Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r82708 - in trunk/boost/fusion: container/deque container/deque/detail/cpp03 container/generation container/generation/detail container/map container/map/detail iterator
From: joel_at_[hidden]
Date: 2013-02-06 20:25:02


Author: djowel
Date: 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
New Revision: 82708
URL: http://svn.boost.org/trac/boost/changeset/82708

Log:
modern c++11 map implemented + various tweaks
Added:
   trunk/boost/fusion/container/generation/detail/pp_make_map.hpp (contents, props changed)
   trunk/boost/fusion/container/generation/detail/pp_map_tie.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/at_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/at_key_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/begin_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/end_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/map_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/map_iterator.hpp (contents, props changed)
Text files modified:
   trunk/boost/fusion/container/deque/deque.hpp | 11 +-
   trunk/boost/fusion/container/deque/detail/cpp03/deque.hpp | 2
   trunk/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp | 2
   trunk/boost/fusion/container/generation/make_deque.hpp | 2
   trunk/boost/fusion/container/generation/make_map.hpp | 144 ++++++++++-----------------------------
   trunk/boost/fusion/container/generation/map_tie.hpp | 138 ++++++-------------------------------
   trunk/boost/fusion/container/map/map.hpp | 48 +++++++++++++
   trunk/boost/fusion/container/map/map_fwd.hpp | 26 ++++++
   trunk/boost/fusion/iterator/basic_iterator.hpp | 2
   9 files changed, 141 insertions(+), 234 deletions(-)

Modified: trunk/boost/fusion/container/deque/deque.hpp
==============================================================================
--- trunk/boost/fusion/container/deque/deque.hpp (original)
+++ trunk/boost/fusion/container/deque/deque.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -8,20 +8,17 @@
 #if !defined(BOOST_FUSION_DEQUE_26112006_1649)
 #define BOOST_FUSION_DEQUE_26112006_1649
 
-#include <boost/config.hpp>
+# include <boost/fusion/container/deque/deque_fwd.hpp>
 
 ///////////////////////////////////////////////////////////////////////////////
-// With variadics, we will use the PP version
+// Without variadics, we will use the PP version
 ///////////////////////////////////////////////////////////////////////////////
-#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#if !defined(BOOST_FUSION_HAS_VARIADIC_DEQUE)
 # include <boost/fusion/container/deque/detail/cpp03/deque.hpp>
 #else
-# if !defined(BOOST_FUSION_HAS_VARIADIC_DEQUE)
-# define BOOST_FUSION_HAS_VARIADIC_DEQUE
-# endif
 
 ///////////////////////////////////////////////////////////////////////////////
-// C++11 variadic interface
+// C++11 interface
 ///////////////////////////////////////////////////////////////////////////////
 #include <boost/fusion/support/sequence_base.hpp>
 #include <boost/fusion/support/detail/access.hpp>

Modified: trunk/boost/fusion/container/deque/detail/cpp03/deque.hpp
==============================================================================
--- trunk/boost/fusion/container/deque/detail/cpp03/deque.hpp (original)
+++ trunk/boost/fusion/container/deque/detail/cpp03/deque.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -164,7 +164,7 @@
             typename enable_if<
                 mpl::and_<
                     traits::is_sequence<Sequence>
- , result_of::empty<Sequence>>>::type* /*dummy*/ = 0)
+ , result_of::empty<Sequence> > >::type* /*dummy*/ = 0)
         {}
 
         deque() {}

Modified: trunk/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp
==============================================================================
--- trunk/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp (original)
+++ trunk/boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -43,6 +43,7 @@
>::construct(BOOST_PP_ENUM_SHIFTED_PARAMS(N, t)));
         }
 
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
         template <BOOST_PP_ENUM_PARAMS(N, typename T_)>
         static type forward_(BOOST_PP_ENUM_BINARY_PARAMS(N, T_, && t))
         {
@@ -54,6 +55,7 @@
         #endif
>::forward_(BOOST_PP_ENUM_SHIFTED(N, FUSION_DEQUE_KEYED_VALUES_FORWARD, _)));
         }
+#endif
 
 #undef N
 #endif

