$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56193 - in sandbox/SOC/2009/fusion: boost/fusion/algorithm/transformation boost/fusion/view/transform_view boost/fusion/view/transform_view/detail libs/fusion/example/test
From: mr.chr.schmidt_at_[hidden]
Date: 2009-09-14 15:58:22
Author: cschmidt
Date: 2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
New Revision: 56193
URL: http://svn.boost.org/trac/boost/changeset/56193
Log:
associative transform_view
Added:
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_data_impl.hpp   (contents, props changed)
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/key_of_impl.hpp   (contents, props changed)
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/value_of_data_impl.hpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2009/fusion/boost/fusion/algorithm/transformation/transform.hpp                 |   101 ++++++++++++++++++++++++++++++++--      
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/advance_impl.hpp            |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/begin_impl.hpp              |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_impl.hpp              |     1                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/end_impl.hpp                |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/next_impl.hpp               |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/prior_impl.hpp              |     2                                         
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/transform_view_iterator.hpp |    46 ++++++++++++++--                        
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view.hpp                 |    24 +++++++-                                
   sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view_fwd.hpp             |     8 +-                                      
   sandbox/SOC/2009/fusion/libs/fusion/example/test/main.cpp                                   |   114 +++++++++++---------------------------- 
   11 files changed, 200 insertions(+), 104 deletions(-)
Modified: sandbox/SOC/2009/fusion/boost/fusion/algorithm/transformation/transform.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/algorithm/transformation/transform.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/algorithm/transformation/transform.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -22,7 +22,12 @@
 
     namespace result_of
     {
-        template <typename Seq1, typename Seq2, typename F = void_>
+        template<
+            typename Seq1
+          , typename Seq2
+          , typename F=mpl::false_
+          , typename IsAssociative=mpl::false_
+        >
         struct transform
         {
             BOOST_FUSION_MPL_ASSERT((traits::is_sequence<Seq1>));
@@ -31,22 +36,64 @@
             BOOST_FUSION_MPL_ASSERT((traits::is_forward<Seq2>));
 
             typedef
-                transform_view<Seq1, Seq2, typename traits::deduce<F>::type>
+                transform_view<
+                    Seq1
+                  , Seq2
+                  , typename traits::deduce<F>::type
+                  , IsAssociative
+                >
             type;
         };
 
         template <typename Seq, typename F>
-#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
-        struct transform<Seq, F, void_>
-#else
-        struct transform<Seq, F>
-#endif
+        struct transform<Seq, F, mpl::false_, mpl::false_>
         {
             BOOST_FUSION_MPL_ASSERT((traits::is_sequence<Seq>));
             BOOST_FUSION_MPL_ASSERT((traits::is_forward<Seq>));
 
-            typedef transform_view<Seq, typename traits::deduce<F>::type> type;
+            typedef
+                transform_view<
+                    Seq
+                  , typename traits::deduce<F>::type
+                  , mpl::false_
+                >
+            type;
         };
+
+        template <typename Seq, typename F>
+        struct transform<Seq, F, mpl::true_, mpl::false_>
+        {
+            BOOST_FUSION_MPL_ASSERT((traits::is_sequence<Seq>));
+            BOOST_FUSION_MPL_ASSERT((traits::is_forward<Seq>));
+
+            typedef
+                transform_view<
+                    Seq
+                  , typename traits::deduce<F>::type
+                  , mpl::true_
+                >
+            type;
+        };
+    }
+
+    //TODO boost config macro for default arguments for function templates
+
+    template <typename IsAssociative,typename Seq, typename F>
+    inline typename
+        result_of::transform<
+            BOOST_FUSION_R_ELSE_CLREF(Seq)
+          , BOOST_FUSION_R_ELSE_CLREF(F)
+          , IsAssociative
+        >::type
+    transform(BOOST_FUSION_R_ELSE_CLREF(Seq) seq,
+            BOOST_FUSION_R_ELSE_CLREF(F) f)
+    {
+        return typename
+            result_of::transform<
+                BOOST_FUSION_R_ELSE_CLREF(Seq)
+              , BOOST_FUSION_R_ELSE_CLREF(F)
+              , IsAssociative
+            >::type(BOOST_FUSION_FORWARD(Seq,seq), BOOST_FUSION_FORWARD(F,f));
     }
 
     template <typename Seq, typename F>
