Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r86584 - in trunk: boost/geometry/util libs/geometry/test/util
From: bruno.lalande_at_[hidden]
Date: 2013-11-08 03:14:52


Author: bruno.lalande
Date: 2013-11-08 03:14:51 EST (Fri, 08 Nov 2013)
New Revision: 86584
URL: http://svn.boost.org/trac/boost/changeset/86584

Log:
Added 2 utility metafunctions for variants. Necessary to make some algos variant aware.

Added:
   trunk/boost/geometry/util/compress_variant.hpp (contents, props changed)
   trunk/boost/geometry/util/transform_variant.hpp (contents, props changed)
   trunk/libs/geometry/test/util/compress_variant.cpp (contents, props changed)
   trunk/libs/geometry/test/util/transform_variant.cpp (contents, props changed)

Added: trunk/boost/geometry/util/compress_variant.hpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/boost/geometry/util/compress_variant.hpp 2013-11-08 03:14:51 EST (Fri, 08 Nov 2013) (r86584)
@@ -0,0 +1,98 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// 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)
+
+#ifndef BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP
+#define BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP
+
+
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+namespace detail
+{
+
+template <typename Variant>
+struct unique_types:
+ mpl::fold<
+ typename mpl::reverse_fold<
+ typename Variant::types,
+ mpl::set<>,
+ mpl::insert<
+ mpl::placeholders::_1,
+ mpl::placeholders::_2
+ >
+ >::type,
+ mpl::vector<>,
+ mpl::push_back<mpl::placeholders::_1, mpl::placeholders::_2>
+ >
+{};
+
+template <typename Types>
+struct variant_or_single:
+ mpl::if_<
+ mpl::equal_to<
+ mpl::size<Types>,
+ mpl::int_<1>
+ >,
+ typename mpl::front<Types>::type,
+ typename make_variant_over<Types>::type
+ >
+{};
+
+} // namespace detail
+
+
+/*!
+ \brief Meta-function that takes a boost::variant type and tries to minimize
+ it by doing the following:
+ - if there's any duplicate types, remove them
+ - if the result is a variant of one type, turn it into just that type
+ \ingroup utility
+ \par Example
+ \code
+ typedef variant<int, float, int, long> variant_type;
+ typedef compress_variant<variant_type>::type compressed;
+ typedef mpl::vector<int, float, long> result_types;
+ BOOST_MPL_ASSERT(( mpl::equal<compressed::types, result_types> ));
+
+ tpyedef variant<int, int, int> one_type_variant_type;
+ typedef compress_variant<one_type_variant_type>::type single_type;
+ BOOST_MPL_ASSERT(( boost::equals<single_type, int> ));
+ \endcode
+*/
+
+template <typename Variant>
+struct compress_variant:
+ detail::variant_or_single<
+ typename detail::unique_types<Variant>::type
+ >
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_COMPRESS_VARIANT_HPP

Added: trunk/boost/geometry/util/transform_variant.hpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/boost/geometry/util/transform_variant.hpp 2013-11-08 03:14:51 EST (Fri, 08 Nov 2013) (r86584)
@@ -0,0 +1,54 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// 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)
+
+#ifndef BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP
+#define BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP
+
+
+#include <boost/mpl/transform.hpp>
+#include <boost/variant/variant_fwd.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+/*!
+ \brief Meta-function that takes a boost::variant type and an MPL lambda
+ expression and returns a variant type over the same types as the
+ initial variant type, each trasnformed using the lambda expression.
+ \ingroup utility
+ \par Example
+ \code
+ typedef variant<int, float, long> variant_type;
+ typedef transform_variant<variant_type, add_pointer<_> > transformed;
+ typedef variant<int*, float*, long*> result;
+ BOOST_MPL_ASSERT(( equal<result, transformed> ));
+ \endcode
+*/
+
+template <typename Variant, typename Op>
+struct transform_variant:
+ make_variant_over<
+ typename mpl::transform<
+ typename Variant::types,
+ Op
+ >::type
+ >
+{};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_TRANSFORM_VARIANT_HPP

Added: trunk/libs/geometry/test/util/compress_variant.cpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/libs/geometry/test/util/compress_variant.cpp 2013-11-08 03:14:51 EST (Fri, 08 Nov 2013) (r86584)
@@ -0,0 +1,77 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Unit Test
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// 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)
+
+
+#include <boost/test/included/test_exec_monitor.hpp>
+#include <boost/geometry/util/compress_variant.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/equal.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/variant/variant.hpp>
+
+
+template <typename ExpectedTypes, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+void check_variant_types(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>)
+{
+ BOOST_MPL_ASSERT((
+ boost::mpl::equal<
+ typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+ ExpectedTypes
+ >
+ ));
+}
+
+template <typename Variant, typename ExpectedTypes>
+void test_variant_result()
+{
+ check_variant_types<ExpectedTypes>(typename boost::geometry::compress_variant<Variant>::type());
+}
+
+template <typename Variant, typename ExpectedType>
+void test_single_type_result()
+{
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ typename boost::geometry::compress_variant<Variant>::type,
+ ExpectedType
+ >
+ ));
+}
+
+
+int test_main(int, char* [])
+{
+ test_variant_result<
+ boost::variant<int, float, double>,
+ boost::mpl::vector<int, float, double>
+ >();
+
+ test_variant_result<
+ boost::variant<int, float, double, int, int, float, double, double, float>,
+ boost::mpl::vector<int, double, float>
+ >();
+
+ test_single_type_result<
+ boost::variant<int>,
+ int
+ >();
+
+ test_single_type_result<
+ boost::variant<double, double, double, double, double>,
+ double
+ >();
+
+ return 0;
+}

Added: trunk/libs/geometry/test/util/transform_variant.cpp
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/libs/geometry/test/util/transform_variant.cpp 2013-11-08 03:14:51 EST (Fri, 08 Nov 2013) (r86584)
@@ -0,0 +1,50 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Unit Test
+
+// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// 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)
+
+
+#include <boost/test/included/test_exec_monitor.hpp>
+#include <boost/geometry/util/transform_variant.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/equal.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/variant/variant.hpp>
+
+using boost::mpl::placeholders::_;
+
+
+template <typename ExpectedTypes, BOOST_VARIANT_ENUM_PARAMS(typename T)>
+void check(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>)
+{
+ BOOST_MPL_ASSERT((
+ boost::mpl::equal<
+ typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types,
+ ExpectedTypes
+ >
+ ));
+}
+
+
+int test_main(int, char* [])
+{
+ typedef typename boost::geometry::transform_variant<
+ boost::variant<int, float, long>,
+ boost::add_pointer<_>
+ >::type transformed;
+
+ check<boost::mpl::vector<int*, float*, long*> >(transformed());
+
+ return 0;
+}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk