geometry/doc/doxy/doxygen_input/sourcecode/doxygen_5.cpp
2016-07-27 16:31:13 +02:00

139 lines
3.5 KiB
C++

OBSOLETE
// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// Doxygen Examples, for Geometry Concepts
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/linestring.hpp>
#include <boost/geometry/geometries/geometries.hpp>
struct legacy_point1
{
double x, y;
};
// adapt legacy_point1
namespace boost { namespace geometry { namespace traits
{
template <> struct tag<legacy_point1> { typedef point_tag type; };
template <> struct coordinate_type<legacy_point1> { typedef double type; };
template <> struct coordinate_system<legacy_point1> { typedef cs::cartesian type; };
template <> struct dimension<legacy_point1>: boost::mpl::int_<2> {};
template <> struct access<legacy_point1, 0>
{
static double get(legacy_point1 const& p) { return p.x; }
static void set(legacy_point1& p, double const& value) { p.x = value; }
};
template <> struct access<legacy_point1, 1>
{
static double get(legacy_point1 const& p) { return p.y; }
static void set(legacy_point1& p, double const& value) { p.y = value; }
};
}}} // namespace boost::geometry::traits
// end adaptation
namespace example_legacy_point1
{
// The first way to check a concept at compile time: checking if the input is parameter
// or return type is OK.
template <typename P>
BOOST_CONCEPT_REQUIRES(((boost::geometry::concepts::Point<P>)), (void))
test1(P& p)
{
}
// The second way to check a concept at compile time: checking if the provided type,
// inside the function, if OK
template <typename P>
void test2(P& p)
{
BOOST_CONCEPT_ASSERT((boost::geometry::concepts::Point<P>));
}
void example()
{
legacy_point1 p;
test1(p);
test2(p);
}
}
// leave comment below for (strange behaviour of) doxygen
class legacy_point2
{
public :
double x() const;
double y() const;
};
// adapt legacy_point2
BOOST_GEOMETRY_REGISTER_POINT_2D_CONST(legacy_point2, double, boost::geometry::cs::cartesian, x(), y() )
// end adaptation
double legacy_point2::x() const { return 0; }
double legacy_point2::y() const { return 0; }
namespace example_legacy_point2
{
// test it using boost concept requires
template <typename P>
BOOST_CONCEPT_REQUIRES(((boost::geometry::concepts::ConstPoint<P>)), (double))
test3(P& p)
{
return boost::geometry::get<0>(p);
}
void example()
{
legacy_point2 p;
test3(p);
}
}
template <typename P>
struct custom_linestring1 : std::deque<P>
{
int id;
};
// adapt custom_linestring1
namespace boost { namespace geometry { namespace traits
{
template <typename P>
struct tag< custom_linestring1<P> > { typedef linestring_tag type; };
}}} // namespace boost::geometry::traits
// end adaptation
namespace example_custom_linestring1
{
void example()
{
typedef custom_linestring1<legacy_point1> L;
BOOST_CONCEPT_ASSERT((boost::geometry::concepts::Linestring<L>));
}
}
int main(void)
{
example_legacy_point1::example();
example_legacy_point2::example();
example_custom_linestring1::example();
return 0;
}