@@ -66,6 +113,21 @@
     }
 
 #ifdef BOOST_NO_RVALUE_REFERENCES
+    template <typename IsAssociative,typename Seq, typename F>
+    inline typename result_of::transform<Seq&, F const&>::type
+    transform(Seq& seq, F const& f)
+    {
+#ifdef BOOST_MSVC
+#   pragma warning(push)
+#   pragma warning(disable: 4180)
+#endif
+        return typename
+            result_of::transform<Seq&, F const&,IsAssociative>::type(seq, f);
+#ifdef BOOST_MSVC
+#   pragma warning(pop)
+#endif
+    }
+
     template <typename Seq, typename F>
     inline typename result_of::transform<Seq&, F const&>::type
     transform(Seq& seq, F const& f)
@@ -82,6 +144,29 @@
 #endif
 
 #define BOOST_FUSION_TRANSFORM_BINARY(SEQ1_CV_REF_MODIFIER,SEQ2_CV_REF_MODIFIER)\
+    template <typename IsAssociative,typename Seq1, typename Seq2, typename F>\
+    inline typename\
+        result_of::transform<\
+            Seq1 SEQ1_CV_REF_MODIFIER\
+          , Seq2 SEQ2_CV_REF_MODIFIER\
+          , BOOST_FUSION_R_ELSE_CLREF(F)\
+          , IsAssociative\
+        >::type\
+    transform(Seq1 SEQ1_CV_REF_MODIFIER seq1\
+          , Seq2 SEQ2_CV_REF_MODIFIER seq2\
+          , BOOST_FUSION_R_ELSE_CLREF(F) f)\
+    {\
+        return typename\
+            result_of::transform<\
+                Seq1 SEQ1_CV_REF_MODIFIER\
+              , Seq2 SEQ2_CV_REF_MODIFIER\
+              , BOOST_FUSION_R_ELSE_CLREF(F)\
+              , IsAssociative\
+            >::type(BOOST_FUSION_FORWARD(Seq1 SEQ1_CV_REF_MODIFIER,seq1)\
+                  , BOOST_FUSION_FORWARD(Seq2 SEQ2_CV_REF_MODIFIER,seq2)\
+                  , BOOST_FUSION_FORWARD(F,f));\
+    }\
+    \
     template <typename Seq1, typename Seq2, typename F>\
     inline typename\
         result_of::transform<\
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/advance_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/advance_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/advance_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -29,6 +29,7 @@
                 transform_view_iterator<
                     typename result_of::advance<typename it::it_type, N>::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
@@ -54,6 +55,7 @@
                     typename result_of::advance<typename it::it1_type, N>::type
                   , typename result_of::advance<typename it::it2_type, N>::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/begin_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/begin_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/begin_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -34,6 +34,7 @@
                         Seq
                       , typename seq::transform_type
                     >::type
+                  , typename seq::is_associative
                 >
             type;
 
@@ -62,6 +63,7 @@
                         Seq
                       , typename seq::transform_type
                     >::type
+                  , typename seq::is_associative
                 >
             type;
 
