summaryrefslogtreecommitdiff
path: root/libs/fusion/doc/adapted.qbk
diff options
context:
space:
mode:
Diffstat (limited to 'libs/fusion/doc/adapted.qbk')
-rw-r--r--libs/fusion/doc/adapted.qbk244
1 files changed, 193 insertions, 51 deletions
diff --git a/libs/fusion/doc/adapted.qbk b/libs/fusion/doc/adapted.qbk
index f762a049b..a370e373a 100644
--- a/libs/fusion/doc/adapted.qbk
+++ b/libs/fusion/doc/adapted.qbk
@@ -89,6 +89,35 @@ __std_pair_doc__, __tr1_tuple_pair__
[endsect]
+[section std::tuple]
+
+This module provides adapters for `std::tuple`. Including the module header
+makes `std::tuple` a fully conforming __random_access_sequence__.
+
+[important To be fully conforming, compiler should support C++11 Variadic Templates.]
+
+[heading Header]
+
+ #include <boost/fusion/adapted/std_tuple.hpp>
+ #include <boost/fusion/include/std_tuple.hpp>
+
+[heading Model of]
+
+* __random_access_sequence__
+
+[heading Example]
+
+ std::tuple<int, std::string, float> p(123, "Hola!!!", 456.f);
+ std::cout << __at_c__<0>(p) << std::endl;
+ std::cout << __at_c__<1>(p) << std::endl;
+ std::cout << p << std::endl;
+
+[heading See also]
+
+__std_tuple_doc__
+
+[endsect]
+
[section mpl sequence]
This module provides adapters for __mpl__ sequences. Including the module
@@ -168,8 +197,8 @@ header makes `boost::tuple` a fully conforming __forward_sequence__.
[heading Example]
boost::tuple<int,std::string> example_tuple(101, "hello");
- std::cout << *boost::fusion::begin(example_tuple) << '\n';
- std::cout << *boost::fusion::next(boost::fusion::begin(example_tuple)) << '\n';
+ std::cout << *__begin__(example_tuple) << '\n';
+ std::cout << *__next__(__begin__(example_tuple)) << '\n';
[heading See also]
@@ -187,8 +216,18 @@ __random_access_sequence__.
[heading Synopsis]
BOOST_FUSION_ADAPT_STRUCT(
struct_name,
+ member_name0,
+ member_name1,
+ member_name2,
+ ...
+ )
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_STRUCT(
+ struct_name,
(member_type0, member_name0)
(member_type1, member_name1)
+ (BOOST_FUSION_ADAPT_AUTO, member_name2)
...
)
@@ -196,9 +235,13 @@ __random_access_sequence__.
The above macro generates the necessary code to adapt `struct_name`
as a model of __random_access_sequence__.
-The sequence of `(member_typeN, member_nameN)`
-pairs declares the type and names of each of the struct members that are
-part of the sequence.
+
+The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
+pairs declares the type and names of each of the struct members that are part of
+the sequence.
+
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
The macro should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be adapted.
@@ -208,7 +251,7 @@ namespace qualified name of the struct to be adapted.
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
-[heading Example]
+[heading Example: BOOST_FUSION_ADAPT_STRUCT ]
namespace demo
{
struct employee
@@ -221,8 +264,15 @@ namespace qualified name of the struct to be adapted.
// demo::employee is now a Fusion sequence
BOOST_FUSION_ADAPT_STRUCT(
demo::employee,
- (std::string, name)
- (int, age))
+ name,
+ age)
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_STRUCT(
+ demo::employee,
+ (BOOST_FUSION_ADAPT_AUTO, name)
+ (BOOST_FUSION_ADAPT_AUTO, age)
+ )
[endsect]
@@ -237,8 +287,18 @@ __random_access_sequence__.
BOOST_FUSION_ADAPT_TPL_STRUCT(
(template_param0)(template_param1)...,
(struct_name) (specialization_param0)(specialization_param1)...,
+ member_name0,
+ member_name1
+ ...
+ )
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_TPL_STRUCT(
+ (template_param0)(template_param1)...,
+ (struct_name) (specialization_param0)(specialization_param1)...,
(member_type0, member_name0)
(member_type1, member_name1)
+ (BOOST_FUSION_ADAPT_AUTO, member_name2),
...
)
@@ -252,9 +312,12 @@ the template type parameters used.
The sequence `(specialization_param0)(specialization_param1)...`
declares the template parameters of the actual specialization of `struct_name`
that is adapted as a fusion sequence.
-The sequence of `(member_typeN, member_nameN)`
-pairs declares the type and names of each of the struct members that are
-part of the sequence.
+The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
+pairs declares the type and names of each of the struct members that are part of
+the sequence.
+
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
The macro should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be adapted.
@@ -272,6 +335,7 @@ namespace qualified name of the struct to be adapted.
{
Name name;
Age age;
+ int employment_timestamp;
};
}
@@ -280,7 +344,16 @@ namespace qualified name of the struct to be adapted.
(Name)(Age),
(demo::employee) (Name)(Age),
(Name, name)
- (Age, age))
+ (Age, age)
+ (BOOST_FUSION_ADAPT_AUTO, employment_timestamp))
+
+ // Or by infering type completely
+ BOOST_FUSION_ADAPT_TPL_STRUCT(
+ (Name)(Age),
+ (demo::employee) (Name)(Age),
+ name,
+ age,
+ employment_timestamp)
[endsect]
@@ -295,8 +368,29 @@ adapted using the given name.
[heading Synopsis]
BOOST_FUSION_ADAPT_STRUCT_NAMED(
struct_name, adapted_name,
+ member_name0,
+ member_name1,
+ member_name2,
+ ...
+ )
+
+ BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(
+ struct_name,
+ (namespace0)(namespace1)...,
+ adapted_name,
+ member_name0,
+ member_name1,
+ member_name2,
+ ...
+ )
+
+ // Without BOOST_PP_VARIADICS support :
+
+ BOOST_FUSION_ADAPT_STRUCT_NAMED(
+ struct_name, adapted_name,
(member_type0, member_name0)
(member_type1, member_name1)
+ (BOOST_FUSION_ADAPT_AUTO, member_name2),
...
)
@@ -306,9 +400,12 @@ adapted using the given name.
adapted_name,
(member_type0, member_name0)
(member_type1, member_name1)
+ (BOOST_FUSION_ADAPT_AUTO, member_name2),
...
)
+
+
[heading Semantics]
The above macros generate the necessary code to adapt `struct_name`
@@ -321,9 +418,12 @@ If an empty namespace sequence is given (that is a macro that expands to
nothing), the adapted view is placed in the global namespace.
If no namespace sequence is given (i.e. `BOOST_FUSION_ADAPT_STRUCT_NAMED`), the
adapted view is placed in the namespace `boost::fusion::adapted`.
-The sequence of `(member_typeN, member_nameN)`
-pairs declares the type and names of each of the struct members that are
-part of the sequence.
+The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
+pairs declares the type and names of each of the struct members that are part of
+the sequence.
+
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
The macros should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be converted.
@@ -347,8 +447,14 @@ namespace qualified name of the struct to be converted.
// referring to demo::employee
BOOST_FUSION_ADAPT_STRUCT_NAMED(
demo::employee, adapted_employee,
- (std::string, name)
- (int, age))
+ name,
+ age)
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_STRUCT_NAMED(
+ demo::employee, adapted_employee,
+ (BOOST_FUSION_ADAPT_AUTO, name),
+ (BOOST_FUSION_ADAPT_AUTO, age))
[endsect]
@@ -362,8 +468,8 @@ __random_access_sequence__ and __associative_sequence__.
[heading Synopsis]
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
struct_name,
- (member_type0, member_name0, key_type0)
- (member_type1, member_name1, key_type1)
+ ([member_type0,] member_name0, key_type0)
+ ([member_type1,] member_name1, key_type1)
...
)
@@ -371,10 +477,13 @@ __random_access_sequence__ and __associative_sequence__.
The above macro generates the necessary code to adapt `struct_name`
as a model of __random_access_sequence__ and __associative_sequence__.
-The sequence of `(member_typeN, member_nameN, key_typeN)`
-triples declares the type, name and key type of each of the struct members
+The sequence of `([member_typeN,] member_nameN, key_typeN)` tuples
+declares the type, name and key type of each of the struct members
that are part of the sequence.
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
+
The macro should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be adapted.
@@ -404,8 +513,14 @@ namespace qualified name of the struct to be adapted.
// keys keys::name and keys::age present.
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
demo::employee,
- (std::string, name, keys::name)
- (int, age, keys::age))
+ (name, keys::name)
+ (age, keys::age))
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+ demo::employee,
+ (BOOST_FUSION_ADAPT_AUTO, name, keys::name),
+ (BOOST_FUSION_ADAPT_AUTO, age, keys::name))
[endsect]
@@ -420,8 +535,8 @@ __random_access_sequence__ and __associative_sequence__.
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
(template_param0)(template_param1)...,
(struct_name) (specialization_param0)(specialization_param1)...,
- (member_type0, member_name0, key_type0)
- (member_type1, member_name1, key_type1)
+ ([member_type0,] member_name0, key_type0)
+ ([member_type1,] member_name1, key_type1)
...
)
@@ -435,10 +550,13 @@ the template type parameters used.
The sequence `(specialization_param0)(specialization_param1)...`
declares the template parameters of the actual specialization of `struct_name`
that is adapted as a fusion sequence.
-The sequence of `(member_typeN, member_nameN, key_typeN)`
-triples declares the type, name and key type of each of the struct members
+The sequence of `([member_typeN,] member_nameN, key_typeN)`
+tuples declares the type, name and key type of each of the struct members
that are part of the sequence.
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
+
The macro should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be adapted.
@@ -470,6 +588,13 @@ namespace qualified name of the struct to be adapted.
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
(Name)(Age),
(demo::employee) (Name)(Age),
+ (name, keys::name)
+ (age, keys::age))
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
+ (Name)(Age),
+ (demo::employee) (Name)(Age),
(Name, name, keys::name)
(Age, age, keys::age))
@@ -486,8 +611,8 @@ __associative_sequence__. The given struct is adapted using the given name.
[heading Synopsis]
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
struct_name, adapted_name,
- (member_type0, member_name0, key_type0)
- (member_type1, member_name1, key_type1)
+ ([member_type0,] member_name0, key_type0)
+ ([member_type1,] member_name1, key_type1)
...
)
@@ -495,8 +620,8 @@ __associative_sequence__. The given struct is adapted using the given name.
struct_name,
(namespace0)(namespace1)...,
adapted_name,
- (member_type0, member_name0, key_type0)
- (member_type1, member_name1, key_type1)
+ ([member_type0,] member_name0, key_type0)
+ ([member_type1,] member_name1, key_type1)
...
)
@@ -516,6 +641,9 @@ The sequence of `(member_typeN, member_nameN, key_typeN)`
triples declares the type, name and key type of each of the struct members
that are part of the sequence.
+When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
+infered with Boost.TypeOf.
+
The macros should be used at global scope, and `struct_name` should be the fully
namespace qualified name of the struct to be converted.
@@ -544,8 +672,14 @@ namespace qualified name of the struct to be converted.
// referring to demo::employee
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
demo::employee, adapted_employee,
- (std::string, name, keys::name)
- (int, age, keys::age))
+ (name, keys::name)
+ (age, keys::age))
+
+ // Without BOOST_PP_VARIADICS support :
+ BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
+ demo::employee, adapted_employee,
+ (BOOST_FUSION_ADAPT_AUTO, name, keys::name)
+ (BOOST_FUSION_ADAPT_AUTO, age, keys::age))
[endsect]
@@ -559,8 +693,8 @@ __random_access_sequence__.
BOOST_FUSION_ADAPT_ADT(
type_name,
- (attribute_type0, attribute_const_type0, get_expr0, set_expr0)
- (attribute_type1, attribute_const_type1, get_expr1, set_expr1)
+ ([attribute_type0, attribute_const_type0,] get_expr0, set_expr0)
+ ([attribute_type1, attribute_const_type1,] get_expr1, set_expr1)
...
)
@@ -569,7 +703,7 @@ __random_access_sequence__.
The above macro generates the necessary code to adapt `type_name`
as a model of __random_access_sequence__.
The sequence of
-[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N])]
+[^([attribute_type['N], attribute_const_type['N],] get_expr['N], set_expr['N])]
quadruples declares the types, const types, get-expressions and set-expressions
of the elements that are part of the adapted fusion sequence.
[^get_expr['N]] is the expression that is invoked to get the ['N]th element
@@ -577,7 +711,9 @@ of an instance of `type_name`. This expression may access a variable named
`obj` of type `type_name&` or `type_name const&` which represents the underlying
instance of `type_name`.
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
-that [^get_expr['N]] denotes to.
+that [^get_expr['N]] denotes to, when omitted the type is deduced from
+[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
+variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
of an instance of `type_name`. This expression may access variables named
`obj` of type `type_name&`, which represent the corresponding instance of
@@ -635,8 +771,8 @@ namespace qualified name of the class type to be adapted.
BOOST_FUSION_ADAPT_ADT(
demo::employee,
- (std::string const&, std::string const&, obj.get_name(), obj.set_name(val))
- (int, int, obj.get_age(), obj.set_age(val)))
+ (obj.get_name(), obj.set_name(val))
+ (obj.get_age(), obj.set_age(val)))
demo::employee e;
front(e)="Edward Norton";
@@ -661,8 +797,8 @@ __random_access_sequence__.
BOOST_FUSION_ADAPT_TPL_ADT(
(template_param0)(template_param1)...,
(type_name) (specialization_param0)(specialization_param1)...,
- (attribute_type0, attribute_const_type0, get_expr0, set_expr0)
- (attribute_type1, attribute_const_type1, get_expr1, set_expr1)
+ ([attribute_type0, attribute_const_type0,] get_expr0, set_expr0)
+ ([attribute_type1, attribute_const_type1,] get_expr1, set_expr1)
...
)
@@ -685,7 +821,9 @@ of an instance of `type_name`. This expression may access a variable named
`obj` of type `type_name&` or `type_name const&` which represents the underlying
instance of `type_name`.
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
-that [^get_expr['N]] denotes to.
+that [^get_expr['N]] denotes to, when omitted the type is deduced from
+[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
+variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
of an instance of `type_name`. This expression may access variables named
`obj` of type `type_name&`, which represent the corresponding instance of
@@ -770,8 +908,8 @@ __random_access_sequence__ and __associative_sequence__.
BOOST_FUSION_ADAPT_ASSOC_ADT(
type_name,
- (attribute_type0, attribute_const_type0, get_expr0, set_expr0, key_type0)
- (attribute_type1, attribute_const_type1, get_expr1, set_expr1, key_type1)
+ ([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
+ ([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
...
)
@@ -788,7 +926,9 @@ of an instance of `type_name`. This expression may access a variable named
`obj` of type `type_name&` or `type_name const&` which represents the underlying
instance of `type_name`.
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
-that [^get_expr['N]] denotes to.
+that [^get_expr['N]] denotes to, when omitted the type is deduced from
+[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
+variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
of an instance of `type_name`. This expression may access variables named
`obj` of type `type_name&`, which represent the corresponding instance of
@@ -852,8 +992,8 @@ namespace qualified name of the class type to be adapted.
BOOST_FUSION_ADAPT_ASSOC_ADT(
demo::employee,
- (std::string const&, std::string const&, obj.get_name(), obj.set_name(val), keys::name)
- (int, int, obj.get_age(), obj.set_age(val), keys::age))
+ (obj.get_name(), obj.set_name(val), keys::name)
+ (obj.get_age(), obj.set_age(val), keys::age))
demo::employee e;
at_key<keys::name>(e)="Edward Norton";
@@ -878,8 +1018,8 @@ __random_access_sequence__ and __associative_sequence__.
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
(template_param0)(template_param1)...,
(type_name) (specialization_param0)(specialization_param1)...,
- (attribute_type0, attribute_const_type0, get_expr0, set_expr0, key_type0)
- (attribute_type1, attribute_const_type1, get_expr1, set_expr1, key_type1)
+ ([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
+ ([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
...
)
@@ -894,7 +1034,7 @@ The sequence `(specialization_param0)(specialization_param1)...`
declares the template parameters of the actual specialization of `type_name`
that is adapted as a fusion sequence.
The sequence of
-[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N], key_type['N])]
+[^([attribute_type['N], attribute_const_type['N],] get_expr['N], set_expr['N], key_type['N])]
5-tuples declares the types, const types, get-expressions, set-expressions and key types
of the elements that are part of the adapted fusion sequence.
[^get_expr['N]] is the expression that is invoked to get the ['N]th element
@@ -902,7 +1042,9 @@ of an instance of `type_name`. This expression may access a variable named
`obj` of type `type_name&` or `type_name const&` which represents the underlying
instance of `type_name`.
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
-that [^get_expr['N]] denotes to.
+that [^get_expr['N]] denotes to, when omitted the type is deduced from
+[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
+variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
of an instance of `type_name`. This expression may access variables named
`obj` of type `type_name&`, which represent the corresponding instance of