Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57156 - in trunk: boost/fusion/algorithm/iteration/detail boost/fusion/algorithm/query boost/fusion/algorithm/query/detail boost/fusion/algorithm/transformation boost/fusion/container/deque boost/fusion/container/map boost/fusion/container/map/detail boost/fusion/container/set boost/fusion/container/set/detail boost/fusion/iterator boost/fusion/sequence/intrinsic boost/fusion/view/filter_view boost/fusion/view/filter_view/detail boost/fusion/view/iterator_range boost/fusion/view/joint_view boost/fusion/view/joint_view/detail boost/fusion/view/reverse_view boost/fusion/view/reverse_view/detail libs/fusion/test/algorithm libs/fusion/test/sequence
From: mr.chr.schmidt_at_[hidden]
Date: 2009-10-25 19:00:00


Author: cschmidt
Date: 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
New Revision: 57156
URL: http://svn.boost.org/trac/boost/changeset/57156

Log:
associative iterators & views
Added:
   trunk/boost/fusion/container/map/detail/deref_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/deref_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/key_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/value_of_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/map/detail/value_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/set/detail/deref_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/set/detail/deref_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/set/detail/key_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/set/detail/value_of_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/container/set/detail/value_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/iterator/basic_iterator.hpp (contents, props changed)
   trunk/boost/fusion/iterator/deref_data.hpp (contents, props changed)
   trunk/boost/fusion/iterator/key_of.hpp (contents, props changed)
   trunk/boost/fusion/iterator/value_of_data.hpp (contents, props changed)
   trunk/boost/fusion/view/filter_view/detail/deref_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/filter_view/detail/key_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/filter_view/detail/value_of_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/joint_view/detail/deref_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/joint_view/detail/key_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/joint_view/detail/value_of_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/reverse_view/detail/deref_data_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/reverse_view/detail/key_of_impl.hpp (contents, props changed)
   trunk/boost/fusion/view/reverse_view/detail/value_of_data_impl.hpp (contents, props changed)
Removed:
   trunk/boost/fusion/algorithm/query/detail/assoc_find.hpp
   trunk/boost/fusion/container/map/detail/at_key_impl.hpp
   trunk/boost/fusion/container/map/detail/lookup_key.hpp
   trunk/boost/fusion/container/map/detail/map_lookup.hpp
   trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp
   trunk/boost/fusion/container/set/detail/at_key_impl.hpp
   trunk/boost/fusion/container/set/detail/lookup_key.hpp
   trunk/boost/fusion/container/set/detail/set_lookup.hpp
   trunk/boost/fusion/container/set/detail/value_at_key_impl.hpp
Text files modified:
   trunk/boost/fusion/algorithm/iteration/detail/fold.hpp | 2
   trunk/boost/fusion/algorithm/query/detail/find_if.hpp | 26 +-------------
   trunk/boost/fusion/algorithm/query/find.hpp | 33 +++++++++---------
   trunk/boost/fusion/algorithm/query/find_if.hpp | 35 ++++++++-----------
   trunk/boost/fusion/algorithm/transformation/erase_key.hpp | 11 ++----
   trunk/boost/fusion/container/deque/deque.hpp | 1
   trunk/boost/fusion/container/map/detail/begin_impl.hpp | 69 ++++++++++++++++-----------------------
   trunk/boost/fusion/container/map/detail/end_impl.hpp | 66 ++++++++++++++++----------------------
   trunk/boost/fusion/container/map/map.hpp | 10 ++--
   trunk/boost/fusion/container/map/map_fwd.hpp | 2 +
   trunk/boost/fusion/container/set/detail/begin_impl.hpp | 69 ++++++++++++++++-----------------------
   trunk/boost/fusion/container/set/detail/end_impl.hpp | 66 ++++++++++++++++----------------------
   trunk/boost/fusion/container/set/set.hpp | 10 ++--
   trunk/boost/fusion/container/set/set_fwd.hpp | 2 +
   trunk/boost/fusion/iterator/iterator_facade.hpp | 3 -
   trunk/boost/fusion/sequence/intrinsic/at_key.hpp | 21 ++++++++++-
   trunk/boost/fusion/sequence/intrinsic/has_key.hpp | 16 ++++++--
   trunk/boost/fusion/sequence/intrinsic/value_at_key.hpp | 10 ++++-
   trunk/boost/fusion/view/filter_view/detail/begin_impl.hpp | 5 +-
   trunk/boost/fusion/view/filter_view/detail/end_impl.hpp | 5 +-
   trunk/boost/fusion/view/filter_view/detail/next_impl.hpp | 21 +++++++++--
   trunk/boost/fusion/view/filter_view/filter_view.hpp | 12 ++++++
   trunk/boost/fusion/view/filter_view/filter_view_iterator.hpp | 28 +++++++++++++--
   trunk/boost/fusion/view/iterator_range/iterator_range.hpp | 1
   trunk/boost/fusion/view/joint_view/detail/begin_impl.hpp | 5 +-
   trunk/boost/fusion/view/joint_view/detail/next_impl.hpp | 5 +-
   trunk/boost/fusion/view/joint_view/joint_view.hpp | 14 +++++++
   trunk/boost/fusion/view/joint_view/joint_view_iterator.hpp | 9 +++-
   trunk/boost/fusion/view/reverse_view/reverse_view.hpp | 12 ++++++
   trunk/boost/fusion/view/reverse_view/reverse_view_iterator.hpp | 3 +
   trunk/libs/fusion/test/algorithm/erase_key.cpp | 4 +-
   trunk/libs/fusion/test/sequence/as_set.cpp | 2
   trunk/libs/fusion/test/sequence/filter_view.cpp | 39 +++++++++++++---------
   trunk/libs/fusion/test/sequence/iterator_range.cpp | 33 +++++++++++++++++++
   trunk/libs/fusion/test/sequence/joint_view.cpp | 45 +++++++++++++++++++++++++
   trunk/libs/fusion/test/sequence/map.cpp | 16 +++++++++
   trunk/libs/fusion/test/sequence/set.cpp | 18 +++++++++
   37 files changed, 436 insertions(+), 293 deletions(-)

Modified: trunk/boost/fusion/algorithm/iteration/detail/fold.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/iteration/detail/fold.hpp (original)
+++ trunk/boost/fusion/algorithm/iteration/detail/fold.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -56,7 +56,7 @@
     {
         typedef typename
         static_fold<
- typename result_of::next<First>::type
+ typename result_of::next<First>::type
             , Last
             , typename fold_apply<State, First, F>::type
             , F

Deleted: trunk/boost/fusion/algorithm/query/detail/assoc_find.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/query/detail/assoc_find.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,35 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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(FUSION_ASSOC_FIND_09242005_1133)
-#define FUSION_ASSOC_FIND_09242005_1133
-
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_const.hpp>
-
-namespace boost { namespace fusion { namespace detail
-{
- template <typename Sequence, typename Key>
- struct assoc_find
- {
- typedef typename
- mpl::if_<
- is_const<Sequence>
- , typename Sequence::template meta_find_impl_const<Key>::type
- , typename Sequence::template meta_find_impl<Key>::type
- >::type
- type;
-
- static type
- call(Sequence& s)
- {
- return s.find_impl(mpl::identity<Key>());
- }
- };
-}}}
-
-#endif

Modified: trunk/boost/fusion/algorithm/query/detail/find_if.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/query/detail/find_if.hpp (original)
+++ trunk/boost/fusion/algorithm/query/detail/find_if.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -1,6 +1,7 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
     Copyright (c) 2007 Dan Marsden
+ Copyright (c) 2009 Christopher Schmidt
 
     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)
@@ -13,7 +14,6 @@
 #include <boost/mpl/lambda.hpp>
 #include <boost/mpl/apply.hpp>
 #include <boost/mpl/identity.hpp>
-#include <boost/fusion/iterator/value_of.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/sequence/intrinsic/begin.hpp>
@@ -31,7 +31,7 @@
     struct apply_filter
     {
         typedef typename mpl::apply1<
- Pred, typename result_of::value_of<Iterator>::type>::type type;
+ Pred, Iterator>::type type;
         BOOST_STATIC_CONSTANT(int, value = type::value);
     };
 
@@ -85,7 +85,7 @@
         typedef typename
             mpl::apply1<
                 Pred
- , typename result_of::value_of<Shifted>::type
+ , Shifted
>::type
         type;
         BOOST_STATIC_CONSTANT(int, value = type::value);
@@ -227,26 +227,6 @@
             return choose_call(iter, typename traits::category_of<Iterator>::type());
         }
     };
-
- template <typename First, typename Last, typename Pred>
- struct static_seq_find_if : static_find_if<First, Last, Pred>
- {
- typedef typename static_find_if<First, Last, Pred>::type type;
-
- template <typename Sequence>
- static type
- call(Sequence const& seq)
- {
- return static_find_if<First, Last, Pred>::call(fusion::begin(seq));
- }
-
- template <typename Sequence>
- static type
- call(Sequence& seq)
- {
- return static_find_if<First, Last, Pred>::call(fusion::begin(seq));
- }
- };
 }}}
 
 #endif

Modified: trunk/boost/fusion/algorithm/query/find.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/query/find.hpp (original)
+++ trunk/boost/fusion/algorithm/query/find.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -8,10 +8,12 @@
 #define FUSION_FIND_05052005_1107
 
 #include <boost/fusion/algorithm/query/detail/find_if.hpp>
-#include <boost/fusion/algorithm/query/detail/assoc_find.hpp>
 #include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
 #include <boost/fusion/support/category_of.hpp>
+#include <boost/mpl/if.hpp>
 #include <boost/type_traits/is_same.hpp>
 #include <boost/type_traits/is_const.hpp>
 #include <boost/utility/enable_if.hpp>
@@ -25,29 +27,26 @@
         template <
             typename Sequence
           , typename T
- , bool is_associative_sequence = traits::is_associative<Sequence>::value >
- struct find;
-
- template <typename Sequence, typename T>
- struct find<Sequence, T, false>
+ >
+ struct find
         {
             typedef
- detail::static_seq_find_if<
+ detail::static_find_if<
                     typename result_of::begin<Sequence>::type
                   , typename result_of::end<Sequence>::type
- , is_same<mpl::_, T>
+ , is_same<
+ typename mpl::if_<
+ traits::is_associative<Sequence>
+ , key_of<mpl::_1>
+ , value_of<mpl::_1>
+ >::type
+ , T
+ >
>
             filter;
 
             typedef typename filter::type type;
         };
