diff options
Diffstat (limited to 'libs/fusion/test')
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(); +} + |