From 8aef19648b14a9ccb62faafdb193ac2869048807 Mon Sep 17 00:00:00 2001 From: Joel de Guzman Date: Sun, 15 Sep 2013 06:16:39 +0000 Subject: [PATCH] big merge from trunk [SVN r85668] --- doc/iterator.qbk | 2 +- test/sequence/define_struct_inline.cpp | 134 ++++++++++++++++++++ test/sequence/define_tpl_struct_inline.cpp | 137 +++++++++++++++++++++ 3 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 test/sequence/define_struct_inline.cpp create mode 100644 test/sequence/define_tpl_struct_inline.cpp diff --git a/doc/iterator.qbk b/doc/iterator.qbk index ff768f92..e9d7d823 100644 --- a/doc/iterator.qbk +++ b/doc/iterator.qbk @@ -492,7 +492,7 @@ Deferences the data property associated with the element referenced by an associ template< typename I > - typename __result_of_deref_data__::type deref(I const& i); + typename __result_of_deref_data__::type deref_data(I const& i); [table Parameters [[Parameter] [Requirement] [Description]] diff --git a/test/sequence/define_struct_inline.cpp b/test/sequence/define_struct_inline.cpp new file mode 100644 index 00000000..9cbd8ea0 --- /dev/null +++ b/test/sequence/define_struct_inline.cpp @@ -0,0 +1,134 @@ +/*============================================================================= + 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) +==============================================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct cls +{ + BOOST_FUSION_DEFINE_STRUCT_INLINE( + point, + (int, x) + (int, y) + ) +}; + +template +struct tpl_cls +{ + BOOST_FUSION_DEFINE_STRUCT_INLINE( + point, + (int, x) + (int, y) + ) +}; + +namespace ns +{ + BOOST_FUSION_DEFINE_STRUCT_INLINE(s, (int, m)) + + BOOST_FUSION_DEFINE_STRUCT_INLINE(empty_struct, ) +} + +template +void run_test() +{ + using namespace boost::fusion; + + std::cout << tuple_open('['); + std::cout << tuple_close(']'); + std::cout << tuple_delimiter(", "); + + { + BOOST_STATIC_ASSERT(boost::fusion::result_of::size::value == 0); + BOOST_STATIC_ASSERT(boost::fusion::result_of::empty::value); + } + + { + BOOST_MPL_ASSERT_NOT((traits::is_view)); + Point p(123, 456); + + std::cout << at_c<0>(p) << std::endl; + std::cout << at_c<1>(p) << std::endl; + std::cout << p << std::endl; + BOOST_TEST(p == make_vector(123, 456)); + + at_c<0>(p) = 6; + at_c<1>(p) = 9; + BOOST_TEST(p == make_vector(6, 9)); + + BOOST_STATIC_ASSERT(boost::fusion::result_of::size::value == 2); + BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty::value); + + BOOST_TEST(front(p) == 6); + BOOST_TEST(back(p) == 9); + } + + { + vector v1(4, 2); + Point v2(5, 3); + vector v3(5, 4); + BOOST_TEST(v1 < v2); + BOOST_TEST(v1 <= v2); + BOOST_TEST(v2 > v1); + BOOST_TEST(v2 >= v1); + BOOST_TEST(v2 < v3); + BOOST_TEST(v2 <= v3); + BOOST_TEST(v3 > v2); + BOOST_TEST(v3 >= v2); + } + + { + // conversion from Point to vector + Point p(5, 3); + vector v(p); + v = p; + } + + { + // conversion from Point to list + Point p(5, 3); + list l(p); + l = p; + } + + { // begin/end + using namespace boost::fusion; + + typedef boost::fusion::result_of::begin::type b; + typedef boost::fusion::result_of::end::type e; + // this fails + BOOST_MPL_ASSERT((boost::is_same::type, e>)); + } + + { + Point p = make_list(5,3); + BOOST_TEST(p == make_vector(5,3)); + + p = make_list(3,5); + BOOST_TEST(p == make_vector(3,5)); + } +} + +int +main() +{ + run_test(); // test with non-template enclosing class + run_test::point>(); // test with template enclosing class + return boost::report_errors(); + +} + diff --git a/test/sequence/define_tpl_struct_inline.cpp b/test/sequence/define_tpl_struct_inline.cpp new file mode 100644 index 00000000..fad064f7 --- /dev/null +++ b/test/sequence/define_tpl_struct_inline.cpp @@ -0,0 +1,137 @@ +/*============================================================================= + Copyright (c) 2010, 2012 Christopher Schmidt, nathan Ridge + + 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct cls +{ + BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE( + (X)(Y), + point, + (X, x) + (Y, y) + ) +}; + +template +struct tpl_cls +{ + BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE( + (X)(Y), + point, + (X, x) + (Y, y) + ) +}; + +namespace ns +{ + BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE((M), s, (M, m)) + + BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE((M), empty_struct, ) +} + +template +void run_test() +{ + using namespace boost::fusion; + + std::cout << tuple_open('['); + std::cout << tuple_close(']'); + std::cout << tuple_delimiter(", "); + + { + BOOST_STATIC_ASSERT(boost::fusion::result_of::size >::value == 0); + BOOST_STATIC_ASSERT(boost::fusion::result_of::empty >::value); + } + + { + BOOST_MPL_ASSERT_NOT((traits::is_view)); + Point p(123, 456); + + std::cout << at_c<0>(p) << std::endl; + std::cout << at_c<1>(p) << std::endl; + std::cout << p << std::endl; + BOOST_TEST(p == make_vector(123, 456)); + + at_c<0>(p) = 6; + at_c<1>(p) = 9; + BOOST_TEST(p == make_vector(6, 9)); + + BOOST_STATIC_ASSERT(boost::fusion::result_of::size::value == 2); + BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty::value); + + BOOST_TEST(front(p) == 6); + BOOST_TEST(back(p) == 9); + } + + { + vector v1(4, 2); + Point v2(5, 3); + vector v3(5, 4); + BOOST_TEST(v1 < v2); + BOOST_TEST(v1 <= v2); + BOOST_TEST(v2 > v1); + BOOST_TEST(v2 >= v1); + BOOST_TEST(v2 < v3); + BOOST_TEST(v2 <= v3); + BOOST_TEST(v3 > v2); + BOOST_TEST(v3 >= v2); + } + + { + // conversion from Point to vector + Point p(5, 3); + vector v(p); + v = p; + } + + { + // conversion from Point to list + Point p(5, 3); + list l(p); + l = p; + } + + { // begin/end + using namespace boost::fusion; + + typedef boost::fusion::result_of::begin >::type b; + typedef boost::fusion::result_of::end >::type e; + // this fails + BOOST_MPL_ASSERT((boost::is_same::type, e>)); + } + + + { + Point p = make_list(5,3); + BOOST_TEST(p == make_vector(5,3)); + + p = make_list(3,5); + BOOST_TEST(p == make_vector(3,5)); + } +} + +int +main() +{ + run_test >(); // test non-template enclosing class + run_test::point >(); // test template enclosing class + + return boost::report_errors(); +} +