-
- template <typename Sequence, typename T>
- struct find<Sequence, T, true>
- {
- typedef detail::assoc_find<Sequence, T> filter;
- typedef typename filter::type type;
- };
     }
 
     template <typename T, typename Sequence>
@@ -59,7 +58,7 @@
     find(Sequence& seq)
     {
         typedef typename result_of::find<Sequence, T>::filter filter;
- return filter::call(seq);
+ return filter::call(fusion::begin(seq));
     }
 
     template <typename T, typename Sequence>
@@ -67,7 +66,7 @@
     find(Sequence const& seq)
     {
         typedef typename result_of::find<Sequence const, T>::filter filter;
- return filter::call(seq);
+ return filter::call(fusion::begin(seq));
     }
 }}
 

Modified: trunk/boost/fusion/algorithm/query/find_if.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/query/find_if.hpp (original)
+++ trunk/boost/fusion/algorithm/query/find_if.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -10,6 +10,10 @@
 #include <boost/fusion/algorithm/query/detail/find_if.hpp>
 #include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/quote.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <boost/type_traits/is_const.hpp>
 
@@ -20,13 +24,18 @@
         template <typename Sequence, typename Pred>
         struct find_if
         {
- typedef typename
+ typedef
                 detail::static_find_if<
                     typename result_of::begin<Sequence>::type
                   , typename result_of::end<Sequence>::type
- , Pred
- >::type
- type;
+ , mpl::bind1<
+ typename mpl::lambda<Pred>::type
+ , mpl::bind1<mpl::quote1<value_of>,mpl::_1>
+ >
+ >
+ filter;
+
+ typedef typename filter::type type;
         };
     }
 
@@ -38,14 +47,7 @@
>::type
     find_if(Sequence& seq)
     {
- typedef
- detail::static_find_if<
- typename result_of::begin<Sequence>::type
- , typename result_of::end<Sequence>::type
- , Pred
- >
- filter;
-
+ typedef typename result_of::find_if<Sequence, Pred>::filter filter;
         return filter::call(fusion::begin(seq));
     }
 
@@ -53,14 +55,7 @@
     inline typename result_of::find_if<Sequence const, Pred>::type const
     find_if(Sequence const& seq)
     {
- typedef
- detail::static_find_if<
- typename result_of::begin<Sequence const>::type
- , typename result_of::end<Sequence const>::type
- , Pred
- >
- filter;
-
+ typedef typename result_of::find_if<Sequence, Pred>::filter filter;
         return filter::call(fusion::begin(seq));
     }
 }}

Modified: trunk/boost/fusion/algorithm/transformation/erase_key.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/transformation/erase_key.hpp (original)
+++ trunk/boost/fusion/algorithm/transformation/erase_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -7,7 +7,7 @@
 #if !defined(FUSION_ERASE_KEY_10022005_1851)
 #define FUSION_ERASE_KEY_10022005_1851
 
-#include <boost/fusion/algorithm/query/detail/assoc_find.hpp>
+#include <boost/fusion/algorithm/query/find.hpp>
 #include <boost/fusion/algorithm/transformation/erase.hpp>
 #include <boost/mpl/not.hpp>
 #include <boost/type_traits/is_same.hpp>
@@ -18,18 +18,15 @@
     {
         template <typename Sequence, typename Key>
         struct erase_key
- {
- typedef detail::assoc_find<Sequence, Key> filter;
- typedef typename erase<Sequence, typename filter::type>::type type;
- };
+ : erase<Sequence, typename find<Sequence, Key>::type>
+ {};
     }
 
     template <typename Key, typename Sequence>
     inline typename result_of::erase_key<Sequence const, Key>::type
     erase_key(Sequence const& seq)
     {
- typedef typename result_of::erase_key<Sequence const, Key>::filter filter;
- return erase(seq, filter::call(seq));
+ return erase(seq, find<Key>(seq));
     }
 }}
 

Modified: trunk/boost/fusion/container/deque/deque.hpp
==============================================================================
--- trunk/boost/fusion/container/deque/deque.hpp (original)
+++ trunk/boost/fusion/container/deque/deque.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -45,6 +45,7 @@
         sequence_base<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)> >
     {
         typedef deque_tag fusion_tag;
+ typedef bidirectional_traversal_tag category;
         typedef typename detail::deque_keyed_values<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type base;
         typedef typename detail::deque_initial_size<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type size;
         typedef mpl::int_<size::value> next_up;

Deleted: trunk/boost/fusion/container/map/detail/at_key_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/at_key_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,49 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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(FUSION_AT_KEY_IMPL_05222005_0254)
-#define FUSION_AT_KEY_IMPL_05222005_0254
-
-#include <boost/fusion/support/detail/access.hpp>
-#include <boost/type_traits/is_const.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 typename Sequence::template meta_at_impl<Key> element;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , detail::cref_result<element>
- , detail::ref_result<element>
- >::type
- type;
-
- static type
- call(Sequence& m)
- {
- return m.at_impl(mpl::identity<Key>());
- }
- };
- };
- }
-}}
-
-#endif

Modified: trunk/boost/fusion/container/map/detail/begin_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/begin_impl.hpp (original)
+++ trunk/boost/fusion/container/map/detail/begin_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -1,56 +1,43 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
+ Copyright (c) 2009 Christopher Schmidt
 
- Distributed under the Boost Software License, Version 1.0. (See accompanying
+ 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(FUSION_BEGIN_IMPL_05222005_1108)
-#define FUSION_BEGIN_IMPL_05222005_1108
 
-#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
+#ifndef BOOST_FUSION_CONTAINER_MAP_DETAIL_BEGIN_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_BEGIN_IMPL_HPP
 
-namespace boost { namespace fusion
+#include <boost/fusion/iterator/basic_iterator.hpp>
+
+namespace boost { namespace fusion { namespace extension
 {
- struct map_tag;
+ template <typename>
+ struct begin_impl;
 
- namespace extension
+ template <>
+ struct begin_impl<map_tag>
     {
- template <typename Tag>
- struct begin_impl;
-
- template <>
- struct begin_impl<map_tag>
+ template <typename Seq>
+ struct apply
         {
- template <typename Sequence>
- struct apply
+ typedef
+ basic_iterator<
+ map_iterator_tag
+ , typename Seq::category
+ , Seq
+ , 0
+ >
+ type;
+
+ static type
+ call(Seq& seq)
             {
- typedef typename
- result_of::begin<typename Sequence::storage_type>::type
- iterator_type;
-
- typedef typename
- result_of::begin<typename Sequence::storage_type const>::type
- const_iterator_type;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , mpl::identity<const_iterator_type>
- , mpl::identity<iterator_type>
- >::type
- type;
-
- static type
- call(Sequence& m)
- {
- return fusion::begin(m.get_data());
- }
- };
+ return type(seq,0);
+ }
         };
- }
-}}
+ };
+}}}
 
 #endif

Added: trunk/boost/fusion/container/map/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/deref_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,48 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_MAP_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<map_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename result_of::value_of<It>::type::second_type data;
+
+ typedef typename
+ mpl::eval_if<
+ is_const<typename It::seq_type>
+ , detail::cref_result<mpl::identity<data> >
+ , detail::ref_result<mpl::identity<data> >
+ >::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return deref(it).second;
+ }
+ };
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/deref_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/deref_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,45 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_MAP_DETAIL_DEREF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_DEREF_IMPL_HPP
+
+#include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_impl;
+
+ template <>
+ struct deref_impl<map_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::at<
+ typename mpl::if_<
+ is_const<typename It::seq_type>
+ , typename It::seq_type::storage_type const
+ , typename It::seq_type::storage_type
+ >::type
+ , typename It::index
+ >::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return at<typename It::index>(it.seq->get_data());
+ }
+ };
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/container/map/detail/end_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/end_impl.hpp (original)
+++ trunk/boost/fusion/container/map/detail/end_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -1,53 +1,43 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
+ Copyright (c) 2009 Christopher Schmidt
 
- Distributed under the Boost Software License, Version 1.0. (See accompanying
+ 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(FUSION_END_IMPL_05222005_1108)
-#define FUSION_END_IMPL_05222005_1108
 
-#include <boost/fusion/sequence/intrinsic/end.hpp>
+#ifndef BOOST_FUSION_CONTAINER_MAP_DETAIL_END_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_END_IMPL_HPP
 
-namespace boost { namespace fusion
+#include <boost/fusion/iterator/basic_iterator.hpp>
+
+namespace boost { namespace fusion { namespace extension
 {
- struct map_tag;
+ template <typename>
+ struct end_impl;
 
- namespace extension
+ template <>
+ struct end_impl<map_tag>
     {
- template <typename Tag>
- struct end_impl;
-
- template <>
- struct end_impl<map_tag>
+ template <typename Seq>
+ struct apply
         {
- template <typename Sequence>
- struct apply
+ typedef
+ basic_iterator<
+ map_iterator_tag
+ , typename Seq::category
+ , Seq
+ , Seq::size::value
+ >
+ type;
+
+ static type
+ call(Seq& seq)
             {
- typedef typename
- result_of::end<typename Sequence::storage_type>::type
- iterator_type;
-
- typedef typename
- result_of::end<typename Sequence::storage_type const>::type
- const_iterator_type;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , mpl::identity<const_iterator_type>
- , mpl::identity<iterator_type>
- >::type
- type;
-
- static type
- call(Sequence& m)
- {
- return fusion::end(m.get_data());
- }
- };
+ return type(seq,0);
+ }
         };
- }
-}}
+ };
+}}}
 
 #endif

Added: trunk/boost/fusion/container/map/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/key_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_MAP_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_KEY_OF_IMPL_HPP
+
+#include <boost/fusion/container/map/detail/value_of_impl.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<map_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ value_of_impl<map_iterator_tag>::
+ template apply<It>::type::first_type
+ type;
+ };
+ };
+}}}
+
+#endif