Added: trunk/boost/fusion/container/generation/detail/pp_make_map.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/generation/detail/pp_make_map.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,132 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under 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_PP_IS_ITERATING
+#if !defined(FUSION_PP_MAKE_MAP_07222005_1247)
+#define FUSION_PP_MAKE_MAP_07222005_1247
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/fusion/container/map/map.hpp>
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/fusion/support/pair.hpp>
+
+#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
+#include <boost/fusion/container/generation/detail/preprocessed/make_map.hpp>
+#else
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(preserve: 2, line: 0, output: "detail/preprocessed/make_map" FUSION_MAX_MAP_SIZE_STR".hpp")
+#endif
+
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under 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)
+
+ This is an auto-generated file. Do not edit!
+==============================================================================*/
+
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(preserve: 1)
+#endif
+
+namespace boost { namespace fusion
+{
+ struct void_;
+
+ namespace result_of
+ {
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ FUSION_MAX_VECTOR_SIZE, typename K, void_)
+ , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ FUSION_MAX_VECTOR_SIZE, typename D, void_)
+ , typename Extra = void_
+ >
+ struct make_map;
+
+ template <>
+ struct make_map<>
+ {
+ typedef map<> type;
+ };
+ }
+
+ inline map<>
+ make_map()
+ {
+ return map<>();
+ }
+
+#define BOOST_FUSION_PAIR(z, n, data) \
+ fusion::pair< \
+ BOOST_PP_CAT(K, n) \
+ , typename detail::as_fusion_element<BOOST_PP_CAT(D, n)>::type>
+
+#define BOOST_FUSION_MAKE_PAIR(z, n, data) \
+ fusion::make_pair<BOOST_PP_CAT(K, n)>(BOOST_PP_CAT(_, n)) \
+
+#define BOOST_PP_FILENAME_1 <boost/fusion/container/generation/detail/pp_make_map.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE)
+#include BOOST_PP_ITERATE()
+
+#undef BOOST_FUSION_PAIR
+#undef BOOST_FUSION_MAKE_PAIR
+
+}}
+
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(output: null)
+#endif
+
+#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
+
+#endif
+#else // defined(BOOST_PP_IS_ITERATING)
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#define N BOOST_PP_ITERATION()
+
+ namespace result_of
+ {
+ template <
+ BOOST_PP_ENUM_PARAMS(N, typename K)
+ , BOOST_PP_ENUM_PARAMS(N, typename D)
+ >
+#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
+ #define TEXT(z, n, text) , text
+ struct make_map<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D) BOOST_PP_REPEAT_FROM_TO(N, FUSION_MAX_VECTOR_SIZE, TEXT, void_) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_VECTOR_SIZE, TEXT, void_)>
+ #undef TEXT
+#else
+ struct make_map<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D)>
+#endif
+ {
+ typedef map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)> type;
+ };
+ }
+
+ template <
+ BOOST_PP_ENUM_PARAMS(N, typename K)
+ , BOOST_PP_ENUM_PARAMS(N, typename D)
+ >
+ inline map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)>
+ make_map(BOOST_PP_ENUM_BINARY_PARAMS(N, D, const& _))
+ {
+ return map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)>(
+ BOOST_PP_ENUM(N, BOOST_FUSION_MAKE_PAIR, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+

Added: trunk/boost/fusion/container/generation/detail/pp_map_tie.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/generation/detail/pp_map_tie.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,136 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2006 Dan Marsden
+
+ Distributed under 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_PP_IS_ITERATING
+#if !defined(FUSION_PP_MAP_TIE_20060814_1116)
+#define FUSION_PP_MAP_TIE_20060814_1116
+
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/fusion/container/map/map.hpp>
+#include <boost/fusion/container/map/detail/cpp03/limits.hpp>
+#include <boost/fusion/support/pair.hpp>
+#include <boost/fusion/container/generation/pair_tie.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
+#include <boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>
+#else
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(preserve: 2, line: 0, output: "detail/preprocessed/map_tie" FUSION_MAX_MAP_SIZE_STR".hpp")
+#endif
+
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under 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)
+
+ This is an auto-generated file. Do not edit!
+==============================================================================*/
+
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(preserve: 1)
+#endif
+
+namespace boost { namespace fusion
+{
+ struct void_;
+
+ namespace result_of
+ {
+ template <
+ BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ FUSION_MAX_MAP_SIZE, typename K, void_)
+ , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
+ FUSION_MAX_MAP_SIZE, typename D, void_)
+ , typename Extra = void_
+ >
+ struct map_tie;
+
+ template <>
+ struct map_tie<>
+ {
+ typedef map<> type;
+ };
+ }
+
+ inline map<>
+ map_tie()
+ {
+ return map<>();
+ }
+
+#define BOOST_FUSION_TIED_PAIR(z, n, data) \
+ fusion::pair< \
+ BOOST_PP_CAT(K, n) \
+ , typename add_reference<BOOST_PP_CAT(D, n)>::type>
+
+#define BOOST_FUSION_PAIR_TIE(z, n, data) \
+ fusion::pair_tie<BOOST_PP_CAT(K, n)>(BOOST_PP_CAT(_, n)) \
+
+#define BOOST_PP_FILENAME_1 <boost/fusion/container/generation/detail/pp_map_tie.hpp>
+#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_MAP_SIZE)
+#include BOOST_PP_ITERATE()
+
+#undef BOOST_FUSION_PAIR
+#undef BOOST_FUSION_MAKE_PAIR
+
+}}
+
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+#pragma wave option(output: null)
+#endif
+
+#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
+
+#endif
+#else // defined(BOOST_PP_IS_ITERATING)
+///////////////////////////////////////////////////////////////////////////////
+//
+// Preprocessor vertical repetition code
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#define N BOOST_PP_ITERATION()
+
+ namespace result_of
+ {
+ template <
+ BOOST_PP_ENUM_PARAMS(N, typename K)
+ , BOOST_PP_ENUM_PARAMS(N, typename D)
+ >
+#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
+ #define TEXT(z, n, text) , text
+
+ struct map_tie<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D) BOOST_PP_REPEAT_FROM_TO(N, FUSION_MAX_MAP_SIZE, TEXT, void_) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_MAP_SIZE, TEXT, void_)>
+ #undef TEXT
+#else
+ struct map_tie<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D)>
+#endif
+ {
+ typedef map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)> type;
+ };
+ }
+
+ template <
+ BOOST_PP_ENUM_PARAMS(N, typename K)
+ , BOOST_PP_ENUM_PARAMS(N, typename D)
+ >
+ inline map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)>
+ map_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, D, & _))
+ {
+ return map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)>(
+ BOOST_PP_ENUM(N, BOOST_FUSION_PAIR_TIE, _));
+ }
+
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+

