summaryrefslogtreecommitdiff
path: root/libs/fusion/test
diff options
context:
space:
mode:
Diffstat (limited to 'libs/fusion/test')
-rw-r--r--libs/fusion/test/Jamfile20
-rw-r--r--libs/fusion/test/algorithm/fold.cpp39
-rw-r--r--libs/fusion/test/algorithm/move.cpp40
-rw-r--r--libs/fusion/test/algorithm/pop_back.cpp2
-rw-r--r--libs/fusion/test/compile_time/sfinae_friendly.hpp54
-rw-r--r--libs/fusion/test/functional/fused.cpp4
-rw-r--r--libs/fusion/test/functional/fused_function_object.cpp4
-rw-r--r--libs/fusion/test/functional/fused_procedure.cpp4
-rw-r--r--libs/fusion/test/functional/invoke.cpp194
-rw-r--r--libs/fusion/test/functional/invoke_function_object.cpp15
-rw-r--r--libs/fusion/test/functional/invoke_procedure.cpp108
-rw-r--r--libs/fusion/test/functional/make_fused.cpp4
-rw-r--r--libs/fusion/test/functional/make_fused_function_object.cpp4
-rw-r--r--libs/fusion/test/functional/make_fused_procedure.cpp4
-rw-r--r--libs/fusion/test/functional/make_unfused.cpp14
-rw-r--r--libs/fusion/test/functional/unfused.cpp4
-rw-r--r--libs/fusion/test/functional/unfused_typed.cpp6
-rw-r--r--libs/fusion/test/sequence/adapt_adt.cpp147
-rw-r--r--libs/fusion/test/sequence/adapt_adt_named.cpp52
-rw-r--r--libs/fusion/test/sequence/adapt_assoc_adt.cpp57
-rw-r--r--libs/fusion/test/sequence/adapt_assoc_adt_named.cpp4
-rw-r--r--libs/fusion/test/sequence/adapt_assoc_struct.cpp61
-rw-r--r--libs/fusion/test/sequence/adapt_assoc_tpl_adt.cpp63
-rw-r--r--libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp64
-rw-r--r--libs/fusion/test/sequence/adapt_struct.cpp131
-rw-r--r--libs/fusion/test/sequence/adapt_struct_named.cpp64
-rw-r--r--libs/fusion/test/sequence/adapt_tpl_adt.cpp66
-rw-r--r--libs/fusion/test/sequence/adapt_tpl_struct.cpp63
-rw-r--r--libs/fusion/test/sequence/as_deque.cpp70
-rw-r--r--libs/fusion/test/sequence/as_map_assoc.cpp85
-rw-r--r--libs/fusion/test/sequence/back_extended_deque.cpp39
-rw-r--r--libs/fusion/test/sequence/boost_tuple.cpp10
-rw-r--r--libs/fusion/test/sequence/boost_tuple_iterator.cpp21
-rw-r--r--libs/fusion/test/sequence/cons.cpp7
-rw-r--r--libs/fusion/test/sequence/deduce_sequence.cpp11
-rw-r--r--libs/fusion/test/sequence/define_struct_inline.cpp4
-rw-r--r--libs/fusion/test/sequence/deque_hash.cpp16
-rw-r--r--libs/fusion/test/sequence/front_extended_deque.cpp39
-rw-r--r--libs/fusion/test/sequence/hash.cpp58
-rw-r--r--libs/fusion/test/sequence/hash.hpp34
-rw-r--r--libs/fusion/test/sequence/list_hash.cpp16
-rw-r--r--libs/fusion/test/sequence/map.cpp58
-rw-r--r--libs/fusion/test/sequence/map_misc.cpp12
-rw-r--r--libs/fusion/test/sequence/misc.hpp12
-rw-r--r--libs/fusion/test/sequence/move.hpp4
-rw-r--r--libs/fusion/test/sequence/set.cpp24
-rw-r--r--libs/fusion/test/sequence/size.cpp103
-rw-r--r--libs/fusion/test/sequence/std_tuple.cpp46
-rw-r--r--libs/fusion/test/sequence/std_tuple_iterator.cpp3
-rw-r--r--libs/fusion/test/sequence/test_deduce_sequence.cpp6
-rw-r--r--libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp56
-rw-r--r--libs/fusion/test/sequence/tuple_hash.cpp (renamed from libs/fusion/test/algorithm/fold2.cpp)12
-rw-r--r--libs/fusion/test/sequence/vector_hash.cpp16
-rw-r--r--libs/fusion/test/support/pair_container.hpp27
-rw-r--r--libs/fusion/test/support/pair_deque.cpp17
-rw-r--r--libs/fusion/test/support/pair_list.cpp17
-rw-r--r--libs/fusion/test/support/pair_map.cpp17
-rw-r--r--libs/fusion/test/support/pair_set.cpp17
-rw-r--r--libs/fusion/test/support/pair_vector.cpp17
59 files changed, 1804 insertions, 362 deletions
diff --git a/libs/fusion/test/Jamfile b/libs/fusion/test/Jamfile
index 63d674aed..752a798ad 100644
--- a/libs/fusion/test/Jamfile
+++ b/libs/fusion/test/Jamfile
@@ -28,11 +28,11 @@ project
[ run algorithm/find.cpp : : : : ]
[ run algorithm/find_if.cpp : : : : ]
[ run algorithm/fold.cpp : : : : ]
- [ run algorithm/fold2.cpp : : : : ]
[ run algorithm/for_each.cpp : : : : ]
[ run algorithm/insert.cpp : : : : ]
[ run algorithm/insert_range.cpp : : : : ]
[ run algorithm/iter_fold.cpp : : : : ]
+ [ run algorithm/move.cpp : : : : ]
[ run algorithm/none.cpp : : : : ]
[ run algorithm/pop_back.cpp : : : : ]
[ run algorithm/pop_front.cpp : : : : ]
@@ -56,13 +56,17 @@ project
[ run algorithm/zip_ignore.cpp : : : : ]
[ run algorithm/flatten.cpp : : : : ]
+ [ run sequence/as_deque.cpp : : : : ]
[ run sequence/as_list.cpp : : : : ]
[ run sequence/as_map.cpp : : : : ]
+ [ run sequence/as_map_assoc.cpp : : : : ]
[ run sequence/as_set.cpp : : : : ]
[ run sequence/as_vector.cpp : : : : ]
[ run sequence/boost_tuple.cpp : : : : ]
+ [ run sequence/boost_tuple_iterator.cpp : : : : ]
[ run sequence/cons.cpp : : : : ]
[ run sequence/filter_view.cpp : : : : ]
+ [ run sequence/hash.cpp : : : : ]
[ run sequence/io.cpp : : : : ]
[ run sequence/iterator_range.cpp : : : : ]
[ run sequence/joint_view.cpp : : : : ]
@@ -70,6 +74,7 @@ project
[ run sequence/list_construction.cpp : : : : ]
[ run sequence/list_copy.cpp : : : : ]
[ run sequence/list_iterator.cpp : : : : ]
+ [ run sequence/list_hash.cpp : : : : ]
[ run sequence/list_make.cpp : : : : ]
[ run sequence/list_misc.cpp : : : : ]
[ run sequence/list_mutate.cpp : : : : ]
@@ -79,6 +84,7 @@ project
[ run sequence/deque_construction.cpp : : : : ]
[ run sequence/deque_copy.cpp : : : : ]
[ run sequence/deque_iterator.cpp : : : : ]
+ [ run sequence/deque_hash.cpp : : : : ]
[ run sequence/deque_make.cpp : : : : ]
[ run sequence/deque_misc.cpp : : : : ]
[ run sequence/deque_move.cpp : : : : ]
@@ -113,8 +119,8 @@ project
[ run sequence/tuple_make.cpp : : : : ]
[ run sequence/tuple_misc.cpp : : : : ]
[ run sequence/tuple_mutate.cpp : : : : ]
+ [ run sequence/tuple_hash.cpp : : : : ]
[ run sequence/tuple_tie.cpp : : : : ]
- [ run sequence/tr1_tuple_auto_conv.cpp : : : : ]
[ run sequence/transform_view.cpp : : : : ]
[ run sequence/vector_comparison.cpp : : : : ]
[ run sequence/vector_construction.cpp : : : : ]
@@ -125,6 +131,7 @@ project
[ run sequence/vector_move.cpp : : : : ]
[ run sequence/vector_mutate.cpp : : : : ]
[ run sequence/vector_n.cpp : : : : ]
+ [ run sequence/vector_hash.cpp : : : : ]
[ run sequence/vector_tie.cpp : : : : ]
[ run sequence/vector_value_at.cpp : : : : ]
[ run sequence/zip_view.cpp : : : : ]
@@ -151,10 +158,13 @@ project
[ run sequence/define_tpl_struct.cpp : : : : ]
[ run sequence/define_tpl_struct_inline.cpp : : : : ]
[ run sequence/define_assoc_tpl_struct.cpp : : : : ]
+ [ run sequence/std_tuple.cpp : : : : ]
[ run sequence/std_tuple_iterator.cpp : : : : ]
[ run sequence/ref_vector.cpp : : : : ]
[ run sequence/flatten_view.cpp : : : : ]
+ [ compile sequence/size.cpp : : : : ]
+
[ run functional/fused.cpp : : : : ]
[ run functional/fused_function_object.cpp : : : : ]
[ run functional/fused_procedure.cpp : : : : ]
@@ -169,6 +179,12 @@ project
[ run functional/invoke_procedure.cpp : : : : ]
[ run sequence/swap.cpp : : : : ]
+ [ compile support/pair_deque.cpp : : : : ]
+ [ compile support/pair_list.cpp : : : : ]
+ [ compile support/pair_map.cpp : : : : ]
+ [ compile support/pair_set.cpp : : : : ]
+ [ compile support/pair_vector.cpp : : : : ]
+
# [ compile-fail xxx.cpp : : : : ]
;
diff --git a/libs/fusion/test/algorithm/fold.cpp b/libs/fusion/test/algorithm/fold.cpp
index 1db081815..249f1bb38 100644
--- a/libs/fusion/test/algorithm/fold.cpp
+++ b/libs/fusion/test/algorithm/fold.cpp
@@ -2,7 +2,7 @@
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2007 Dan Marsden
- 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)
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
@@ -120,6 +120,26 @@ int add(int lhs, int rhs)
return lhs + rhs;
}
+struct functor
+{
+ template<typename T>
+ int
+ operator() (int hitherho, T const& cur) const
+ {
+ return int(hitherho + cur);
+ }
+};
+
+struct visitor
+{
+ typedef int result_type;
+
+ int operator()(int sum, long&)
+ {
+ return sum;
+ }
+};
+
int
main()
{
@@ -217,6 +237,21 @@ main()
BOOST_TEST(fusion::accumulate(vec, 0, add) == 3);
}
+ {
+#if !defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+ {
+ boost::fusion::vector<int, double, long> container{1, 2, 3};
+ functor f;
+ boost::fusion::fold(container, 0, f);
+ }
+#endif
+
+ {
+ boost::fusion::vector<long> vec;
+ visitor v;
+ boost::fusion::fold(vec, 0, v);
+ }
+ }
+
return boost::report_errors();
}
-
diff --git a/libs/fusion/test/algorithm/move.cpp b/libs/fusion/test/algorithm/move.cpp
new file mode 100644
index 000000000..ac9ffed23
--- /dev/null
+++ b/libs/fusion/test/algorithm/move.cpp
@@ -0,0 +1,40 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/container/list/list.hpp>
+#include <boost/fusion/sequence/comparison.hpp>
+#include <boost/fusion/algorithm/auxiliary/move.hpp>
+#include <utility>
+
+int main()
+{
+ {
+ boost::fusion::vector<int, short, double> v(1, 2, 3);
+ boost::fusion::list<int, short, double> l1 = v;
+ boost::fusion::list<int, short, double> l2;
+
+ boost::fusion::move(std::move(v), l2);
+ BOOST_TEST(l1 == l2);
+ }
+
+ return boost::report_errors();
+}
+
+#else
+
+int main()
+{
+ // no thing to do
+}
+
+#endif
+
diff --git a/libs/fusion/test/algorithm/pop_back.cpp b/libs/fusion/test/algorithm/pop_back.cpp
index e374152f7..b594f6c85 100644
--- a/libs/fusion/test/algorithm/pop_back.cpp
+++ b/libs/fusion/test/algorithm/pop_back.cpp
@@ -95,7 +95,7 @@ main()
#endif
{
- boost::array<std::size_t, 2> a = { 10, 50 };
+ boost::array<std::size_t, 2> a = {{ 10, 50 }};
BOOST_TEST(back(pop_back(a)) == 10);
}
diff --git a/libs/fusion/test/compile_time/sfinae_friendly.hpp b/libs/fusion/test/compile_time/sfinae_friendly.hpp
new file mode 100644
index 000000000..77b148b88
--- /dev/null
+++ b/libs/fusion/test/compile_time/sfinae_friendly.hpp
@@ -0,0 +1,54 @@
+/*=============================================================================
+ Copyright (c) 2015 Kohei Takahashi
+
+ Use modification and distribution are subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef FUSION_TEST_SFINAE_FRIENDLY_HPP
+#define FUSION_TEST_SFINAE_FRIENDLY_HPP
+
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/fusion/support/detail/result_of.hpp>
+
+#if !defined(BOOST_NO_SFINAE) && !defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
+
+#include <boost/fusion/container/vector.hpp>
+
+namespace sfinae_friendly
+{
+ template <typename, typename T = void> struct void_ { typedef T type; };
+
+ template <typename> struct arg_;
+ template <typename R, typename T> struct arg_<R(T)> { typedef T type; };
+
+ template <typename Traits, typename = void>
+ struct check
+ : boost::mpl::true_ { };
+
+ template <typename Traits>
+ struct check<Traits, typename void_<typename Traits::type>::type>
+ : boost::mpl::false_ { };
+
+ struct unspecified {};
+ typedef boost::fusion::vector<> v0;
+ typedef boost::fusion::vector<unspecified> v1;
+ typedef boost::fusion::vector<unspecified, unspecified> v2;
+ typedef boost::fusion::vector<unspecified, unspecified, unspecified> v3;
+}
+
+#define SFINAE_FRIENDLY_ASSERT(Traits) \
+ BOOST_MPL_ASSERT((::sfinae_friendly::check<typename ::sfinae_friendly::arg_<void Traits>::type>))
+
+#else
+
+#define SFINAE_FRIENDLY_ASSERT(Traits) \
+ BOOST_MPL_ASSERT((boost::mpl::true_))
+
+#endif
+
+#endif // FUSION_TEST_SFINAE_FRIENDLY_HPP
+
diff --git a/libs/fusion/test/functional/fused.cpp b/libs/fusion/test/functional/fused.cpp
index e2c893956..b2ce8dde9 100644
--- a/libs/fusion/test/functional/fused.cpp
+++ b/libs/fusion/test/functional/fused.cpp
@@ -10,18 +10,18 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/assert.hpp>
+#include <boost/mpl/empty_base.hpp>
namespace fusion = boost::fusion;
using boost::noncopyable;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/fused_function_object.cpp b/libs/fusion/test/functional/fused_function_object.cpp
index c8d4c590d..399745a06 100644
--- a/libs/fusion/test/functional/fused_function_object.cpp
+++ b/libs/fusion/test/functional/fused_function_object.cpp
@@ -10,7 +10,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
@@ -18,7 +18,7 @@
namespace fusion = boost::fusion;
using boost::noncopyable;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/fused_procedure.cpp b/libs/fusion/test/functional/fused_procedure.cpp
index 57443c208..1ed0ddf73 100644
--- a/libs/fusion/test/functional/fused_procedure.cpp
+++ b/libs/fusion/test/functional/fused_procedure.cpp
@@ -10,7 +10,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
@@ -26,7 +26,7 @@ int effect;
BOOST_TEST(effect == e); \
}
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/invoke.cpp b/libs/fusion/test/functional/invoke.cpp
index 67e65febb..2a94539f7 100644
--- a/libs/fusion/test/functional/invoke.cpp
+++ b/libs/fusion/test/functional/invoke.cpp
@@ -7,6 +7,7 @@
http://www.boost.org/LICENSE_1_0.txt).
==============================================================================*/
+#include <boost/config.hpp>
#include <boost/fusion/functional/invocation/invoke.hpp>
#include <boost/detail/lightweight_test.hpp>
@@ -30,6 +31,8 @@
#include <boost/fusion/iterator/advance.hpp>
#include <boost/fusion/algorithm/transformation/join.hpp>
+#include "../compile_time/sfinae_friendly.hpp"
+
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
@@ -79,6 +82,11 @@ struct fobj
int operator()(int i, object const &, object_nc &);
int operator()(int i, object const &, object_nc &) const;
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj, sfinae_friendly::v0>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj, sfinae_friendly::v3>));
+
struct nullary_fobj
{
@@ -87,6 +95,10 @@ struct nullary_fobj
int operator()() { return 0; }
int operator()() const { return 1; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj, sfinae_friendly::v3>));
+
struct fobj_nc
: boost::noncopyable
@@ -104,6 +116,11 @@ struct fobj_nc
int operator()(int i) { return 14 + i; }
int operator()(int i) const { return 15 + i; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj_nc, sfinae_friendly::v0>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj_nc, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj_nc, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<fobj_nc, sfinae_friendly::v3>));
+
struct nullary_fobj_nc
: boost::noncopyable
@@ -113,11 +130,34 @@ struct nullary_fobj_nc
int operator()() { return 12; }
int operator()() const { return 13; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj_nc, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj_nc, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<nullary_fobj_nc, sfinae_friendly::v3>));
+
int nullary() { return 16; }
int unary(int i) { return 17 + i; }
int binary1(int i, object &) { return 18 + i; }
int binary2(int i, object const &) { return 19 + i; }
+//FIXME
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object &), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object &), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object &), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object &), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object const &), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object const &), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object const &), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<int(*)(int, object const &), sfinae_friendly::v3>));
typedef int (* func_ptr)(int);
typedef int (* const c_func_ptr)(int);
@@ -146,11 +186,28 @@ class members
int binary_c(int i, object) const { return data + 6 + i; }
};
+#ifdef BOOST_NO_CXX11_SMART_PTR
+typedef std::auto_ptr<members > members_ptr;
+typedef std::auto_ptr<members const> const_members_ptr;
+#else
+typedef std::unique_ptr<members > members_ptr;
+typedef std::unique_ptr<members const> const_members_ptr;
+#endif
+
struct derived
: members
{
};
+#ifdef BOOST_NO_CXX11_SMART_PTR
+typedef std::auto_ptr<derived > derived_ptr;
+typedef std::auto_ptr<derived const> const_derived_ptr;
+#else
+typedef std::unique_ptr<derived > derived_ptr;
+typedef std::unique_ptr<derived const> const_derived_ptr;
+#endif
+
+
typedef int element1_type;
typedef object element2_type;
typedef object_nc & element3_type;
@@ -161,31 +218,123 @@ object_nc element3;
members that;
-std::auto_ptr<members> spt_that(new members);
-std::auto_ptr<members const> spt_that_c(new members);
-
-fusion::single_view<members > sv_obj_ctx( that);
-fusion::single_view<members &> sv_ref_ctx( that);
-fusion::single_view<members *> sv_ptr_ctx(& that);
-fusion::single_view<members const > sv_obj_c_ctx( that);
-fusion::single_view<members const &> sv_ref_c_ctx( that);
-fusion::single_view<members const *> sv_ptr_c_ctx(& that);
-fusion::single_view<std::auto_ptr<members> const &> sv_spt_ctx(spt_that);
-fusion::single_view< std::auto_ptr<members const> const &> sv_spt_c_ctx(spt_that_c);
+members_ptr spt_that(new members);
+const_members_ptr spt_that_c(new members);
+
+typedef fusion::single_view<members > sv_obj;
+typedef fusion::single_view<members &> sv_ref;
+typedef fusion::single_view<members *> sv_ptr;
+typedef fusion::single_view<members const > sv_obj_c;
+typedef fusion::single_view<members const &> sv_ref_c;
+typedef fusion::single_view<members const *> sv_ptr_c;
+typedef fusion::single_view<members_ptr const &> sv_spt;
+typedef fusion::single_view<const_members_ptr const &> sv_spt_c;
+
+sv_obj sv_obj_ctx( that);
+sv_ref sv_ref_ctx( that);
+sv_ptr sv_ptr_ctx(& that);
+sv_obj_c sv_obj_c_ctx( that);
+sv_ref_c sv_ref_c_ctx( that);
+sv_ptr_c sv_ptr_c_ctx(& that);
+sv_spt sv_spt_ctx(spt_that);
+sv_spt_c sv_spt_c_ctx(spt_that_c);
+template <typename F, typename S>
+struct sv_helper
+{
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_obj , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ref , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ptr , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_obj_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ref_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ptr_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_spt , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_spt_c, S>::type>));
+};
+// FIXME:
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v3>;
+
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v3>;
+
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v3>;
derived derived_that;
-std::auto_ptr<derived> spt_derived_that(new derived);
-std::auto_ptr<derived const> spt_derived_that_c(new derived);
-
-fusion::single_view<derived > sv_obj_d_ctx( derived_that);
-fusion::single_view<derived &> sv_ref_d_ctx( derived_that);
-fusion::single_view<derived *> sv_ptr_d_ctx(& derived_that);
-fusion::single_view<derived const > sv_obj_c_d_ctx( derived_that);
-fusion::single_view<derived const &> sv_ref_c_d_ctx( derived_that);
-fusion::single_view<derived const *> sv_ptr_c_d_ctx(& derived_that);
-fusion::single_view<std::auto_ptr<derived> const &> sv_spt_d_ctx(spt_derived_that);
-fusion::single_view< std::auto_ptr<derived const> const &> sv_spt_c_d_ctx(spt_derived_that_c);
+derived_ptr spt_derived_that(new derived);
+const_derived_ptr spt_derived_that_c(new derived);
+
+typedef fusion::single_view<derived > sv_obj_d;
+typedef fusion::single_view<derived &> sv_ref_d;
+typedef fusion::single_view<derived *> sv_ptr_d;
+typedef fusion::single_view<derived const > sv_obj_c_d;
+typedef fusion::single_view<derived const &> sv_ref_c_d;
+typedef fusion::single_view<derived const *> sv_ptr_c_d;
+typedef fusion::single_view<derived_ptr const &> sv_spt_d;
+typedef fusion::single_view<const_derived_ptr const &> sv_spt_c_d;
+
+sv_obj_d sv_obj_d_ctx( derived_that);
+sv_ref_d sv_ref_d_ctx( derived_that);
+sv_ptr_d sv_ptr_d_ctx(& derived_that);
+sv_obj_c_d sv_obj_c_d_ctx( derived_that);
+sv_ref_c_d sv_ref_c_d_ctx( derived_that);
+sv_ptr_c_d sv_ptr_c_d_ctx(& derived_that);
+sv_spt_d sv_spt_d_ctx(spt_derived_that);
+sv_spt_c_d sv_spt_c_d_ctx(spt_derived_that_c);
+template <typename F, typename S>
+struct sv_d_helper
+{
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_obj_d , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ref_d , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ptr_d , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_obj_c_d, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ref_c_d, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_ptr_c_d, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_spt_d , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke<F, typename fusion::result_of::join<sv_spt_c_d, S>::type>));
+};
+// FIXME:
+//template struct sv_d_helper<int (members::*)() , sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)() , sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)() , sfinae_friendly::v3>;
+//template struct sv_d_helper<int (members::*)() const, sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)() const, sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)() const, sfinae_friendly::v3>;
+
+//template struct sv_d_helper<int (members::*)(int) , sfinae_friendly::v0>;
+//template struct sv_d_helper<int (members::*)(int) , sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)(int) , sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)(int) , sfinae_friendly::v3>;
+//template struct sv_d_helper<int (members::*)(int) const, sfinae_friendly::v0>;
+//template struct sv_d_helper<int (members::*)(int) const, sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)(int) const, sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)(int) const, sfinae_friendly::v3>;
+
+//template struct sv_d_helper<int (members::*)(int, object) , sfinae_friendly::v0>;
+//template struct sv_d_helper<int (members::*)(int, object) , sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)(int, object) , sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)(int, object) , sfinae_friendly::v3>;
+//template struct sv_d_helper<int (members::*)(int, object) const, sfinae_friendly::v0>;
+//template struct sv_d_helper<int (members::*)(int, object) const, sfinae_friendly::v1>;
+//template struct sv_d_helper<int (members::*)(int, object) const, sfinae_friendly::v2>;
+//template struct sv_d_helper<int (members::*)(int, object) const, sfinae_friendly::v3>;
template <class Sequence>
void test_sequence_n(Sequence & seq, mpl::int_<0>)
@@ -299,7 +448,6 @@ void test_sequence_n(Sequence & seq, mpl::int_<1>)
BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ref_c_d_ctx,seq)));
BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ptr_c_d_ctx,seq)));
BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_spt_c_d_ctx,seq)));
-
}
template <class Sequence>
diff --git a/libs/fusion/test/functional/invoke_function_object.cpp b/libs/fusion/test/functional/invoke_function_object.cpp
index d618a4955..7c75f06d1 100644
--- a/libs/fusion/test/functional/invoke_function_object.cpp
+++ b/libs/fusion/test/functional/invoke_function_object.cpp
@@ -30,6 +30,8 @@
#include <boost/fusion/iterator/advance.hpp>
#include <boost/fusion/algorithm/transformation/join.hpp>
+#include "../compile_time/sfinae_friendly.hpp"
+
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
@@ -82,6 +84,9 @@ struct fobj
int operator()(int i, object const &, object_nc &);
int operator()(int i, object const &, object_nc &) const;
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj, sfinae_friendly::v3>));
struct nullary_fobj
{
@@ -90,6 +95,9 @@ struct nullary_fobj
int operator()() { return 0; }
int operator()() const { return 1; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj, sfinae_friendly::v3>));
struct fobj_nc
: boost::noncopyable
@@ -107,6 +115,10 @@ struct fobj_nc
int operator()(int i) { return 14 + i; }
int operator()(int i) const { return 15 + i; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj_nc, sfinae_friendly::v0>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj_nc, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj_nc, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<fobj_nc, sfinae_friendly::v3>));
struct nullary_fobj_nc
: boost::noncopyable
@@ -116,6 +128,9 @@ struct nullary_fobj_nc
int operator()() { return 12; }
int operator()() const { return 13; }
};
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj_nc, sfinae_friendly::v1>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj_nc, sfinae_friendly::v2>));
+SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object<nullary_fobj_nc, sfinae_friendly::v3>));
typedef int element1_type;
diff --git a/libs/fusion/test/functional/invoke_procedure.cpp b/libs/fusion/test/functional/invoke_procedure.cpp
index 49c35d376..3877ca30c 100644
--- a/libs/fusion/test/functional/invoke_procedure.cpp
+++ b/libs/fusion/test/functional/invoke_procedure.cpp
@@ -7,6 +7,7 @@
http://www.boost.org/LICENSE_1_0.txt).
==============================================================================*/
+#include <boost/config.hpp>
#include <boost/fusion/functional/invocation/invoke_procedure.hpp>
#include <boost/detail/lightweight_test.hpp>
@@ -28,6 +29,8 @@
#include <boost/fusion/iterator/advance.hpp>
#include <boost/fusion/algorithm/transformation/join.hpp>
+#include "../compile_time/sfinae_friendly.hpp"
+
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
@@ -65,18 +68,72 @@ class members
int binary_c(int & i, object) const { return i = data + 6; }
};
+#ifdef BOOST_NO_CXX11_SMART_PTR
+typedef std::auto_ptr<members > members_ptr;
+typedef std::auto_ptr<members const> const_members_ptr;
+#else
+typedef std::unique_ptr<members > members_ptr;
+typedef std::unique_ptr<members const> const_members_ptr;
+#endif
+
members that;
-std::auto_ptr<members> spt_that(new members);
-std::auto_ptr<members const> spt_that_c(new members);
-
-fusion::single_view<members > sv_obj_ctx( that);
-fusion::single_view<members &> sv_ref_ctx( that);
-fusion::single_view<members *> sv_ptr_ctx(& that);
-fusion::single_view<members const > sv_obj_c_ctx( that);
-fusion::single_view<members const &> sv_ref_c_ctx( that);
-fusion::single_view<members const *> sv_ptr_c_ctx(& that);
-fusion::single_view<std::auto_ptr<members> const &> sv_spt_ctx(spt_that);
-fusion::single_view< std::auto_ptr<members const> const &> sv_spt_c_ctx(spt_that_c);
+members_ptr spt_that(new members);
+const_members_ptr spt_that_c(new members);
+
+typedef fusion::single_view<members > sv_obj;
+typedef fusion::single_view<members &> sv_ref;
+typedef fusion::single_view<members *> sv_ptr;
+typedef fusion::single_view<members const > sv_obj_c;
+typedef fusion::single_view<members const &> sv_ref_c;
+typedef fusion::single_view<members const *> sv_ptr_c;
+typedef fusion::single_view<members_ptr const &> sv_spt;
+typedef fusion::single_view<const_members_ptr const &> sv_spt_c;
+
+sv_obj sv_obj_ctx( that);
+sv_ref sv_ref_ctx( that);
+sv_ptr sv_ptr_ctx(& that);
+sv_obj_c sv_obj_c_ctx( that);
+sv_ref_c sv_ref_c_ctx( that);
+sv_ptr_c sv_ptr_c_ctx(& that);
+sv_spt sv_spt_ctx(spt_that);
+sv_spt_c sv_spt_c_ctx(spt_that_c);
+template <typename F, typename S>
+struct sv_helper
+{
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_obj , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_ref , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_ptr , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_obj_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_ref_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_ptr_c, S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_spt , S>::type>));
+ SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<F, typename fusion::result_of::join<sv_spt_c, S>::type>));
+};
+// FIXME:
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)() , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)() const, sfinae_friendly::v3>;
+
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int) , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int) const, sfinae_friendly::v3>;
+
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int, object) , sfinae_friendly::v3>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v0>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v1>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v2>;
+//template struct sv_helper<int (members::*)(int, object) const, sfinae_friendly::v3>;
struct fobj
{
@@ -94,6 +151,11 @@ struct fobj
int operator()(int & i, object &, object_nc &) { return i = 10; }
int operator()(int & i, object &, object_nc &) const { return i = 11; }
};
+// FIXME:
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj, sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj, sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj, sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj, sfinae_friendly::v3>));
struct fobj_nc
: boost::noncopyable
@@ -104,11 +166,35 @@ struct fobj_nc
int operator()(int & i) { return i = 14; }
int operator()(int & i) const { return i = 15; }
};
+// FIXME:
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj_nc, sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj_nc, sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj_nc, sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<fobj_nc, sfinae_friendly::v3>));
int nullary() { return element1 = 16; }
int unary(int & i) { return i = 17; }
int binary1(int & i, object &) { return i = 18; }
int binary2(int & i, object const &) { return i = 19; }
+//FIXME
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object &), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object &), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object &), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object &), sfinae_friendly::v3>));
+//
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object const &), sfinae_friendly::v0>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object const &), sfinae_friendly::v1>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object const &), sfinae_friendly::v2>));
+//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure<int(*)(int, object const &), sfinae_friendly::v3>));
typedef int (* func_ptr)(int &);
typedef int (* const c_func_ptr)(int &);
diff --git a/libs/fusion/test/functional/make_fused.cpp b/libs/fusion/test/functional/make_fused.cpp
index a207359c7..ceb82063e 100644
--- a/libs/fusion/test/functional/make_fused.cpp
+++ b/libs/fusion/test/functional/make_fused.cpp
@@ -10,7 +10,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
@@ -20,7 +20,7 @@ using boost::noncopyable;
using boost::cref;
using boost::ref;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/make_fused_function_object.cpp b/libs/fusion/test/functional/make_fused_function_object.cpp
index 87ee8e233..79ea517ba 100644
--- a/libs/fusion/test/functional/make_fused_function_object.cpp
+++ b/libs/fusion/test/functional/make_fused_function_object.cpp
@@ -10,7 +10,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
@@ -20,7 +20,7 @@ using boost::noncopyable;
using boost::cref;
using boost::ref;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/make_fused_procedure.cpp b/libs/fusion/test/functional/make_fused_procedure.cpp
index ce7e267c8..2fa2762c5 100644
--- a/libs/fusion/test/functional/make_fused_procedure.cpp
+++ b/libs/fusion/test/functional/make_fused_procedure.cpp
@@ -10,7 +10,7 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/container/vector.hpp>
@@ -28,7 +28,7 @@ int effect;
BOOST_TEST(effect == e); \
}
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/make_unfused.cpp b/libs/fusion/test/functional/make_unfused.cpp
index 1e2869183..73be142b4 100644
--- a/libs/fusion/test/functional/make_unfused.cpp
+++ b/libs/fusion/test/functional/make_unfused.cpp
@@ -10,14 +10,15 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
#include <boost/mpl/bool.hpp>
-#include <boost/mpl/identity.hpp>
#include <boost/utility/result_of.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/fusion/sequence/intrinsic/empty.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
@@ -33,17 +34,18 @@ typedef mpl::true_ no_nullary_call;
using boost::ref;
using boost::cref;
-template <class Base = boost::blank, class RemoveNullary = mpl::false_>
+template <class Base = mpl::empty_base, class RemoveNullary = mpl::false_>
struct test_func
: Base
{
template <typename Sig>
struct result;
- template <class Self, class Seq>
+ template <class Self, class Seq>
struct result< Self(Seq &) >
- : mpl::if_< mpl::and_< boost::fusion::result_of::empty<Seq>, RemoveNullary >,
- boost::blank, mpl::identity<long> >::type
+ : boost::enable_if<
+ mpl::not_<mpl::and_<boost::fusion::result_of::empty<Seq>, RemoveNullary> >,
+ long>
{ };
template <typename Seq>
diff --git a/libs/fusion/test/functional/unfused.cpp b/libs/fusion/test/functional/unfused.cpp
index bde9b95b3..1e30eabd3 100644
--- a/libs/fusion/test/functional/unfused.cpp
+++ b/libs/fusion/test/functional/unfused.cpp
@@ -10,8 +10,8 @@
#include <boost/detail/lightweight_test.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/blank.hpp>
+#include <boost/mpl/empty_base.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/utility/result_of.hpp>
@@ -24,7 +24,7 @@ namespace mpl = boost::mpl;
using boost::noncopyable;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/functional/unfused_typed.cpp b/libs/fusion/test/functional/unfused_typed.cpp
index 93c35b6df..eaa03425f 100644
--- a/libs/fusion/test/functional/unfused_typed.cpp
+++ b/libs/fusion/test/functional/unfused_typed.cpp
@@ -9,11 +9,9 @@
#include <boost/fusion/functional/adapter/unfused_typed.hpp>
#include <boost/detail/lightweight_test.hpp>
-#include <boost/blank.hpp>
#include <boost/noncopyable.hpp>
-#include <boost/utility/result_of.hpp>
-
+#include <boost/mpl/empty_base.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/placeholders.hpp>
@@ -31,7 +29,7 @@ typedef fusion::vector<> types0;
typedef fusion::vector<long &> types1;
typedef fusion::vector<long &,int,char> types3;
-template <class Base = boost::blank>
+template <class Base = boost::mpl::empty_base>
struct test_func
: Base
{
diff --git a/libs/fusion/test/sequence/adapt_adt.cpp b/libs/fusion/test/sequence/adapt_adt.cpp
index d4f4a8c27..265cfca59 100644
--- a/libs/fusion/test/sequence/adapt_adt.cpp
+++ b/libs/fusion/test/sequence/adapt_adt.cpp
@@ -38,18 +38,21 @@ namespace ns
{
public:
- point() : x(0), y(0) {}
- point(int in_x, int in_y) : x(in_x), y(in_y) {}
+ point() : x(0), y(0), z(0) {}
+ point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
int get_x() const { return x; }
int get_y() const { return y; }
+ int get_z() const { return z; }
void set_x(int x_) { x = x_; }
void set_y(int y_) { y = y_; }
+ void set_z(int z_) { z = z_; }
private:
int x;
int y;
+ int z;
};
#if !BOOST_WORKAROUND(__GNUC__,<4)
@@ -58,17 +61,22 @@ namespace ns
friend struct boost::fusion::extension::access;
public:
- point_with_private_members() : x(0), y(0) {}
- point_with_private_members(int x, int y) : x(x), y(y) {}
-
- private:
+ point_with_private_members() : x(0), y(0), z(0) {}
+ point_with_private_members(int in_x, int in_y, int in_z)
+ : x(in_x), y(in_y), z(in_z) {}
+
int get_x() const { return x; }
int get_y() const { return y; }
+ int get_z() const { return z; }
void set_x(int x_) { x = x_; }
void set_y(int y_) { y = y_; }
-
+ void set_z(int z_) { z = z_; }
+
+ private:
+
int x;
int y;
+ int z;
};
#endif
@@ -91,25 +99,55 @@ namespace ns
};
}
-BOOST_FUSION_ADAPT_ADT(
- ns::point,
- (int, int, obj.get_x(), obj.set_x(val))
- (int, int, obj.get_y(), obj.set_y(val))
-)
+#if BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ADT(
+ ns::point,
+ (int, int, obj.get_x(), obj.set_x(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
+ (obj.get_z(), obj.set_z(val))
+ )
-#if !BOOST_WORKAROUND(__GNUC__,<4)
-BOOST_FUSION_ADAPT_ADT(
- ns::point_with_private_members,
- (int, int, obj.get_x(), obj.set_x(val))
- (int, int, obj.get_y(), obj.set_y(val))
-)
-#endif
+# if !BOOST_WORKAROUND(__GNUC__,<4)
+ BOOST_FUSION_ADAPT_ADT(
+ ns::point_with_private_members,
+ (obj.get_x(), obj.set_x(val))
+ (obj.get_y(), obj.set_y(val))
+ (obj.get_z(), obj.set_z(val))
+ )
+# endif
+
+
+ BOOST_FUSION_ADAPT_ADT(
+ ns::name,
+ (obj.get_last(), obj.set_last(val))
+ (obj.get_first(), obj.set_first(val))
+ )
+
+
+#else // BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ADT(
+ ns::point,
+ (int, int, obj.get_x(), obj.set_x(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
+ )
+
+# if !BOOST_WORKAROUND(__GNUC__,<4)
+ BOOST_FUSION_ADAPT_ADT(
+ ns::point_with_private_members,
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_x(), obj.set_x(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
+ )
+# endif
+
+ BOOST_FUSION_ADAPT_ADT(
+ ns::name,
+ (const std::string&, const std::string&, obj.get_last(), obj.set_last(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_first(), obj.set_first(val))
+ )
-BOOST_FUSION_ADAPT_ADT(
- ns::name,
- (const std::string&, const std::string&, obj.get_last(), obj.set_last(val))
- (const std::string&, const std::string&, obj.get_first(), obj.set_first(val))
-)
+#endif
int
main()
@@ -123,28 +161,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
- ns::point p(123, 456);
+ ns::point p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- fusion::vector<int, float> v1(4, 2);
- ns::point v2(5, 3);
- fusion::vector<long, double> v3(5, 4);
+ fusion::vector<int, float, int> v1(4, 2, 2);
+ ns::point v2(5, 3, 3);
+ fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -171,15 +211,15 @@ main()
{
// conversion from ns::point to vector
- ns::point p(5, 3);
- fusion::vector<int, long> v(p);
+ ns::point p(5, 3, 3);
+ fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from ns::point to list
- ns::point p(5, 3);
- fusion::list<int, long> l(p);
+ ns::point p(5, 3, 3);
+ fusion::list<int, long, int> l(p);
l = p;
}
@@ -193,26 +233,29 @@ main()
#if !BOOST_WORKAROUND(__GNUC__,<4)
{
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point_with_private_members>));
- ns::point_with_private_members p(123, 456);
+ ns::point_with_private_members p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point_with_private_members>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point_with_private_members>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point_with_private_members>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
#endif
{
+ // Check types provided in case it's provided
BOOST_MPL_ASSERT((
boost::is_same<
boost::fusion::result_of::front<ns::point>::type,
@@ -233,6 +276,28 @@ main()
boost::fusion::result_of::front<ns::point const>::type::type,
int
>));
+
+ // Check types provided in case it's deduced
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ boost::fusion::result_of::back<ns::point>::type,
+ boost::fusion::extension::adt_attribute_proxy<ns::point,2,false>
+ >));
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ boost::fusion::result_of::back<ns::point>::type::type,
+ int
+ >));
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ boost::fusion::result_of::back<ns::point const>::type,
+ boost::fusion::extension::adt_attribute_proxy<ns::point,2,true>
+ >));
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ boost::fusion::result_of::back<ns::point const>::type::type,
+ const int
+ >));
}
return boost::report_errors();
diff --git a/libs/fusion/test/sequence/adapt_adt_named.cpp b/libs/fusion/test/sequence/adapt_adt_named.cpp
index 384156337..8924ce41c 100644
--- a/libs/fusion/test/sequence/adapt_adt_named.cpp
+++ b/libs/fusion/test/sequence/adapt_adt_named.cpp
@@ -37,28 +37,46 @@ namespace ns
{
public:
- point() : x(0), y(0) {}
- point(int in_x, int in_y) : x(in_x), y(in_y) {}
+ point() : x(0), y(0), z(0) {}
+ point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
int get_x() const { return x; }
int get_y() const { return y; }
+ int get_z() const { return z; }
void set_x(int x_) { x = x_; }
void set_y(int y_) { y = y_; }
+ void set_z(int z_) { z = z_; }
private:
int x;
int y;
+ int z;
};
}
+#if BOOST_PP_VARIADICS
+
+// this creates a fusion view: boost::fusion::adapted::point
+BOOST_FUSION_ADAPT_ADT_NAMED(
+ ns::point, point,
+ (int, int, obj.get_x(), obj.set_x(val))
+ (int, int, obj.get_y(), obj.set_y(val))
+ (obj.get_z(), obj.set_z(val))
+)
+
+#else // BOOST_PP_VARIADICS
+
// this creates a fusion view: boost::fusion::adapted::point
BOOST_FUSION_ADAPT_ADT_NAMED(
ns::point, point,
- (int, int, obj.obj.get_x(), obj.obj.set_x(val))
- (int, int, obj.obj.get_y(), obj.obj.set_y(val))
+ (int, int, obj.get_x(), obj.set_x(val))
+ (int, int, obj.get_y(), obj.set_y(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
)
+#endif // BOOST_PP_VARIADICS
+
int
main()
{
@@ -71,31 +89,33 @@ main()
{
BOOST_MPL_ASSERT((traits::is_view<adapted::point>));
- ns::point basep(123, 456);
+ ns::point basep(123, 456, 789);
adapted::point p(basep);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<adapted::point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- fusion::vector<int, float> v1(4, 2);
- ns::point basep(5, 3);
+ fusion::vector<int, float, int> v1(4, 2, 2);
+ ns::point basep(5, 3, 3);
adapted::point v2(basep);
- fusion::vector<long, double> v3(5, 4);
+ fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -108,19 +128,19 @@ main()
{
// conversion from ns::point to vector
- ns::point basep(5, 3);
+ ns::point basep(5, 3, 3);
adapted::point p(basep);
- fusion::vector<int, long> v(p);
+ fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from ns::point to list
- ns::point basep(5, 3);
+ ns::point basep(5, 3, 3);
adapted::point p(basep);
- fusion::list<int, long> l(p);
+ fusion::list<int, long, float> l(p);
l = p;
}
diff --git a/libs/fusion/test/sequence/adapt_assoc_adt.cpp b/libs/fusion/test/sequence/adapt_assoc_adt.cpp
index c97e84b0a..a03605f1e 100644
--- a/libs/fusion/test/sequence/adapt_assoc_adt.cpp
+++ b/libs/fusion/test/sequence/adapt_assoc_adt.cpp
@@ -26,31 +26,50 @@ namespace ns
struct y_member;
struct z_member;
+ struct non_member;
+
class point
{
public:
- point() : x(0), y(0) {}
- point(int in_x, int in_y) : x(in_x), y(in_y) {}
+ point() : x(0), y(0), z(0) {}
+ point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
int get_x() const { return x; }
int get_y() const { return y; }
+ int get_z() const { return z; }
void set_x(int x_) { x = x_; }
void set_y(int y_) { y = y_; }
+ void set_z(int z_) { z = z_; }
private:
int x;
int y;
+ int z;
};
}
+#if BOOST_PP_VARIADICS
+
BOOST_FUSION_ADAPT_ASSOC_ADT(
ns::point,
(int, int, obj.get_x(), obj.set_x(val), ns::x_member)
(int, int, obj.get_y(), obj.set_y(val), ns::y_member)
+ (obj.get_z(), obj.set_z(val), ns::z_member)
)
+#else // BOOST_PP_VARIADICS
+
+BOOST_FUSION_ADAPT_ASSOC_ADT(
+ ns::point,
+ (int, int, obj.get_x(), obj.set_x(val), ns::x_member)
+ (int, int, obj.get_y(), obj.set_y(val), ns::y_member)
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val), ns::z_member)
+)
+
+#endif
+
int
main()
{
@@ -62,28 +81,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
- ns::point p(123, 456);
+ ns::point p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- boost::fusion::vector<int, float> v1(4, 2);
- ns::point v2(5, 3);
- boost::fusion::vector<long, double> v3(5, 4);
+ boost::fusion::vector<int, float, int> v1(4, 2, 2);
+ ns::point v2(5, 3, 3);
+ boost::fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -96,15 +117,15 @@ main()
{
// conversion from ns::point to vector
- ns::point p(5, 3);
- boost::fusion::vector<int, long> v(p);
+ ns::point p(5, 3, 3);
+ boost::fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from ns::point to list
- ns::point p(5, 3);
- boost::fusion::list<int, long> l(p);
+ ns::point p(5, 3, 3);
+ boost::fusion::list<int, long, int> l(p);
l = p;
}
@@ -119,15 +140,19 @@ main()
// assoc stuff
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::x_member>));
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::y_member>));
- BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::z_member> >));
+ BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::z_member>));
+ BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::non_member> >));
+
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::x_member>::type, int>));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::y_member>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::z_member>::type, int>));
- ns::point p(5, 3);
+ ns::point p(5, 3, 1);
BOOST_TEST(at_key<ns::x_member>(p) == 5);
BOOST_TEST(at_key<ns::y_member>(p) == 3);
+ BOOST_TEST(at_key<ns::z_member>(p) == 1);
}
return boost::report_errors();
diff --git a/libs/fusion/test/sequence/adapt_assoc_adt_named.cpp b/libs/fusion/test/sequence/adapt_assoc_adt_named.cpp
index d68d99040..8ef9aa27b 100644
--- a/libs/fusion/test/sequence/adapt_assoc_adt_named.cpp
+++ b/libs/fusion/test/sequence/adapt_assoc_adt_named.cpp
@@ -48,8 +48,8 @@ namespace ns
BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED(
ns::point,
point,
- (int, int, obj.obj.get_x(), obj.obj.set_x(val), ns::x_member)
- (int, int, obj.obj.get_y(), obj.obj.set_y(val), ns::y_member)
+ (int, int, obj.get_x(), obj.set_x(val), ns::x_member)
+ (int, int, obj.get_y(), obj.set_y(val), ns::y_member)
)
int
diff --git a/libs/fusion/test/sequence/adapt_assoc_struct.cpp b/libs/fusion/test/sequence/adapt_assoc_struct.cpp
index 62574a7ec..4cdabb878 100644
--- a/libs/fusion/test/sequence/adapt_assoc_struct.cpp
+++ b/libs/fusion/test/sequence/adapt_assoc_struct.cpp
@@ -30,6 +30,7 @@
#include <boost/fusion/mpl.hpp>
#include <boost/fusion/support/is_view.hpp>
#include <boost/mpl/front.hpp>
+#include <boost/mpl/back.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/not.hpp>
@@ -42,19 +43,33 @@ namespace ns
struct x_member;
struct y_member;
struct z_member;
+ struct non_member;
struct point
{
int x;
int y;
+ int z;
};
}
-BOOST_FUSION_ADAPT_ASSOC_STRUCT(
- ns::point,
- (int, x, ns::x_member)
- (int, y, ns::y_member)
-)
+#if BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+ ns::point,
+ (x, ns::x_member)
+ (y, ns::y_member)
+ (int, z, ns::z_member)
+ )
+
+#else // BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+ ns::point,
+ (BOOST_FUSION_ADAPT_AUTO, x, ns::x_member)
+ (BOOST_FUSION_ADAPT_AUTO, y, ns::y_member)
+ (int, z, ns::z_member)
+ )
+
+#endif
int
main()
@@ -68,28 +83,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
- ns::point p = {123, 456};
+ ns::point p = {123, 456, 789};
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- fusion::vector<int, float> v1(4, 2);
- ns::point v2 = {5, 3};
- fusion::vector<long, double> v3(5, 4);
+ fusion::vector<int, float, int> v1(4, 2, 2);
+ ns::point v2 = {5, 3, 3};
+ fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -102,15 +119,15 @@ main()
{
// conversion from ns::point to vector
- ns::point p = {5, 3};
- fusion::vector<int, long> v(p);
+ ns::point p = {5, 3, 3};
+ fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from ns::point to list
- ns::point p = {5, 3};
- fusion::list<int, long> l(p);
+ ns::point p = {5, 3, 3};
+ fusion::list<int, long, int> l(p);
l = p;
}
@@ -118,15 +135,18 @@ main()
// assoc stuff
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::x_member>));
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::y_member>));
- BOOST_MPL_ASSERT((mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::z_member> >));
+ BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::z_member>));
+ BOOST_MPL_ASSERT((mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::non_member> >));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::x_member>::type, int>));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::y_member>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::z_member>::type, int>));
- ns::point p = {5, 3};
+ ns::point p = {5, 3, 9};
BOOST_TEST(at_key<ns::x_member>(p) == 5);
BOOST_TEST(at_key<ns::y_member>(p) == 3);
+ BOOST_TEST(at_key<ns::z_member>(p) == 9);
}
{
@@ -134,6 +154,9 @@ main()
BOOST_MPL_ASSERT((boost::is_same<
boost::fusion::result_of::value_at_c<ns::point,0>::type
, mpl::front<ns::point>::type>));
+ BOOST_MPL_ASSERT((boost::is_same<
+ boost::fusion::result_of::value_at_c<ns::point,2>::type
+ , mpl::back<ns::point>::type>));
}
return boost::report_errors();
diff --git a/libs/fusion/test/sequence/adapt_assoc_tpl_adt.cpp b/libs/fusion/test/sequence/adapt_assoc_tpl_adt.cpp
index 15e2124cb..8aa600ff6 100644
--- a/libs/fusion/test/sequence/adapt_assoc_tpl_adt.cpp
+++ b/libs/fusion/test/sequence/adapt_assoc_tpl_adt.cpp
@@ -26,39 +26,57 @@ namespace ns
struct y_member;
struct z_member;
- template<typename X, typename Y>
+ struct non_member;
+
+ template<typename X, typename Y, typename Z>
class point
{
public:
- point() : x(0), y(0) {}
- point(X in_x, Y in_y) : x(in_x), y(in_y) {}
+ point() : x(0), y(0), z(0) {}
+ point(X in_x, Y in_y, Z in_z) : x(in_x), y(in_y), z(in_z) {}
X get_x() const { return x; }
Y get_y() const { return y; }
+ Z get_z() const { return z; }
void set_x(X x_) { x = x_; }
void set_y(Y y_) { y = y_; }
+ void set_z(Z z_) { z = z_; }
private:
X x;
Y y;
+ Z z;
};
}
+#if BOOST_PP_VARIADICS
+BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
+ (X)(Y)(Z),
+ (ns::point)(X)(Y)(Z),
+ (X, X, obj.get_x(), obj.set_x(val), ns::x_member)
+ (Y, Y, obj.get_y(), obj.set_y(val), ns::y_member)
+ (obj.get_z(), obj.set_z(val), ns::z_member)
+)
+
+#else // BOOST_PP_VARIADICS
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
- (X)(Y),
- (ns::point)(X)(Y),
+ (X)(Y)(Z),
+ (ns::point)(X)(Y)(Z),
(X, X, obj.get_x(), obj.set_x(val), ns::x_member)
(Y, Y, obj.get_y(), obj.set_y(val), ns::y_member)
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val), ns::z_member)
)
+#endif
+
int
main()
{
using namespace boost::fusion;
- typedef ns::point<int,int> point;
+ typedef ns::point<int,int,long> point;
std::cout << tuple_open('[');
std::cout << tuple_close(']');
@@ -66,28 +84,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
- point p(123, 456);
+ point p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- boost::fusion::vector<int, float> v1(4, 2);
- point v2(5, 3);
- boost::fusion::vector<long, double> v3(5, 4);
+ boost::fusion::vector<int, float, long> v1(4, 2, 2);
+ point v2(5, 3, 3);
+ boost::fusion::vector<long, double, long> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -100,15 +120,15 @@ main()
{
// conversion from point to vector
- point p(5, 3);
- boost::fusion::vector<int, long> v(p);
+ point p(5, 3, 3);
+ boost::fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from point to list
- point p(5, 3);
- boost::fusion::list<int, long> l(p);
+ point p(5, 3, 3);
+ boost::fusion::list<int, long, int> l(p);
l = p;
}
@@ -123,15 +143,18 @@ main()
// assoc stuff
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::x_member>));
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::y_member>));
- BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::z_member> >));
+ BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::z_member>));
+ BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::non_member> >));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::x_member>::type, int>));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::y_member>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::z_member>::type, long>));
- point p(5, 3);
+ point p(5, 3, 1);
BOOST_TEST(at_key<ns::x_member>(p) == 5);
BOOST_TEST(at_key<ns::y_member>(p) == 3);
+ BOOST_TEST(at_key<ns::z_member>(p) == 1);
}
return boost::report_errors();
diff --git a/libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp b/libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp
index a327f9e87..6adcc9312 100644
--- a/libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp
+++ b/libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp
@@ -39,27 +39,42 @@ namespace ns
struct y_member;
struct z_member;
- template<typename X, typename Y>
+ struct non_member;
+
+ template<typename X, typename Y, typename Z>
struct point
{
X x;
Y y;
+ Z z;
};
}
-BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
- (X)(Y),
- (ns::point)(X)(Y),
- (int, x, ns::x_member)
- (int, y, ns::y_member)
-)
+#if BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
+ (X)(Y)(Z),
+ (ns::point)(X)(Y)(Z),
+ (int, x, ns::x_member)
+ (Y, y, ns::y_member)
+ (z, ns::z_member)
+ )
+
+#else // BOOST_PP_VARIADICS
+ BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
+ (X)(Y)(Z),
+ (ns::point)(X)(Y)(Z),
+ (int, x, ns::x_member)
+ (Y, y, ns::y_member)
+ (BOOST_FUSION_ADAPT_AUTO, z, ns::z_member)
+ )
+#endif
int
main()
{
using namespace boost::fusion;
- typedef ns::point<int,int> point;
+ typedef ns::point<int,int,float> point;
std::cout << tuple_open('[');
std::cout << tuple_close(']');
@@ -67,28 +82,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
- point p = {123, 456};
+ point p = {123, 456, 789.43f};
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789.43f));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- vector<int, float> v1(4, 2);
- point v2 = {5, 3};
- vector<long, double> v3(5, 4);
+ vector<int, float, int> v1(4, 2, 2);
+ point v2 = {5, 3, 3};
+ vector<long, double, float> v3(5, 4, 4.13f);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -101,15 +118,15 @@ main()
{
// conversion from point to vector
- point p = {5, 3};
- vector<int, long> v(p);
+ point p = {5, 3, 3};
+ vector<int, long, int> v(p);
v = p;
}
{
// conversion from point to list
- point p = {5, 3};
- list<int, long> l(p);
+ point p = {5, 3, 3};
+ list<int, long, int> l(p);
l = p;
}
@@ -117,15 +134,18 @@ main()
// assoc stuff
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::x_member>));
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::y_member>));
- BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::z_member> >));
+ BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::z_member>));
+ BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::non_member> >));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::x_member>::type, int>));
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::y_member>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::z_member>::type, float>));
- point p = {5, 3};
+ point p = {5, 3, 9};
BOOST_TEST(at_key<ns::x_member>(p) == 5);
BOOST_TEST(at_key<ns::y_member>(p) == 3);
+ BOOST_TEST(at_key<ns::z_member>(p) == 9);
}
return boost::report_errors();
diff --git a/libs/fusion/test/sequence/adapt_struct.cpp b/libs/fusion/test/sequence/adapt_struct.cpp
index 68240463c..c0cd30494 100644
--- a/libs/fusion/test/sequence/adapt_struct.cpp
+++ b/libs/fusion/test/sequence/adapt_struct.cpp
@@ -38,6 +38,7 @@ namespace ns
{
int x;
int y;
+ int z;
};
#if !BOOST_WORKAROUND(__GNUC__,<4)
@@ -48,65 +49,119 @@ namespace ns
private:
int x;
int y;
+ int z;
public:
- point_with_private_attributes(int x, int y):x(x),y(y)
+ point_with_private_attributes(int x, int y, int z):x(x),y(y),z(z)
{}
};
#endif
+
+ struct foo
+ {
+ int x;
+ };
+
+ struct bar
+ {
+ foo foo_;
+ int y;
+ };
}
-BOOST_FUSION_ADAPT_STRUCT(
- ns::point,
- (int, x)
- (int, y)
-)
+#if BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::point,
+ x,
+ y,
+ z
+ )
+
+# if !BOOST_WORKAROUND(__GNUC__,<4)
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::point_with_private_attributes,
+ x,
+ y,
+ z
+ )
+# endif
+
+ struct s { int m; };
+ BOOST_FUSION_ADAPT_STRUCT(s, m)
+
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::bar,
+ foo_.x, // test that adapted members can actually be expressions
+ y
+ )
+
+#else // BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::point,
+ (int, x)
+ (int, y)
+ (BOOST_FUSION_ADAPT_AUTO, z)
+ )
+
+# if !BOOST_WORKAROUND(__GNUC__,<4)
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::point_with_private_attributes,
+ (int, x)
+ (int, y)
+ (BOOST_FUSION_ADAPT_AUTO, z)
+ )
+# endif
+
+ struct s { int m; };
+ BOOST_FUSION_ADAPT_STRUCT(s, (BOOST_FUSION_ADAPT_AUTO, m))
+
+ BOOST_FUSION_ADAPT_STRUCT(
+ ns::bar,
+ (BOOST_FUSION_ADAPT_AUTO, foo_.x) // test that adapted members can actually be expressions
+ (BOOST_FUSION_ADAPT_AUTO, y)
+ )
-#if !BOOST_WORKAROUND(__GNUC__,<4)
-BOOST_FUSION_ADAPT_STRUCT(
- ns::point_with_private_attributes,
- (int, x)
- (int, y)
-)
#endif
-struct s { int m; };
-BOOST_FUSION_ADAPT_STRUCT(s, (int, m))
-
int
main()
{
using namespace boost::fusion;
using namespace boost;
+ using ns::point;
std::cout << tuple_open('[');
std::cout << tuple_close(']');
std::cout << tuple_delimiter(", ");
{
- BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
- ns::point p = {123, 456};
+ BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
+ point p = {123, 456, 789};
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
- BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
+ BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- fusion::vector<int, float> v1(4, 2);
- ns::point v2 = {5, 3};
- fusion::vector<long, double> v3(5, 4);
+ vector<int, float, int> v1(4, 2, 2);
+ point v2 = {5, 3, 3};
+ vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -118,16 +173,16 @@ main()
}
{
- // conversion from ns::point to vector
- ns::point p = {5, 3};
- fusion::vector<int, long> v(p);
+ // conversion from point to vector
+ point p = {5, 3, 3};
+ vector<int, long, int> v(p);
v = p;
}
{
- // conversion from ns::point to list
- ns::point p = {5, 3};
- fusion::list<int, long> l(p);
+ // conversion from point to list
+ point p = {5, 3, 3};
+ list<int, long, int> l(p);
l = p;
}
@@ -150,15 +205,25 @@ main()
#if !BOOST_WORKAROUND(__GNUC__,<4)
{
- ns::point_with_private_attributes p(123, 456);
+ ns::point_with_private_attributes p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
}
#endif
+ {
+ fusion::vector<int, float> v1(4, 2);
+ ns::bar v2 = {{5}, 3};
+ BOOST_TEST(v1 < v2);
+ BOOST_TEST(v1 <= v2);
+ BOOST_TEST(v2 > v1);
+ BOOST_TEST(v2 >= v1);
+ }
+
return boost::report_errors();
}
diff --git a/libs/fusion/test/sequence/adapt_struct_named.cpp b/libs/fusion/test/sequence/adapt_struct_named.cpp
index ef859655b..aab11d2dc 100644
--- a/libs/fusion/test/sequence/adapt_struct_named.cpp
+++ b/libs/fusion/test/sequence/adapt_struct_named.cpp
@@ -37,19 +37,39 @@ namespace ns
{
int x;
int y;
+ int z;
};
}
-// this creates a fusion view: boost::fusion::adapted::point
-BOOST_FUSION_ADAPT_STRUCT_NAMED(
- ns::point, point,
- (int, x)
- (int, y)
-)
+#if BOOST_PP_VARIADICS
-// this creates a fusion view: ns1::s1
-struct s { int m; };
-BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, (int, m))
+ // this creates a fusion view: boost::fusion::adapted::point
+ BOOST_FUSION_ADAPT_STRUCT_NAMED(
+ ns::point, point,
+ x,
+ y,
+ z
+ )
+
+ // this creates a fusion view: ns1::s1
+ struct s { int m; };
+ BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, m)
+
+#else // BOOST_PP_VARIADICS
+
+ // this creates a fusion view: boost::fusion::adapted::point
+ BOOST_FUSION_ADAPT_STRUCT_NAMED(
+ ns::point, point,
+ (int, x)
+ (int, y)
+ (BOOST_FUSION_ADAPT_AUTO, z)
+ )
+
+ // this creates a fusion view: ns1::s1
+ struct s { int m; };
+ BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, (BOOST_FUSION_ADAPT_AUTO, m))
+
+#endif
int
main()
@@ -63,31 +83,33 @@ main()
{
BOOST_MPL_ASSERT((traits::is_view<adapted::point>));
- ns::point basep = {123, 456};
+ ns::point basep = {123, 456, 789};
adapted::point p(basep);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<adapted::point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- fusion::vector<int, float> v1(4, 2);
- ns::point p = {5, 3};
+ fusion::vector<int, float, int> v1(4, 2, 2);
+ ns::point p = {5, 3, 3};
adapted::point v2(p);
- fusion::vector<long, double> v3(5, 4);
+ fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -100,17 +122,17 @@ main()
{
// conversion from adapted::point to vector
- ns::point basep = {5, 3};
+ ns::point basep = {5, 3, 3};
adapted::point p(basep);
- fusion::vector<int, long> v(p);
+ fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from adapted::point to list
- ns::point basep = {5, 3};
+ ns::point basep = {5, 3, 3};
adapted::point p(basep);
- fusion::list<int, long> l(p);
+ fusion::list<int, long, int> l(p);
l = p;
}
diff --git a/libs/fusion/test/sequence/adapt_tpl_adt.cpp b/libs/fusion/test/sequence/adapt_tpl_adt.cpp
index aeb0f7215..bbd1d07fe 100644
--- a/libs/fusion/test/sequence/adapt_tpl_adt.cpp
+++ b/libs/fusion/test/sequence/adapt_tpl_adt.cpp
@@ -39,27 +39,45 @@ namespace ns
{
public:
- point() : x(0), y(0) {}
- point(X x_, Y y_) : x(x_), y(y_) {}
+ point() : x(0), y(0), z(0) {}
+ point(X x_, Y y_, int z_) : x(x_), y(y_), z(z_) {}
X get_x() const { return x; }
Y get_y() const { return y; }
+ int get_z() const { return z; }
void set_x(X x_) { x = x_; }
void set_y(Y y_) { y = y_; }
+ void set_z(int z_) { z = z_; }
private:
X x;
Y y;
+ int z;
};
}
-BOOST_FUSION_ADAPT_TPL_ADT(
- (X)(Y),
- (ns::point)(X)(Y),
- (X, X, obj.get_x(), obj.set_x(val))
- (Y, Y, obj.get_y(), obj.set_y(val))
-)
+
+#if BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_TPL_ADT(
+ (X)(Y),
+ (ns::point)(X)(Y),
+ (X, X, obj.get_x(), obj.set_x(val))
+ (Y, Y, obj.get_y(), obj.set_y(val))
+ (obj.get_z(), obj.set_z(val))
+ )
+
+#else // BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_TPL_ADT(
+ (X)(Y),
+ (ns::point)(X)(Y),
+ (X, X, obj.get_x(), obj.set_x(val))
+ (Y, Y, obj.get_y(), obj.set_y(val))
+ (BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
+ )
+#endif
int
main()
@@ -75,28 +93,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
- point p(123, 456);
+ point p(123, 456, 789);
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- boost::fusion::vector<int, float> v1(4, 2);
- point v2(5, 3);
- boost::fusion::vector<long, double> v3(5, 4);
+ boost::fusion::vector<int, float, int> v1(4, 2, 2);
+ point v2(5, 3, 3);
+ boost::fusion::vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -108,9 +128,9 @@ main()
}
{
- boost::fusion::vector<std::string, std::string> v1("Lincoln", "Abraham");
- name v2("Roosevelt", "Franklin");
- name v3("Roosevelt", "Theodore");
+ boost::fusion::vector<std::string, std::string, int> v1("Lincoln", "Abraham", 3);
+ name v2("Roosevelt", "Franklin", 3);
+ name v3("Roosevelt", "Theodore", 3);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -123,15 +143,15 @@ main()
{
// conversion from point to vector
- point p(5, 3);
- boost::fusion::vector<int, long> v(p);
+ point p(5, 3, 3);
+ boost::fusion::vector<int, long, int> v(p);
v = p;
}
{
// conversion from point to list
- point p(5, 3);
- boost::fusion::list<int, long> l(p);
+ point p(5, 3, 3);
+ boost::fusion::list<int, long, int> l(p);
l = p;
}
diff --git a/libs/fusion/test/sequence/adapt_tpl_struct.cpp b/libs/fusion/test/sequence/adapt_tpl_struct.cpp
index 352cf9957..86face6d4 100644
--- a/libs/fusion/test/sequence/adapt_tpl_struct.cpp
+++ b/libs/fusion/test/sequence/adapt_tpl_struct.cpp
@@ -35,19 +35,40 @@ namespace ns
{
X x;
Y y;
+ int z;
};
}
-BOOST_FUSION_ADAPT_TPL_STRUCT(
- (X)(Y),
- (ns::point)(X)(Y),
- (X, x)
- (Y, y)
-)
+#if BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_TPL_STRUCT(
+ (X)(Y),
+ (ns::point)(X)(Y),
+ x,
+ (BOOST_FUSION_ADAPT_AUTO, y)
+ (int, z)
+ )
+
+ template<typename M>
+ struct s { M m; };
+ BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), m)
+
+#else // BOOST_PP_VARIADICS
+
+ BOOST_FUSION_ADAPT_TPL_STRUCT(
+ (X)(Y),
+ (ns::point)(X)(Y),
+ (X, x)
+ (Y, y)
+ (BOOST_FUSION_ADAPT_AUTO, z)
+ )
+
+ template<typename M>
+ struct s { M m; };
+ BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), (BOOST_FUSION_ADAPT_AUTO, m))
+
+#endif
-template<typename M>
-struct s { M m; };
-BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), (M, m))
int
main()
@@ -62,28 +83,30 @@ main()
{
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
- point p = {123, 456};
+ point p = {123, 456, 789};
std::cout << at_c<0>(p) << std::endl;
std::cout << at_c<1>(p) << std::endl;
+ std::cout << at_c<2>(p) << std::endl;
std::cout << p << std::endl;
- BOOST_TEST(p == make_vector(123, 456));
+ BOOST_TEST(p == make_vector(123, 456, 789));
at_c<0>(p) = 6;
at_c<1>(p) = 9;
- BOOST_TEST(p == make_vector(6, 9));
+ at_c<2>(p) = 12;
+ BOOST_TEST(p == make_vector(6, 9, 12));
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
+ BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
BOOST_TEST(front(p) == 6);
- BOOST_TEST(back(p) == 9);
+ BOOST_TEST(back(p) == 12);
}
{
- vector<int, float> v1(4, 2);
- point v2 = {5, 3};
- vector<long, double> v3(5, 4);
+ vector<int, float, int> v1(4, 2, 2);
+ point v2 = {5, 3, 3};
+ vector<long, double, int> v3(5, 4, 4);
BOOST_TEST(v1 < v2);
BOOST_TEST(v1 <= v2);
BOOST_TEST(v2 > v1);
@@ -96,14 +119,14 @@ main()
{
// conversion from point to vector
- point p = {5, 3};
- vector<int, long> v(p);
+ point p = {5, 3, 3};
+ vector<int, long, int> v(p);
v = p;
}
{
// conversion from point to list
- point p = {5, 3};
+ point p = {5, 3, 3};
list<int, long> l(p);
l = p;
}
diff --git a/libs/fusion/test/sequence/as_deque.cpp b/libs/fusion/test/sequence/as_deque.cpp
new file mode 100644
index 000000000..c56c598dd
--- /dev/null
+++ b/libs/fusion/test/sequence/as_deque.cpp
@@ -0,0 +1,70 @@
+/*=============================================================================
+ Copyright (c) 2014 Louis Dionne
+
+ 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)
+==============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/algorithm/transformation/push_back.hpp>
+#include <boost/fusion/algorithm/transformation/push_front.hpp>
+#include <boost/fusion/container/deque/convert.hpp>
+#include <boost/fusion/container/deque/deque.hpp>
+#include <boost/fusion/container/generation/make_deque.hpp>
+#include <boost/fusion/container/generation/make_list.hpp>
+#include <boost/fusion/container/generation/make_vector.hpp>
+#include <boost/fusion/sequence/comparison/equal_to.hpp>
+
+#include <string>
+
+
+int main() {
+ using namespace boost::fusion;
+ using namespace boost;
+
+ BOOST_TEST(as_deque(make_vector()) == make_deque());
+ BOOST_TEST(as_deque(make_vector(1)) == make_deque(1));
+ BOOST_TEST(as_deque(make_vector(1, '2')) == make_deque(1, '2'));
+ BOOST_TEST(as_deque(make_vector(1, '2', 3.3f)) == make_deque(1, '2', 3.3f));
+
+ BOOST_TEST(as_deque(make_list()) == make_deque());
+ BOOST_TEST(as_deque(make_list(1)) == make_deque(1));
+ BOOST_TEST(as_deque(make_list(1, '2')) == make_deque(1, '2'));
+ BOOST_TEST(as_deque(make_list(1, '2', 3.3f)) == make_deque(1, '2', 3.3f));
+
+ {
+ deque<> xs;
+ BOOST_TEST(as_deque(push_back(xs, 1)) == make_deque(1));
+ }
+
+ {
+ deque<int> xs(1);
+ BOOST_TEST(as_deque(push_back(xs, '2')) == make_deque(1, '2'));
+ }
+
+ {
+ deque<int, char> xs(1, '2');
+ BOOST_TEST(as_deque(push_back(xs, 3.3f)) == make_deque(1, '2', 3.3f));
+ }
+
+ {
+ deque<> xs;
+ BOOST_TEST(
+ as_deque(push_front(xs, make_deque(1, '2', 3.3f))) ==
+ make_deque(make_deque(1, '2', 3.3f))
+ );
+
+ BOOST_TEST(as_deque(make_deque(make_deque(1))) == make_deque(make_deque(1)));
+ }
+
+/* Disabling test for now, see https://github.com/boostorg/fusion/pull/38 ($$$ FIXME $$$)
+
+ {
+ deque<> xs;
+ BOOST_TEST(
+ as_deque(push_front(xs, make_vector(1, '2', 3.3f))) ==
+ make_deque(make_vector(1, '2', 3.3f))
+ );
+ }
+*/
+ return boost::report_errors();
+}
diff --git a/libs/fusion/test/sequence/as_map_assoc.cpp b/libs/fusion/test/sequence/as_map_assoc.cpp
new file mode 100644
index 000000000..bc9a6951c
--- /dev/null
+++ b/libs/fusion/test/sequence/as_map_assoc.cpp
@@ -0,0 +1,85 @@
+/*=============================================================================
+ Copyright (c) 2001-2011 Joel de Guzman
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/adapted/mpl.hpp>
+#include <boost/fusion/container/generation/make_vector.hpp>
+#include <boost/fusion/container/map/convert.hpp>
+#include <boost/fusion/container/generation/make_set.hpp>
+#include <boost/fusion/container/vector/convert.hpp>
+#include <boost/fusion/sequence/comparison/equal_to.hpp>
+#include <boost/fusion/sequence/intrinsic/at_key.hpp>
+#include <boost/fusion/sequence/io/out.hpp>
+#include <boost/fusion/support/pair.hpp>
+
+namespace ns
+{
+ struct x_member;
+ struct y_member;
+ struct z_member;
+
+ struct point
+ {
+ int x;
+ int y;
+ };
+}
+
+BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+ ns::point,
+ (int, x, ns::x_member)
+ (int, y, ns::y_member)
+)
+
+int
+main()
+{
+ using namespace boost::fusion;
+ using namespace boost;
+
+ std::cout << tuple_open('[');
+ std::cout << tuple_close(']');
+ std::cout << tuple_delimiter(", ");
+
+ {
+ ns::point p = {123, 456};
+ std::cout << as_map(p) << std::endl;
+ }
+
+ {
+ ns::point p = {123, 456};
+ boost::fusion::result_of::as_map<ns::point>::type map(p);
+ std::cout << at_key<ns::x_member>(map) << std::endl;
+ std::cout << at_key<ns::y_member>(map) << std::endl;
+ BOOST_TEST(at_key<ns::x_member>(map) == 123);
+ BOOST_TEST(at_key<ns::y_member>(map) == 456);
+ }
+
+ {
+ boost::fusion::result_of::as_map<set<int, char> >::type map(make_set(1, '2'));
+ BOOST_TEST(at_key<int>(map) == 1);
+ BOOST_TEST(at_key<char>(map) == '2');
+ }
+
+ {
+ // test conversion
+ typedef map<
+ pair<ns::x_member, int>
+ , pair<ns::y_member, int> >
+ map_type;
+
+ ns::point p = {123, 456};
+ map_type m(p);
+ BOOST_TEST(as_vector(m) == make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456)));
+ m = (make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456))); // test assign
+ BOOST_TEST(as_vector(m) == make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456)));
+ }
+
+ return boost::report_errors();
+}
+
diff --git a/libs/fusion/test/sequence/back_extended_deque.cpp b/libs/fusion/test/sequence/back_extended_deque.cpp
index edae9276c..368ec0c26 100644
--- a/libs/fusion/test/sequence/back_extended_deque.cpp
+++ b/libs/fusion/test/sequence/back_extended_deque.cpp
@@ -24,6 +24,45 @@ int main()
{
using namespace boost::fusion;
{
+ typedef deque<> initial_deque_type;
+ initial_deque_type initial_deque;
+ typedef back_extended_deque<initial_deque_type, long> extended_type;
+ extended_type extended(initial_deque, 101L);
+
+ BOOST_TEST(size(extended) == 1);
+ BOOST_TEST(extended == make_vector(101L));
+ BOOST_TEST(*begin(extended) == 101L);
+ BOOST_TEST(*prior(end(extended)) == 101L);
+ BOOST_TEST(distance(begin(extended), end(extended)) == 1);
+ }
+ {
+ namespace mpl = boost::mpl;
+ typedef deque<> initial_deque_type;
+ typedef back_extended_deque<initial_deque_type, long> extended_type;
+
+ BOOST_MPL_ASSERT((boost::is_same<mpl::at_c<extended_type, 0>::type, long>));
+ BOOST_MPL_ASSERT((boost::is_same<mpl::deref<mpl::begin<extended_type>::type>::type, long>));
+ BOOST_MPL_ASSERT((mpl::equal_to<mpl::size<extended_type>::type, mpl::int_<1> >));
+ }
+ {
+ long l(101L);
+ typedef deque<> initial_deque_type;
+ initial_deque_type initial_deque;
+ typedef back_extended_deque<initial_deque_type, long&> extended_type;
+ extended_type extended(initial_deque, l);
+ BOOST_TEST(extended == make_vector(101L));
+
+ long l2(202L);
+ extended_type extended2(initial_deque_type(), l2);
+
+ extended = extended2;
+
+ BOOST_TEST(extended == make_vector(202L));
+
+ BOOST_TEST(l == l2);
+ }
+
+ {
typedef deque<int, char> initial_deque_type;
initial_deque_type initial_deque(1, 'a');
typedef back_extended_deque<initial_deque_type, long> extended_type;
diff --git a/libs/fusion/test/sequence/boost_tuple.cpp b/libs/fusion/test/sequence/boost_tuple.cpp
index c16c08940..7d19ffef3 100644
--- a/libs/fusion/test/sequence/boost_tuple.cpp
+++ b/libs/fusion/test/sequence/boost_tuple.cpp
@@ -23,6 +23,7 @@
#include <boost/fusion/sequence/comparison/less_equal.hpp>
#include <boost/fusion/sequence/comparison/greater.hpp>
#include <boost/fusion/sequence/comparison/greater_equal.hpp>
+#include <boost/fusion/sequence/convert.hpp>
#include <boost/fusion/mpl.hpp>
#include <boost/fusion/support/is_view.hpp>
#include <boost/tuple/tuple.hpp>
@@ -87,7 +88,14 @@ main()
fusion::list<int, std::string> l(tuples::make_tuple(123, "Hola!!!"));
l = tuples::make_tuple(123, "Hola!!!");
}
-
+
+ {
+ // conversion vector to boost tuple
+ boost::tuple<int, std::string> t = convert<boost_tuple_tag>(make_vector(123, "Hola!!!"));
+ BOOST_TEST(get<0>(t) == 123);
+ BOOST_TEST(get<1>(t) == "Hola!!!");
+ }
+
{
// test from Ticket #1601, submitted by Shunsuke Sogame
// expanded by Stjepan Rajko
diff --git a/libs/fusion/test/sequence/boost_tuple_iterator.cpp b/libs/fusion/test/sequence/boost_tuple_iterator.cpp
new file mode 100644
index 000000000..3ab096b9b
--- /dev/null
+++ b/libs/fusion/test/sequence/boost_tuple_iterator.cpp
@@ -0,0 +1,21 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+
+#include <boost/fusion/adapted/boost_tuple.hpp>
+
+#define FUSION_SEQUENCE boost::tuple
+#define FUSION_TRAVERSAL_TAG forward_traversal_tag
+#define FUSION_NO_PRIOR
+#include "./iterator.hpp"
+
+int
+main()
+{
+ test();
+ return boost::report_errors();
+}
+
diff --git a/libs/fusion/test/sequence/cons.cpp b/libs/fusion/test/sequence/cons.cpp
index cb74af619..88a04101c 100644
--- a/libs/fusion/test/sequence/cons.cpp
+++ b/libs/fusion/test/sequence/cons.cpp
@@ -16,6 +16,7 @@
#include <boost/lambda/lambda.hpp>
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/algorithm/transformation/filter_if.hpp>
+#include <boost/fusion/algorithm/transformation/push_front.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/type_traits/is_same.hpp>
@@ -83,6 +84,12 @@ main()
BOOST_TEST((*begin(tie) == 3));
}
+ {
+ // This used to trigger a hard compilation error:
+ cons<cons<int> > xs;
+ begin(push_front(xs, 3));
+ }
+
return boost::report_errors();
}
diff --git a/libs/fusion/test/sequence/deduce_sequence.cpp b/libs/fusion/test/sequence/deduce_sequence.cpp
index ea6616627..a1569f46f 100644
--- a/libs/fusion/test/sequence/deduce_sequence.cpp
+++ b/libs/fusion/test/sequence/deduce_sequence.cpp
@@ -6,6 +6,7 @@
http://www.boost.org/LICENSE_1_0.txt).
==============================================================================*/
+#include <boost/config.hpp>
#include <boost/fusion/support/deduce_sequence.hpp>
#include <boost/fusion/mpl.hpp>
#include <boost/detail/lightweight_test.hpp>
@@ -13,6 +14,9 @@
#include <boost/mpl/equal.hpp>
#include <boost/ref.hpp>
+#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
+#include <functional>
+#endif
using boost::is_same;
using boost::reference_wrapper;
@@ -66,6 +70,13 @@ int main()
TEST_SAME_TYPE(deduce< reference_wrapper<int> const & >::type, int &);
TEST_SAME_TYPE(deduce< reference_wrapper<int const> const & >::type, int const &);
+#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
+ TEST_SAME_TYPE(deduce< std::reference_wrapper<int> & >::type, int &);
+ TEST_SAME_TYPE(deduce< std::reference_wrapper<int const> & >::type, int const &);
+ TEST_SAME_TYPE(deduce< std::reference_wrapper<int> const & >::type, int &);
+ TEST_SAME_TYPE(deduce< std::reference_wrapper<int const> const & >::type, int const &);
+#endif
+
TEST_SAME_TYPE(deduce< int(&)[2] >::type, int(&)[2]);
TEST_SAME_TYPE(deduce< int const (&)[2] >::type, int const (&)[2]);
TEST_SAME_TYPE(deduce< int volatile (&)[2] >::type, int volatile (&)[2]);
diff --git a/libs/fusion/test/sequence/define_struct_inline.cpp b/libs/fusion/test/sequence/define_struct_inline.cpp
index 9cbd8ea0c..e849ce9b1 100644
--- a/libs/fusion/test/sequence/define_struct_inline.cpp
+++ b/libs/fusion/test/sequence/define_struct_inline.cpp
@@ -1,8 +1,8 @@
/*=============================================================================
Copyright (c) 2010, 2012 Christopher Schmidt, Nathan Ridge
- Distributed under the Boost Software Liceclse, Version 1.0. (See accompanying
- file LICEclsE_1_0.txt or copy at http://www.boost.org/LICEclsE_1_0.txt)
+ 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)
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
diff --git a/libs/fusion/test/sequence/deque_hash.cpp b/libs/fusion/test/sequence/deque_hash.cpp
new file mode 100644
index 000000000..01b36660a
--- /dev/null
+++ b/libs/fusion/test/sequence/deque_hash.cpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2014 Christoph Weiss
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/deque/deque.hpp>
+
+#define FUSION_SEQUENCE deque
+#include "hash.hpp"
+
+int main()
+{
+ hash_test();
+ return boost::report_errors();
+}
diff --git a/libs/fusion/test/sequence/front_extended_deque.cpp b/libs/fusion/test/sequence/front_extended_deque.cpp
index d1c903432..cdbedeb3b 100644
--- a/libs/fusion/test/sequence/front_extended_deque.cpp
+++ b/libs/fusion/test/sequence/front_extended_deque.cpp
@@ -24,6 +24,45 @@ int main()
{
using namespace boost::fusion;
{
+ typedef deque<> initial_deque_type;
+ initial_deque_type initial_deque;
+ typedef front_extended_deque<initial_deque_type, int> extended_type;
+ extended_type extended(initial_deque, 1);
+
+ BOOST_TEST(size(extended) == 1);
+ BOOST_TEST(extended == make_vector(1));
+ BOOST_TEST(*begin(extended) == 1);
+ BOOST_TEST(*prior(end(extended)) == 1);
+ BOOST_TEST(distance(begin(extended), end(extended)) == 1);
+ }
+ {
+ namespace mpl = boost::mpl;
+ typedef deque<> initial_deque_type;
+ typedef front_extended_deque<initial_deque_type, int> extended_type;
+
+ BOOST_MPL_ASSERT((boost::is_same<mpl::at_c<extended_type, 0>::type, int>));
+ BOOST_MPL_ASSERT((boost::is_same<mpl::deref<mpl::begin<extended_type>::type>::type, int>));
+ BOOST_MPL_ASSERT((mpl::equal_to<mpl::size<extended_type>::type, mpl::int_<1> >));
+ }
+ {
+ int i(1);
+ typedef deque<> initial_deque_type;
+ initial_deque_type initial_deque;
+ typedef front_extended_deque<initial_deque_type, int&> extended_type;
+ extended_type extended(initial_deque, i);
+ BOOST_TEST(extended == make_vector(1));
+
+ int i2(2);
+ extended_type extended2(initial_deque_type(), i2);
+
+ extended = extended2;
+
+ BOOST_TEST(extended == make_vector(2));
+
+ BOOST_TEST(i == i2);
+ }
+
+ {
typedef deque<char, long> initial_deque_type;
initial_deque_type initial_deque('a', 101L);
typedef front_extended_deque<initial_deque_type, int> extended_type;
diff --git a/libs/fusion/test/sequence/hash.cpp b/libs/fusion/test/sequence/hash.cpp
new file mode 100644
index 000000000..3740bf550
--- /dev/null
+++ b/libs/fusion/test/sequence/hash.cpp
@@ -0,0 +1,58 @@
+/*=============================================================================
+ Copyright (c) 2014 Christoph Weiss
+
+ 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)
+==============================================================================*/
+
+#include <string>
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/fusion/sequence/hash.hpp>
+
+struct test_struct
+{
+ test_struct(bool bb, int ii, char cc, std::string const& ss) :
+ b(bb),
+ i(ii),
+ c(cc),
+ s(ss) {}
+
+ bool b;
+ int i;
+ char c;
+ std::string s;
+};
+
+BOOST_FUSION_ADAPT_STRUCT(
+ test_struct,
+ (bool, b)
+ (int, i)
+ (char, c)
+ (std::string, s)
+)
+
+int main()
+{
+ using boost::fusion::hash_value;
+
+ const test_struct a0(false, 1, 'c', "Hello Nurse"),
+ a1(false, 1, 'c', "Hello Nurse"),
+ b(true, 1, 'c', "Hello Nurse"),
+ c(false, 0, 'c', "Hello Nurse"),
+ d(false, 1, 'd', "Hello Nurse"),
+ e(false, 1, 'c', "Hello World");
+
+ BOOST_TEST(hash_value(a0) == hash_value(a1));
+ BOOST_TEST(hash_value(a0) != hash_value(b));
+ BOOST_TEST(hash_value(a0) != hash_value(c));
+ BOOST_TEST(hash_value(a0) != hash_value(d));
+ BOOST_TEST(hash_value(a0) != hash_value(e));
+ BOOST_TEST(hash_value(b) != hash_value(c));
+ BOOST_TEST(hash_value(b) != hash_value(d));
+ BOOST_TEST(hash_value(b) != hash_value(d));
+ BOOST_TEST(hash_value(c) != hash_value(d));
+ BOOST_TEST(hash_value(c) != hash_value(e));
+ BOOST_TEST(hash_value(d) != hash_value(e));
+}
diff --git a/libs/fusion/test/sequence/hash.hpp b/libs/fusion/test/sequence/hash.hpp
new file mode 100644
index 000000000..7dea0a3f0
--- /dev/null
+++ b/libs/fusion/test/sequence/hash.hpp
@@ -0,0 +1,34 @@
+/*=============================================================================
+ Copyright (c) 2014 Christoph Weiss
+
+ 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)
+==============================================================================*/
+#include <string>
+#include <utility>
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/sequence/hash.hpp>
+#include <boost/functional/hash.hpp>
+
+void
+hash_test()
+{
+ using namespace boost::fusion;
+
+ const FUSION_SEQUENCE<int, char, bool, std::string> v0(42, 'x', false, "Aurea prima");
+ const FUSION_SEQUENCE<int, char, bool, std::string> v1(42, 'x', false, "Aurea prima");
+ BOOST_TEST(hash_value(v0) == hash_value(v1));
+
+ const FUSION_SEQUENCE<int, char, bool, std::string> w(41, 'x', false, "Aurea prima");
+ BOOST_TEST(hash_value(w) != hash_value(v0));
+
+ const FUSION_SEQUENCE<int, char, bool, std::string> x(42, 'y', false, "Aurea prima");
+ BOOST_TEST(hash_value(x) != hash_value(v0));
+
+ const FUSION_SEQUENCE<int, char, bool, std::string> y(42, 'x', true, "Aurea prima");
+ BOOST_TEST(hash_value(y) != hash_value(v0));
+
+ const FUSION_SEQUENCE<int, char, bool, std::string> z(42, 'x', false, "quae vindice nullo");
+ BOOST_TEST(hash_value(z) != hash_value(v0));
+}
diff --git a/libs/fusion/test/sequence/list_hash.cpp b/libs/fusion/test/sequence/list_hash.cpp
new file mode 100644
index 000000000..51203b273
--- /dev/null
+++ b/libs/fusion/test/sequence/list_hash.cpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2014 Christoph Weiss
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/list/list.hpp>
+
+#define FUSION_SEQUENCE list
+#include "hash.hpp"
+
+int main()
+{
+ hash_test();
+ return boost::report_errors();
+}
diff --git a/libs/fusion/test/sequence/map.cpp b/libs/fusion/test/sequence/map.cpp
index 58497b44d..8dada1675 100644
--- a/libs/fusion/test/sequence/map.cpp
+++ b/libs/fusion/test/sequence/map.cpp
@@ -25,6 +25,24 @@
#include <iostream>
#include <string>
+
+struct copy_all
+{
+ copy_all() {}
+ copy_all(copy_all const&) {}
+
+ template <typename T>
+ copy_all(T const& x)
+ {
+ foo(x); // should fail!
+ }
+};
+
+struct abstract
+{
+ virtual void foo() = 0;
+};
+
int
main()
{
@@ -41,7 +59,8 @@ main()
{
typedef map<
pair<int, char>
- , pair<double, std::string> >
+ , pair<double, std::string>
+ , pair<abstract, int> >
map_type;
BOOST_MPL_ASSERT((traits::is_associative<map_type>));
@@ -49,23 +68,29 @@ main()
map_type m(
make_pair<int>('X')
- , make_pair<double>("Men"));
+ , make_pair<double>("Men")
+ , make_pair<abstract>(2));
std::cout << at_key<int>(m) << std::endl;
std::cout << at_key<double>(m) << std::endl;
+ std::cout << at_key<abstract>(m) << std::endl;
BOOST_TEST(at_key<int>(m) == 'X');
BOOST_TEST(at_key<double>(m) == "Men");
+ BOOST_TEST(at_key<abstract>(m) == 2);
BOOST_STATIC_ASSERT((
boost::is_same<boost::fusion::result_of::value_at_key<map_type, int>::type, char>::value));
BOOST_STATIC_ASSERT((
boost::is_same<boost::fusion::result_of::value_at_key<map_type, double>::type, std::string>::value));
+ BOOST_STATIC_ASSERT((
+ boost::is_same<boost::fusion::result_of::value_at_key<map_type, abstract>::type, int>::value));
std::cout << m << std::endl;
BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key<map_type, int>::value));
BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key<map_type, double>::value));
+ BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key<map_type, abstract>::value));
BOOST_STATIC_ASSERT((!boost::fusion::result_of::has_key<map_type, std::string>::value));
std::cout << deref_data(begin(m)) << std::endl;
@@ -73,15 +98,19 @@ main()
BOOST_TEST(deref_data(begin(m)) == 'X');
BOOST_TEST(deref_data(fusion::next(begin(m))) == "Men");
+ BOOST_TEST(deref_data(fusion::next(next(begin(m)))) == 2);
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::key_of<boost::fusion::result_of::begin<map_type>::type>::type, int>::value));
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::key_of<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type, double>::value));
+ BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::key_of<boost::fusion::result_of::next<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type>::type, abstract>::value));
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::value_of_data<boost::fusion::result_of::begin<map_type>::type>::type, char>::value));
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::value_of_data<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type, std::string>::value));
+ BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::value_of_data<boost::fusion::result_of::next<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type>::type, int>::value));
// Test random access interface.
pair<int, char> a = at_c<0>(m); (void) a;
pair<double, std::string> b = at_c<1>(m);
+ pair<abstract, int> c = at_c<2>(m);
}
// iterators & random access interface.
@@ -119,6 +148,31 @@ main()
BOOST_TEST(at_key<char>(make_map<char, int>('X', 123)) == 'X');
BOOST_TEST(at_key<int>(make_map<char, int>('X', 123)) == 123);
}
+
+ {
+ // test for copy construction of fusion pairs
+ // make sure that the correct constructor is called
+ pair<int, copy_all> p1;
+ pair<int, copy_all> p2 = p1;
+ }
+
+ {
+ // compile test only
+ // make sure result_of::deref_data returns a reference
+ typedef map<pair<float, int> > map_type;
+ typedef boost::fusion::result_of::begin<map_type>::type i_type;
+ typedef boost::fusion::result_of::deref_data<i_type>::type r_type;
+ BOOST_STATIC_ASSERT((boost::is_same<r_type, int&>::value));
+ }
+
+ {
+ // compile test only
+ // make sure result_of::deref_data is const correct
+ typedef map<pair<float, int> > const map_type;
+ typedef boost::fusion::result_of::begin<map_type>::type i_type;
+ typedef boost::fusion::result_of::deref_data<i_type>::type r_type;
+ BOOST_STATIC_ASSERT((boost::is_same<r_type, int const&>::value));
+ }
return boost::report_errors();
}
diff --git a/libs/fusion/test/sequence/map_misc.cpp b/libs/fusion/test/sequence/map_misc.cpp
index 256a16f4f..81da97539 100644
--- a/libs/fusion/test/sequence/map_misc.cpp
+++ b/libs/fusion/test/sequence/map_misc.cpp
@@ -16,6 +16,7 @@
#include <boost/mpl/equal.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/is_sequence.hpp>
#include <boost/type_traits/is_same.hpp>
#include <string>
@@ -148,6 +149,17 @@ test()
BOOST_STATIC_ASSERT(!traits::is_sequence<char>::value);
}
+ { // testing mpl::is_sequence
+
+ typedef map<pair<k1, int>, pair<k2, float>, pair<k3, double> > t1;
+ typedef map<> t2;
+ typedef map<pair<k1, char> > t3;
+
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t1>::value);
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t2>::value);
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t3>::value);
+ }
+
{ // testing mpl compatibility
// test an algorithm
diff --git a/libs/fusion/test/sequence/misc.hpp b/libs/fusion/test/sequence/misc.hpp
index ecbe15494..c426bba8a 100644
--- a/libs/fusion/test/sequence/misc.hpp
+++ b/libs/fusion/test/sequence/misc.hpp
@@ -13,6 +13,7 @@
#include <boost/mpl/equal.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/is_sequence.hpp>
#include <boost/type_traits/is_same.hpp>
#include <string>
@@ -175,6 +176,17 @@ test()
BOOST_STATIC_ASSERT(!traits::is_sequence<char>::value);
}
+ { // testing mpl::is_sequence
+
+ typedef FUSION_SEQUENCE<int, float, double> t1;
+ typedef FUSION_SEQUENCE<> t2;
+ typedef FUSION_SEQUENCE<char> t3;
+
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t1>::value);
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t2>::value);
+ BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t3>::value);
+ }
+
{ // testing mpl compatibility
// test begin, end, next, prior, advance, size, deref, etc.
diff --git a/libs/fusion/test/sequence/move.hpp b/libs/fusion/test/sequence/move.hpp
index febbc2bba..8636604f1 100644
--- a/libs/fusion/test/sequence/move.hpp
+++ b/libs/fusion/test/sequence/move.hpp
@@ -38,12 +38,12 @@ namespace test_detail
return *this;
}
- x(x const& rhs)
+ x(x const& /*rhs*/)
{
incr_copy();
}
- x& operator=(x const& rhs)
+ x& operator=(x const& /*rhs*/)
{
incr_copy();
return *this;
diff --git a/libs/fusion/test/sequence/set.cpp b/libs/fusion/test/sequence/set.cpp
index 1ea6ba241..cf97c100f 100644
--- a/libs/fusion/test/sequence/set.cpp
+++ b/libs/fusion/test/sequence/set.cpp
@@ -18,8 +18,10 @@
#include <boost/fusion/iterator/next.hpp>
#include <boost/fusion/support/pair.hpp>
#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/static_assert.hpp>
#include <boost/mpl/assert.hpp>
+#include <boost/mpl/is_sequence.hpp>
#include <iostream>
#include <string>
@@ -78,6 +80,28 @@ main()
BOOST_TEST(at_key<int>(make_set('X', 123)) == 123);
}
+ { // testing is_sequence
+
+ typedef set<int, float, double> t1;
+ typedef set<> t2;
+ typedef set<char> t3;
+
+ BOOST_MPL_ASSERT((traits::is_sequence<t1>));
+ BOOST_MPL_ASSERT((traits::is_sequence<t2>));
+ BOOST_MPL_ASSERT((traits::is_sequence<t3>));
+ }
+
+ { // testing mpl::is_sequence
+
+ typedef set<int, float, double> t1;
+ typedef set<> t2;
+ typedef set<char> t3;
+
+ BOOST_MPL_ASSERT((boost::mpl::is_sequence<t1>));
+ BOOST_MPL_ASSERT((boost::mpl::is_sequence<t2>));
+ BOOST_MPL_ASSERT((boost::mpl::is_sequence<t3>));
+ }
+
return boost::report_errors();
}
diff --git a/libs/fusion/test/sequence/size.cpp b/libs/fusion/test/sequence/size.cpp
new file mode 100644
index 000000000..8c4c5a55b
--- /dev/null
+++ b/libs/fusion/test/sequence/size.cpp
@@ -0,0 +1,103 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/config.hpp>
+#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/container/deque.hpp>
+#include <boost/fusion/container/list.hpp>
+#include <boost/fusion/container/set.hpp>
+#include <boost/fusion/container/map.hpp>
+#include <boost/fusion/support/pair.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/assert.hpp>
+
+#include <boost/array.hpp>
+#include <boost/fusion/adapted/boost_array.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/fusion/adapted/boost_tuple.hpp>
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
+ !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#include <tuple>
+#include <boost/fusion/adapted/std_tuple.hpp>
+#endif
+
+template <typename LHS, typename RHS>
+void check_(LHS const&, RHS const&)
+{
+ BOOST_MPL_ASSERT((boost::is_same<LHS, RHS>));
+}
+
+template <typename S>
+void check()
+{
+ check_(
+ boost::fusion::result_of::size<S>::type::value
+ , boost::fusion::result_of::size<S>::value
+ );
+}
+
+void test()
+{
+ {
+ check<boost::fusion::vector<> >();
+ check<boost::fusion::vector<int> >();
+ check<boost::fusion::vector<int, int> >();
+ check<boost::fusion::vector<int, int, int> >();
+ }
+
+ {
+ check<boost::fusion::deque<> >();
+ check<boost::fusion::deque<int> >();
+ check<boost::fusion::deque<int, int> >();
+ check<boost::fusion::deque<int, int, int> >();
+ }
+
+ {
+ check<boost::fusion::list<> >();
+ check<boost::fusion::list<int> >();
+ check<boost::fusion::list<int, int> >();
+ check<boost::fusion::list<int, int, int> >();
+ }
+
+ {
+ check<boost::fusion::set<> >();
+ check<boost::fusion::set<int> >();
+ check<boost::fusion::set<int, float> >();
+ check<boost::fusion::set<int, float, double> >();
+ }
+
+ {
+ check<boost::fusion::map<> >();
+ check<boost::fusion::map<boost::fusion::pair<int, int> > >();
+ check<boost::fusion::map<boost::fusion::pair<int, int> , boost::fusion::pair<float, int> > >();
+ check<boost::fusion::map<boost::fusion::pair<int, int> , boost::fusion::pair<float, int> , boost::fusion::pair<double, int> > >();
+ }
+
+ {
+ check<boost::array<int, 1> >();
+ check<boost::array<int, 2> >();
+ check<boost::array<int, 3> >();
+ }
+
+ {
+ check<boost::tuples::tuple<> >();
+ check<boost::tuples::tuple<int> >();
+ check<boost::tuples::tuple<int, int> >();
+ check<boost::tuples::tuple<int, int, int> >();
+ }
+
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
+ !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+ {
+ check<std::tuple<> >();
+ check<std::tuple<int> >();
+ check<std::tuple<int, int> >();
+ check<std::tuple<int, int, int> >();
+ }
+#endif
+}
+
diff --git a/libs/fusion/test/sequence/std_tuple.cpp b/libs/fusion/test/sequence/std_tuple.cpp
new file mode 100644
index 000000000..2495fa550
--- /dev/null
+++ b/libs/fusion/test/sequence/std_tuple.cpp
@@ -0,0 +1,46 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+
+#include <boost/config.hpp>
+
+// adapted/std_tuple.hpp only supports implementations using variadic templates
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
+ !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/adapted/std_tuple.hpp>
+#include <boost/fusion/sequence/convert.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/container/generation/make_vector.hpp>
+#include <tuple>
+#include <string>
+
+int
+main()
+{
+ using namespace boost::fusion;
+ using namespace boost;
+
+ {
+ // conversion vector to std tuple
+ std::tuple<int, std::string> t = convert<std_tuple_tag>(make_vector(123, "Hola!!!"));
+ BOOST_TEST(std::get<0>(t) == 123);
+ BOOST_TEST(std::get<1>(t) == "Hola!!!");
+ }
+
+ return boost::report_errors();
+}
+
+#else
+
+int
+main()
+{
+ return 0;
+}
+
+#endif
diff --git a/libs/fusion/test/sequence/std_tuple_iterator.cpp b/libs/fusion/test/sequence/std_tuple_iterator.cpp
index 202fb7a53..e33db3861 100644
--- a/libs/fusion/test/sequence/std_tuple_iterator.cpp
+++ b/libs/fusion/test/sequence/std_tuple_iterator.cpp
@@ -8,7 +8,8 @@
// The std_tuple_iterator adaptor only supports implementations
// using variadic templates
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
+ !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/fusion/adapted/std_tuple.hpp>
diff --git a/libs/fusion/test/sequence/test_deduce_sequence.cpp b/libs/fusion/test/sequence/test_deduce_sequence.cpp
index d137cd307..d7a3b8135 100644
--- a/libs/fusion/test/sequence/test_deduce_sequence.cpp
+++ b/libs/fusion/test/sequence/test_deduce_sequence.cpp
@@ -1,3 +1,9 @@
+/*=============================================================================
+ Copyright (c) 2009 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)
+==============================================================================*/
#include <boost/mpl/vector.hpp>
#include <boost/fusion/support.hpp>
diff --git a/libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp b/libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp
deleted file mode 100644
index 010d4c710..000000000
--- a/libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <boost/tr1/memory.hpp>
-#include <boost/tr1/tuple.hpp>
-#include <boost/any.hpp>
-#include <iostream>
-
-namespace Core
-{
- class AutoConverter
- {
- std::tr1::shared_ptr<boost::any> t_;
-
- public:
- AutoConverter(std::tr1::shared_ptr<boost::any> const & t)
- : t_(t)
- {}
-
- template <typename C>
- operator C ()
- {
- try
- {
- boost::any & a = (*t_);
-
- return boost::any_cast<C>(a);
- }
- catch(boost::bad_any_cast & e)
- {
- std::cerr << "Internal conversion bug: "
- << "Failed to convert data holder to "
- << typeid(C).name() << "\n"
- << e.what()
- << std::endl;
-
- C c = C();
- return c;
- }
- }
- };
-
-
- inline AutoConverter Demo()
- {
- std::tr1::shared_ptr<boost::any> p_result
- (new boost::any(std::tr1::make_tuple(1, 2, 3, 4)));
- return p_result;
- }
-
-} // namespace Core
-
-
-int main()
-{
- std::tr1::tuple<int, int, int, int> test = Core::Demo();
- return 0;
-}
-
diff --git a/libs/fusion/test/algorithm/fold2.cpp b/libs/fusion/test/sequence/tuple_hash.cpp
index 51ef975db..e8f604ef5 100644
--- a/libs/fusion/test/algorithm/fold2.cpp
+++ b/libs/fusion/test/sequence/tuple_hash.cpp
@@ -1,8 +1,16 @@
/*=============================================================================
- Copyright (c) 2010 Christopher Schmidt
+ Copyright (c) 2014 Christoph Weiss
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)
==============================================================================*/
+#include <boost/fusion/tuple/tuple.hpp>
-#include "fold.hpp"
+#define FUSION_SEQUENCE tuple
+#include "hash.hpp"
+
+int main()
+{
+ hash_test();
+ return boost::report_errors();
+}
diff --git a/libs/fusion/test/sequence/vector_hash.cpp b/libs/fusion/test/sequence/vector_hash.cpp
new file mode 100644
index 000000000..6b6dcd24c
--- /dev/null
+++ b/libs/fusion/test/sequence/vector_hash.cpp
@@ -0,0 +1,16 @@
+/*=============================================================================
+ Copyright (c) 2014 Christoph Weiss
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/vector/vector.hpp>
+
+#define FUSION_SEQUENCE vector
+#include "hash.hpp"
+
+int main()
+{
+ hash_test();
+ return boost::report_errors();
+}
diff --git a/libs/fusion/test/support/pair_container.hpp b/libs/fusion/test/support/pair_container.hpp
new file mode 100644
index 000000000..3e84f0588
--- /dev/null
+++ b/libs/fusion/test/support/pair_container.hpp
@@ -0,0 +1,27 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/fusion/support/pair.hpp>
+
+using namespace boost::fusion;
+
+template <typename C>
+void copy()
+{
+ pair<int, C> src;
+ pair<int, C> dest = src;
+ boost::ignore_unused(dest);
+}
+
+void test()
+{
+ copy<FUSION_SEQUENCE<> >();
+ copy<FUSION_SEQUENCE<TEST_TYPE> >();
+ copy<FUSION_SEQUENCE<TEST_TYPE, TEST_TYPE> >();
+}
+
diff --git a/libs/fusion/test/support/pair_deque.cpp b/libs/fusion/test/support/pair_deque.cpp
new file mode 100644
index 000000000..27da30ec4
--- /dev/null
+++ b/libs/fusion/test/support/pair_deque.cpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/deque/deque.hpp>
+
+#define FUSION_SEQUENCE deque
+#define TEST_TYPE int
+#include "./pair_container.hpp"
+
+int main()
+{
+ test();
+}
+
diff --git a/libs/fusion/test/support/pair_list.cpp b/libs/fusion/test/support/pair_list.cpp
new file mode 100644
index 000000000..ce478ff68
--- /dev/null
+++ b/libs/fusion/test/support/pair_list.cpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/list/list.hpp>
+
+#define FUSION_SEQUENCE list
+#define TEST_TYPE int
+#include "./pair_container.hpp"
+
+int main()
+{
+ test();
+}
+
diff --git a/libs/fusion/test/support/pair_map.cpp b/libs/fusion/test/support/pair_map.cpp
new file mode 100644
index 000000000..d472ba269
--- /dev/null
+++ b/libs/fusion/test/support/pair_map.cpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/map/map.hpp>
+
+#define FUSION_SEQUENCE map
+#define TEST_TYPE pair<int,int>
+#include "./pair_container.hpp"
+
+int main()
+{
+ test();
+}
+
diff --git a/libs/fusion/test/support/pair_set.cpp b/libs/fusion/test/support/pair_set.cpp
new file mode 100644
index 000000000..b346a8ba5
--- /dev/null
+++ b/libs/fusion/test/support/pair_set.cpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/set/set.hpp>
+
+#define FUSION_SEQUENCE set
+#define TEST_TYPE int
+#include "./pair_container.hpp"
+
+int main()
+{
+ test();
+}
+
diff --git a/libs/fusion/test/support/pair_vector.cpp b/libs/fusion/test/support/pair_vector.cpp
new file mode 100644
index 000000000..62a4f2b55
--- /dev/null
+++ b/libs/fusion/test/support/pair_vector.cpp
@@ -0,0 +1,17 @@
+/*=============================================================================
+ Copyright (c) 2014 Kohei Takahashi
+
+ 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)
+==============================================================================*/
+#include <boost/fusion/container/vector/vector.hpp>
+
+#define FUSION_SEQUENCE vector
+#define TEST_TYPE int
+#include "./pair_container.hpp"
+
+int main()
+{
+ test();
+}
+