| [/============================================================================== |
| Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger |
| Copyright (C) 2010 Christopher Schmidt |
| |
| Use, modification and distribution is 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) |
| ===============================================================================/] |
| [section Adapted] |
| |
| Fusion provides a couple of adapters for other sequences such as arrays, |
| `std::pair`, __mpl__ sequences, and `boost::array`. These adapters are |
| written using Fusion's non-intrusive __extension__ mechanism. If you wish |
| to use these sequences with fusion, simply include the necessary files and |
| they will be regarded as first-class, fully conforming fusion sequences. |
| |
| Fusion also provides various schemes to make it easy for the user to adapt |
| various data structures, non-intrusively, as full fledged Fusion sequences. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted.hpp> |
| #include <boost/fusion/include/adapted.hpp> |
| |
| Fusion sequences may also be adapted as fully conforming __mpl__ sequences (see |
| __intrinsics__). That way, we can have 2-way adaptation to and from __mpl__ and |
| Fusion. To make Fusion sequences fully conforming __mpl__ sequences, include: |
| |
| #include <boost/fusion/mpl.hpp> |
| |
| If you want bi-directional adaptation to and from __mpl__ and Fusion, simply |
| include: |
| |
| #include <boost/fusion/include/mpl.hpp> |
| |
| The header includes all the necessary headers. |
| |
| [section:array Array] |
| |
| This module provides adapters for arrays. Including the module |
| header makes any array a fully conforming __random_access_sequence__. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/array.hpp> |
| #include <boost/fusion/include/array.hpp> |
| |
| [heading Model of] |
| |
| * __random_access_sequence__ |
| |
| [heading Example] |
| |
| int arr[3] = {1,2,3}; |
| |
| std::cout << *__begin__(arr) << std::endl; |
| std::cout << *__next__(__begin__(arr)) << std::endl; |
| std::cout << *__advance_c__<2>(__begin__(arr)) << std::endl; |
| std::cout << *__prior__(__end__(arr)) << std::endl; |
| std::cout << __at_c__<2>(arr) << std::endl; |
| |
| [endsect] |
| |
| [section std::pair] |
| |
| This module provides adapters for `std::pair`. Including the module header |
| makes `std::pair` a fully conforming __random_access_sequence__. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/std_pair.hpp> |
| #include <boost/fusion/include/std_pair.hpp> |
| |
| [heading Model of] |
| |
| * __random_access_sequence__ |
| |
| [heading Example] |
| |
| std::pair<int, std::string> p(123, "Hola!!!"); |
| 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_pair_doc__, __tr1_tuple_pair__ |
| |
| [endsect] |
| |
| [section mpl sequence] |
| |
| This module provides adapters for __mpl__ sequences. Including the module |
| header makes all __mpl__ sequences fully conforming fusion sequences. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/mpl.hpp> |
| #include <boost/fusion/include/mpl.hpp> |
| |
| [heading Model of] |
| |
| * __forward_sequence__ (If the __mpl__ sequence is a forward sequence.) |
| * __bidirectional_sequence__ (If the __mpl__ sequence is a bidirectional sequence.) |
| * __random_access_sequence__ (If the __mpl__ sequence is a random access sequence.) |
| |
| [heading Example] |
| |
| mpl::vector_c<int, 123, 456> vec_c; |
| fusion::vector2<int, long> v(vec_c); |
| std::cout << __at_c__<0>(v) << std::endl; |
| std::cout << __at_c__<1>(v) << std::endl; |
| |
| v = mpl::vector_c<int, 456, 789>(); |
| std::cout << __at_c__<0>(v) << std::endl; |
| std::cout << __at_c__<1>(v) << std::endl; |
| |
| [heading See also] |
| |
| __mpl__ |
| |
| [endsect] |
| |
| [section boost::array] |
| |
| This module provides adapters for `boost::array`. Including the module |
| header makes `boost::array` a fully conforming __random_access_sequence__. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/boost_array.hpp> |
| #include <boost/fusion/include/boost_array.hpp> |
| |
| [heading Model of] |
| |
| * __random_access_sequence__ |
| |
| [heading Example] |
| |
| boost::array<int,3> arr = {{1,2,3}}; |
| |
| std::cout << *__begin__(arr) << std::endl; |
| std::cout << *__next__(__begin__(arr)) << std::endl; |
| std::cout << *__advance_c__<2>(__begin__(arr)) << std::endl; |
| std::cout << *__prior__(__end__(arr)) << std::endl; |
| std::cout << __at_c__<2>(arr) << std::endl; |
| |
| [heading See also] |
| |
| __boost_array_library__ |
| |
| [endsect] |
| |
| [section boost::tuple] |
| This module provides adapters for `boost::tuple`. Including the module |
| header makes `boost::tuple` a fully conforming __forward_sequence__. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/boost_tuple.hpp> |
| #include <boost/fusion/include/boost_tuple.hpp> |
| |
| [heading Model of] |
| |
| * __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'; |
| |
| [heading See also] |
| |
| __boost_tuple_library__ |
| |
| [endsect] |
| |
| [section:adapt_struct BOOST_FUSION_ADAPT_STRUCT] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_STRUCT is a macro that can be used to generate all the |
| necessary boilerplate to make an arbitrary struct a model of |
| __random_access_sequence__. |
| |
| [heading Synopsis] |
| BOOST_FUSION_ADAPT_STRUCT( |
| struct_name, |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| 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 macro should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_struct.hpp> |
| #include <boost/fusion/include/adapt_struct.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| std::string name; |
| int age; |
| }; |
| } |
| |
| // demo::employee is now a Fusion sequence |
| BOOST_FUSION_ADAPT_STRUCT( |
| demo::employee, |
| (std::string, name) |
| (int, age)) |
| |
| [endsect] |
| |
| [section:adapt_tpl_struct BOOST_FUSION_ADAPT_TPL_STRUCT] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_TPL_STRUCT is a macro that can be used to generate all the |
| necessary boilerplate to make an arbitrary template struct a model of |
| __random_access_sequence__. |
| |
| [heading Synopsis] |
| BOOST_FUSION_ADAPT_TPL_STRUCT( |
| (template_param0)(template_param1)..., |
| (struct_name) (specialization_param0)(specialization_param1)..., |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| The above macro generates the necessary code to adapt `struct_name` or an |
| arbitrary specialization of `struct_name` as a model of |
| __random_access_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| 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 macro should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_struct.hpp> |
| #include <boost/fusion/include/adapt_struct.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| template<typename Name, typename Age> |
| struct employee |
| { |
| Name name; |
| Age age; |
| }; |
| } |
| |
| // Any instantiated demo::employee is now a Fusion sequence |
| BOOST_FUSION_ADAPT_TPL_STRUCT( |
| (Name)(Age), |
| (demo::employee) (Name)(Age), |
| (Name, name) |
| (Age, age)) |
| |
| [endsect] |
| |
| [section:adapt_struct_named BOOST_FUSION_ADAPT_STRUCT_NAMED] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_STRUCT_NAMED and BOOST_FUSION_ADAPT_STRUCT_NAMED_NS are |
| macros that can be used to generate all the necessary boilerplate to make an |
| arbitrary struct a model of __random_access_sequence__. The given struct is |
| adapted using the given name. |
| |
| [heading Synopsis] |
| BOOST_FUSION_ADAPT_STRUCT_NAMED( |
| struct_name, adapted_name, |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( |
| struct_name, |
| (namespace0)(namespace1)..., |
| adapted_name, |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| The above macros generate the necessary code to adapt `struct_name` |
| as a model of __random_access_sequence__ while using `adapted_name` as the |
| name of the adapted struct. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `adapted_name`. It yields to a fully qualified name for `adapted_name` of |
| `namespace0::namespace1::... adapted_name`. |
| 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 macros should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be converted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_struct_named.hpp> |
| #include <boost/fusion/include/adapt_struct_named.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| std::string name; |
| int age; |
| }; |
| } |
| |
| // boost::fusion::adapted::adapted_employee is now a Fusion sequence |
| // referring to demo::employee |
| BOOST_FUSION_ADAPT_STRUCT_NAMED( |
| demo::employee, adapted_employee, |
| (std::string, name) |
| (int, age)) |
| |
| [endsect] |
| |
| [section:adapt_assoc BOOST_FUSION_ADAPT_ASSOC_STRUCT] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_ASSOC_STRUCT is a macro that can be used to generate all the |
| necessary boilerplate to make an arbitrary struct a model of |
| __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) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| 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 |
| that are part of the sequence. |
| |
| The macro should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp> |
| #include <boost/fusion/include/adapt_assoc_struct.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| std::string name; |
| int age; |
| }; |
| } |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| // demo::employee is now a Fusion sequence. |
| // It is also an associative sequence with |
| // keys keys::name and keys::age present. |
| BOOST_FUSION_ADAPT_ASSOC_STRUCT( |
| demo::employee, |
| (std::string, name, keys::name) |
| (int, age, keys::age)) |
| |
| [endsect] |
| |
| [section:adapt_assoc_tpl_struct BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT is a macro that can be used to generate all the |
| necessary boilerplate to make an arbitrary template struct a model of |
| __random_access_sequence__ and __associative_sequence__. |
| |
| [heading Synopsis] |
| 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) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| The above macro generates the necessary code to adapt `struct_name` or an |
| arbitrary specialization of `struct_name` as a model of |
| __random_access_sequence__ and __associative_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| 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 |
| that are part of the sequence. |
| |
| The macro should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp> |
| #include <boost/fusion/include/adapt_assoc_struct.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| template<typename Name, typename Age> |
| struct employee |
| { |
| Name name; |
| Age age; |
| }; |
| } |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| // Any instantiated demo::employee is now a Fusion sequence. |
| // It is also an associative sequence with |
| // keys keys::name and keys::age present. |
| BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT( |
| (Name)(Age), |
| (demo::employee) (Name)(Age), |
| (Name, name, keys::name) |
| (Age, age, keys::age)) |
| |
| [endsect] |
| |
| [section:adapt_assoc_struct_named BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED] |
| |
| [heading Description] |
| BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED and BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS are |
| macros that can be used to generate all the necessary boilerplate to make an |
| arbitrary struct a model of __random_access_sequence__ and |
| __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) |
| ... |
| ) |
| |
| BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS( |
| struct_name, |
| (namespace0)(namespace1)..., |
| adapted_name, |
| (member_type0, member_name0, key_type0) |
| (member_type1, member_name1, key_type1) |
| ... |
| ) |
| |
| [heading Semantics] |
| |
| The above macros generate the necessary code to adapt `struct_name` |
| as a model of __random_access_sequence__ and __associative_sequence__ while |
| using `adapted_name` as the name of the adapted struct. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `adapted_name`. It yields to a fully qualified name for `adapted_name` of |
| `namespace0::namespace1::... adapted_name`. |
| 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_ASSOC_NAMED`), the |
| adapted view is placed in the namespace `boost::fusion::adapted`. |
| 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. |
| |
| The macros should be used at global scope, and `struct_name` should be the fully |
| namespace qualified name of the struct to be converted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp> |
| #include <boost/fusion/include/adapt_assoc_struct_named.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| std::string name; |
| int age; |
| }; |
| } |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| // boost::fusion::adapted::adapted_employee is now a Fusion sequence |
| // referring to demo::employee |
| BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED( |
| demo::employee, adapted_employee, |
| (std::string, name, keys::name) |
| (int, age, keys::age)) |
| |
| [endsect] |
| |
| [section:adapt_adt BOOST_FUSION_ADAPT_ADT] |
| |
| BOOST_FUSION_ADAPT_ADT is a macro than can be used to generate all the |
| necessary boilerplate to adapt an arbitrary class type as a model of |
| __random_access_sequence__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_ADAPT_ADT( |
| type_name, |
| (attribute_type0, attribute_const_type0, get_expr0, set_expr0) |
| (attribute_type1, attribute_const_type1, get_expr1, set_expr1) |
| ... |
| ) |
| |
| [heading Expression Semantics] |
| |
| 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])] |
| 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 |
| 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. |
| [^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 |
| `type_name`, and `val` of an arbitrary const-qualified reference template type |
| parameter `Val`, which represents the right operand of the assignment |
| expression. |
| |
| The actual return type of fusion's intrinsic sequence access (meta-)functions |
| when in invoked with (an instance of) `type_name` is a proxy type. |
| This type is implicitly convertible to the attribute type via [^get_expr['N]] and |
| forwards assignment to the underlying element via [^set_expr['N]]. |
| The value type (that is the type returned by __result_of_value_of__, |
| __result_of_value_at__ and __result_of_value_at_c__) of the ['N]th element |
| is [^attribute_type['N]] with const-qualifier and reference removed. |
| |
| The macro should be used at global scope, and `type_name` should be the fully |
| namespace qualified name of the class type to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/adt/adapt_adt.hpp> |
| #include <boost/fusion/include/adapt_adt.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| private: |
| std::string name; |
| int age; |
| |
| public: |
| void set_name(std::string const& n) |
| { |
| name=n; |
| } |
| |
| void set_age(int a) |
| { |
| age=a; |
| } |
| |
| std::string const& get_name()const |
| { |
| return name; |
| } |
| |
| int get_age()const |
| { |
| return age; |
| } |
| }; |
| } |
| |
| 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))) |
| |
| demo::employee e; |
| front(e)="Edward Norton"; |
| back(e)=41; |
| //Prints 'Edward Norton is 41 years old' |
| std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl; |
| |
| [heading See also] |
| |
| __adt_attribute_proxy__ |
| |
| [endsect] |
| |
| [section:adapt_tpl_adt BOOST_FUSION_ADAPT_TPL_ADT] |
| |
| BOOST_FUSION_ADAPT_TPL_ADT is a macro than can be used to generate all the |
| necessary boilerplate to adapt an arbitrary template class type as a model of |
| __random_access_sequence__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_ADAPT_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) |
| ... |
| ) |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code to adapt `type_name` |
| or an arbitrary specialization of `type_name` |
| as a model of __random_access_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| the template type parameters used. |
| 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])] |
| 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 |
| 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. |
| [^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 |
| `type_name`, and `val` of an arbitrary const-qualified reference template type |
| parameter `Val`, which represents the right operand of the assignment |
| expression. |
| |
| The actual return type of fusion's intrinsic sequence access (meta-)functions |
| when in invoked with (an instance of) `type_name` is a proxy type. |
| This type is implicitly convertible to the attribute type via [^get_expr['N]] and |
| forwards assignment to the underlying element via [^set_expr['N]]. |
| The value type (that is the type returned by __result_of_value_of__, |
| __result_of_value_at__ and __result_of_value_at_c__) of the ['N]th element |
| is [^attribute_type['N]] with const-qualifier and reference removed. |
| |
| The macro should be used at global scope, and `type_name` should be the fully |
| namespace qualified name of the template class type to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/adt/adapt_adt.hpp> |
| #include <boost/fusion/include/adapt_adt.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| template<typename Name, typename Age> |
| struct employee |
| { |
| private: |
| Name name; |
| Age age; |
| |
| public: |
| void set_name(Name const& n) |
| { |
| name=n; |
| } |
| |
| void set_age(Age const& a) |
| { |
| age=a; |
| } |
| |
| Name const& get_name()const |
| { |
| return name; |
| } |
| |
| Age const& get_age()const |
| { |
| return age; |
| } |
| }; |
| } |
| |
| BOOST_FUSION_ADAPT_TPL_ADT( |
| (Name)(Age), |
| (demo::employee) (Name)(Age), |
| (Name const&, Name const&, obj.get_name(), obj.set_name(val)) |
| (Age const&, Age const&, obj.get_age(), obj.set_age(val))) |
| |
| demo::employee<std::string, int> e; |
| boost::fusion::front(e)="Edward Norton"; |
| boost::fusion::back(e)=41; |
| //Prints 'Edward Norton is 41 years old' |
| std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl; |
| |
| [heading See also] |
| |
| __adt_attribute_proxy__ |
| |
| [endsect] |
| |
| [section:adapt_assoc_adt BOOST_FUSION_ADAPT_ASSOC_ADT] |
| |
| BOOST_FUSION_ADAPT_ASSOC_ADT is a macro than can be used to generate all the |
| necessary boilerplate to adapt an arbitrary class type as a model of |
| __random_access_sequence__ and __associative_sequence__. |
| |
| [heading Synopsis] |
| |
| 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) |
| ... |
| ) |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code to adapt `type_name` |
| as a model of __random_access_sequence__ and __associative_sequence__. |
| The sequence of |
| [^(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 |
| 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. |
| [^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 |
| `type_name`, and `val` of an arbitrary const-qualified reference template type |
| parameter `Val`, which represents the right operand of the assignment |
| expression. |
| |
| The actual return type of fusion's intrinsic sequence access (meta-)functions |
| when in invoked with (an instance of) `type_name` is a proxy type. |
| This type is implicitly convertible to the attribute type via [^get_expr['N]] and |
| forwards assignment to the underlying element via [^set_expr['N]]. |
| The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__, |
| __result_of_value_at__, __result_of_value_at_c__ and __result_of_value_at_key__) of the ['N]th element |
| is [^attribute_type['N]] with const-qualifier and reference removed. |
| |
| The macro should be used at global scope, and `type_name` should be the fully |
| namespace qualified name of the class type to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp> |
| #include <boost/fusion/include/adapt_assoc_adt.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| struct employee |
| { |
| private: |
| std::string name; |
| int age; |
| |
| public: |
| void set_name(std::string const& n) |
| { |
| name=n; |
| } |
| |
| void set_age(int a) |
| { |
| age=a; |
| } |
| |
| std::string const& get_name()const |
| { |
| return name; |
| } |
| |
| int get_age()const |
| { |
| return age; |
| } |
| }; |
| } |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| 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)) |
| |
| demo::employee e; |
| at_key<keys::name>(e)="Edward Norton"; |
| at_key<keys::age>(e)=41; |
| //Prints 'Edward Norton is 41 years old' |
| std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl; |
| |
| [heading See also] |
| |
| __adt_attribute_proxy__ |
| |
| [endsect] |
| |
| [section:adapt_assoc_tpl_adt BOOST_FUSION_ADAPT_ASSOC_TPL_ADT] |
| |
| BOOST_FUSION_ADAPT_ASSOC_TPL_ADT is a macro than can be used to generate all the |
| necessary boilerplate to adapt an arbitrary template class type as a model of |
| __random_access_sequence__ and __associative_sequence__. |
| |
| [heading Synopsis] |
| |
| 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) |
| ... |
| ) |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code to adapt `type_name` |
| or an arbitrary specialization of `type_name` |
| as a model of __random_access_sequence__ and __associative_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| the template type parameters used. |
| 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])] |
| 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 |
| 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. |
| [^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 |
| `type_name`, and `val` of an arbitrary const-qualified reference template type |
| parameter `Val`, which represents the right operand of the assignment |
| expression. |
| |
| The actual return type of fusion's intrinsic sequence access (meta-)functions |
| when in invoked with (an instance of) `type_name` is a proxy type. |
| This type is implicitly convertible to the attribute type via [^get_expr['N]] and |
| forwards assignment to the underlying element via [^set_expr['N]]. |
| The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__, |
| __result_of_value_at__, __result_of_value_at_c__ and __result_of_value_at_key__) of the ['N]th element |
| is [^attribute_type['N]] with const-qualifier and reference removed. |
| |
| The macro should be used at global scope, and `type_name` should be the fully |
| namespace qualified name of the template class type to be adapted. |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp> |
| #include <boost/fusion/include/adapt_assoc_adt.hpp> |
| |
| [heading Example] |
| namespace demo |
| { |
| template<typename Name, typename Age> |
| struct employee |
| { |
| private: |
| Name name; |
| Age age; |
| |
| public: |
| void set_name(Name const& n) |
| { |
| name=n; |
| } |
| |
| void set_age(Age const& a) |
| { |
| age=a; |
| } |
| |
| Name const& get_name()const |
| { |
| return name; |
| } |
| |
| Age const& get_age()const |
| { |
| return age; |
| } |
| }; |
| } |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| BOOST_FUSION_ADAPT_ASSOC_TPL_ADT( |
| (Name)(Age), |
| (demo::employee) (Name)(Age), |
| (Name const&, Name const&, obj.get_name(), obj.set_name(val), keys::name) |
| (Age const&, Age const&, obj.get_age(), obj.set_age(val), keys::age)) |
| |
| demo::employee<std::string, int> e; |
| at_key<keys::name>(e)="Edward Norton"; |
| at_key<keys::age>(e)=41; |
| //Prints 'Edward Norton is 41 years old' |
| std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl; |
| |
| [heading See also] |
| |
| __adt_attribute_proxy__ |
| |
| [endsect] |
| |
| [section:define_struct BOOST_FUSION_DEFINE_STRUCT] |
| |
| BOOST_FUSION_DEFINE_STRUCT 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__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_DEFINE_STRUCT( |
| (namespace0)(namespace1)..., |
| struct_name, |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| [variablelist Notation |
| [[`str`] [An instance of `struct_name`]] |
| [[`e0`...`en`] [Heterogeneous values]] |
| [[`fs`] [A __forward_sequence__]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code that defines and adapts `struct_name` |
| as a model of __random_access_sequence__. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `struct_name`. It yields to a fully qualified name for `struct_name` of |
| `namespace0::namespace1::... struct_name`. |
| If an empty namespace sequence is given (that is a macro that expands to |
| nothing), the struct is placed in the global namespace. |
| 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 macro should be used at global scope. |
| Semantics of an expression is defined only where it differs from, or is not |
| defined in __random_access_sequence__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`struct_name()`] [Creates an instance of `struct_name` with default constructed elements.]] |
| [[`struct_name(e0, e1,... en)`] [Creates an instance of `struct_name` with elements `e0`...`en`.]] |
| [[`struct_name(fs)`] [Copy constructs an instance of `struct_name` from a __forward_sequence__ `fs`.]] |
| [[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]] |
| [[`str.member_nameN`] [Access of struct member `member_nameN`]] |
| ] |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/define_struct.hpp> |
| #include <boost/fusion/include/define_struct.hpp> |
| |
| [heading Example] |
| |
| // demo::employee is a Fusion sequence |
| BOOST_FUSION_DEFINE_STRUCT( |
| (demo), employee, |
| (std::string, name) |
| (int, age)) |
| |
| [endsect] |
| |
| [section:define_tpl_struct BOOST_FUSION_DEFINE_TPL_STRUCT] |
| |
| [heading Description] |
| |
| BOOST_FUSION_DEFINE_TPL_STRUCT 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__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_DEFINE_TPL_STRUCT( |
| (template_param0)(template_param1)..., |
| (namespace0)(namespace1)..., |
| struct_name, |
| (member_type0, member_name0) |
| (member_type1, member_name1) |
| ... |
| ) |
| |
| [variablelist Notation |
| [[`Str`] [An instantiated `struct_name`]] |
| [[`str`] [An instance of `Str`]] |
| [[`e0`...`en`] [Heterogeneous values]] |
| [[`fs`] [A __forward_sequence__]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code that defines and adapts `struct_name` |
| as a model of __random_access_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| the template type parameters used. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `struct_name`. It yields to a fully qualified name for `struct_name` of |
| `namespace0::namespace1::... struct_name`. |
| If an empty namespace sequence is given (that is a macro that expands to |
| nothing), the struct is placed in the global namespace. |
| 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 macro should be used at global scope. |
| Semantics of an expression is defined only where it differs from, or is not |
| defined in __random_access_sequence__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`Str()`] [Creates an instance of `Str` with default constructed elements.]] |
| [[`Str(e0, e1,... en)`] [Creates an instance of `Str` with elements `e0`...`en`.]] |
| [[`Str(fs)`] [Copy constructs an instance of `Str` from a __forward_sequence__ `fs`.]] |
| [[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]] |
| [[`str.member_nameN`] [Access of struct member `member_nameN`]] |
| ] |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/define_struct.hpp> |
| #include <boost/fusion/include/define_struct.hpp> |
| |
| [heading Example] |
| |
| // Any instantiated demo::employee is a Fusion sequence |
| BOOST_FUSION_DEFINE_TPL_STRUCT( |
| (Name)(Age), (demo), employee, |
| (Name, name) |
| (Age, age)) |
| |
| [endsect] |
| |
| [section:define_assoc_struct BOOST_FUSION_DEFINE_ASSOC_STRUCT] |
| |
| [heading Description] |
| |
| BOOST_FUSION_DEFINE_ASSOC_STRUCT 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__ and __associative_sequence__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_DEFINE_ASSOC_STRUCT( |
| (namespace0)(namespace1)..., |
| struct_name, |
| (member_type0, member_name0, key_type0) |
| (member_type1, member_name1, key_type1) |
| ... |
| ) |
| |
| [variablelist Notation |
| [[`str`] [An instance of `struct_name`]] |
| [[`e0`...`en`] [Heterogeneous values]] |
| [[`fs`] [A __forward_sequence__]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code that defines and adapts `struct_name` |
| as a model of __random_access_sequence__ and __associative_sequence__. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `struct_name`. It yields to a fully qualified name for `struct_name` of |
| `namespace0::namespace1::... struct_name`. |
| If an empty namespace sequence is given (that is a macro that expands to |
| nothing), the struct is placed in the global namespace. |
| 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. |
| |
| The macro should be used at global scope. |
| Semantics of an expression is defined only where it differs from, or is not |
| defined in __random_access_sequence__ and __associative_sequence__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`struct_name()`] [Creates an instance of `struct_name` with default constructed elements.]] |
| [[`struct_name(e0, e1,... en)`] [Creates an instance of `struct_name` with elements `e0`...`en`.]] |
| [[`struct_name(fs)`] [Copy constructs an instance of `struct_name` from a __forward_sequence__ `fs`.]] |
| [[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]] |
| [[`str.member_nameN`] [Access of struct member `member_nameN`]] |
| ] |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/define_assoc_struct.hpp> |
| #include <boost/fusion/include/define_assoc_struct.hpp> |
| |
| [heading Example] |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| // demo::employee is a Fusion sequence |
| BOOST_FUSION_DEFINE_ASSOC_STRUCT( |
| (demo), employee, |
| (std::string, name, keys::name) |
| (int, age, keys::age)) |
| |
| [endsect] |
| |
| [section:define_assoc_tpl_struct BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT] |
| |
| [heading Description] |
| |
| BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT 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__ and __associative_sequence__. |
| |
| [heading Synopsis] |
| |
| BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT( |
| (template_param0)(template_param1)..., |
| (namespace0)(namespace1)..., |
| struct_name, |
| (member_type0, member_name0, key_type0) |
| (member_type1, member_name1, key_type1) |
| ... |
| ) |
| |
| [variablelist Notation |
| [[`Str`] [An instantiated `struct_name`]] |
| [[`str`] [An instance of `Str`]] |
| [[`e0`...`en`] [Heterogeneous values]] |
| [[`fs`] [A __forward_sequence__]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| The above macro generates the necessary code that defines and adapts |
| `struct_name` as a model of __random_access_sequence__ and |
| __associative_sequence__. |
| The sequence `(template_param0)(template_param1)...` declares the names of |
| the template type parameters used. |
| The sequence `(namespace0)(namespace1)...` declares the namespace |
| for `struct_name`. It yields to a fully qualified name for `struct_name` of |
| `namespace0::namespace1::... struct_name`. |
| If an empty namespace sequence is given (that is a macro that expands to |
| nothing), the struct is placed in the global namespace. |
| 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. |
| |
| The macro should be used at global scope. |
| Semantics of an expression is defined only where it differs from, or is not |
| defined in __random_access_sequence__ and __associative_sequence__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`Str()`] [Creates an instance of `Str` with default constructed elements.]] |
| [[`Str(e0, e1,... en)`] [Creates an instance of `Str` with elements `e0`...`en`.]] |
| [[`Str(fs)`] [Copy constructs an instance of `Str` from a __forward_sequence__ `fs`.]] |
| [[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]] |
| [[`str.member_nameN`] [Access of struct member `member_nameN`]] |
| ] |
| |
| [heading Header] |
| |
| #include <boost/fusion/adapted/struct/define_assoc_struct.hpp> |
| #include <boost/fusion/include/define_assoc_struct.hpp> |
| |
| [heading Example] |
| |
| namespace keys |
| { |
| struct name; |
| struct age; |
| } |
| |
| // Any instantiated demo::employee is a Fusion sequence |
| BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT( |
| (Name)(Age), (demo), employee, |
| (Name, name, keys::name) |
| (Age, age, keys::age)) |
| |
| [endsect] |
| |
| [endsect] |