Added: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_data_impl.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_data_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -0,0 +1,89 @@
+/*=============================================================================
+    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_TRANSFORM_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_TRANSFORM_VIEW_DETAIL_DEREF_DATA_IMPL_HPP
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/support/internal/result_of.hpp>
+
+namespace boost { namespace fusion { namespace extension
+{
+    template <typename>
+    struct deref_data_impl;
+
+    // Unary Version
+    template <>
+    struct deref_data_impl<transform_view_iterator_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename detail::remove_reference<It>::type it;
+            typedef typename
+                boost::result_of<
+                    typename detail::get_func_base<
+                        typename it::transform_type
+                    >::type(
+                    typename result_of::deref<typename it::it_type>::type)
+                >::type
+            result_pair;
+
+            typedef typename
+                detail::forward_as<
+                    result_pair
+                  , typename detail::remove_reference<
+                        result_pair
+                    >::type::second_type
+                >::type
+            type;
+
+            static type
+            call(It it)
+            {
+                return (*it.f)(fusion::deref(it.it)).second;
+            }
+        };
+    };
+
+    // Binary Version
+    template <>
+    struct deref_data_impl<transform_view_iterator2_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename detail::remove_reference<It>::type it;
+            typedef typename
+                boost::result_of<
+                    typename detail::get_func_base<
+                        typename it::transform_type
+                    >::type(
+                    typename result_of::deref<typename it::it1_type>::type
+                  , typename result_of::deref<typename it::it2_type>::type)
+                >::type
+            result_pair;
+
+            typedef typename
+                detail::forward_as<
+                    result_pair
+                  , typename detail::remove_reference<result_pair>::second_type
+                >::type
+            type;
+
+            static type
+            call(It it)
+            {
+                return (*it.f)
+                    (fusion::deref(it.it1), fusion::deref(it.it2)).second;
+            }
+        };
+    };
+}}}
+
+#endif
+
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/deref_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -9,7 +9,6 @@
 #define BOOST_FUSION_VIEW_TRANSFORM_VIEW_DETAIL_DEREF_IMPL_HPP
 
 #include <boost/fusion/iterator/deref.hpp>
-#include <boost/fusion/iterator/value_of.hpp>
 #include <boost/fusion/support/internal/result_of.hpp>
 
 namespace boost { namespace fusion { namespace extension
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/end_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/end_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/end_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -32,6 +32,7 @@
                         Seq
                       , typename seq::transform_type
                     >::type
+                  , typename seq::is_associative
                 >
             type;
 
@@ -60,6 +61,7 @@
                         Seq
                       , typename seq::transform_type
                     >::type
+                  , typename seq::is_associative
                 >
             type;
 
Added: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/key_of_impl.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/key_of_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -0,0 +1,43 @@
+/*=============================================================================
+    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_TRANSFORM_VIEW_DETAIL_KEY_OF_IMPL_HPP
+#define BOOST_FUSION_VIEW_TRANSFORM_VIEW_DETAIL_KEY_OF_IMPL_HPP
+
+namespace boost { namespace fusion { namespace extension
+{
+    template <typename>
+    struct key_of_impl;
+
+    template <>
+    struct key_of_impl<transform_view_iterator_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename
+                value_of_impl<transform_view_iterator_tag>::
+                    template apply<It>::type::first_type
+            type;
+        };
+    };
+
+    template <>
+    struct key_of_impl<transform_view_iterator2_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename
+                value_of_impl<transform_view_iterator2_tag>::
+                    template apply<It>::first_type
+            type;
+        };
+    };
+}}}
+
+#endif
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/next_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/next_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/next_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -30,6 +30,7 @@
                         typename it::it_type
                     >::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
@@ -59,6 +60,7 @@
                         typename it::it2_type
                     >::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/prior_impl.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/prior_impl.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/prior_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -31,6 +31,7 @@
                         typename it::it_type
                     >::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
@@ -62,6 +63,7 @@
                         typename it::it2_type
                     >::type
                   , typename it::transform_type
+                  , typename it::is_associative
                 >
             type;
 
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/transform_view_iterator.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/transform_view_iterator.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/transform_view_iterator.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -18,15 +18,33 @@
     // Unary Version
     struct transform_view_iterator_tag;
 
-    template <typename It, typename FRef>
+    template <typename It, typename FRef, typename IsAssociative>
     struct transform_view_iterator
-      : iterator_base<transform_view_iterator<It, FRef> >
+      : iterator_base<transform_view_iterator<It, FRef, IsAssociative> >
     {
         typedef FRef transform_type;
         typedef It it_type;
+        typedef typename
+            mpl::eval_if<
+                traits::is_random_access<it_type>
+              , mpl::identity<random_access_traversal_tag>
+              , mpl::if_<
+                    traits::is_bidirectional<it_type>
+                  , bidirectional_traversal_tag
+                  , forward_traversal_tag
+                >
+            >::type
+        it_category;
+        typedef IsAssociative is_associative;
 
         typedef transform_view_iterator_tag fusion_tag;
-        typedef typename traits::category_of<it_type>::type category;
+        typedef typename
+            mpl::eval_if<
+                is_associative
+              , mpl::inherit2<it_category,associative_sequence_tag>
+              , mpl::identity<it_category>
+            >::type
+        category;
 
         template<typename OtherIt>
         transform_view_iterator(BOOST_FUSION_R_ELSE_CLREF(OtherIt) it)
@@ -59,16 +77,32 @@
     // Binary Version
     struct transform_view_iterator2_tag;
 
-    template <typename It1, typename It2, typename FRef>
+    template <typename It1, typename It2, typename FRef, typename IsAssociative>
     struct transform_view_iterator2
-      : iterator_base<transform_view_iterator2<It1, It2, FRef> >
+      : iterator_base<transform_view_iterator2<It1, It2, FRef, IsAssociative> >
     {
         typedef It1 it1_type;
         typedef It2 it2_type;
         typedef FRef transform_type;
+        typedef typename
+            detail::strictest_traversal<
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+                fusion::vector2<it1_type, it2_type>
+#else
+                fusion::vector<it1_type, it2_type>
+#endif
+            >::type
+        strictest_traversal;
+        typedef IsAssociative is_associative;
 
         typedef transform_view_iterator2_tag fusion_tag;
-        typedef typename traits::category_of<it1_type>::type category;
+        typedef typename
+            mpl::eval_if<
+                IsAssociative
+              , mpl::inherit2<strictest_traversal,associative_sequence_tag>
+              , mpl::identity<strictest_traversal>
+            >::type
+        category;
 
         template<typename OtherIt>
         transform_view_iterator2(
Added: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/value_of_data_impl.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/detail/value_of_data_impl.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -0,0 +1,43 @@
+/*=============================================================================
+    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_TRANSFORM_VIEW_DETAIL_VALUE_OF_DATA_IMPL_HPP
+#define BOOST_FUSION_VIEW_TRANSFORM_VIEW_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<transform_view_iterator_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename
+                value_of_impl<transform_view_iterator_tag>::
+                    template apply<It>::type::second_type
+            type;
+        };
+    };
+
+    template <>
+    struct value_of_data_impl<transform_view_iterator2_tag>
+    {
+        template <typename It>
+        struct apply
+        {
+            typedef typename
+                value_of_impl<transform_view_iterator2_tag>::
+                    template apply<It>::second_type
+            type;
+        };
+    };
+}}}
+
+#endif
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -25,6 +25,7 @@
 #include <boost/fusion/view/detail/strictest_traversal.hpp>
 #include <boost/fusion/view/detail/view_storage.hpp>
 
+#include <boost/mpl/if.hpp>
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/inherit.hpp>
 #include <boost/mpl/identity.hpp>
@@ -42,9 +43,12 @@
 #include <boost/fusion/view/transform_view/detail/begin_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/end_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/deref_impl.hpp>
+#include <boost/fusion/view/transform_view/detail/deref_data_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/next_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/prior_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/value_of_impl.hpp>
+#include <boost/fusion/view/transform_view/detail/value_of_data_impl.hpp>
+#include <boost/fusion/view/transform_view/detail/key_of_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/advance_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/distance_impl.hpp>
 #include <boost/fusion/view/transform_view/detail/equal_to_impl.hpp>
@@ -59,7 +63,7 @@
     //TODO IsAssociative
 
     // Binary Version
-    template <typename Seq1, typename Seq2, typename F, typename IsAssociative>
+    template<typename Seq1, typename Seq2, typename F, typename IsAssociative>
     struct transform_view
       : sequence_base<transform_view<Seq1, Seq2, F,IsAssociative> >
     {
@@ -70,6 +74,7 @@
         BOOST_FUSION_MPL_ASSERT((
             mpl::equal_to<result_of::size<Seq1>,result_of::size<Seq2> >));
 
+        typedef IsAssociative is_associative;
         typedef detail::view_storage<Seq1> storage1_type;
         typedef typename storage1_type::type seq1_type;
         typedef detail::view_storage<Seq2> storage2_type;
@@ -90,7 +95,7 @@
         typedef mpl::true_ is_view;
         typedef typename
             mpl::eval_if<
-                IsAssociative
+                is_associative
               , mpl::inherit2<strictest_traversal,associative_sequence_tag>
               , mpl::identity<strictest_traversal>
             >::type
@@ -148,14 +153,25 @@
         BOOST_FUSION_MPL_ASSERT((traits::is_sequence<Seq>));
         BOOST_FUSION_MPL_ASSERT((traits::is_forward<Seq>));
 
+        typedef IsAssociative is_associative;
         typedef detail::view_storage<Seq> storage_type;
         typedef typename storage_type::type seq_type;
-        typedef typename traits::category_of<seq_type>::type seq_category;
+        typedef typename
+            mpl::eval_if<
+                traits::is_random_access<seq_type>
+              , mpl::identity<random_access_traversal_tag>
+              , mpl::if_<
+                    traits::is_bidirectional<seq_type>
+                  , bidirectional_traversal_tag
+                  , forward_traversal_tag
+                >
+            >::type
+        seq_category;
         typedef F transform_type;
 
         typedef typename
             mpl::eval_if<
-                IsAssociative
+                is_associative
               , mpl::inherit2<seq_category,associative_sequence_tag>
               , mpl::identity<seq_category>
             >::type
Modified: sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view_fwd.hpp
==============================================================================
--- sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view_fwd.hpp	(original)
+++ sandbox/SOC/2009/fusion/boost/fusion/view/transform_view/transform_view_fwd.hpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -17,10 +17,10 @@
     struct transform_view2_tag;
 
     template<
-        typename A
-      , typename B
-      , typename C = mpl::false_
-      , typename D = mpl::false_
+        typename Seq1
+      , typename Seq2
+      , typename F=mpl::false_
+      , typename IsAssociative=mpl::false_
     >
     struct transform_view;
 }}
Modified: sandbox/SOC/2009/fusion/libs/fusion/example/test/main.cpp
==============================================================================
--- sandbox/SOC/2009/fusion/libs/fusion/example/test/main.cpp	(original)
+++ sandbox/SOC/2009/fusion/libs/fusion/example/test/main.cpp	2009-09-14 15:58:20 EDT (Mon, 14 Sep 2009)
@@ -19,88 +19,9 @@
 
 namespace fusion=boost::fusion;
 
-struct dummy
-{
-    int i;
-
-    dummy()
-      : i(0)
-    {}
-
-    template<typename T>
-    dummy(T const& t)
-      : i(t.i)
-    {}
-
-    template<typename T,typename T2>
-    dummy(T,T2)
-      : i(0)
-    {}
-};
-
-struct dummy2
-{
-    int i;
-
-    dummy2()
-      : i(0)
-    {}
-
-    template<class T>
-    dummy2(T const& t)
-      : i(t.i)
-    {}
-};
-
-void assign_test()
-{
-    using namespace fusion;
-
-    dummy d;
-
-    {
-        fusion::pair<int,std::string> a("test");
-    }
-
-    {
-        vector<int> vec(0);
-        vector<int> vec2(vec);
-        vector<int> vec3(sequence_assign(vec));
-        vector<long> vec4(vec);
-    }
-
-    {
-        vector<dummy> vec(d);
-        vector<dummy> vec2(vec);
-        vector<dummy> vec3(sequence_assign(vec));
-        //vector<dummy2> vec4(vec);
-        vector<dummy2> vec5(sequence_assign(vec));
-    }
-
-    {
-        vector<int,dummy> vec(0,d);
-        vector<int,dummy> vec2(vec);
-        vector<int,dummy> vec3(sequence_assign(vec));
-        vector<int,dummy2> vec4(vec);
-        vector<int,dummy2> vec5(sequence_assign(vec));
-        vector<long,dummy2> vec6(vec);
-    }
-
-    {
-        single_view<int> view(0);
-        single_view<int> view2(view);
-        single_view<int> view3(sequence_assign(view));
-        single_view<long> view4(view);
-    }
-
-    map<pair<int,int> > m(make_pair<int>(0));
-}
-
 #if defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_NO_VARIADIC_TEMPLATES)
 int main()
-{
-    assign_test();
-}
+{}
 #else
 #include <type_traits>
 #include <utility>
@@ -207,9 +128,40 @@
 struct C
 {};
 
+struct make_associative
+{
+    template<typename Sig>
+    struct result;
+
+    template<typename Self, typename Arg>
+    struct result<Self(Arg)>
+    {
+        typedef
+            fusion::pair<
+                typename fusion::detail::remove_reference<Arg>::type
+              , Arg
+            >
+        type;
+    };
+
+    template<typename Arg>
+    typename result<make_associative(Arg&&)>::type
+    operator()(Arg&& arg)
+    {
+        return typename result<make_associative(Arg&&)>::type(arg);
+    }
+};
+
 int main()
 {
-    assign_test();
+    {
+        using namespace fusion;
+
+        fusion::at_key<int>(
+            transform<boost::mpl::true_>(
+                make_vector(0,0.0f),
+                make_associative()));
+    }
 
     {
         using namespace fusion;