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::concept::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::concept::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::concept::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::concept::Linestring<L>)); } } int main(void) { example_legacy_point1::example(); example_legacy_point2::example(); example_custom_linestring1::example(); return 0; }