Deleted: trunk/boost/fusion/container/map/detail/lookup_key.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/lookup_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,99 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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(FUSION_LOOKUP_KEY_07222005_1248)
-#define FUSION_LOOKUP_KEY_07222005_1248
-
-#include <boost/mpl/int.hpp>
-#include <boost/type_traits/add_const.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/fusion/support/detail/unknown_key.hpp>
-
-namespace boost { namespace fusion
-{
- struct void_;
-}}
-
-namespace boost { namespace fusion { namespace detail
-{
- template <typename T>
- struct map_data_type
- {
- typedef typename
- add_reference<
- typename T::second_type
- >::type
- type;
- };
-
- template <>
- struct map_data_type<void_>
- {
- typedef void_& type;
- };
-
- template <typename T>
- struct map_const_data_type
- {
- typedef typename
- add_reference<
- typename add_const<
- typename T::second_type
- >::type
- >::type
- type;
- };
-
- template <>
- struct map_const_data_type<void_>
- {
- typedef void_ const& type;
- };
-
- template <typename T>
- struct map_value_type
- {
- typedef typename T::second_type type;
- };
-
- template <>
- struct map_value_type<void_>
- {
- typedef void_ type;
- };
-
- template <typename T, int index>
- struct map_key_type
- {
- typedef typename T::first_type type;
- };
-
- template <int index>
- struct map_key_type<void_, index>
- {
- typedef unknown_key<index> type;
- };
-
- template <int index, typename RT, typename Key, typename Vector>
- struct map_lookup_key
- {
- static RT
- call(Vector& vec)
- {
- return vec.at_impl(mpl::int_<index>()).second;
- }
- };
-
- template <int index, typename Vector>
- struct map_lookup_key<index, void_&, unknown_key<index>, Vector>
- {
- static void_&
- call(Vector& vec); // intentionally undefined
- };
-}}}
-
-#endif
-

Deleted: trunk/boost/fusion/container/map/detail/map_lookup.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/map_lookup.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,128 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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_LOOKUP_07212005_1118)
-#define FUSION_MAP_LOOKUP_07212005_1118
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310)
-#pragma warning (push)
-#pragma warning(disable: 4348) // redefinition of default parameter
-#endif
-
- template <typename Key, typename dummy = int>
- struct meta_at_impl
- {
- typedef void_ type;
- };
-
- template <typename Key, typename dummy = int>
- struct meta_find_impl
- {
- typedef vector_iterator<storage_type, storage_type::size::value> type;
- };
-
- template <typename Key, typename dummy = int>
- struct meta_find_impl_const
- {
- typedef vector_iterator<storage_type const, storage_type::size::value> type;
- };
-
- template <typename Key>
- vector_iterator<storage_type const, storage_type::size::value>
- find_impl(mpl::identity<Key>) const
- {
- return vector_iterator<storage_type const, storage_type::size::value>(data);
- }
-
- template <typename Key>
- vector_iterator<storage_type, storage_type::size::value>
- find_impl(mpl::identity<Key>)
- {
- return vector_iterator<storage_type, storage_type::size::value>(data);
- }
-
-#define BOOST_PP_FILENAME_1 \
- <boost/fusion/container/map/detail/map_lookup.hpp>
-#define BOOST_PP_ITERATION_LIMITS (0, BOOST_PP_DEC(FUSION_MAX_MAP_SIZE))
-#include BOOST_PP_ITERATE()
-
-#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310)
-#pragma warning (pop)
-#endif
-
-#endif
-#else // defined(BOOST_PP_IS_ITERATING)
-///////////////////////////////////////////////////////////////////////////////
-//
-// Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#define N BOOST_PP_ITERATION()
-
- template <typename dummy>
- struct meta_at_impl<
- typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef typename detail::map_value_type<BOOST_PP_CAT(T, N)>::type type;
- };
-
- typename detail::map_data_type<BOOST_PP_CAT(T, N)>::type
- at_impl(mpl::identity<typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type>)
- {
- return detail::map_lookup_key<
- N
- , typename detail::map_data_type<BOOST_PP_CAT(T, N)>::type
- , typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type
- , storage_type>::call(data);
- }
-
- typename detail::map_const_data_type<BOOST_PP_CAT(T, N)>::type
- at_impl(mpl::identity<typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type>) const
- {
- return detail::map_lookup_key<
- N
- , typename detail::map_const_data_type<BOOST_PP_CAT(T, N)>::type
- , typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type
- , storage_type const>::call(data);
- }
-
- template <typename dummy>
- struct meta_find_impl<
- typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef vector_iterator<storage_type, N> type;
- };
-
- template <typename dummy>
- struct meta_find_impl_const<
- typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef vector_iterator<storage_type const, N> type;
- };
-
- vector_iterator<storage_type, N>
- find_impl(mpl::identity<typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type>)
- {
- return vector_iterator<storage_type, N>(data);
- }
-
- vector_iterator<storage_type const, N>
- find_impl(mpl::identity<typename detail::map_key_type<BOOST_PP_CAT(T, N), N>::type>) const
- {
- return vector_iterator<storage_type const, N>(data);
- }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-

Deleted: trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/map/detail/value_at_key_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,33 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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)
-==============================================================================*/
-#if !defined(FUSION_VALUE_AT_KEY_IMPL_05222005_0325)
-#define FUSION_VALUE_AT_KEY_IMPL_05222005_0325
-
-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 typename Sequence::
- template meta_at_impl<Key>::type type;
- };
- };
- }
-}}
-
-#endif

Added: trunk/boost/fusion/container/map/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/value_of_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,32 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_MAP_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_VALUE_OF_DATA_IMPL_HPP
+
+#include <boost/fusion/container/map/detail/value_of_impl.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<map_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ value_of_impl<map_iterator_tag>::
+ template apply<It>::type::second_type
+ type;
+ };
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/container/map/detail/value_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/map/detail/value_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,39 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_MAP_DETAIL_VALUE_OF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_MAP_DETAIL_VALUE_OF_IMPL_HPP
+
+#include <boost/fusion/sequence/intrinsic/value_at.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_impl;
+
+ template <>
+ struct value_of_impl<map_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::value_at<
+ typename mpl::if_<
+ is_const<typename It::seq_type>
+ , typename It::seq_type::storage_type const
+ , typename It::seq_type::storage_type
+ >::type
+ , typename It::index
+ >::type
+ 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 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -11,11 +11,13 @@
 #include <boost/fusion/support/category_of.hpp>
 #include <boost/fusion/support/detail/access.hpp>
 #include <boost/fusion/container/map/map_fwd.hpp>
-#include <boost/fusion/container/map/detail/lookup_key.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_key_impl.hpp>
-#include <boost/fusion/container/map/detail/value_at_key_impl.hpp>
+#include <boost/fusion/container/map/detail/value_of_impl.hpp>
+#include <boost/fusion/container/map/detail/deref_data_impl.hpp>
+#include <boost/fusion/container/map/detail/deref_impl.hpp>
+#include <boost/fusion/container/map/detail/key_of_impl.hpp>
+#include <boost/fusion/container/map/detail/value_of_data_impl.hpp>
 #include <boost/fusion/container/vector/vector.hpp>
 #include <boost/mpl/identity.hpp>
 #include <boost/mpl/bool.hpp>
@@ -23,7 +25,6 @@
 namespace boost { namespace fusion
 {
     struct void_;
- struct map_tag;
     struct fusion_sequence_tag;
 
     template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_MAP_SIZE, typename T)>
@@ -49,7 +50,6 @@
             : data(rhs) {}
 
         #include <boost/fusion/container/map/detail/map_forward_ctor.hpp>
- #include <boost/fusion/container/map/detail/map_lookup.hpp>
 
         template <typename T>
         map&

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 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -13,6 +13,8 @@
 namespace boost { namespace fusion
 {
     struct void_;
+ struct map_tag;
+ struct map_iterator_tag;
 
     template <
         BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(

Deleted: trunk/boost/fusion/container/set/detail/at_key_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/at_key_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,49 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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(FUSION_AT_KEY_IMPL_09162005_1118)
-#define FUSION_AT_KEY_IMPL_09162005_1118
-
-#include <boost/fusion/support/detail/access.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/mpl/identity.hpp>
-
-namespace boost { namespace fusion
-{
- struct set_tag;
-
- namespace extension
- {
- template <typename Tag>
- struct at_key_impl;
-
- template <>
- struct at_key_impl<set_tag>
- {
- template <typename Sequence, typename Key>
- struct apply
- {
- typedef typename Sequence::template meta_at_impl<Key> element;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , detail::cref_result<element>
- , detail::ref_result<element>
- >::type
- type;
-
- static type
- call(Sequence& s)
- {
- return s.at_impl(mpl::identity<Key>());
- }
- };
- };
- }
-}}
-
-#endif

Modified: trunk/boost/fusion/container/set/detail/begin_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/begin_impl.hpp (original)
+++ trunk/boost/fusion/container/set/detail/begin_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -1,56 +1,43 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
+ Copyright (c) 2009 Christopher Schmidt
 
- Distributed under the Boost Software License, Version 1.0. (See accompanying
+ 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(FUSION_BEGIN_IMPL_09162005_1120)
-#define FUSION_BEGIN_IMPL_09162005_1120
 
-#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
+#ifndef BOOST_FUSION_CONTAINER_SET_DETAIL_BEGIN_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_BEGIN_IMPL_HPP
 
-namespace boost { namespace fusion
+#include <boost/fusion/iterator/basic_iterator.hpp>
+
+namespace boost { namespace fusion { namespace extension
 {
- struct set_tag;
+ template <typename>
+ struct begin_impl;
 
- namespace extension
+ template <>
+ struct begin_impl<set_tag>
     {
- template <typename Tag>
- struct begin_impl;
-
- template <>
- struct begin_impl<set_tag>
+ template <typename Seq>
+ struct apply
         {
- template <typename Sequence>
- struct apply
+ typedef
+ basic_iterator<
+ set_iterator_tag
+ , typename Seq::category
+ , Seq
+ , 0
+ >
+ type;
+
+ static type
+ call(Seq& seq)
             {
- typedef typename
- result_of::begin<typename Sequence::storage_type>::type
- iterator_type;
-
- typedef typename
- result_of::begin<typename Sequence::storage_type const>::type
- const_iterator_type;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , mpl::identity<const_iterator_type>
- , mpl::identity<iterator_type>
- >::type
- type;
-
- static type
- call(Sequence& s)
- {
- return fusion::begin(s.get_data());
- }
- };
+ return type(seq,0);
+ }
         };
- }
-}}
+ };
+}}}
 
 #endif

Added: trunk/boost/fusion/container/set/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/set/detail/deref_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_SET_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/container/set/detail/deref_impl.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<set_iterator_tag>
+ : deref_impl<set_iterator_tag>
+ {};
+}}}
+
+#endif