Modified: trunk/boost/fusion/container/generation/make_deque.hpp
==============================================================================
--- trunk/boost/fusion/container/generation/make_deque.hpp (original)
+++ trunk/boost/fusion/container/generation/make_deque.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -21,8 +21,6 @@
 
 namespace boost { namespace fusion
 {
- struct void_;
-
     namespace result_of
     {
         template <typename ...T>

Modified: trunk/boost/fusion/container/generation/make_map.hpp
==============================================================================
--- trunk/boost/fusion/container/generation/make_map.hpp (original)
+++ trunk/boost/fusion/container/generation/make_map.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -1,132 +1,62 @@
 /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2001-2013 Joel de Guzman
 
     Distributed under 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_PP_IS_ITERATING
 #if !defined(FUSION_MAKE_MAP_07222005_1247)
 #define FUSION_MAKE_MAP_07222005_1247
 
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
 #include <boost/fusion/container/map/map.hpp>
-#include <boost/fusion/support/detail/as_fusion_element.hpp>
-#include <boost/fusion/support/pair.hpp>
 
-#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
-#include <boost/fusion/container/generation/detail/preprocessed/make_map.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
+# include <boost/fusion/container/generation/detail/pp_make_map.hpp>
 #else
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 2, line: 0, output: "detail/preprocessed/make_map" FUSION_MAX_MAP_SIZE_STR".hpp")
-#endif
 
-/*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
-
- Distributed under 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)
-
- This is an auto-generated file. Do not edit!
-==============================================================================*/
-
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 1)
-#endif
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/fusion/support/pair.hpp>
 
 namespace boost { namespace fusion
 {
- struct void_;
-
     namespace result_of
     {
- template <
- BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
- FUSION_MAX_VECTOR_SIZE, typename K, void_)
- , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
- FUSION_MAX_VECTOR_SIZE, typename D, void_)
- , typename Extra = void_
- >
- struct make_map;
-
- template <>
- struct make_map<>
+ template <typename ...Key>
+ struct make_map
         {
- typedef map<> type;
+ template <typename ...T>
+ struct apply
+ {
+ typedef map<
+ fusion::pair<
+ Key
+ , typename detail::as_fusion_element<T>::type
+ >...>
+ type;
+ };
         };
     }
 
- inline map<>
- make_map()
- {
- return map<>();
- }
-
-#define BOOST_FUSION_PAIR(z, n, data) \
- fusion::pair< \
- BOOST_PP_CAT(K, n) \
- , typename detail::as_fusion_element<BOOST_PP_CAT(D, n)>::type>
-
-#define BOOST_FUSION_MAKE_PAIR(z, n, data) \
- fusion::make_pair<BOOST_PP_CAT(K, n)>(BOOST_PP_CAT(_, n)) \
-
-#define BOOST_PP_FILENAME_1 <boost/fusion/container/generation/make_map.hpp>
-#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE)
-#include BOOST_PP_ITERATE()
-
-#undef BOOST_FUSION_PAIR
-#undef BOOST_FUSION_MAKE_PAIR
-
-}}
-
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(output: null)
-#endif
-
-#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
-
-#endif
-#else // defined(BOOST_PP_IS_ITERATING)
-///////////////////////////////////////////////////////////////////////////////
-//
-// Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#define N BOOST_PP_ITERATION()
-
- namespace result_of
+ template <typename ...Key, typename ...T>
+ inline map<
+ fusion::pair<
+ Key
+ , typename detail::as_fusion_element<T>::type
+ >...>
+ make_map(T const&... arg)
     {
- template <
- BOOST_PP_ENUM_PARAMS(N, typename K)
- , BOOST_PP_ENUM_PARAMS(N, typename D)
- >
-#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
- #define TEXT(z, n, text) , text
- struct make_map<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D) BOOST_PP_REPEAT_FROM_TO(N, FUSION_MAX_VECTOR_SIZE, TEXT, void_) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_VECTOR_SIZE, TEXT, void_)>
- #undef TEXT
-#else
- struct make_map<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D)>
-#endif
- {
- typedef map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)> type;
- };
- }
+ typedef map<
+ fusion::pair<
+ Key
+ , typename detail::as_fusion_element<T>::type
+ >...>
+ result_type;
 
