Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r78509 - in trunk/libs/fusion: doc test test/sequence
From: joel_at_[hidden]
Date: 2012-05-18 21:24:56


Author: djowel
Date: 2012-05-18 21:24:55 EDT (Fri, 18 May 2012)
New Revision: 78509
URL: http://svn.boost.org/trac/boost/changeset/78509

Log:
BOOST_FUSION_DEFINE_STRUCT_INLINE patch by Nathan Ridge
Added:
   trunk/libs/fusion/test/sequence/define_struct_inline.cpp (contents, props changed)
   trunk/libs/fusion/test/sequence/define_tpl_struct_inline.cpp (contents, props changed)
Text files modified:
   trunk/libs/fusion/doc/adapted.qbk | 94 ++++++++++++++++++++++++++++++++++++++++
   trunk/libs/fusion/test/Jamfile | 4 +
   2 files changed, 97 insertions(+), 1 deletions(-)

Modified: trunk/libs/fusion/doc/adapted.qbk
==============================================================================
--- trunk/libs/fusion/doc/adapted.qbk (original)
+++ trunk/libs/fusion/doc/adapted.qbk 2012-05-18 21:24:55 EDT (Fri, 18 May 2012)
@@ -1115,6 +1115,100 @@
 
 [endsect]
 
+[section:define_struct_inline BOOST_FUSION_DEFINE_STRUCT_INLINE]
+
+[heading Description]
+
+BOOST_FUSION_DEFINE_STRUCT_INLINE is a macro that can be used to generate all
+the necessary boilerplate to define and adapt an arbitrary struct as a model of
+__random_access_sequence__. Unlike BOOST_FUSION_DEFINE_STRUCT, it can be used
+at class or namespace scope.
+
+[heading Synopsis]
+
+ BOOST_FUSION_DEFINE_STRUCT_INLINE(
+ struct_name,
+ (member_type0, member_name0)
+ (member_type1, member_name1)
+ ...
+ )
+
+[heading Expression Semantics]
+
+The semantics of BOOST_FUSION_DEFINE_STRUCT_INLINE are identical to those of
+BOOST_FUSION_DEFINE_STRUCT, with two differences:
+
+# BOOST_FUSION_DEFINE_STRUCT_INLINE can be used at class or namespace scope, and
+ thus does not take a namespace list parameter.
+# The structure generated by BOOST_FUSION_DEFINE_STRUCT_INLINE has a base class,
+ and is thus not POD in C++03.
+
+[heading Header]
+
+ #include <boost/fusion/adapted/struct/define_struct_inline.hpp>
+ #include <boost/fusion/include/define_struct_inline.hpp>
+
+[heading Example]
+
+ // enclosing::employee is a Fusion sequence
+ class enclosing
+ {
+ BOOST_FUSION_DEFINE_STRUCT_INLINE(
+ employee,
+ (std::string, name)
+ (int, age))
+ };
+
+
+[endsect]
+
+[section:define_tpl_struct_inline BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE]
+
+[heading Description]
+
+BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE is a macro that can be used to generate
+all the necessary boilerplate to define and adapt an arbitrary template struct
+as a model of __random_access_sequence__. Unlike BOOST_FUSION_DEFINE_TPL_STRUCT,
+it can be used at class or namespace scope.
+
+[heading Synopsis]
+
+ BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE(
+ (template_param0)(template_param1)...,
+ struct_name,
+ (member_type0, member_name0)
+ (member_type1, member_name1)
+ ...
+ )
+
+[heading Expression Semantics]
+
+The semantics of BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE are identical to those of
+BOOST_FUSION_DEFINE_TPL_STRUCT, with two differences:
+
+# BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE can be used at class or namespace scope,
+ and thus does not take a namespace list parameter.
+# The structure generated by BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE has a base
+ class, and is thus not POD in C++03.
+
+[heading Header]
+
+ #include <boost/fusion/adapted/struct/define_struct_inline.hpp>
+ #include <boost/fusion/include/define_struct_inline.hpp>
+
+[heading Example]
+
+ // Any instantiated enclosing::employee is a Fusion sequence
+ class enclosing
+ {
+ BOOST_FUSION_DEFINE_TPL_STRUCT(
+ (Name)(Age), employee,
+ (Name, name)
+ (Age, age))
+ };
+
+[endsect]
+
 [section:define_assoc_struct BOOST_FUSION_DEFINE_ASSOC_STRUCT]
 
 [heading Description]