Added: trunk/boost/fusion/container/set/detail/deref_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/set/detail/deref_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,45 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_SET_DETAIL_DEREF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_DEREF_IMPL_HPP
+
+#include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_impl;
+
+ template <>
+ struct deref_impl<set_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::at<
+ typename mpl::if_<
+ is_const<typename It::seq_type>
+ , typename It::seq_type::storage_type const
+ , typename It::seq_type::storage_type
+ >::type
+ , typename It::index
+ >::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return at<typename It::index>(it.seq->get_data());
+ }
+ };
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/container/set/detail/end_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/end_impl.hpp (original)
+++ trunk/boost/fusion/container/set/detail/end_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -1,53 +1,43 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
+ Copyright (c) 2009 Christopher Schmidt
 
- Distributed under the Boost Software License, Version 1.0. (See accompanying
+ 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(FUSION_END_IMPL_09162005_1121)
-#define FUSION_END_IMPL_09162005_1121
 
-#include <boost/fusion/sequence/intrinsic/end.hpp>
+#ifndef BOOST_FUSION_CONTAINER_SET_DETAIL_END_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_END_IMPL_HPP
 
-namespace boost { namespace fusion
+#include <boost/fusion/iterator/basic_iterator.hpp>
+
+namespace boost { namespace fusion { namespace extension
 {
- struct set_tag;
+ template <typename>
+ struct end_impl;
 
- namespace extension
+ template <>
+ struct end_impl<set_tag>
     {
- template <typename Tag>
- struct end_impl;
-
- template <>
- struct end_impl<set_tag>
+ template <typename Seq>
+ struct apply
         {
- template <typename Sequence>
- struct apply
+ typedef
+ basic_iterator<
+ set_iterator_tag
+ , typename Seq::category
+ , Seq
+ , Seq::size::value
+ >
+ type;
+
+ static type
+ call(Seq& seq)
             {
- typedef typename
- result_of::end<typename Sequence::storage_type>::type
- iterator_type;
-
- typedef typename
- result_of::end<typename Sequence::storage_type const>::type
- const_iterator_type;
-
- typedef typename
- mpl::eval_if<
- is_const<Sequence>
- , mpl::identity<const_iterator_type>
- , mpl::identity<iterator_type>
- >::type
- type;
-
- static type
- call(Sequence& s)
- {
- return fusion::end(s.get_data());
- }
- };
+ return type(seq,0);
+ }
         };
- }
-}}
+ };
+}}}
 
 #endif

Added: trunk/boost/fusion/container/set/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/set/detail/key_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_SET_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_KEY_OF_IMPL_HPP
+
+#include <boost/fusion/container/set/detail/value_of_data_impl.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<set_iterator_tag>
+ : value_of_impl<set_iterator_tag>
+ {};
+}}}
+
+#endif

Deleted: trunk/boost/fusion/container/set/detail/lookup_key.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/lookup_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,93 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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(FUSION_LOOKUP_KEY_09162005_1111)
-#define FUSION_LOOKUP_KEY_09162005_1111
-
-#include <boost/mpl/int.hpp>
-#include <boost/type_traits/add_const.hpp>
-#include <boost/type_traits/add_reference.hpp>
-#include <boost/fusion/support/detail/unknown_key.hpp>
-
-namespace boost { namespace fusion
-{
- struct void_;
-}}
-
-namespace boost { namespace fusion { namespace detail
-{
- template <typename T>
- struct set_data_type
- {
- typedef typename add_reference<T>::type type;
- };
-
- template <>
- struct set_data_type<void_>
- {
- typedef void_& type;
- };
-
- template <typename T>
- struct set_const_data_type
- {
- typedef typename
- add_reference<
- typename add_const<T>::type
- >::type
- type;
- };
-
- template <>
- struct set_const_data_type<void_>
- {
- typedef void_ const& type;
- };
-
- template <typename T>
- struct set_value_type
- {
- typedef T type;
- };
-
- template <>
- struct set_value_type<void_>
- {
- typedef void_ type;
- };
-
- template <typename T, int index>
- struct set_key_type
- {
- typedef T type;
- };
-
- template <int index>
- struct set_key_type<void_, index>
- {
- typedef unknown_key<index> type;
- };
-
- template <int index, typename RT, typename Key, typename Vector>
- struct set_lookup_key
- {
- static RT
- call(Vector& vec)
- {
- return vec.at_impl(mpl::int_<index>());
- }
- };
-
- template <int index, typename Vector>
- struct set_lookup_key<index, void_&, unknown_key<index>, Vector>
- {
- static void_&
- call(Vector& vec); // intentionally undefined
- };
-}}}
-
-#endif
-

Deleted: trunk/boost/fusion/container/set/detail/set_lookup.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/set_lookup.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,128 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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_SET_LOOKUP_09162005_1116)
-#define FUSION_SET_LOOKUP_09162005_1116
-
-#include <boost/preprocessor/iterate.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-
-#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310)
-#pragma warning (push)
-#pragma warning(disable: 4348) // redefinition of default parameter
-#endif
-
- template <typename Key, typename dummy = int>
- struct meta_at_impl
- {
- typedef void_ type;
- };
-
- template <typename Key, typename dummy = int>
- struct meta_find_impl
- {
- typedef vector_iterator<storage_type, storage_type::size::value> type;
- };
-
- template <typename Key, typename dummy = int>
- struct meta_find_impl_const
- {
- typedef vector_iterator<storage_type const, storage_type::size::value> type;
- };
-
- template <typename Key>
- vector_iterator<storage_type const, storage_type::size::value>
- find_impl(mpl::identity<Key>) const
- {
- return vector_iterator<storage_type const, storage_type::size::value>(data);
- }
-
- template <typename Key>
- vector_iterator<storage_type, storage_type::size::value>
- find_impl(mpl::identity<Key>)
- {
- return vector_iterator<storage_type, storage_type::size::value>(data);
- }
-
-#define BOOST_PP_FILENAME_1 \
- <boost/fusion/container/set/detail/set_lookup.hpp>
-#define BOOST_PP_ITERATION_LIMITS (0, BOOST_PP_DEC(FUSION_MAX_SET_SIZE))
-#include BOOST_PP_ITERATE()
-
-#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310)
-#pragma warning (pop)
-#endif
-
-#endif
-#else // defined(BOOST_PP_IS_ITERATING)
-///////////////////////////////////////////////////////////////////////////////
-//
-// Preprocessor vertical repetition code
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#define N BOOST_PP_ITERATION()
-
- template <typename dummy>
- struct meta_at_impl<
- typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef typename detail::set_value_type<BOOST_PP_CAT(T, N)>::type type;
- };
-
- typename detail::set_data_type<BOOST_PP_CAT(T, N)>::type
- at_impl(mpl::identity<typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type>)
- {
- return detail::set_lookup_key<
- N
- , typename detail::set_data_type<BOOST_PP_CAT(T, N)>::type
- , typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type
- , storage_type>::call(data);
- }
-
- typename detail::set_const_data_type<BOOST_PP_CAT(T, N)>::type
- at_impl(mpl::identity<typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type>) const
- {
- return detail::set_lookup_key<
- N
- , typename detail::set_const_data_type<BOOST_PP_CAT(T, N)>::type
- , typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type
- , storage_type const>::call(data);
- }
-
- template <typename dummy>
- struct meta_find_impl<
- typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef vector_iterator<storage_type, N> type;
- };
-
- template <typename dummy>
- struct meta_find_impl_const<
- typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type, dummy>
- {
- typedef vector_iterator<storage_type const, N> type;
- };
-
- vector_iterator<storage_type, N>
- find_impl(mpl::identity<typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type>)
- {
- return vector_iterator<storage_type, N>(data);
- }
-
- vector_iterator<storage_type const, N>
- find_impl(mpl::identity<typename detail::set_key_type<BOOST_PP_CAT(T, N), N>::type>) const
- {
- return vector_iterator<storage_type const, N>(data);
- }
-
-#undef N
-#endif // defined(BOOST_PP_IS_ITERATING)
-

Deleted: trunk/boost/fusion/container/set/detail/value_at_key_impl.hpp
==============================================================================
--- trunk/boost/fusion/container/set/detail/value_at_key_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
+++ (empty file)
@@ -1,35 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2006 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)
-==============================================================================*/
-#if !defined(FUSION_VALUE_AT_KEY_IMPL_09162005_1123)
-#define FUSION_VALUE_AT_KEY_IMPL_09162005_1123
-
-#include <boost/mpl/at.hpp>
-
-namespace boost { namespace fusion
-{
- struct set_tag;
-
- namespace extension
- {
- template <typename Tag>
- struct value_at_key_impl;
-
- template <>
- struct value_at_key_impl<set_tag>
- {
- template <typename Sequence, typename Key>
- struct apply
- {
- typedef typename Sequence::
- template meta_at_impl<Key>::type type;
- };
- };
- }
-}}
-
-#endif

Added: trunk/boost/fusion/container/set/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/set/detail/value_of_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,24 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_SET_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_VALUE_OF_DATA_IMPL_HPP
+
+#include <boost/fusion/container/set/detail/value_of_data_impl.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<set_iterator_tag>
+ : value_of_impl<set_iterator_tag>
+ {};
+}}}
+
+#endif

Added: trunk/boost/fusion/container/set/detail/value_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/container/set/detail/value_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_CONTAINER_SET_DETAIL_VALUE_OF_IMPL_HPP
+#define BOOST_FUSION_CONTAINER_SET_DETAIL_VALUE_OF_IMPL_HPP
+
+#include <boost/fusion/sequence/intrinsic/value_at.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_impl;
+
+ template <>
+ struct value_of_impl<set_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::value_at<
+ typename It::seq_type::storage_type
+ , typename It::index
+ >::type
+ type;
+ };
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/container/set/set.hpp
==============================================================================
--- trunk/boost/fusion/container/set/set.hpp (original)
+++ trunk/boost/fusion/container/set/set.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -11,11 +11,13 @@
 #include <boost/fusion/support/category_of.hpp>
 #include <boost/fusion/support/detail/access.hpp>
 #include <boost/fusion/container/set/set_fwd.hpp>
-#include <boost/fusion/container/set/detail/lookup_key.hpp>
 #include <boost/fusion/container/set/detail/begin_impl.hpp>
 #include <boost/fusion/container/set/detail/end_impl.hpp>
-#include <boost/fusion/container/set/detail/at_key_impl.hpp>
-#include <boost/fusion/container/set/detail/value_at_key_impl.hpp>
+#include <boost/fusion/container/set/detail/value_of_impl.hpp>
+#include <boost/fusion/container/set/detail/deref_data_impl.hpp>
+#include <boost/fusion/container/set/detail/deref_impl.hpp>
+#include <boost/fusion/container/set/detail/key_of_impl.hpp>
+#include <boost/fusion/container/set/detail/value_of_data_impl.hpp>
 #include <boost/fusion/container/vector/vector.hpp>
 #include <boost/mpl/identity.hpp>
 #include <boost/mpl/bool.hpp>
@@ -23,7 +25,6 @@
 namespace boost { namespace fusion
 {
     struct void_;
- struct set_tag;
     struct fusion_sequence_tag;
 
     template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_SET_SIZE, typename T)>
@@ -49,7 +50,6 @@
             : data(rhs) {}
 
         #include <boost/fusion/container/set/detail/set_forward_ctor.hpp>
- #include <boost/fusion/container/set/detail/set_lookup.hpp>
 
         template <typename T>
         set&

Modified: trunk/boost/fusion/container/set/set_fwd.hpp
==============================================================================
--- trunk/boost/fusion/container/set/set_fwd.hpp (original)
+++ trunk/boost/fusion/container/set/set_fwd.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -13,6 +13,8 @@
 namespace boost { namespace fusion
 {
     struct void_;
+ struct set_tag;
+ struct set_iterator_tag;
 
     template <
         BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(

Added: trunk/boost/fusion/iterator/basic_iterator.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/iterator/basic_iterator.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,136 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_ITERATOR_BASIC_ITERATOR_HPP
+#define BOOST_FUSION_ITERATOR_BASIC_ITERATOR_HPP
+
+#include <boost/fusion/iterator/iterator_facade.hpp>
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+namespace boost { namespace fusion
+{
+ namespace extension
+ {
+ template <typename>
+ struct value_of_impl;
+
+ template <typename>
+ struct deref_impl;
+
+ template <typename>
+ struct value_of_data_impl;
+
+ template <typename>
+ struct key_of_impl;
+
+ template <typename>
+ struct deref_data_impl;
+ }
+
+ template<typename Tag, typename Category, typename Seq, int Index>
+ struct basic_iterator
+ : iterator_facade<basic_iterator<Tag,Category,Seq,Index>, Category>
+ {
+ typedef mpl::int_<Index> index;
+ typedef Seq seq_type;
+
+ template <typename It>
+ struct value_of
+ : extension::value_of_impl<Tag>::template apply<It>
+ {};
+
+ template <typename It>
+ struct deref
+ : extension::deref_impl<Tag>::template apply<It>
+ {};
+
+ template <typename It>
+ struct value_of_data
+ : extension::value_of_data_impl<Tag>::template apply<It>
+ {};
+
+ template <typename It>
+ struct key_of
+ : extension::key_of_impl<Tag>::template apply<It>
+ {};
+
+ template <typename It>
+ struct deref_data
+ : extension::deref_data_impl<Tag>::template apply<It>
+ {};
+
+ template <typename It, typename N>
+ struct advance
+ {
+ typedef
+ basic_iterator<Tag, Category, Seq, Index + N::value>
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return type(*it.seq,0);
+ }
+ };
+
+ template <typename It>
+ struct next
+ : advance<It, mpl::int_<1> >
+ {};
+
+ template <typename It>
+ struct prior
+ : advance<It, mpl::int_<-1> >
+ {};
+
+ template <typename It1, typename It2>
+ struct distance
+ : mpl::minus<
+ typename It2::index
+ , typename It1::index
+ >
+ {};
+
+ template <typename It1, typename It2>
+ struct equal_to
+ : mpl::and_<
+ is_same<
+ typename remove_const<typename It1::seq_type>::type
+ , typename remove_const<typename It2::seq_type>::type
+ >
+ , mpl::equal_to<typename It1::index,typename It2::index>
+ >
+ {};
+
+ template<typename OtherSeq>
+ basic_iterator(basic_iterator<Tag,Category,OtherSeq,Index> const& it)
+ : seq(it.seq)
+ {}
+
+ basic_iterator(Seq& seq, int)
+ : seq(&seq)
+ {}
+
+ template<typename OtherSeq>
+ basic_iterator&
+ operator=(basic_iterator<Tag,Category,OtherSeq,Index> const& it)
+ {
+ seq=it.seq;
+ return *this;
+ }
+
+ Seq* seq;
+ };
+}}
+
+#endif

Added: trunk/boost/fusion/iterator/deref_data.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/iterator/deref_data.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,49 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_ITERATOR_DEREF_DATA_HPP
+#define BOOST_FUSION_ITERATOR_DEREF_DATA_HPP
+
+#include <boost/fusion/support/tag_of.hpp>
+
+namespace boost { namespace fusion
+{
+ struct iterator_facade_tag;
+
+ namespace extension
+ {
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<iterator_facade_tag>
+ {
+ template <typename It>
+ struct apply
+ : It::template deref_data<It>
+ {};
+ };
+ }
+
+ namespace result_of
+ {
+ template <typename It>
+ struct deref_data
+ : extension::deref_data_impl<typename traits::tag_of<It>::type>::
+ template apply<It>
+ {};
+ }
+
+ template <typename It>
+ typename result_of::deref_data<It>::type
+ deref_data(It const& it)
+ {
+ return result_of::deref_data<It>::call(it);
+ }
+}}
+
+#endif

Modified: trunk/boost/fusion/iterator/iterator_facade.hpp
==============================================================================
--- trunk/boost/fusion/iterator/iterator_facade.hpp (original)
+++ trunk/boost/fusion/iterator/iterator_facade.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -50,8 +50,7 @@
         template <typename First, typename Last>
         struct distance :
             distance_detail::linear_distance<First, Last>
- {
- };
+ {};
     };
 }}
 

Added: trunk/boost/fusion/iterator/key_of.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/iterator/key_of.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_ITERATOR_KEY_OF_HPP
+#define BOOST_FUSION_ITERATOR_KEY_OF_HPP
+
+#include <boost/fusion/support/tag_of.hpp>
+
+namespace boost { namespace fusion
+{
+ struct iterator_facade_tag;
+
+ namespace extension
+ {
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<iterator_facade_tag>
+ {
+ template <typename It>
+ struct apply
+ : It::template key_of<It>
+ {};
+ };
+ }
+
+ namespace result_of
+ {
+ template <typename It>
+ struct key_of
+ : extension::key_of_impl<typename traits::tag_of<It>::type>::
+ template apply<It>
+ {};
+ }
+}}
+
+#endif

Added: trunk/boost/fusion/iterator/value_of_data.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/iterator/value_of_data.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,42 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_ITERATOR_VALUE_OF_DATA_HPP
+#define BOOST_FUSION_ITERATOR_VALUE_OF_DATA_HPP
+
+#include <boost/fusion/support/tag_of.hpp>
+
+namespace boost { namespace fusion
+{
+ struct iterator_facade_tag;
+
+ namespace extension
+ {
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<iterator_facade_tag>
+ {
+ template <typename It>
+ struct apply
+ : It::template value_of_data<It>
+ {};
+ };
+ }
+
+ namespace result_of
+ {
+ template <typename It>
+ struct value_of_data
+ : extension::value_of_data_impl<typename traits::tag_of<It>::type>::
+ template apply<It>
+ {};
+ }
+}}
+
+#endif

Modified: trunk/boost/fusion/sequence/intrinsic/at_key.hpp
==============================================================================
--- trunk/boost/fusion/sequence/intrinsic/at_key.hpp (original)
+++ trunk/boost/fusion/sequence/intrinsic/at_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -9,6 +9,8 @@
 #define BOOST_FUSION_AT_KEY_20060304_1755
 
 #include <boost/type_traits/is_const.hpp>
+#include <boost/fusion/algorithm/query/find.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
 #include <boost/fusion/support/tag_of.hpp>
 #include <boost/fusion/support/detail/access.hpp>
 
@@ -25,15 +27,28 @@
         template <typename Tag>
         struct at_key_impl
         {
- template <typename Sequence, typename Key>
- struct apply;
+ template <typename Seq, typename Key>
+ struct apply
+ {
+ typedef typename
+ result_of::deref_data<
+ typename result_of::find<Seq, Key>::type
+ >::type
+ type;
+
+ static type
+ call(Seq& seq)
+ {
+ return fusion::deref_data(fusion::find<Key>(seq));
+ }
+ };
         };
 
         template <>
         struct at_key_impl<sequence_facade_tag>
         {
             template <typename Sequence, typename Key>
- struct apply : Sequence::template at_key<Sequence, Key> {};
+ struct apply : Sequence::template at_key_impl<Sequence, Key> {};
         };
 
         template <>

Modified: trunk/boost/fusion/sequence/intrinsic/has_key.hpp
==============================================================================
--- trunk/boost/fusion/sequence/intrinsic/has_key.hpp (original)
+++ trunk/boost/fusion/sequence/intrinsic/has_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -7,9 +7,11 @@
 #if !defined(FUSION_HAS_KEY_09232005_1454)
 #define FUSION_HAS_KEY_09232005_1454
 
-#include <boost/mpl/not.hpp>
 #include <boost/fusion/support/tag_of.hpp>
-#include <boost/type_traits/is_same.hpp>
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/algorithm/query/find.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/mpl/not.hpp>
 
 namespace boost { namespace fusion
 {
@@ -26,10 +28,14 @@
         template <typename Tag>
         struct has_key_impl
         {
- template <typename Sequence, typename Key>
+ template <typename Seq, typename Key>
             struct apply
- : mpl::not_<is_same<typename Sequence::
- template meta_at_impl<Key>::type, void_> >
+ : mpl::not_<
+ typename result_of::equal_to<
+ typename result_of::find<Seq, Key>::type
+ , typename result_of::end<Seq>::type
+ >::type
+ >::type
             {};
         };
 

Modified: trunk/boost/fusion/sequence/intrinsic/value_at_key.hpp
==============================================================================
--- trunk/boost/fusion/sequence/intrinsic/value_at_key.hpp (original)
+++ trunk/boost/fusion/sequence/intrinsic/value_at_key.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -9,6 +9,8 @@
 #define FUSION_VALUE_AT_KEY_05052005_0229
 
 #include <boost/mpl/int.hpp>
+#include <boost/fusion/iterator/value_of_data.hpp>
+#include <boost/fusion/algorithm/query/find.hpp>
 #include <boost/fusion/support/tag_of.hpp>
 
 namespace boost { namespace fusion
@@ -24,8 +26,12 @@
         template <typename Tag>
         struct value_at_key_impl
         {
- template <typename Sequence, typename Key>
- struct apply;
+ template <typename Seq, typename Key>
+ struct apply
+ : result_of::value_of_data<
+ typename result_of::find<Seq, Key>::type
+ >
+ {};
         };
 
         template <>

Modified: trunk/boost/fusion/view/filter_view/detail/begin_impl.hpp
==============================================================================
--- trunk/boost/fusion/view/filter_view/detail/begin_impl.hpp (original)
+++ trunk/boost/fusion/view/filter_view/detail/begin_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -11,7 +11,7 @@
 {
     struct filter_view_tag;
 
- template <typename First, typename Last, typename Pred>
+ template <typename Category, typename First, typename Last, typename Pred>
     struct filter_iterator;
 
     namespace extension
@@ -28,7 +28,8 @@
                 typedef typename Sequence::first_type first_type;
                 typedef typename Sequence::last_type last_type;
                 typedef typename Sequence::pred_type pred_type;
- typedef filter_iterator<first_type, last_type, pred_type> type;
+ typedef typename Sequence::category category;
+ typedef filter_iterator<category, first_type, last_type, pred_type> type;
 
                 static type
                 call(Sequence& s)

Added: trunk/boost/fusion/view/filter_view/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/filter_view/detail/deref_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_FILTER_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_FILTER_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/deref_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<filter_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::deref_data<typename It::first_type>::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return fusion::deref_data(it.first);
+ }
+ };
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/filter_view/detail/end_impl.hpp
==============================================================================
--- trunk/boost/fusion/view/filter_view/detail/end_impl.hpp (original)
+++ trunk/boost/fusion/view/filter_view/detail/end_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -11,7 +11,7 @@
 {
     struct filter_view_tag;
 
- template <typename First, typename Last, typename Pred>
+ template <typename Category, typename First, typename Last, typename Pred>
     struct filter_iterator;
 
     namespace extension
@@ -27,7 +27,8 @@
             {
                 typedef typename Sequence::last_type last_type;
                 typedef typename Sequence::pred_type pred_type;
- typedef filter_iterator<last_type, last_type, pred_type> type;
+ typedef typename Sequence::category category;
+ typedef filter_iterator<category,last_type, last_type, pred_type> type;
 
                 static type
                 call(Sequence& s)

Added: trunk/boost/fusion/view/filter_view/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/filter_view/detail/key_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_FILTER_VIEW_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_VIEW_FILTER_VIEW_DETAIL_KEY_OF_IMPL_HPP
+
+#include <boost/fusion/iterator/key_of.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<filter_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::key_of<typename It::first_type>
+ {};
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/filter_view/detail/next_impl.hpp
==============================================================================
--- trunk/boost/fusion/view/filter_view/detail/next_impl.hpp (original)
+++ trunk/boost/fusion/view/filter_view/detail/next_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -8,14 +8,19 @@
 #define FUSION_NEXT_IMPL_06052005_0900
 
 #include <boost/fusion/algorithm/query/detail/find_if.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/identity.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/quote.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/placeholders.hpp>
 
 namespace boost { namespace fusion
 {
     struct filter_view_iterator_tag;
 
- template <typename First, typename Last, typename Pred>
+ template <typename Category, typename First, typename Last, typename Pred>
     struct filter_iterator;
 
     namespace extension
@@ -32,6 +37,7 @@
                 typedef typename Iterator::first_type first_type;
                 typedef typename Iterator::last_type last_type;
                 typedef typename Iterator::pred_type pred_type;
+ typedef typename Iterator::category category;
 
                 typedef typename
                     mpl::eval_if<
@@ -41,12 +47,19 @@
>::type
                 next_type;
 
- typedef typename detail::static_find_if<
- next_type, last_type, pred_type>
+ typedef typename
+ detail::static_find_if<
+ next_type
+ , last_type
+ , mpl::bind1<
+ typename mpl::lambda<pred_type>::type
+ , mpl::bind1<mpl::quote1<result_of::value_of>,mpl::_1>
+ >
+ >
                 filter;
 
                 typedef filter_iterator<
- typename filter::type, last_type, pred_type>
+ category, typename filter::type, last_type, pred_type>
                 type;
 
                 static type

Added: trunk/boost/fusion/view/filter_view/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/filter_view/detail/value_of_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_FILTER_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_FILTER_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/value_of_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<filter_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::value_of_data<typename It::first_type>
+ {};
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/filter_view/filter_view.hpp
==============================================================================
--- trunk/boost/fusion/view/filter_view/filter_view.hpp (original)
+++ trunk/boost/fusion/view/filter_view/filter_view.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -17,6 +17,10 @@
 #include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/fusion/sequence/intrinsic/end.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/inherit.hpp>
+#include <boost/mpl/identity.hpp>
+
 
 namespace boost { namespace fusion
 {
@@ -29,7 +33,13 @@
     {
         typedef filter_view_tag fusion_tag;
         typedef fusion_sequence_tag tag; // this gets picked up by MPL
- typedef forward_traversal_tag category;
+ typedef typename
+ mpl::eval_if<
+ traits::is_associative<Sequence>
+ , mpl::inherit2<forward_traversal_tag,associative_sequence_tag>
+ , mpl::identity<forward_traversal_tag>
+ >::type
+ category;
         typedef mpl::true_ is_view;
 
         typedef typename result_of::begin<Sequence>::type first_type;

Modified: trunk/boost/fusion/view/filter_view/filter_view_iterator.hpp
==============================================================================
--- trunk/boost/fusion/view/filter_view/filter_view_iterator.hpp (original)
+++ trunk/boost/fusion/view/filter_view/filter_view_iterator.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -9,20 +9,29 @@
 
 #include <boost/fusion/iterator/mpl/convert_iterator.hpp>
 #include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
 #include <boost/fusion/support/iterator_base.hpp>
+#include <boost/fusion/algorithm/query/detail/find_if.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/quote.hpp>
+#include <boost/mpl/bind.hpp>
+#include <boost/mpl/placeholders.hpp>
+
 #include <boost/fusion/view/filter_view/detail/deref_impl.hpp>
 #include <boost/fusion/view/filter_view/detail/next_impl.hpp>
 #include <boost/fusion/view/filter_view/detail/value_of_impl.hpp>
 #include <boost/fusion/view/filter_view/detail/equal_to_impl.hpp>
-#include <boost/fusion/algorithm/query/detail/find_if.hpp>
+#include <boost/fusion/view/filter_view/detail/deref_data_impl.hpp>
+#include <boost/fusion/view/filter_view/detail/value_of_data_impl.hpp>
+#include <boost/fusion/view/filter_view/detail/key_of_impl.hpp>
 
 namespace boost { namespace fusion
 {
     struct filter_view_iterator_tag;
     struct forward_traversal_tag;
 
- template <typename First, typename Last, typename Pred>
- struct filter_iterator : iterator_base<filter_iterator<First, Last, Pred> >
+ template <typename Category, typename First, typename Last, typename Pred>
+ struct filter_iterator : iterator_base<filter_iterator<Category, First, Last, Pred> >
     {
         typedef convert_iterator<First> first_converter;
         typedef typename first_converter::type first_iter;
@@ -30,8 +39,17 @@
         typedef typename last_converter::type last_iter;
 
         typedef filter_view_iterator_tag fusion_tag;
- typedef forward_traversal_tag category;
- typedef detail::static_find_if<first_iter, last_iter, Pred> filter;
+ typedef Category category;
+ typedef
+ detail::static_find_if<
+ first_iter
+ , last_iter
+ , mpl::bind1<
+ typename mpl::lambda<Pred>::type
+ , mpl::bind1<mpl::quote1<result_of::value_of>,mpl::_1>
+ >
+ >
+ filter;
         typedef typename filter::type first_type;
         typedef last_iter last_type;
         typedef Pred pred_type;

Modified: trunk/boost/fusion/view/iterator_range/iterator_range.hpp
==============================================================================
--- trunk/boost/fusion/view/iterator_range/iterator_range.hpp (original)
+++ trunk/boost/fusion/view/iterator_range/iterator_range.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -17,7 +17,6 @@
 #include <boost/fusion/view/iterator_range/detail/at_impl.hpp>
 #include <boost/fusion/view/iterator_range/detail/value_at_impl.hpp>
 #include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
-#include <boost/mpl/bool.hpp>
 
 namespace boost { namespace fusion
 {

Modified: trunk/boost/fusion/view/joint_view/detail/begin_impl.hpp
==============================================================================
--- trunk/boost/fusion/view/joint_view/detail/begin_impl.hpp (original)
+++ trunk/boost/fusion/view/joint_view/detail/begin_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -14,7 +14,7 @@
 {
     struct joint_view_tag;
 
- template <typename First, typename Last, typename Concat>
+ template <typename Category, typename First, typename Last, typename Concat>
     struct joint_view_iterator;
 
     namespace extension
@@ -31,13 +31,14 @@
                 typedef typename Sequence::first_type first_type;
                 typedef typename Sequence::last_type last_type;
                 typedef typename Sequence::concat_type concat_type;
+ typedef typename Sequence::category category;
                 typedef result_of::equal_to<first_type, last_type> equal_to;
 
                 typedef typename
                     mpl::if_<
                         equal_to
                       , concat_type
- , joint_view_iterator<first_type, last_type, concat_type>
+ , joint_view_iterator<category, first_type, last_type, concat_type>
>::type
                 type;
 

Added: trunk/boost/fusion/view/joint_view/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/joint_view/detail/deref_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_JOINT_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_JOINT_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/deref_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<joint_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::deref_data<typename It::first_type>::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return fusion::deref_data(it.first);
+ }
+ };
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/view/joint_view/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/joint_view/detail/key_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_JOINT_VIEW_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_VIEW_JOINT_VIEW_DETAIL_KEY_OF_IMPL_HPP
+
+#include <boost/fusion/iterator/key_of.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<joint_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::key_of<typename It::first_type>
+ {};
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/joint_view/detail/next_impl.hpp
==============================================================================
--- trunk/boost/fusion/view/joint_view/detail/next_impl.hpp (original)
+++ trunk/boost/fusion/view/joint_view/detail/next_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -15,7 +15,7 @@
 {
     struct joint_view_iterator_tag;
 
- template <typename First, typename Last, typename Concat>
+ template <typename Category, typename First, typename Last, typename Concat>
     struct joint_view_iterator;
 
     namespace extension
@@ -32,6 +32,7 @@
                 typedef typename Iterator::first_type first_type;
                 typedef typename Iterator::last_type last_type;
                 typedef typename Iterator::concat_type concat_type;
+ typedef typename Iterator::category category;
                 typedef typename result_of::next<first_type>::type next_type;
                 typedef result_of::equal_to<next_type, last_type> equal_to;
 
@@ -39,7 +40,7 @@
                     mpl::if_<
                         equal_to
                       , concat_type
- , joint_view_iterator<next_type, last_type, concat_type>
+ , joint_view_iterator<category, next_type, last_type, concat_type>
>::type
                 type;
 

Added: trunk/boost/fusion/view/joint_view/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/joint_view/detail/value_of_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_JOINT_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_JOINT_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/value_of_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<joint_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::value_of_data<typename It::first_type>
+ {};
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/joint_view/joint_view.hpp
==============================================================================
--- trunk/boost/fusion/view/joint_view/joint_view.hpp (original)
+++ trunk/boost/fusion/view/joint_view/joint_view.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -19,6 +19,9 @@
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/plus.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/inherit.hpp>
+#include <boost/mpl/identity.hpp>
 
 namespace boost { namespace fusion
 {
@@ -31,7 +34,16 @@
     {
         typedef joint_view_tag fusion_tag;
         typedef fusion_sequence_tag tag; // this gets picked up by MPL
- typedef forward_traversal_tag category;
+ typedef typename
+ mpl::eval_if<
+ mpl::and_<
+ traits::is_associative<Sequence1>
+ , traits::is_associative<Sequence2>
+ >
+ , mpl::inherit2<forward_traversal_tag,associative_sequence_tag>
+ , mpl::identity<forward_traversal_tag>
+ >::type
+ category;
         typedef mpl::true_ is_view;
 
         typedef typename result_of::begin<Sequence1>::type first_type;

Modified: trunk/boost/fusion/view/joint_view/joint_view_iterator.hpp
==============================================================================
--- trunk/boost/fusion/view/joint_view/joint_view_iterator.hpp (original)
+++ trunk/boost/fusion/view/joint_view/joint_view_iterator.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -14,6 +14,9 @@
 #include <boost/fusion/view/joint_view/detail/deref_impl.hpp>
 #include <boost/fusion/view/joint_view/detail/next_impl.hpp>
 #include <boost/fusion/view/joint_view/detail/value_of_impl.hpp>
+#include <boost/fusion/view/joint_view/detail/deref_data_impl.hpp>
+#include <boost/fusion/view/joint_view/detail/value_of_data_impl.hpp>
+#include <boost/fusion/view/joint_view/detail/key_of_impl.hpp>
 #include <boost/static_assert.hpp>
 
 namespace boost { namespace fusion
@@ -21,9 +24,9 @@
     struct joint_view_iterator_tag;
     struct forward_traversal_tag;
 
- template <typename First, typename Last, typename Concat>
+ template <typename Category, typename First, typename Last, typename Concat>
     struct joint_view_iterator
- : iterator_base<joint_view_iterator<First, Last, Concat> >
+ : iterator_base<joint_view_iterator<Category, First, Last, Concat> >
     {
         typedef convert_iterator<First> first_converter;
         typedef convert_iterator<Last> last_converter;
@@ -34,7 +37,7 @@
         typedef typename concat_converter::type concat_type;
 
         typedef joint_view_iterator_tag fusion_tag;
- typedef forward_traversal_tag category;
+ typedef Category category;
         BOOST_STATIC_ASSERT((!result_of::equal_to<first_type, last_type>::value));
 
         joint_view_iterator(First const& first, Concat const& concat)

Added: trunk/boost/fusion/view/reverse_view/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/reverse_view/detail/deref_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,37 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_REVERSE_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_REVERSE_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/deref_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct deref_data_impl;
+
+ template <>
+ struct deref_data_impl<reverse_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ {
+ typedef typename
+ result_of::deref_data<typename It::first_type>::type
+ type;
+
+ static type
+ call(It const& it)
+ {
+ return fusion::deref_data(it.first);
+ }
+ };
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/view/reverse_view/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/reverse_view/detail/key_of_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_REVERSE_VIEW_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_VIEW_REVERSE_VIEW_DETAIL_KEY_OF_IMPL_HPP
+
+#include <boost/fusion/iterator/key_of.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct key_of_impl;
+
+ template <>
+ struct key_of_impl<reverse_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::key_of<typename It::it_type>
+ {};
+ };
+}}}
+
+#endif

Added: trunk/boost/fusion/view/reverse_view/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/view/reverse_view/detail/value_of_data_impl.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -0,0 +1,28 @@
+/*=============================================================================
+ Copyright (c) 2009 Christopher Schmidt
+
+ 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_FUSION_VIEW_REVERSE_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_REVERSE_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/value_of_data.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+ template <typename>
+ struct value_of_data_impl;
+
+ template <>
+ struct value_of_data_impl<reverse_view_iterator_tag>
+ {
+ template <typename It>
+ struct apply
+ : result_of::value_of_data<typename It::first_type>
+ {};
+ };
+}}}
+
+#endif

Modified: trunk/boost/fusion/view/reverse_view/reverse_view.hpp
==============================================================================
--- trunk/boost/fusion/view/reverse_view/reverse_view.hpp (original)
+++ trunk/boost/fusion/view/reverse_view/reverse_view.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -20,6 +20,9 @@
 #include <boost/type_traits/is_base_of.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/inherit.hpp>
+#include <boost/mpl/identity.hpp>
 
 namespace boost { namespace fusion
 {
@@ -32,8 +35,15 @@
         typedef reverse_view_tag fusion_tag;
         typedef fusion_sequence_tag tag; // this gets picked up by MPL
         typedef mpl::true_ is_view;
+ typedef typename traits::category_of<Sequence>::type seq_category;
 
- typedef typename traits::category_of<Sequence>::type category;
+ typedef typename
+ mpl::eval_if<
+ traits::is_associative<Sequence>
+ , mpl::inherit2<seq_category,associative_sequence_tag>
+ , mpl::identity<seq_category>
+ >::type
+ category;
         typedef typename result_of::begin<Sequence>::type first_type;
         typedef typename result_of::end<Sequence>::type last_type;
         typedef typename result_of::size<Sequence>::type size;

Modified: trunk/boost/fusion/view/reverse_view/reverse_view_iterator.hpp
==============================================================================
--- trunk/boost/fusion/view/reverse_view/reverse_view_iterator.hpp (original)
+++ trunk/boost/fusion/view/reverse_view/reverse_view_iterator.hpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -17,6 +17,9 @@
 #include <boost/fusion/view/reverse_view/detail/advance_impl.hpp>
 #include <boost/fusion/view/reverse_view/detail/distance_impl.hpp>
 #include <boost/fusion/view/reverse_view/detail/value_of_impl.hpp>
+#include <boost/fusion/view/reverse_view/detail/deref_data_impl.hpp>
+#include <boost/fusion/view/reverse_view/detail/value_of_data_impl.hpp>
+#include <boost/fusion/view/reverse_view/detail/key_of_impl.hpp>
 #include <boost/type_traits/is_base_of.hpp>
 #include <boost/static_assert.hpp>
 

Modified: trunk/libs/fusion/test/algorithm/erase_key.cpp
==============================================================================
--- trunk/libs/fusion/test/algorithm/erase_key.cpp (original)
+++ trunk/libs/fusion/test/algorithm/erase_key.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -66,8 +66,8 @@
     std::cout << tuple_close(']');
     std::cout << tuple_delimiter(", ");
 
- test_set(as_set(erase_key<char>(make_set(1, 'x', 1.5, std::string("hello")))));
- test_map(as_map(erase_key<_2>(make_map<_1, _2, _3, _4>(1, 'x', 1.5, "hello"))));
+ test_set(erase_key<char>(make_set(1, 'x', 1.5, std::string("hello"))));
+ test_map(erase_key<_2>(make_map<_1, _2, _3, _4>(1, 'x', 1.5, "hello")));
 
     return boost::report_errors();
 }

Modified: trunk/libs/fusion/test/sequence/as_set.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/as_set.cpp (original)
+++ trunk/libs/fusion/test/sequence/as_set.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -33,7 +33,7 @@
         std::cout << as_set(make_list(1, 1.23, "harru")) << std::endl;
         std::cout << as_set(push_back(empty, 999)) << std::endl;
         
- BOOST_TEST(as_list(as_set(make_list(1, 1.23, "harru")))
+ BOOST_TEST(as_list(as_set(make_list(1, 1.23, "harru")))
             == make_list(1, 1.23, std::string("harru")));
         BOOST_TEST(as_list(as_set(push_back(empty, 999)))
             == push_back(empty, 999));

Modified: trunk/libs/fusion/test/sequence/filter_view.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/filter_view.cpp (original)
+++ trunk/libs/fusion/test/sequence/filter_view.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -13,6 +13,12 @@
 #include <boost/fusion/view/filter_view/filter_view.hpp>
 #include <boost/fusion/container/generation/make_vector.hpp>
 #include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/fusion/container/map.hpp>
+#include <boost/fusion/sequence/intrinsic/has_key.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/value_of_data.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
 #include <boost/type_traits/is_class.hpp>
 #include <boost/type_traits/is_same.hpp>
 #include <boost/mpl/arg.hpp>
@@ -62,22 +68,6 @@
     std::cout << tuple_close(']');
     std::cout << tuple_delimiter(", ");
 
- { // Testing the static find_if (internal function)
-
- typedef vector<int, char, long, X> vector_type;
-
- vector_type v(1, 'x', 987654, X());
- typedef vector_iterator<vector_type, 0> begin;
- typedef vector_iterator<vector_type, 4> end;
- typedef detail::static_find_if<begin, end, is_same<_, long> > filter;
- typedef filter::type type;
-
- BOOST_TEST(*type(v) == 987654);
- std::cout << *type(v) << std::endl;
- std::cout << *filter::call(begin(v)) << std::endl;
- BOOST_TEST(*type(v) == *filter::call(begin(v)));
- }
-
     {
         typedef vector<Y, char, long, X, bool, double> vector_type;
 
@@ -115,6 +105,23 @@
         BOOST_MPL_ASSERT((result_of::equal_to<result_of::begin<filter_view_type>::type, result_of::end<filter_view_type>::type>));
     }
 
+ {
+ typedef map<pair<void, int>, pair<double, std::string> > map_type;
+ map_type m(make_pair<void>(0), make_pair<double>("Bond"));
+
+ typedef filter_view<map_type const, is_same<_, pair<double, std::string> > > filter_view_type;
+ filter_view_type f(m);
+
+ BOOST_MPL_ASSERT((result_of::has_key<filter_view_type, double>::type));
+ BOOST_MPL_ASSERT_NOT((result_of::has_key<filter_view_type, void>::type));
+
+ BOOST_MPL_ASSERT((is_same<result_of::key_of<result_of::begin<filter_view_type>::type>::type, double>));
+ BOOST_MPL_ASSERT((is_same<result_of::value_of_data<result_of::begin<filter_view_type>::type>::type, std::string>));
+
+ std::cout << deref_data(begin(f)) << std::endl;
+ BOOST_TEST((deref_data(begin(f)) == "Bond"));
+ }
+
     return boost::report_errors();
 }
 

Modified: trunk/libs/fusion/test/sequence/iterator_range.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/iterator_range.cpp (original)
+++ trunk/libs/fusion/test/sequence/iterator_range.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -5,15 +5,23 @@
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 ==============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/container/map.hpp>
 #include <boost/fusion/container/vector/vector.hpp>
 #include <boost/fusion/container/generation/make_vector.hpp>
 #include <boost/fusion/view/iterator_range/iterator_range.hpp>
 #include <boost/fusion/sequence/comparison/equal_to.hpp>
 #include <boost/fusion/sequence/io/out.hpp>
 #include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/has_key.hpp>
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/value_of_data.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
 #include <boost/mpl/vector_c.hpp>
 #include <boost/mpl/begin.hpp>
 #include <boost/mpl/next.hpp>
+#include <boost/mpl/assert.hpp>
 #include <boost/static_assert.hpp>
 
 int
@@ -76,6 +84,31 @@
         BOOST_STATIC_ASSERT(result_of::size<slice_t>::value == 2);
     }
 
+ {
+ typedef map<pair<void,std::string>, pair<double,char>,pair<void*, int> > map_type;
+ map_type m(make_pair<void>("foo"), make_pair<double>('x'), make_pair<void*>(2));
+
+ typedef iterator_range<
+ result_of::begin<map_type>::type
+ , result_of::advance_c<result_of::begin<map_type>::type,2>::type
+ > range_type;
+ range_type r(begin(m), advance_c<2>(begin(m)));
+
+ BOOST_MPL_ASSERT((result_of::has_key<range_type, void>::type));
+ BOOST_MPL_ASSERT((result_of::has_key<range_type, double>::type));
+
+ BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::begin<range_type>::type>::type, void>));
+ BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::next<result_of::begin<range_type>::type>::type>::type, double>));
+
+ BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::begin<range_type>::type>::type, std::string>));
+ BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::next<result_of::begin<range_type>::type>::type>::type, char>));
+
+ std::cout << deref_data(begin(r)) << std::endl;
+ std::cout << deref_data(next(begin(r))) << std::endl;
+ BOOST_TEST((deref_data(begin(r)) == "foo"));
+ BOOST_TEST((deref_data(next(begin(r))) == 'x'));
+ }
+
     return boost::report_errors();
 }
 

Modified: trunk/libs/fusion/test/sequence/joint_view.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/joint_view.cpp (original)
+++ trunk/libs/fusion/test/sequence/joint_view.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -5,13 +5,22 @@
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 ==============================================================================*/
 #include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/container/map.hpp>
+#include <boost/fusion/container/set.hpp>
 #include <boost/fusion/container/vector/vector.hpp>
 #include <boost/fusion/view/joint_view/joint_view.hpp>
 #include <boost/fusion/sequence/io/out.hpp>
 #include <boost/fusion/sequence/comparison/equal_to.hpp>
 #include <boost/fusion/container/generation/make_vector.hpp>
 #include <boost/fusion/sequence/intrinsic/at.hpp>
-#include <boost/mpl/vector_c.hpp>
+#include <boost/fusion/sequence/intrinsic/has_key.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
+#include <boost/mpl/assert.hpp>
+#include <string>
 
 struct X
 {
@@ -139,6 +148,40 @@
         }
     }
 
+ {
+ typedef map<pair<void,int> > map_type;
+ map_type m(make_pair<void>(0));
+
+ typedef set<std::string, float> set_type;
+ set_type s("foo", 1.3f);
+
+ typedef joint_view<map_type, set_type> joint_view_type;
+ joint_view_type j(m,s);
+
+ BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, void>::type));
+ BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, std::string>::type));
+ BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, float>::type));
+
+ BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::begin<joint_view_type>::type>::type, void>));
+ BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::next<result_of::begin<joint_view_type>::type>::type>::type, std::string>));
+ BOOST_MPL_ASSERT((boost::is_same<
+ result_of::key_of<result_of::next<result_of::next<result_of::begin<joint_view_type>::type>::type>::type>::type
+ , float>));
+
+ BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::begin<joint_view_type>::type>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::next<result_of::begin<joint_view_type>::type>::type>::type, std::string>));
+ BOOST_MPL_ASSERT((boost::is_same<
+ result_of::value_of_data<result_of::next<result_of::next<result_of::begin<joint_view_type>::type>::type>::type>::type
+ , float>));
+
+ std::cout << deref_data(begin(j)) << std::endl;
+ std::cout << deref_data(boost::fusion::next(begin(j))) << std::endl;
+ std::cout << deref_data(next(boost::fusion::next(begin(j)))) << std::endl;
+ BOOST_TEST((deref_data(begin(j)) == 0));
+ BOOST_TEST((deref_data(boost::fusion::next(begin(j))) == "foo"));
+ BOOST_TEST((deref_data(next(boost::fusion::next(begin(j)))) == 1.3f));
+ }
+
     return boost::report_errors();
 }
 

Modified: trunk/libs/fusion/test/sequence/map.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/map.cpp (original)
+++ trunk/libs/fusion/test/sequence/map.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -10,7 +10,12 @@
 #include <boost/fusion/sequence/intrinsic/at_key.hpp>
 #include <boost/fusion/sequence/intrinsic/value_at_key.hpp>
 #include <boost/fusion/sequence/intrinsic/has_key.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/fusion/sequence/io/out.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
+#include <boost/fusion/iterator/value_of_data.hpp>
+#include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/support/pair.hpp>
 #include <boost/fusion/support/category_of.hpp>
 #include <boost/static_assert.hpp>
@@ -59,6 +64,17 @@
         BOOST_STATIC_ASSERT((result_of::has_key<map_type, int>::value));
         BOOST_STATIC_ASSERT((result_of::has_key<map_type, double>::value));
         BOOST_STATIC_ASSERT((!result_of::has_key<map_type, std::string>::value));
+
+ std::cout << deref_data(begin(m)) << std::endl;
+ std::cout << deref_data(next(begin(m))) << std::endl;
+
+ BOOST_TEST(deref_data(begin(m)) == 'X');
+ BOOST_TEST(deref_data(next(begin(m))) == "Men");
+
+ BOOST_STATIC_ASSERT((is_same<result_of::key_of<result_of::begin<map_type>::type>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::key_of<result_of::next<result_of::begin<map_type>::type>::type>::type, double>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::value_of_data<result_of::begin<map_type>::type>::type, char>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::value_of_data<result_of::next<result_of::begin<map_type>::type>::type>::type, std::string>::value));
     }
     
     {

Modified: trunk/libs/fusion/test/sequence/set.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/set.cpp (original)
+++ trunk/libs/fusion/test/sequence/set.cpp 2009-10-25 18:59:54 EDT (Sun, 25 Oct 2009)
@@ -10,7 +10,12 @@
 #include <boost/fusion/sequence/intrinsic/at_key.hpp>
 #include <boost/fusion/sequence/intrinsic/value_at_key.hpp>
 #include <boost/fusion/sequence/intrinsic/has_key.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
 #include <boost/fusion/sequence/io/out.hpp>
+#include <boost/fusion/iterator/key_of.hpp>
+#include <boost/fusion/iterator/deref_data.hpp>
+#include <boost/fusion/iterator/value_of_data.hpp>
+#include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/support/pair.hpp>
 #include <boost/fusion/support/category_of.hpp>
 #include <boost/static_assert.hpp>
@@ -48,12 +53,23 @@
             boost::is_same<result_of::value_at_key<set_type, int>::type, int>::value));
         BOOST_STATIC_ASSERT((
             boost::is_same<result_of::value_at_key<set_type, std::string>::type, std::string>::value));
-
+
         std::cout << m << std::endl;
 
         BOOST_STATIC_ASSERT((result_of::has_key<set_type, int>::value));
         BOOST_STATIC_ASSERT((result_of::has_key<set_type, std::string>::value));
         BOOST_STATIC_ASSERT((!result_of::has_key<set_type, double>::value));
+
+ std::cout << deref_data(begin(m)) << std::endl;
+ std::cout << deref_data(next(begin(m))) << std::endl;
+
+ BOOST_TEST(deref_data(begin(m)) == 123);
+ BOOST_TEST(deref_data(next(begin(m))) == "Hola");
+
+ BOOST_STATIC_ASSERT((is_same<result_of::key_of<result_of::begin<set_type>::type>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::key_of<result_of::next<result_of::begin<set_type>::type>::type>::type, std::string>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::value_of_data<result_of::begin<set_type>::type>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<result_of::value_of_data<result_of::next<result_of::begin<set_type>::type>::type>::type, std::string>::value));
     }
     
     {


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