- template <
- BOOST_PP_ENUM_PARAMS(N, typename K)
- , BOOST_PP_ENUM_PARAMS(N, typename D)
- >
- inline map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)>
- make_map(BOOST_PP_ENUM_BINARY_PARAMS(N, D, const& _))
- {
- return map<BOOST_PP_ENUM(N, BOOST_FUSION_PAIR, _)>(
- BOOST_PP_ENUM(N, BOOST_FUSION_MAKE_PAIR, _));
+ return result_type(arg...);
     }
+ }}
 
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
+#endif
+#endif
\ No newline at end of file

Modified: trunk/boost/fusion/container/generation/map_tie.hpp
==============================================================================
--- trunk/boost/fusion/container/generation/map_tie.hpp (original)
+++ trunk/boost/fusion/container/generation/map_tie.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -1,136 +1,46 @@
 /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Copyright (c) 2006 Dan Marsden
+ Copyright (c) 2001-2013 Joel de Guzman
 
     Distributed under 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_PP_IS_ITERATING
-#if !defined(FUSION_MAP_TIE_20060814_1116)
-#define FUSION_MAP_TIE_20060814_1116
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#if !defined(FUSION_MAP_TIE_07222005_1247)
+#define FUSION_MAP_TIE_07222005_1247
+
 #include <boost/fusion/container/map/map.hpp>
-#include <boost/fusion/container/map/detail/cpp03/limits.hpp>
-#include <boost/fusion/support/pair.hpp>
-#include <boost/fusion/container/generation/pair_tie.hpp>
-#include <boost/type_traits/add_reference.hpp>
 
-#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
-#include <boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
+# include <boost/fusion/container/generation/detail/pp_map_tie.hpp>
 #else
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 2, line: 0, output: "detail/preprocessed/map_tie" FUSION_MAX_MAP_SIZE_STR".hpp")
-#endif
 
-/*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
-
- Distributed under 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)
-
- This is an auto-generated file. Do not edit!
-==============================================================================*/
-
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(preserve: 1)
-#endif
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/pair.hpp>
 
 namespace boost { namespace fusion
 {
- struct void_;
-
     namespace result_of
     {
- template <
- BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
- FUSION_MAX_MAP_SIZE, typename K, void_)
- , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
- FUSION_MAX_MAP_SIZE, typename D, void_)
- , typename Extra = void_
- >
- struct map_tie;
-
- template <>
- struct map_tie<>
+ template <typename ...Key>
+ struct map_tie
         {
- typedef map<> type;
+ template <typename ...T>
+ struct apply
+ {
+ typedef map<fusion::pair<Key, T&>...> type;
+ };
         };
     }
 
- inline map<>
- map_tie()
+ template <typename ...Key, typename ...T>
+ inline map<fusion::pair<Key, T&>...>
+ map_tie(T&... arg)
     {
- return map<>();
+ typedef map<fusion::pair<Key, T&>...> result_type;
+ return result_type(arg...);
     }
+ }}
 
-#define BOOST_FUSION_TIED_PAIR(z, n, data) \
- fusion::pair< \
- BOOST_PP_CAT(K, n) \
- , typename add_reference<BOOST_PP_CAT(D, n)>::type>
-
-#define BOOST_FUSION_PAIR_TIE(z, n, data) \
- fusion::pair_tie<BOOST_PP_CAT(K, n)>(BOOST_PP_CAT(_, n)) \
-
-#define BOOST_PP_FILENAME_1 <boost/fusion/container/generation/map_tie.hpp>
-#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_MAP_SIZE)
-#include BOOST_PP_ITERATE()
-
-#undef BOOST_FUSION_PAIR
-#undef BOOST_FUSION_MAKE_PAIR
-
-}}
-
-#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
-#pragma wave option(output: null)
 #endif
-
-#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
-
-#endif
-#else // defined(BOOST_PP_IS_ITERATING)
-///////////////////////////////////////////////////////////////////////////////
-//
-// Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#define N BOOST_PP_ITERATION()
-
- namespace result_of
- {
- template <
- BOOST_PP_ENUM_PARAMS(N, typename K)
- , BOOST_PP_ENUM_PARAMS(N, typename D)
- >
-#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
- #define TEXT(z, n, text) , text
-
- struct map_tie<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D) BOOST_PP_REPEAT_FROM_TO(N, FUSION_MAX_MAP_SIZE, TEXT, void_) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_MAP_SIZE, TEXT, void_)>
- #undef TEXT
-#else
- struct map_tie<BOOST_PP_ENUM_PARAMS(N, K), BOOST_PP_ENUM_PARAMS(N, D)>
-#endif
- {
- typedef map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)> type;
- };
- }
-
- template <
- BOOST_PP_ENUM_PARAMS(N, typename K)
- , BOOST_PP_ENUM_PARAMS(N, typename D)
- >
- inline map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)>
- map_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, D, & _))
- {
- return map<BOOST_PP_ENUM(N, BOOST_FUSION_TIED_PAIR, _)>(
- BOOST_PP_ENUM(N, BOOST_FUSION_PAIR_TIE, _));
- }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-
+#endif
\ No newline at end of file

Added: trunk/boost/fusion/container/map/detail/at_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/at_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 2001-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_DETAIL_AT_IMPL_02042013_0821)
+#define BOOST_FUSION_MAP_DETAIL_AT_IMPL_02042013_0821
+
+#include <boost/fusion/support/detail/access.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ namespace extension
+ {
+ template <typename Tag>
+ struct at_impl;
+
+ template <>
+ struct at_impl<map_tag>
+ {
+ template <typename Sequence, typename N>
+ struct apply
+ {
+ typedef
+ decltype(std::declval<Sequence>().get(N()))
+ type;
+
+ static type
+ call(Sequence& m)
+ {
+ return m.get(N());
+ }
+ };
+
+ template <typename Sequence, typename N>
+ struct apply<Sequence const, N>
+ {
+ typedef
+ decltype(std::declval<Sequence const>().get(N()))
+ type;
+
+ static type
+ call(Sequence const& m)
+ {
+ return m.get(N());
+ }
+ };
+ };
+ }
+}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/at_key_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/at_key_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,58 @@
+/*=============================================================================
+ Copyright (c) 2001-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_DETAIL_AT_KEY_IMPL_02042013_0821)
+#define BOOST_FUSION_MAP_DETAIL_AT_KEY_IMPL_02042013_0821
+
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ namespace extension
+ {
+ template <typename Tag>
+ struct at_key_impl;
+
+ template <>
+ struct at_key_impl<map_tag>
+ {
+ template <typename Sequence, typename Key>
+ struct apply
+ {
+ typedef
+ decltype(std::declval<Sequence>().get(mpl::identity<Key>()))
+ type;
+
+ static type
+ call(Sequence& m)
+ {
+ return m.get(mpl::identity<Key>());
+ }
+ };
+
+ template <typename Sequence, typename Key>
+ struct apply<Sequence const, Key>
+ {
+ typedef
+ decltype(std::declval<Sequence const>().get(mpl::identity<Key>()))
+ type;
+
+ static type
+ call(Sequence const& m)
+ {
+ return m.get(mpl::identity<Key>());
+ }
+ };
+ };
+ }
+}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/begin_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/begin_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2005-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_BEGIN_IMPL_02042013_0857)
+#define BOOST_FUSION_MAP_BEGIN_IMPL_02042013_0857
+
+#include <boost/fusion/container/map/map_iterator.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ namespace extension
+ {
+ template<typename T>
+ struct begin_impl;
+
+ template<>
+ struct begin_impl<map_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef map_iterator<Sequence, 0> type;
+
+ static type call(Sequence& seq)
+ {
+ return type(seq);
+ }
+ };
+ };
+ }
+}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/end_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/end_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2005-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_END_IMPL_02042013_0857)
+#define BOOST_FUSION_MAP_END_IMPL_02042013_0857
+
+#include <boost/fusion/container/map/map_iterator.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ namespace extension
+ {
+ template<typename T>
+ struct end_impl;
+
+ template<>
+ struct end_impl<map_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef map_iterator<Sequence, Sequence::size::value> type;
+
+ static type call(Sequence& seq)
+ {
+ return type(seq);
+ }
+ };
+ };
+ }
+}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/map_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/map_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,165 @@
+/*=============================================================================
+ Copyright (c) 2005-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_IMPL_02032013_2233)
+#define BOOST_FUSION_MAP_IMPL_02032013_2233
+
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace fusion
+{
+ struct fusion_sequence_tag;
+}}
+
+namespace boost { namespace fusion { namespace detail
+{
+ struct map_impl_from_iterator {};
+
+ template <int index, typename ...T>
+ struct map_impl;
+
+ template <int index_>
+ struct map_impl<index_>
+ {
+ typedef fusion_sequence_tag tag;
+ static int const index = index_;
+ static int const size = 0;
+
+ map_impl() {}
+
+ template <typename Iterator>
+ map_impl(Iterator const& iter, map_impl_from_iterator)
+ {}
+
+ void get();
+ void get_val();
+ void get_key();
+ };
+
+ template <int index_, typename Pair, typename ...T>
+ struct map_impl<index_, Pair, T...> : map_impl<index_ + 1, T...>
+ {
+ typedef fusion_sequence_tag tag;
+ typedef map_impl<index_+1, T...> rest_type;
+
+ using rest_type::get;
+ using rest_type::get_val;
+ using rest_type::get_key;
+
+ static int const index = index_;
+ static int const size = rest_type::size + 1;
+
+ typedef Pair pair_type;
+ typedef typename Pair::first_type key_type;
+ typedef typename Pair::second_type value_type;
+
+ map_impl()
+ : rest_type(), element()
+ {}
+
+ map_impl(map_impl const& rhs)
+ : rest_type(rhs.get_base()), element(rhs.element)
+ {}
+
+ map_impl(map_impl&& rhs)
+ : rest_type(std::forward<rest_type>(*static_cast<rest_type*>(this)))
+ , element(std::forward<Pair>(rhs.element))
+ {}
+
+ template <typename ...U>
+ map_impl(map_impl<index, U...> const& rhs)
+ : rest_type(rhs.get_base()), element(rhs.element)
+ {}
+
+ map_impl(typename detail::call_param<Pair>::type element
+ , typename detail::call_param<T>::type... rest)
+ : rest_type(rest...), element(element)
+ {}
+
+ map_impl(Pair&& element, T&&... rest)
+ : rest_type(std::forward<T>(rest)...)
+ , element(std::forward<Pair>(element))
+ {}
+
+ template <typename Iterator>
+ map_impl(Iterator const& iter, map_impl_from_iterator fi)
+ : rest_type(fusion::next(iter), fi)
+ , element(*iter)
+ {}
+
+ rest_type& get_base()
+ {
+ return *this;
+ }
+
+ rest_type const& get_base() const
+ {
+ return *this;
+ }
+
+ value_type get_val(mpl::identity<key_type>);
+ pair_type get_val(mpl::int_<index>);
+ value_type get_val(mpl::identity<key_type>) const;
+ pair_type get_val(mpl::int_<index>) const;
+
+ key_type get_key(mpl::int_<index>);
+ key_type get_key(mpl::int_<index>) const;
+
+ typename cref_result<value_type>::type
+ get(mpl::identity<key_type>) const
+ {
+ return element.second;
+ }
+
+ typename ref_result<value_type>::type
+ get(mpl::identity<key_type>)
+ {
+ return element.second;
+ }
+
+ typename cref_result<pair_type>::type
+ get(mpl::int_<index>) const
+ {
+ return element;
+ }
+
+ typename ref_result<pair_type>::type
+ get(mpl::int_<index>)
+ {
+ return element;
+ }
+
+ template <typename ...U>
+ map_impl& operator=(map_impl<index, U...> const& rhs)
+ {
+ rest_type::operator=(rhs);
+ element = rhs.element;
+ return *this;
+ }
+
+ map_impl& operator=(map_impl const& rhs)
+ {
+ rest_type::operator=(rhs);
+ element = rhs.element;
+ return *this;
+ }
+
+ map_impl& operator=(map_impl&& rhs)
+ {
+ rest_type::operator=(std::forward<map_impl>(rhs));
+ element = std::forward<Pair>(rhs.element);
+ return *this;
+ }
+
+ Pair element;
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,38 @@
+/*=============================================================================
+ Copyright (c) 2001-2013 Joel de Guzman
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_DETAIL_VALUE_AT_KEY_IMPL_02042013_0821)
+#define BOOST_FUSION_MAP_DETAIL_VALUE_AT_KEY_IMPL_02042013_0821
+
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ namespace extension
+ {
+ template <typename Tag>
+ struct value_at_key_impl;
+
+ template <>
+ struct value_at_key_impl<map_tag>
+ {
+ template <typename Sequence, typename Key>
+ struct apply
+ {
+ typedef
+ decltype(std::declval<Sequence>().get_val(mpl::identity<Key>()))
+ type;
+ };
+ };
+ }
+}}
+
+#endif

Modified: trunk/boost/fusion/container/map/map.hpp
==============================================================================
--- trunk/boost/fusion/container/map/map.hpp (original)
+++ trunk/boost/fusion/container/map/map.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -7,6 +7,52 @@
 #if !defined(FUSION_MAP_MAIN_07212005_1106)
 #define FUSION_MAP_MAIN_07212005_1106
 
-#include <boost/fusion/container/map/detail/cpp03/map.hpp>
+#include <boost/fusion/container/map/map_fwd.hpp>
 
+///////////////////////////////////////////////////////////////////////////////
+// Without variadics, we will use the PP version
+///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
+# include <boost/fusion/container/map/detail/cpp03/map.hpp>
+#else
+
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/map/detail/map_impl.hpp>
+#include <boost/fusion/container/map/detail/begin_impl.hpp>
+#include <boost/fusion/container/map/detail/end_impl.hpp>
+#include <boost/fusion/container/map/detail/at_impl.hpp>
+#include <boost/fusion/container/map/detail/at_key_impl.hpp>
+#include <boost/fusion/container/map/detail/value_at_key_impl.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/fusion/sequence/intrinsic/at_c.hpp>
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/fusion/support/category_of.hpp>
+
+namespace boost { namespace fusion
+{
+ struct map_tag;
+
+ template <typename ...T>
+ struct map : detail::map_impl<0, T...>, sequence_base<map<T...>>
+ {
+ typedef map_tag fusion_tag;
+ typedef detail::map_impl<0, T...> base_type;
+
+ struct category : random_access_traversal_tag, associative_tag {};
+ typedef mpl::int_<base_type::size> size;
+ typedef mpl::false_ is_view;
+
+ map() {};
+
+ map(typename detail::call_param<T>::type... element)
+ : base_type(element...)
+ {}
+ };
+}}
+
+#endif
 #endif

Modified: trunk/boost/fusion/container/map/map_fwd.hpp
==============================================================================
--- trunk/boost/fusion/container/map/map_fwd.hpp (original)
+++ trunk/boost/fusion/container/map/map_fwd.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -7,6 +7,30 @@
 #if !defined(FUSION_MAP_FORWARD_MAIN_07212005_1105)
 #define FUSION_MAP_FORWARD_MAIN_07212005_1105
 
-#include <boost/fusion/container/map/detail/cpp03/map_fwd.hpp>
+#include <boost/config.hpp>
 
+///////////////////////////////////////////////////////////////////////////////
+// With no decltype and variadics, we will use the C++03 version
+///////////////////////////////////////////////////////////////////////////////
+#if (defined(BOOST_NO_CXX11_DECLTYPE) \
+ || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) \
+ || defined(BOOST_NO_CXX11_RVALUE_REFERENCES))
+# include <boost/fusion/container/map/detail/cpp03/map_fwd.hpp>
+#else
+# if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
+# define BOOST_FUSION_HAS_VARIADIC_MAP
+# endif
+
+#include <boost/fusion/container/map/detail/map_impl.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ struct map;
+}}
+
+#endif
 #endif

Added: trunk/boost/fusion/container/map/map_iterator.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/map_iterator.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -0,0 +1,164 @@
+/*=============================================================================
+ Copyright (c) 2005-2013 Joel de Guzman
+ Copyright (c) 2005-2006 Dan Marsden
+
+ Distributed under 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)
+==============================================================================*/
+#if !defined(BOOST_FUSION_MAP_ITERATOR_02042013_0835)
+#define BOOST_FUSION_MAP_ITERATOR_02042013_0835
+
+#include <boost/fusion/iterator/iterator_facade.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/equal_to.hpp>
+
+namespace boost { namespace fusion
+{
+ struct random_access_traversal_tag;
+
+ template <typename Seq, int Pos>
+ struct map_iterator
+ : iterator_facade<
+ map_iterator<Seq, Pos>
+ , random_access_traversal_tag>
+ {
+ typedef Seq sequence;
+ typedef mpl::int_<Pos> index;
+
+ map_iterator(Seq& seq)
+ : seq_(seq)
+ {}
+
+ template<typename Iterator>
+ struct value_of
+ {
+ typedef typename Iterator::sequence sequence;
+ typedef typename Iterator::index index;
+ typedef
+ decltype(std::declval<sequence>().get_val(index()))
+ type;
+ };
+
+ template<typename Iterator>
+ struct value_of_data
+ {
+ typedef typename Iterator::sequence sequence;
+ typedef typename Iterator::index index;
+ typedef
+ decltype(std::declval<sequence>().get_val(index()).second)
+ type;
+ };
+
+ template<typename Iterator>
+ struct key_of
+ {
+ typedef typename Iterator::sequence sequence;
+ typedef typename Iterator::index index;
+ typedef
+ decltype(std::declval<sequence>().get_key(index()))
+ type;
+ };
+
+ template<typename Iterator>
+ struct deref
+ {
+ typedef typename Iterator::sequence sequence;
+ typedef typename Iterator::index index;
+ typedef
+ decltype(std::declval<sequence>().get(index()))
+ type;
+
+ static type
+ call(Iterator const& it)
+ {
+ return it.seq_.get(typename Iterator::index());
+ }
+ };
+
+ template<typename Iterator>
+ struct deref_data
+ {
+ typedef typename Iterator::sequence sequence;
+ typedef typename Iterator::index index;
+ typedef
+ decltype(std::declval<sequence>().get(index()).second)
+ type;
+
+ static type
+ call(Iterator const& it)
+ {
+ return it.seq_.get(typename Iterator::index()).second;
+ }
+ };
+
+ //~ template<typename Iterator>
+ //~ struct deref_data
+ //~ {
+ //~ typedef typename Iterator::sequence sequence;
+ //~ typedef typename Iterator::index index;
+ //~ typedef
+ //~ decltype(std::declval<sequence>().get(index()))
+ //~ type;
+
+ //~ static type
+ //~ call(Iterator const& it)
+ //~ {
+ //~ return it.seq_.get(typename Iterator::index());
+ //~ }
+ //~ };
+
+ template <typename Iterator, typename N>
+ struct advance
+ {
+ typedef typename Iterator::index index;
+ typedef typename Iterator::sequence sequence;
+ typedef map_iterator<sequence, index::value + N::value> type;
+
+ static type
+ call(Iterator const& i)
+ {
+ return type(i.seq_);
+ }
+ };
+
+ template<typename Iterator>
+ struct next
+ : advance<Iterator, mpl::int_<1> >
+ {};
+
+ template<typename Iterator>
+ struct prior
+ : advance<Iterator, mpl::int_<-1> >
+ {};
+
+ template <typename I1, typename I2>
+ struct distance : mpl::minus<typename I2::index, typename I1::index>
+ {
+ typedef typename
+ mpl::minus<
+ typename I2::index, typename I1::index
+ >::type
+ type;
+
+ static type
+ call(I1 const&, I2 const&)
+ {
+ return type();
+ }
+ };
+
+ template<typename I1, typename I2>
+ struct equal_to
+ : mpl::equal_to<typename I1::index, typename I2::index>
+ {};
+
+ Seq& seq_;
+
+ private:
+ // silence MSVC warning C4512: assignment operator could not be generated
+ map_iterator& operator= (map_iterator const&);
+ };
+
+}}
+
+#endif

Modified: trunk/boost/fusion/iterator/basic_iterator.hpp
==============================================================================
--- trunk/boost/fusion/iterator/basic_iterator.hpp (original)
+++ trunk/boost/fusion/iterator/basic_iterator.hpp 2013-02-03 22:49:34 EST (Sun, 03 Feb 2013)
@@ -39,7 +39,7 @@
 
     template<typename Tag, typename Category, typename Seq, int Index>
     struct basic_iterator
- : iterator_facade<basic_iterator<Tag,Category,Seq,Index>, Category>
+ : iterator_facade<basic_iterator<Tag, Category, Seq, Index>, Category>
     {
         typedef mpl::int_<Index> index;
         typedef Seq seq_type;


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