Modified: trunk/libs/fusion/test/Jamfile
==============================================================================
--- trunk/libs/fusion/test/Jamfile (original)
+++ trunk/libs/fusion/test/Jamfile 2012-05-18 21:24:55 EDT (Fri, 18 May 2012)
@@ -132,8 +132,10 @@
     [ run sequence/adapt_tpl_struct.cpp : : : : ]
     [ run sequence/adt_attribute_proxy.cpp : : : : ]
     [ run sequence/define_struct.cpp : : : : ]
+ [ run sequence/define_struct_inline.cpp : : : : ]
     [ run sequence/define_assoc_struct.cpp : : : : ]
- [ run sequence/define_tpl_struct.cpp : : : : ]
+ [ run sequence/define_tpl_struct.cpp : : : : ]
+ [ run sequence/define_tpl_struct_inline.cpp : : : : ]
     [ run sequence/define_assoc_tpl_struct.cpp : : : : ]
     [ run sequence/std_tuple_iterator.cpp : : : : ]
 

Added: trunk/libs/fusion/test/sequence/define_struct_inline.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/fusion/test/sequence/define_struct_inline.cpp 2012-05-18 21:24:55 EDT (Fri, 18 May 2012)
@@ -0,0 +1,110 @@
+/*=============================================================================
+ 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 <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/sequence.hpp>
+#include <boost/fusion/container.hpp>
+#include <boost/fusion/support.hpp>
+#include <boost/fusion/sequence/io/out.hpp>
+#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <iostream>
+#include <string>
+
+struct cls
+{
+ BOOST_FUSION_DEFINE_STRUCT_INLINE(
+ point,
+ (int, x)
+ (int, y)
+ )
+};
+
+namespace ns
+{
+ BOOST_FUSION_DEFINE_STRUCT_INLINE(s, (int, m))
+}
+
+int
+main()
+{
+ using namespace boost::fusion;
+
+ std::cout << tuple_open('[');
+ std::cout << tuple_close(']');
+ std::cout << tuple_delimiter(", ");
+
+ {
+ BOOST_MPL_ASSERT_NOT((traits::is_view<cls::point>));
+ cls::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<cls::point>::value == 2);
+ BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<cls::point>::value);
+
+ BOOST_TEST(front(p) == 6);
+ BOOST_TEST(back(p) == 9);
+ }
+
+ {
+ vector<int, float> v1(4, 2);
+ cls::point v2(5, 3);
+ vector<long, double> 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 cls::point to vector
+ cls::point p(5, 3);
+ vector<int, long> v(p);
+ v = p;
+ }
+
+ {
+ // conversion from cls::point to list
+ cls::point p(5, 3);
+ list<int, long> l(p);
+ l = p;
+ }
+
+ { // begin/end
+ using namespace boost::fusion;
+
+ typedef boost::fusion::result_of::begin<ns::s>::type b;
+ typedef boost::fusion::result_of::end<ns::s>::type e;
+ // this fails
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::next<b>::type, e>));
+ }
+
+ {
+ cls::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));
+ }
+
+ return boost::report_errors();
+}
+

Added: trunk/libs/fusion/test/sequence/define_tpl_struct_inline.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/fusion/test/sequence/define_tpl_struct_inline.cpp 2012-05-18 21:24:55 EDT (Fri, 18 May 2012)
@@ -0,0 +1,114 @@
+/*=============================================================================
+ 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 <boost/detail/lightweight_test.hpp>
+#include <boost/fusion/sequence.hpp>
+#include <boost/fusion/container.hpp>
+#include <boost/fusion/support.hpp>
+#include <boost/fusion/sequence/io/out.hpp>
+#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <iostream>
+#include <string>
+
+struct 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))
+}
+
+int
+main()
+{
+ using namespace boost::fusion;
+
+ typedef cls::point<int, int> point;
+
+ std::cout << tuple_open('[');
+ std::cout << tuple_close(']');
+ std::cout << tuple_delimiter(", ");
+
+ {
+ BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
+ 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<point>::value == 2);
+ BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
+
+ BOOST_TEST(front(p) == 6);
+ BOOST_TEST(back(p) == 9);
+ }
+
+ {
+ vector<int, float> v1(4, 2);
+ point v2(5, 3);
+ vector<long, double> 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<int, long> v(p);
+ v = p;
+ }
+
+ {
+ // conversion from point to list
+ point p(5, 3);
+ list<int, long> l(p);
+ l = p;
+ }
+
+ { // begin/end
+ using namespace boost::fusion;
+
+ typedef boost::fusion::result_of::begin<ns::s<int> >::type b;
+ typedef boost::fusion::result_of::end<ns::s<int> >::type e;
+ // this fails
+ BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::next<b>::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));
+ }
+
+ return boost::report_errors();
+}
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk