Compare commits
324 Commits
svn-branch
...
fusion_ada
Author | SHA1 | Date | |
---|---|---|---|
d9337979b1 | |||
73a5dde412 | |||
c6c9d872d3 | |||
fc1a60e8e6 | |||
de43345b34 | |||
382c1e5645 | |||
588896de45 | |||
70d5b40a7c | |||
98247fb97f | |||
af1bc25783 | |||
7d641cbc8f | |||
f349d48a3f | |||
97c863eaa0 | |||
5eb36f590a | |||
b7febc887a | |||
45aa4ccf95 | |||
24e95c34fb | |||
223c7d520f | |||
ed9880c161 | |||
d05b854c58 | |||
d185bd5df6 | |||
aa4d67258b | |||
147c76573e | |||
fbbfc16d2d | |||
9ab7774fd7 | |||
687668c110 | |||
2093bf82db | |||
4dd4773d3d | |||
08a6ea79b3 | |||
9075da0790 | |||
f68b7b1f5a | |||
2a50f7caad | |||
c952a5c053 | |||
bc07cac46c | |||
b5018586aa | |||
c65000eac8 | |||
d10f40c489 | |||
18fa262a4e | |||
c9ae4fc886 | |||
0f34b3a692 | |||
68b4683e95 | |||
63045e8611 | |||
f3fa7a1dc6 | |||
cc9b043168 | |||
a4660f41af | |||
6da646631c | |||
0ed591d214 | |||
15dd9c9d97 | |||
1dccb553ea | |||
a2e32493bb | |||
3280267ed4 | |||
b7f95ee853 | |||
dec799caa8 | |||
d93e675408 | |||
06cac9da1a | |||
465c3f273b | |||
6314f1a450 | |||
916df63a14 | |||
b637f2569b | |||
95d2a111ab | |||
ff56beaf55 | |||
5dc9f457a0 | |||
5ff35b6540 | |||
a62956bb12 | |||
bd5ce92e10 | |||
834250a4c8 | |||
a87a665072 | |||
7a7b225fb1 | |||
5f416e24fc | |||
a7e9bb2df4 | |||
20ee8d192a | |||
bf10307430 | |||
4835310623 | |||
ba0e753cff | |||
b7f0f8856c | |||
416cd2e2d9 | |||
f3921fee95 | |||
ec3cefd86f | |||
0a13aa5ee4 | |||
7ef4b03249 | |||
f716d2f410 | |||
1b4acaa1b0 | |||
4c110d9a88 | |||
f73b5362c5 | |||
df7b766247 | |||
3b3da1a10a | |||
6b6d613e15 | |||
c10b94472d | |||
101d9d5505 | |||
0ffc0f04e3 | |||
c6cb25846c | |||
8dc502d33a | |||
179e36fa42 | |||
90206f5da9 | |||
ae23ffb8b6 | |||
5ae01ad6a9 | |||
d5eb1e793c | |||
3933df13fb | |||
cdfb1a46b3 | |||
2f850604e8 | |||
c704efb49c | |||
06a46de636 | |||
3192da28e6 | |||
e50f5852e4 | |||
98b71154ec | |||
e014a1d173 | |||
812e9e379e | |||
ba723a2cad | |||
020b22f9b9 | |||
3a28c3fd81 | |||
cfcdbe1195 | |||
03ba146d84 | |||
acf25e3986 | |||
c921b9ca99 | |||
6cad6bef99 | |||
3d19bf9d96 | |||
bebd553dd6 | |||
fdb6598194 | |||
badf3f2a47 | |||
bcc2530f19 | |||
ec9530eb15 | |||
6adde75b54 | |||
73f058b381 | |||
1b2e62f4b9 | |||
2b5da49628 | |||
cd0d3ce09a | |||
644d72ccfe | |||
103b02fda2 | |||
d0b3d163c5 | |||
561b762f57 | |||
b8c65b976c | |||
790810757a | |||
c8ffc6498b | |||
0f2f1776be | |||
f869aa1591 | |||
aa7b0a6972 | |||
69e67cd1ad | |||
f0bc2a2ac1 | |||
727f49b49e | |||
0eedba5796 | |||
0873af5d3c | |||
5102d6874f | |||
b6c2e9e10b | |||
7b089aa589 | |||
52d280983b | |||
fe3682ac02 | |||
c8e4172021 | |||
64c3fc568c | |||
c2abefbab8 | |||
904ec1e676 | |||
0715e996e2 | |||
047b052548 | |||
4f941d9760 | |||
fcb579f208 | |||
a54c543dd7 | |||
4b0bed40f7 | |||
a13d1346f6 | |||
d71cf19e0f | |||
70410d1e07 | |||
f7685b1194 | |||
a5d6fd0800 | |||
5422ba7f8f | |||
17e49ba448 | |||
1ab5eef418 | |||
34fac0c449 | |||
bf66c12cde | |||
dd0cee1721 | |||
abff92ab65 | |||
f64c396c66 | |||
c008b0dc3a | |||
f022949764 | |||
ae0c976926 | |||
af812e6207 | |||
f0eab528e9 | |||
9a501785e6 | |||
0e50a02fbc | |||
2e60ba6f29 | |||
4cf96e14f3 | |||
0000ca263b | |||
6483cf4058 | |||
04ce8a788b | |||
ce3f2d6020 | |||
687b2cf097 | |||
c851252f65 | |||
557b3d2dc6 | |||
7ef202b794 | |||
02b776360a | |||
37fc1443ad | |||
944c363787 | |||
6f6bfb3a27 | |||
04cbf0d4c6 | |||
703bff4ff9 | |||
7e1c6cdf47 | |||
3ca94f5762 | |||
c052b4b452 | |||
166132789a | |||
435fb5c29f | |||
934463c7b4 | |||
a5f87696f2 | |||
2d37b9c22c | |||
f7b14aee35 | |||
8a132ea44a | |||
5ffab5001e | |||
e58bd91f27 | |||
5aa9a89fb8 | |||
0d7ad9f6e2 | |||
946957d3dc | |||
3f965e00d3 | |||
10d363837a | |||
25bb75e3f8 | |||
2cc2729f51 | |||
059c041659 | |||
f7adae2b3d | |||
f5fe438f14 | |||
38bcd6e779 | |||
219b4124d7 | |||
39785ddb0e | |||
a0c1ec2018 | |||
1fde7cc293 | |||
74a5d8804c | |||
8e4dd16b2d | |||
d2633616dc | |||
01ed85e0e5 | |||
6c904779af | |||
41e18be5cf | |||
fd3a18ce1a | |||
21a2621cce | |||
efad85a925 | |||
ad90e29cd6 | |||
a9ed19e3b8 | |||
26b28eff93 | |||
e113b31fdd | |||
44d5dca98b | |||
c04e912866 | |||
125a8b5957 | |||
e5b0f3c2e1 | |||
4b139914b1 | |||
c4f9f0d1b6 | |||
aa78028662 | |||
ec5f8dc5ec | |||
867c7e5dfb | |||
e1dc534877 | |||
14580550cf | |||
f2e7a184a0 | |||
93447d3382 | |||
266a7622ba | |||
de18e59c85 | |||
94618528b6 | |||
a9335aa664 | |||
8aef19648b | |||
1f718e4520 | |||
66ddb762d3 | |||
fc38122f0f | |||
940c594d3e | |||
9cceb79cf8 | |||
5a51e5d9aa | |||
bcb5fd9618 | |||
e03dcc7c54 | |||
2e99690387 | |||
ee33ea5cfa | |||
93477e270e | |||
b159898a47 | |||
9a8955fbe1 | |||
44b337abb0 | |||
af16a84f09 | |||
4b6dddde03 | |||
01156b172a | |||
295bacb652 | |||
adb2d8bef0 | |||
518ac25a80 | |||
efea9aec4b | |||
c411c4b479 | |||
13aca9d862 | |||
dcbebe60f1 | |||
577a607a14 | |||
aa30bad7e4 | |||
94f5406936 | |||
cd811f56bc | |||
7aa4e2cbda | |||
9792f67700 | |||
a3427ea75b | |||
134fbf9600 | |||
199d8b548f | |||
0f4ac2e9e3 | |||
32adb57290 | |||
02b2a88bea | |||
1572e0e9c3 | |||
649770fdcd | |||
6f0af5db0a | |||
95555f3f20 | |||
0f33972fe9 | |||
a0733ce5ee | |||
dc8225a7aa | |||
994b37e4d5 | |||
3f4d3eb887 | |||
cda74605fc | |||
b605617c4f | |||
b22e2b64da | |||
46fc256c2f | |||
7615b492af | |||
e0a17b552c | |||
2e805be6df | |||
2f8b91828b | |||
ea5ea7f001 | |||
df633002dd | |||
d726756148 | |||
efcab8aae4 | |||
5dff610007 | |||
d004046aa5 | |||
a046e43990 | |||
b1ebdd60a6 | |||
0b58f052b3 | |||
36736edec5 | |||
57725cb393 | |||
099deb4385 | |||
d150ba8498 | |||
df2abdab6b | |||
780b8bc1b0 | |||
813930aee6 | |||
9e8d8b1871 | |||
4a29dd2a7c | |||
7bd2fd716d | |||
d57e8cfe9e | |||
ed9cb87ac3 |
211
doc/adapted.qbk
@ -185,10 +185,20 @@ necessary boilerplate to make an arbitrary struct a model of
|
||||
__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 +206,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 +222,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 +235,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]
|
||||
|
||||
@ -234,11 +255,21 @@ 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_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 +283,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 +306,7 @@ namespace qualified name of the struct to be adapted.
|
||||
{
|
||||
Name name;
|
||||
Age age;
|
||||
int employment_timestamp;
|
||||
};
|
||||
}
|
||||
|
||||
@ -280,7 +315,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]
|
||||
|
||||
@ -293,10 +337,31 @@ 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_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 +371,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 +389,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 +418,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 +439,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 +448,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 +484,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 +506,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 +521,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.
|
||||
|
||||
@ -467,6 +556,13 @@ namespace qualified name of the struct to be adapted.
|
||||
// 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, keys::name)
|
||||
(age, keys::age))
|
||||
|
||||
// Without BOOST_PP_VARIADICS support :
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
|
||||
(Name)(Age),
|
||||
(demo::employee) (Name)(Age),
|
||||
@ -486,8 +582,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 +591,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 +612,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 +643,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 +664,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 +674,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 +682,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 +742,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 +768,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 +792,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 +879,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 +897,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 +963,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 +989,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 +1005,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 +1013,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
|
||||
|
@ -69,7 +69,7 @@ It is also used to convert sequence into other.
|
||||
|
||||
[heading Synopsis]
|
||||
template <typename Seq1, typename Seq2>
|
||||
void copy(Seq1 const& src, Seq2& dest);
|
||||
typename __result_of_copy__<Seq1, Seq2>::type copy(Seq1 const& src, Seq2& dest);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
@ -100,6 +100,121 @@ Linear, exactly `__result_of_size__<Sequence>::value`.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section move]
|
||||
|
||||
[heading Description]
|
||||
move a sequence `src` to a sequence `dest`.
|
||||
It is also used to convert sequence into other.
|
||||
|
||||
[heading Synopsis]
|
||||
template <typename Seq1, typename Seq2>
|
||||
typename __result_of_move__<Seq1, Seq2>::type move(Seq1&& src, Seq2& dest);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`src`][A model of __forward_sequence__, all elements contained in the `src` sequence should be convertible into the element contained in the `dest` sequence.][Operation's argument]]
|
||||
[[`dest`][A model of __forward_sequence__, `e2 = std::move(e1)` is valid expression for each pair of elements `e1` of `src` and `e2` of `dest`.][Operation's argument]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__move__(src, dest);
|
||||
|
||||
[*Return type]: `void`
|
||||
|
||||
[*Semantics]: `e2 = std::move(e1)` for each element `e1` in `src` and `e2` in `dest`.
|
||||
|
||||
[heading Complexity]
|
||||
Linear, exactly `__result_of_size__<Sequence>::value`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/auxiliary/move.hpp>
|
||||
#include <boost/fusion/include/move.hpp>
|
||||
|
||||
[heading Example]
|
||||
__vector__<int,int> vec(1,2);
|
||||
__list__<int,int> ls;
|
||||
__move__(std::move(vec), ls);
|
||||
assert(ls == __make_list__(1,2));
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Metafunctions]
|
||||
|
||||
[section copy]
|
||||
|
||||
[heading Description]
|
||||
A metafunction returning the result type of applying __copy__, which is always `void`.
|
||||
|
||||
[heading Synopsis]
|
||||
template <typename Seq1, typename Seq2>
|
||||
struct copy
|
||||
{
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq1`] [A model of __forward_sequence__] [Operation's argument]]
|
||||
[[`Seq2`] [A model of __forward_sequence__] [Operation's argument]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::copy<Seq1, Seq2>::type
|
||||
|
||||
[*Return type]: `void` iff both of `Seq1` and `Seq2` are sequence.
|
||||
Otherwise, none.
|
||||
|
||||
[*Semantics]: Returns the return type of __copy__ for 2 sequences of types `Seq1` and `Seq2`.
|
||||
|
||||
[heading Complexity]
|
||||
Constant.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/auxiliary/copy.hpp>
|
||||
#include <boost/fusion/include/copy.hpp>
|
||||
|
||||
[endsect]
|
||||
|
||||
[section move]
|
||||
|
||||
[heading Description]
|
||||
A metafunction returning the result type of applying __move__, which is always `void`.
|
||||
|
||||
[heading Synopsis]
|
||||
template <typename Seq1, typename Seq2>
|
||||
struct move
|
||||
{
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq1`] [A model of __forward_sequence__] [Operation's argument]]
|
||||
[[`Seq2`] [A model of __forward_sequence__] [Operation's argument]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::move<Seq1, Seq2>::type
|
||||
|
||||
[*Return type]: `void` iff both of `Seq1` and `Seq2` are sequence.
|
||||
Otherwise, none.
|
||||
|
||||
[*Semantics]: Returns the return type of __move__ for 2 sequences of types `Seq1` and `Seq2`.
|
||||
|
||||
[heading Complexity]
|
||||
Constant.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/auxiliary/move.hpp>
|
||||
#include <boost/fusion/include/move.hpp>
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
@ -536,13 +651,13 @@ Finds the first element of a given type within a sequence.
|
||||
typename T,
|
||||
typename Sequence
|
||||
>
|
||||
__unspecified__ find(Sequence const& seq);
|
||||
typename __result_of_find__<Sequence const, T>::type find(Sequence const& seq);
|
||||
|
||||
template<
|
||||
typename T,
|
||||
typename Sequence
|
||||
>
|
||||
__unspecified__ find(Sequence& seq);
|
||||
typename __result_of_find__<Sequence, T>::type find(Sequence& seq);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
@ -574,23 +689,23 @@ Linear. At most `__result_of_size__<Sequence>::value` comparisons.
|
||||
[endsect]
|
||||
|
||||
[section find_if]
|
||||
Finds the first element within a sequence with a type for which a given __mpl_lambda_expression__ evaluates to
|
||||
`boost::mpl::true_`.
|
||||
|
||||
[heading Description]
|
||||
Finds the first element within a sequence with a type for which a given __mpl_lambda_expression__ evaluates to
|
||||
`boost::mpl::true_`.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename F,
|
||||
typename Sequence
|
||||
>
|
||||
__unspecified__ find_if(Sequence const& seq);
|
||||
typename __result_of_find_if__<Sequence const, F>::type find_if(Sequence const& seq);
|
||||
|
||||
template<
|
||||
typename F,
|
||||
typename Sequence
|
||||
>
|
||||
__unspecified__ find_if(Sequence& seq);
|
||||
typename __result_of_find_if__<Sequence, F>::type find_if(Sequence& seq);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
@ -1329,7 +1444,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
[heading Description]
|
||||
Returns a new sequence with the elements of the original in reverse order.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence
|
||||
>
|
||||
@ -1369,7 +1484,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
[heading Description]
|
||||
__clear__ returns an empty sequence.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence
|
||||
>
|
||||
@ -1406,7 +1521,7 @@ Constant.
|
||||
Returns a new sequence, containing all the elements of the original except those at a specified iterator, or
|
||||
between two iterators.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence,
|
||||
typename First
|
||||
@ -1467,11 +1582,11 @@ Constant. Returns a view which is lazily evaluated.
|
||||
[section erase_key]
|
||||
|
||||
[heading Description]
|
||||
For an [link fusion.sequence.concepts.associative_sequence associative]] __forward_sequence__ `seq`,
|
||||
returns a [link fusion.sequence.concepts.associative_sequence associative]] __forward_sequence__ containing
|
||||
For an [link fusion.sequence.concepts.associative_sequence associative] __forward_sequence__ `seq`,
|
||||
returns a [link fusion.sequence.concepts.associative_sequence associative] __forward_sequence__ containing
|
||||
all the elements of the original except those with a given key.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Key,
|
||||
typename Sequence
|
||||
@ -1510,7 +1625,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
Returns a new sequence with all the elements of the original, an a new element inserted the
|
||||
position described by a given iterator.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence,
|
||||
typename Pos,
|
||||
@ -1527,7 +1642,7 @@ position described by a given iterator.
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__insert__(seq, p, t);
|
||||
__insert__(seq, pos, t);
|
||||
|
||||
[*Return type]:
|
||||
|
||||
@ -1555,7 +1670,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
[heading Description]
|
||||
Returns a new sequence with another sequence inserted at a specified iterator.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence,
|
||||
typename Pos,
|
||||
@ -1580,7 +1695,7 @@ Returns a new sequence with another sequence inserted at a specified iterator.
|
||||
* A model of __associative_sequence__ if `seq` implements the __associative_sequence__ model.
|
||||
|
||||
[*Semantics]: Returns a new sequence, containing all the elements of `seq`, and the elements of
|
||||
`range` inserted at iterator `pos`. All elements retaining their ordering from the orignal sequences.
|
||||
`range` inserted at iterator `pos`. All elements retaining their ordering from the original sequences.
|
||||
|
||||
[heading Complexity]
|
||||
Constant. Returns a view which is lazily evaluated.
|
||||
@ -1641,7 +1756,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
[section zip]
|
||||
|
||||
[heading Description]
|
||||
Zips sequences together to form a single sequence, whos members are tuples of the members of the component sequences.
|
||||
Zips sequences together to form a single sequence, whose members are tuples of the members of the component sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
@ -1841,6 +1956,50 @@ Constant. Returns a view which is lazily evaluated.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section flatten]
|
||||
|
||||
[heading Description]
|
||||
Returns a new sequence without nested sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence
|
||||
>
|
||||
typename __result_of_flatten__<Sequence>::type flatten(Sequence& seq);
|
||||
|
||||
template<
|
||||
typename Sequence
|
||||
>
|
||||
typename __result_of_flatten__<Sequence const>::type flatten(Sequence const& seq);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`seq`][A model of __forward_sequence__][Operation's argument]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__flatten__(seq);
|
||||
|
||||
[*Return type]:
|
||||
|
||||
* A model of __forward_sequence__.
|
||||
|
||||
[*Semantics]: Returns a new sequence containing all the leaf elements of `seq`.
|
||||
|
||||
[heading Complexity]
|
||||
Constant. Returns a view which is lazily evaluated.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/transformation/flatten.hpp>
|
||||
#include <boost/fusion/include/flatten.hpp>
|
||||
|
||||
[heading Example]
|
||||
const __vector__<int, int, __vector__<int, int>, int> vec(1, 2, __make_vector__(3, 4), 5);
|
||||
assert(__flatten__(vec) == __make_vector__(1, 2, 3, 4, 5)));
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Metafunctions]
|
||||
@ -2427,7 +2586,7 @@ Returns the result of joining 2 sequences, given the sequence types.
|
||||
[*Return type]:
|
||||
|
||||
* A model of __forward_sequence__.
|
||||
* A model of __associative_sequence__ if `LhSequence` amd `RhSequence` implement the __associative_sequence__ model.
|
||||
* A model of __associative_sequence__ if `LhSequence` and `RhSequence` implement the __associative_sequence__ model.
|
||||
|
||||
[*Semantics]: Returns a sequence containing the elements of `LhSequence` followed by the elements of `RhSequence`. The order of the elements in the 2 sequences is preserved.
|
||||
|
||||
@ -2444,7 +2603,7 @@ Constant.
|
||||
[section zip]
|
||||
|
||||
[heading Description]
|
||||
Zips sequences together to form a single sequence, whos members are tuples of the members of the component sequences.
|
||||
Zips sequences together to form a single sequence, whose members are tuples of the members of the component sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
@ -2633,6 +2792,44 @@ Constant.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section flatten]
|
||||
|
||||
[heading Description]
|
||||
Returns the result type of __flatten__, given the input sequence type.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Sequence
|
||||
>
|
||||
struct flatten
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
};
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`Sequence`][A model of __forward_sequence__][Operation's argument]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__result_of_flatten__<Sequence>::type
|
||||
|
||||
[*Return type]:
|
||||
|
||||
* A model of __forward_sequence__.
|
||||
|
||||
[*Semantics]: Returns a sequence with all the leaf elements of `Sequence`.
|
||||
|
||||
[heading Complexity]
|
||||
Constant.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/transformation/flatten.hpp>
|
||||
#include <boost/fusion/include/flatten.hpp>
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
@ -9,7 +9,7 @@
|
||||
[section Container]
|
||||
|
||||
Fusion provides a few predefined sequences out of the box. These
|
||||
/containers/ actually hold heterogenously typed data; unlike
|
||||
/containers/ actually hold heterogeneously typed data; unlike
|
||||
__views__. These containers are more or less counterparts of those in __stl__.
|
||||
|
||||
[heading Header]
|
||||
@ -21,7 +21,7 @@ __views__. These containers are more or less counterparts of those in __stl__.
|
||||
|
||||
[heading Description]
|
||||
|
||||
`vector` is a __random_access_sequence__ of heterogenous typed data
|
||||
`vector` is a __random_access_sequence__ of heterogeneous typed data
|
||||
structured as a simple `struct` where each element is held as a member
|
||||
variable. `vector` is the simplest of the Fusion sequence container (a
|
||||
vector with N elements is just a struct with N members), and in many
|
||||
@ -209,7 +209,7 @@ constant (see __recursive_inline__).]
|
||||
|
||||
[heading Description]
|
||||
|
||||
`list` is a __forward_sequence__ of heterogenous typed data built on top of
|
||||
`list` is a __forward_sequence__ of heterogeneous typed data built on top of
|
||||
__cons__. It is more efficient than __vector__ when the target sequence is
|
||||
constructed piecemeal (a data at a time). The runtime cost of access to
|
||||
each element is peculiarly constant (see __recursive_inline__).
|
||||
@ -508,7 +508,7 @@ not defined in __bidirectional_sequence__.
|
||||
|
||||
[heading Description]
|
||||
|
||||
set is an __associative_sequence__ of heteregenous typed data elements.
|
||||
set is an __associative_sequence__ of heterogeneous typed data elements.
|
||||
Type identity is used to impose an equivalence relation on keys. The
|
||||
element's type is its key. A set may contain at most one element for each
|
||||
key. Membership testing and element key lookup has constant runtime
|
||||
@ -589,7 +589,7 @@ defined in __random_access_sequence__ and __associative_sequence__.
|
||||
|
||||
[heading Description]
|
||||
|
||||
map is an __associative_sequence__ of heteregenous typed data elements.
|
||||
map is an __associative_sequence__ of heterogeneous typed data elements.
|
||||
Each element is a key/data pair (see __fusion_pair__) where the key has no
|
||||
data (type only). Type identity is used to impose an equivalence relation
|
||||
on keys. A map may contain at most one element for each key. Membership
|
||||
@ -846,7 +846,7 @@ Create a __deque__ from one or more values.
|
||||
|
||||
For C++11 compilers, the variadic function interface has no upper bound.
|
||||
|
||||
For C++11 compilers, the variadic function accepts `0` to
|
||||
For C++03 compilers, the variadic function accepts `0` to
|
||||
`FUSION_MAX_DEQUE_SIZE` elements, where `FUSION_MAX_DEQUE_SIZE` is a
|
||||
user definable predefined maximum that defaults to `10`. You may define
|
||||
the preprocessor constant `FUSION_MAX_DEQUE_SIZE` before including any
|
||||
@ -950,7 +950,9 @@ Create a __map__ from one or more key/data pairs.
|
||||
typename __result_of_make_map__<K0, K0,... KN, T0, T1,... TN>::type
|
||||
make_map(T0 const& x0, T1 const& x1... TN const& xN);
|
||||
|
||||
The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
|
||||
For C++11 compilers, the variadic function interface has no upper bound.
|
||||
|
||||
For C++03 compilers, the variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
|
||||
where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
|
||||
defaults to `10`. You may define the preprocessor constant
|
||||
`FUSION_MAX_MAP_SIZE` before including any Fusion header to change the
|
||||
@ -1007,11 +1009,11 @@ Example:
|
||||
|
||||
int i; char c; double d;
|
||||
...
|
||||
__vector_tie__(i, c, a);
|
||||
__vector_tie__(i, c, d);
|
||||
|
||||
The __vector_tie__ function creates a __vector__ of type
|
||||
`__vector__<int&, char&, double&>`. The same result could be achieved with the call
|
||||
__make_vector__(__boost_ref_call__(i), __boost_ref_call__(c), __boost_ref_call__(a))
|
||||
__make_vector__(__boost_ref_call__(i), __boost_ref_call__(c), __boost_ref_call__(d))
|
||||
[footnote see __boost_ref__ for details about `ref`].
|
||||
|
||||
A /tie/ can be used to 'unpack' another tuple into variables. E.g.:
|
||||
@ -1468,6 +1470,10 @@ rules for __element_conversion__.
|
||||
|
||||
Returns the result type of __make_map__.
|
||||
|
||||
The implementation depends on the support of variadic templates.
|
||||
|
||||
When variadic templates are not supported, make_map is a metafunction of the form:
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <
|
||||
@ -1475,7 +1481,9 @@ Returns the result type of __make_map__.
|
||||
, typename T0, typename T1,... typename TN>
|
||||
struct make_map;
|
||||
|
||||
The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
|
||||
For C++11 compilers, the variadic function interface has no upper bound.
|
||||
|
||||
For C++03 compilers, the variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
|
||||
where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
|
||||
defaults to `10`. You may define the preprocessor constant
|
||||
`FUSION_MAX_MAP_SIZE` before including any Fusion header to change the
|
||||
@ -1483,6 +1491,18 @@ default. Example:
|
||||
|
||||
#define FUSION_MAX_MAP_SIZE 20
|
||||
|
||||
When variadic templates are supported, make_map is a metafunction class of the form:
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <
|
||||
typename K0, typename K1,... typename KN>
|
||||
struct make_map
|
||||
{
|
||||
struct apply<
|
||||
typename T0, typename T1,... typename TN>
|
||||
};
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
@ -1493,9 +1513,16 @@ default. Example:
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
#if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
|
||||
resulf_of::make_map<K0, K1,... KN, T0, T1,... TN>::type;
|
||||
#else
|
||||
resulf_of::make_map<K0, K1,... KN>::apply<T0, T1,... TN>::type;
|
||||
#endif
|
||||
|
||||
[*Return type]: __result_of_make_map__`<K0, K0,... KN, T0, T1,... TN>::type`
|
||||
when variadic templates are not supported, or
|
||||
__result_of_make_map__`<K0, K0,... KN>::apply<T0, T1,... TN>::type`
|
||||
when variadic templates are supported.
|
||||
|
||||
[*Semantics]: A __map__ with __fusion_pair__ elements where the
|
||||
`second_type` is converted following the rules for __element_conversion__.
|
||||
@ -1509,7 +1536,11 @@ default. Example:
|
||||
|
||||
[heading Example]
|
||||
|
||||
#if !defined(BOOST_FUSION_HAS_VARIADIC_MAP)
|
||||
result_of::make_map<int, double, char, double>::type
|
||||
#else
|
||||
result_of::make_map<int, double>::apply<char, double>::type
|
||||
#endif
|
||||
|
||||
[heading See also]
|
||||
|
||||
|
@ -71,7 +71,7 @@ tag type for operations involving our sequence. This is done by specializing
|
||||
}}}
|
||||
|
||||
`traits::tag_of` also has a second template argument,
|
||||
that can be used in conjuction with `boost::enable_if` to provide tag
|
||||
that can be used in conjunction with `boost::enable_if` to provide tag
|
||||
support for groups of related types. This feature is not necessary
|
||||
for our sequence, but for an example see the code in:
|
||||
|
||||
@ -228,7 +228,7 @@ bit of metaprogramming to return `const` references if the underlying sequence
|
||||
is const.
|
||||
|
||||
[note Although there is a fair amount of left to do to produce a fully fledged
|
||||
Fusion sequence, __result_of_value_of__ and __deref__ illustrate all the signficant concepts
|
||||
Fusion sequence, __result_of_value_of__ and __deref__ illustrate all the significant concepts
|
||||
required. The remainder of the process is very repetitive, simply requiring
|
||||
implementation of a suitable `xxxx_impl` for each feature `xxxx`.
|
||||
]
|
||||
@ -378,7 +378,7 @@ the example code.
|
||||
|
||||
We've now worked through the entire process for adding a new random
|
||||
access sequence and we've also enabled our type to serve as an associative
|
||||
sequence. The implementation was slightly longwinded, but followed
|
||||
sequence. The implementation was slightly long-winded, but followed
|
||||
a simple repeating pattern.
|
||||
|
||||
The support for `std::pair`, __mpl__ sequences, and `boost::array` all
|
||||
|
@ -364,7 +364,7 @@ implemented).
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <booost/fusion/functional/invocation/invoke_procedure.hpp>
|
||||
#include <boost/fusion/functional/invocation/invoke_procedure.hpp>
|
||||
|
||||
[heading Example]
|
||||
__vector__<int,int> v(1,2);
|
||||
@ -644,7 +644,7 @@ An unary __poly_func_obj__ adapter template for __callable_obj__ target
|
||||
functions. It takes a __forward_sequence__ that contains the arguments for
|
||||
the target function.
|
||||
|
||||
The result is discared and the adapter's return type is `void`.
|
||||
The result is discarded and the adapter's return type is `void`.
|
||||
|
||||
The type of the target function is allowed to be const qualified or a
|
||||
reference. Const qualification is preserved and propagated appropriately
|
||||
@ -922,7 +922,7 @@ An n-ary __poly_func_obj__ adapter template for an unary __poly_func_obj__
|
||||
target function. When called, its arguments are bundled to a
|
||||
__random_access_sequence__ that is passed to the target function object.
|
||||
|
||||
The call operators of esulting function objects are strictly typed
|
||||
The call operators of resulting function objects are strictly typed
|
||||
(in other words, non-templatized) with the types from a __sequence__.
|
||||
|
||||
The type of the target function is allowed to be const qualified or a
|
||||
|
@ -26,11 +26,11 @@
|
||||
[def __caution__ [$images/caution.png]]
|
||||
|
||||
[def __spirit__ [@http://spirit.sourceforge.net Spirit]]
|
||||
[def __phoenix__ [@http://boost.org/libs/spirit/phoenix/index.html Phoenix]]
|
||||
[def __phoenix__ [@http://www.boost.org/libs/phoenix/index.html Phoenix]]
|
||||
[def __mpl__ [@http://www.boost.org/libs/mpl/index.html MPL]]
|
||||
[def __stl__ [@http://en.wikipedia.org/wiki/Standard_Template_Library STL]]
|
||||
[def __tuple__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html Boost.Tuple]]
|
||||
[def __tr1__tuple__ [@http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1403.pdf TR1 Tuple]]
|
||||
[def __tr1__tuple__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1403.pdf TR1 Tuple]]
|
||||
[def __boost_tools__ [@http://www.boost.org/tools/index.html Boost Tools]]
|
||||
[def __spirit_list__ [@https://lists.sourceforge.net/lists/listinfo/spirit-general Spirit Mailing List]]
|
||||
[def __spirit_general__ [@news://news.gmane.org/gmane.comp.spirit.general Spirit General NNTP news portal]]
|
||||
@ -40,8 +40,8 @@
|
||||
[def __david_abrahams__ [@http://www.boost.org/people/dave_abrahams.htm David Abrahams]]
|
||||
[def __the_forwarding_problem__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm The Forwarding Problem]]
|
||||
|
||||
[def __boost_any__ [@http://boost.org/doc/html/any.html Boost.Any]]
|
||||
[def __new_iterator_concepts__ [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts]]
|
||||
[def __boost_any__ [@http://www.boost.org/doc/html/any.html Boost.Any]]
|
||||
[def __new_iterator_concepts__ [@http://www.boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts]]
|
||||
[def __boost_array_library__ [@http://www.boost.org/doc/html/array.html Boost.Array Library]]
|
||||
[def __boost_variant_library__ [@http://www.boost.org/doc/html/variant.html Boost.Variant Library]]
|
||||
[def __boost_tuple_library__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html Boost.Tuple Library]]
|
||||
@ -53,6 +53,7 @@
|
||||
[def __boost_shared_ptr_call__ [@http://www.boost.org/libs/smart_ptr/shared_ptr.htm `boost::shared_ptr`]]
|
||||
[def __boost_func_forward__ [@http://www.boost.org/libs/functional/forward/doc/html/index.html Boost.Functional/Forward]]
|
||||
[def __boost_func_factory__ [@http://www.boost.org/libs/functional/factory/doc/html/index.html Boost.Functional/Factory]]
|
||||
[def __boost_func_hash__ [@http://www.boost.org/doc/html/hash.html Boost.Functional/Hash]]
|
||||
[def __std_pair_doc__ [@http://www.sgi.com/tech/stl/pair.html `std::pair`]]
|
||||
[def __std_plus_doc__ [@http://www.sgi.com/tech/stl/plus.html `std::plus`]]
|
||||
[def __std_minus_doc__ [@http://www.sgi.com/tech/stl/minus.html `std::minus`]]
|
||||
@ -131,6 +132,7 @@
|
||||
[def __transform_view__ [link fusion.view.transform_view `transform_view`]]
|
||||
[def __reverse_view__ [link fusion.view.reverse_view `reverse_view`]]
|
||||
[def __zip_view__ [link fusion.view.zip_view `zip_view`]]
|
||||
[def __flatten_view__ [link fusion.view.flatten_view `flatten_view`]]
|
||||
|
||||
[def __array__ [link fusion.adapted.array array]]
|
||||
[def __std_pair__ [link fusion.adapted.std__pair `std::pair`]]
|
||||
@ -176,6 +178,8 @@
|
||||
[def __result_of_value_at__ [link fusion.sequence.intrinsic.metafunctions.value_at `result_of::value_at`]]
|
||||
[def __result_of_value_at_c__ [link fusion.sequence.intrinsic.metafunctions.value_at_c `result_of::value_at_c`]]
|
||||
[def __result_of_value_at_key__ [link fusion.sequence.intrinsic.metafunctions.value_at_key `result_of::value_at_key`]]
|
||||
[def __swap__ [link fusion.sequence.intrinsic.functions.swap `swap`]]
|
||||
[def __result_of_swap__ [link fusion.sequence.intrinsic.metafunctions.swap `result_of::swap`]]
|
||||
|
||||
[def __conversion__ [link fusion.container.conversion.functions Conversion]]
|
||||
[def __result_of_conversion__ [link fusion.container.conversion.metafunctions Conversion Metafunctions]]
|
||||
@ -224,6 +228,9 @@
|
||||
[def __algorithm__ [link fusion.algorithm Algorithm]]
|
||||
[def __algorithms__ [link fusion.algorithm Algorithms]]
|
||||
[def __copy__ [link fusion.algorithm.auxiliary.functions.copy `copy`]]
|
||||
[def __result_of_copy__ [link fusion.algorithm.auxiliary.metafunctions.copy `result_of::copy`]]
|
||||
[def __move__ [link fusion.algorithm.auxiliary.functions.move `move`]]
|
||||
[def __result_of_move__ [link fusion.algorithm.auxiliary.metafunctions.move `result_of::move`]]
|
||||
[def __fold__ [link fusion.algorithm.iteration.functions.fold `fold`]]
|
||||
[def __result_of_fold__ [link fusion.algorithm.iteration.metafunctions.fold `result_of::fold`]]
|
||||
[def __reverse_fold__ [link fusion.algorithm.iteration.functions.reverse_fold `reverse_fold`]]
|
||||
@ -288,6 +295,8 @@
|
||||
[def __result_of_push_back__ [link fusion.algorithm.transformation.metafunctions.push_back `result_of::push_back`]]
|
||||
[def __push_front__ [link fusion.algorithm.transformation.functions.push_front `push_front`]]
|
||||
[def __result_of_push_front__ [link fusion.algorithm.transformation.metafunctions.push_front `result_of::push_front`]]
|
||||
[def __flatten__ [link fusion.algorithm.transformation.functions.flatten `flatten`]]
|
||||
[def __result_of_flatten__ [link fusion.algorithm.transformation.metafunctions.flatten `result_of::flatten`]]
|
||||
|
||||
[def __tr1_tuple_pair__ [link fusion.tuple.pairs `TR1 and std::pair`]]
|
||||
[def __tuple_get__ [link fusion.tuple.class_template_tuple.element_access `get`]]
|
||||
|
0
doc/html/images/alert.png
Normal file → Executable file
Before Width: | Height: | Size: 603 B After Width: | Height: | Size: 603 B |
0
doc/html/images/home.png
Normal file → Executable file
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
0
doc/html/images/next.png
Normal file → Executable file
Before Width: | Height: | Size: 336 B After Width: | Height: | Size: 336 B |
0
doc/html/images/note.png
Normal file → Executable file
Before Width: | Height: | Size: 658 B After Width: | Height: | Size: 658 B |
0
doc/html/images/prev.png
Normal file → Executable file
Before Width: | Height: | Size: 334 B After Width: | Height: | Size: 334 B |
0
doc/html/images/smiley.png
Normal file → Executable file
Before Width: | Height: | Size: 867 B After Width: | Height: | Size: 867 B |
0
doc/html/images/tip.png
Normal file → Executable file
Before Width: | Height: | Size: 640 B After Width: | Height: | Size: 640 B |
0
doc/html/images/up.png
Normal file → Executable file
Before Width: | Height: | Size: 370 B After Width: | Height: | Size: 370 B |
@ -126,6 +126,7 @@
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/sequence/operator/i_o.html">I/O</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/operator/comparison.html">Comparison</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/operator/hashing.html">Hashing</a></span></dt>
|
||||
</dl></dd>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/container.html">Container</a></span></dt>
|
||||
@ -160,6 +161,7 @@
|
||||
<dt><span class="section"><a href="fusion/view/reverse_view.html">reverse_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/nview.html">nview</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/repetitive_view.html">repetitive_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/flatten_view.html">flatten_view</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/adapted.html">Adapted</a></span></dt>
|
||||
<dd><dl>
|
||||
@ -188,7 +190,10 @@
|
||||
<dt><span class="section"><a href="fusion/algorithm.html">Algorithm</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/algorithm/auxiliary.html">Auxiliary</a></span></dt>
|
||||
<dd><dl><dt><span class="section"><a href="fusion/algorithm/auxiliary/functions.html">Functions</a></span></dt></dl></dd>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/algorithm/auxiliary/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/algorithm/auxiliary/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/algorithm/iteration.html">Iteration</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/algorithm/iteration/functions.html">Functions</a></span></dt>
|
||||
|
@ -513,7 +513,7 @@ Deferences the data property associated with the element referenced by an associ
|
||||
#include <boost/fusion/include/deref_data.hpp>
|
||||
|
||||
[heading Example]
|
||||
typedef __map__<__pair__<float,int&> > map;
|
||||
typedef __map__<__pair__<float, int&> > map;
|
||||
|
||||
int i(0);
|
||||
map m(1.0f,i);
|
||||
@ -677,7 +677,7 @@ Returns the type stored at the position of an iterator.
|
||||
[heading Description]
|
||||
Returns the type that will be returned by dereferencing an iterator.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename I
|
||||
>
|
||||
@ -721,7 +721,7 @@ Returns the type that will be returned by dereferencing an iterator.
|
||||
[heading Description]
|
||||
Returns the type of the next iterator in a sequence.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename I
|
||||
>
|
||||
@ -1044,7 +1044,7 @@ Returns the type of the data property associated with the element referenced by
|
||||
[heading Description]
|
||||
Returns the type that will be returned by dereferencing the data property referenced by an associative iterator.
|
||||
|
||||
[heading Synposis]
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename I
|
||||
>
|
||||
@ -1066,18 +1066,17 @@ Returns the type that will be returned by dereferencing the data property refere
|
||||
[*Semantics]: Returns the result of dereferencing the data property referenced by an associative iterator of type `I`.
|
||||
|
||||
[heading Header]
|
||||
#include <boosta/fusion/iterator/deref_data.hpp>
|
||||
#include <boost/fusion/iterator/deref_data.hpp>
|
||||
#include <boost/fusion/include/deref_data.hpp>
|
||||
|
||||
[heading Example]
|
||||
typedef __map__<__pair__<float,int> > map;
|
||||
typedef __result_of_begin__<vec>::type first;
|
||||
|
||||
BOOST_MPL_ASSERT((boost::is_same<__result_of_deref_data__<first>::type, int&>));
|
||||
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));
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
|
@ -58,10 +58,10 @@ In the case:
|
||||
|
||||
[heading Extensibility]
|
||||
|
||||
Unlike __mpl__, there is no extensibe sequence concept in fusion. This does
|
||||
Unlike __mpl__, there is no extensible sequence concept in fusion. This does
|
||||
not mean that Fusion sequences are not extensible. In fact, all Fusion
|
||||
sequences are inherently extensible. It is just that the manner of sequence
|
||||
extension in Fusion is diferent from both __stl__ and __mpl__ on account of
|
||||
extension in Fusion is different from both __stl__ and __mpl__ on account of
|
||||
the lazy nature of fusion __algorithms__. __stl__ containers extend
|
||||
themselves in place though member functions such as __push_back__ and
|
||||
__insert__. __mpl__ sequences, on the other hand, are extended through
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
[heading Description]
|
||||
|
||||
Fusion is a library for working with heterogenous collections of data,
|
||||
Fusion is a library for working with heterogeneous collections of data,
|
||||
commonly referred to as tuples. A set of containers (vector, list, set and map)
|
||||
is provided, along with views that provide a transformed presentation
|
||||
of their underlying data. Collectively the containers and views are referred to
|
||||
@ -31,7 +31,7 @@ Tuples are powerful beasts. After having developed two significant projects
|
||||
(__spirit__ and __phoenix__) that relied heavily metaprogramming, it
|
||||
became apparent that tuples are a powerful means to simplify otherwise tricky
|
||||
tasks; especially those that require a combination of metaprogramming and
|
||||
manipulation of heterogenous data types with values. While __mpl__ is an
|
||||
manipulation of heterogeneous data types with values. While __mpl__ is an
|
||||
extremely powerful metaprogramming tool, __mpl__ focuses on type
|
||||
manipulation only. Ultimately, you'll have to map these types to real
|
||||
values to make them useful in the runtime world where all the real action
|
||||
|
115
doc/sequence.qbk
@ -1,6 +1,7 @@
|
||||
[/==============================================================================
|
||||
Copyright (C) 2001-2011 Joel de Guzman
|
||||
Copyright (C) 2006 Dan Marsden
|
||||
Copyright (C) 2014 Christoph Weiss
|
||||
|
||||
Use, modification and distribution is subject to the Boost Software
|
||||
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -540,7 +541,7 @@ Returns the first element in the sequence.
|
||||
|
||||
[*Return type]: Returns a reference to the first element in the sequence
|
||||
`seq` if `seq` is mutable and `e = o`, where `e` is the first element in
|
||||
the sequence, is a valid expression. Else, returns a type convertable to
|
||||
the sequence, is a valid expression. Else, returns a type convertible to
|
||||
the first element in the sequence.
|
||||
|
||||
[*Precondition]: `__empty__(seq) == false`
|
||||
@ -588,7 +589,7 @@ Returns the last element in the sequence.
|
||||
|
||||
[*Return type]: Returns a reference to the last element in the sequence
|
||||
`seq` if `seq` is mutable and `e = o`, where `e` is the last element in the
|
||||
sequence, is a valid expression. Else, returns a type convertable to the
|
||||
sequence, is a valid expression. Else, returns a type convertible to the
|
||||
last element in the sequence.
|
||||
|
||||
[*Precondition]: `__empty__(seq) == false`
|
||||
@ -679,7 +680,7 @@ Returns the M-th element from the beginning of the sequence.
|
||||
[*Return type]: Returns a reference to the M-th element from the beginning
|
||||
of the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the M-th
|
||||
element from the beginning of the sequence, is a valid expression. Else,
|
||||
returns a type convertable to the M-th element from the beginning of the
|
||||
returns a type convertible to the M-th element from the beginning of the
|
||||
sequence.
|
||||
|
||||
[*Precondition]: `0 <= M::value < __size__(s)`
|
||||
@ -732,7 +733,7 @@ Returns the N-th element from the beginning of the sequence.
|
||||
[*Return type]: Returns a reference to the N-th element from the beginning
|
||||
of the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the N-th
|
||||
element from the beginning of the sequence, is a valid expression. Else,
|
||||
returns a type convertable to the N-th element from the beginning of the
|
||||
returns a type convertible to the N-th element from the beginning of the
|
||||
sequence.
|
||||
|
||||
[*Precondition]: `0 <= N < __size__(s)`
|
||||
@ -827,7 +828,7 @@ Returns the element associated with a Key from the sequence.
|
||||
[*Return type]: Returns a reference to the element associated with Key from
|
||||
the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the
|
||||
element associated with Key, is a valid expression. Else, returns a type
|
||||
convertable to the element associated with Key.
|
||||
convertible to the element associated with Key.
|
||||
|
||||
[*Precondition]: `has_key<Key>(seq) == true`
|
||||
|
||||
@ -853,13 +854,14 @@ Performs an element by element swap of the elements in 2 sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
template<typename Seq1, typename Seq2>
|
||||
void swap(Seq1& seq1, Seq2& seq2);
|
||||
typename __result_of_swap__<Seq1, Seq2>::type
|
||||
swap(Seq1& seq1, Seq2& seq2);
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameters] [Requirement] [Description]]
|
||||
[[`seq1`, `seq2`][Models of __forward_sequence__][The sequences whos elements we wish to swap.]]
|
||||
[[`seq1`, `seq2`][Models of __forward_sequence__][The sequences whose elements we wish to swap.]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
@ -872,7 +874,10 @@ Performs an element by element swap of the elements in 2 sequences.
|
||||
|
||||
[*Semantics]: Calls `swap(a1, b1)` for corresponding elements in `seq1` and `seq2`.
|
||||
|
||||
/sequence/intrinsic/swap.hpp>
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/sequence/intrinsic/swap.hpp>
|
||||
#include <boost/fusion/include/swap.hpp>
|
||||
|
||||
[heading Example]
|
||||
__vector__<int, std::string> v1(1, "hello"), v2(2, "world");
|
||||
@ -1390,7 +1395,7 @@ Returns the actual element type associated with a Key from the __sequence__.
|
||||
|
||||
[heading Example]
|
||||
typedef __map__<__pair__<int, char>, __pair__<char, char>, __pair__<double, char> > mymap;
|
||||
BOOST_MPL_ASSERT((boost::is_same<__result_of_at_key__<mymap, int>::type, char>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<__result_of_value_at_key__<mymap, int>::type, char>));
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -1414,9 +1419,10 @@ Returns the return type of swap.
|
||||
[heading Expression Semantics]
|
||||
result_of::swap<Seq1, Seq2>::type
|
||||
|
||||
[*Return type]: `void`.
|
||||
[*Return type]: `void` iff both of `Seq1` and `Seq2` are sequence.
|
||||
Otherwise, none.
|
||||
|
||||
[*Semantics]: Always returns `void`.
|
||||
[*Semantics]: Returns the return type of __swap__ for 2 sequences of types `Seq1` and `Seq2`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -1487,7 +1493,7 @@ The code:
|
||||
__vector__<int, int> j;
|
||||
|
||||
std::cin >> i;
|
||||
std::cin >> set_open('[') >> set_close(']') >> set_delimiter(':');
|
||||
std::cin >> tuple_open('[') >> tuple_close(']') >> tuple_delimiter(':');
|
||||
std::cin >> j;
|
||||
|
||||
reads the data into the __vector__(s) `i` and `j`.
|
||||
@ -1896,6 +1902,91 @@ compile time error.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Hashing]
|
||||
|
||||
Automatically create a `boost::hash` conforming `hash_value` function.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Seq>
|
||||
std::size_t
|
||||
hash_value(Seq const& seq);
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`seq`] [Instance of __sequence__] [__sequence__ to compute hash value of]]
|
||||
]
|
||||
|
||||
[*Return type]: `std::size_t`
|
||||
|
||||
[*Requirements]:
|
||||
|
||||
For each element `e` in sequence `seq`, `hash_value(seq)` is a valid expression
|
||||
returning a type that is convertible to `std::size_t`.
|
||||
|
||||
[*Semantics]: Returns a combined hash value for all elements of `seq`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/sequence/hash.hpp>
|
||||
#include <boost/fusion/include/hash.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
#include <boost/fusion/include/equal_to.hpp>
|
||||
#include <boost/fusion/include/hash.hpp>
|
||||
#include <boost/fusion/include/vector.hpp>
|
||||
#include <boost/unordered_map.hpp>
|
||||
|
||||
void foo()
|
||||
{
|
||||
typedef boost::fusion::vector<int, std::string, char> Vec;
|
||||
const Vec v = {42, "Hello World", 't'};
|
||||
// Compute a hash value directly.
|
||||
std::cout << "hash_value(v) = " << boost::fusion::hash_value(v) << '\n';
|
||||
// Or use it to create an unordered_map.
|
||||
boost::unordered_map<Vec, bool> map;
|
||||
map[v] = true;
|
||||
assert(map.size() == 1 && map.count(v) == 1);
|
||||
}
|
||||
|
||||
[heading Example]
|
||||
|
||||
#include <boost/fusion/include/define_struct.hpp>
|
||||
#include <boost/fusion/include/equal_to.hpp>
|
||||
#include <boost/fusion/include/hash.hpp>
|
||||
#include <boost/unordered_set.hpp>
|
||||
|
||||
// We would like to define a struct that we can form unordered_sets of.
|
||||
BOOST_FUSION_DEFINE_STRUCT(
|
||||
(demo), Key,
|
||||
(bool, b)
|
||||
(std::string, s)
|
||||
(int, i)
|
||||
)
|
||||
|
||||
namespace demo {
|
||||
// Make operator== and hash_value ADL accessible.
|
||||
using boost::fusion::operator==;
|
||||
using boost::fusion::hash_value;
|
||||
typedef boost::unordered_set<demo::Key> Set;
|
||||
}
|
||||
|
||||
void foo()
|
||||
{
|
||||
demo::Set set;
|
||||
demo::Key key;
|
||||
assert(set.count(key) == 0);
|
||||
}
|
||||
|
||||
[heading See also]
|
||||
|
||||
__boost_func_hash__
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
@ -16,7 +16,7 @@ A couple of classes and metafunctions provide basic support for Fusion.
|
||||
|
||||
Metafunction that evaluates to `mpl::true_` if a certain type `T` is a
|
||||
conforming Fusion __sequence__, `mpl::false_` otherwise. This may be
|
||||
specialized to accomodate clients which provide Fusion conforming sequences.
|
||||
specialized to accommodate clients which provide Fusion conforming sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
@ -70,7 +70,7 @@ conforming Fusion __view__, `mpl::false_` otherwise. A view is a
|
||||
specialized sequence that does not actually contain data. Views hold
|
||||
sequences which may be other views. In general, views are held by other
|
||||
views by value, while non-views are held by other views by reference. `is_view`
|
||||
may be specialized to accomodate clients providing Fusion conforming views.
|
||||
may be specialized to accommodate clients providing Fusion conforming views.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
@ -125,7 +125,7 @@ All conforming Fusion sequences and iterators have an associated tag type. The
|
||||
purpose of the tag is to enable __tag_dispatching__ from __intrinsic__
|
||||
functions to implementations appropriate for the type.
|
||||
|
||||
This metafunction may be specialized to accomodate clients providing Fusion
|
||||
This metafunction may be specialized to accommodate clients providing Fusion
|
||||
conforming sequences.
|
||||
|
||||
[heading Synopsis]
|
||||
|
@ -23,6 +23,21 @@ As such the fusion tuple type provides a lot of functionality beyond that requir
|
||||
Currently tuple is basically a synonym for __vector__, although this may be changed
|
||||
in future releases of fusion.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/tuple.hpp>
|
||||
#include <boost/fusion/include/tuple.hpp>
|
||||
|
||||
#include <boost/fusion/tuple/tuple.hpp>
|
||||
#include <boost/fusion/tuple/tuple_fwd.hpp>
|
||||
#include <boost/fusion/include/tuple_fwd.hpp>
|
||||
|
||||
// for creation function
|
||||
#include <boost/fusion/tuple/tuple_tie.hpp>
|
||||
#include <boost/fusion/include/tuple_tie.hpp>
|
||||
#include <boost/fusion/tuple/make_tuple.hpp>
|
||||
#include <boost/fusion/include/make_tuple.hpp>
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename T1 = __unspecified__,
|
||||
@ -31,8 +46,6 @@ in future releases of fusion.
|
||||
typename TN = __unspecified__>
|
||||
class tuple;
|
||||
|
||||
/tuple.hpp>
|
||||
|
||||
[section Construction]
|
||||
|
||||
[heading Description]
|
||||
@ -49,7 +62,7 @@ The __tr1__tuple__ type provides a default constructor, a constructor that takes
|
||||
|
||||
tuple();
|
||||
|
||||
[*Requirements]: Each `Ti` is default constructable.
|
||||
[*Requirements]: Each `Ti` is default-constructible.
|
||||
|
||||
[*Semantics]: Default initializes each element of the tuple.
|
||||
|
||||
@ -61,7 +74,7 @@ The __tr1__tuple__ type provides a default constructor, a constructor that takes
|
||||
|
||||
tuple(const tuple& t);
|
||||
|
||||
[*Requirements]: Each `Ti` should be copy constructable.
|
||||
[*Requirements]: Each `Ti` should be copy-constructible.
|
||||
|
||||
[*Semantics]: Copy constructs each element of `*this` with the corresponding element of `t`.
|
||||
|
||||
@ -77,19 +90,21 @@ The __tr1__tuple__ type provides a default constructor, a constructor that takes
|
||||
[section Tuple creation functions]
|
||||
|
||||
[heading Description]
|
||||
TR1 describes 2 utility functions for creating __tr1__tuple__s. `make_tuple` builds a tuple out of it's argument list, and `tie` builds a tuple of references to it's arguments. The details of these creation functions are described in this section.
|
||||
TR1 describes 2 utility functions for creating __tr1__tuple__. `make_tuple` builds a tuple out of it's argument list, and `tie` builds a tuple of references to it's arguments. The details of these creation functions are described in this section.
|
||||
|
||||
[heading Specification]
|
||||
|
||||
template<typename T1, typename T2, ..., typename TN>
|
||||
tuple<V1, V2, ..., VN> make_tuple(const T1& t1, const T2& t2, ..., const TN& tn);
|
||||
tuple<V1, V2, ..., VN>
|
||||
make_tuple(const T1& t1, const T2& t2, ..., const TN& tn);
|
||||
|
||||
Where `Vi` is `X&` if the cv-unqualified type `Ti` is `reference_wrapper<X>`, otherwise `Vi` is `Ti`.
|
||||
|
||||
[*Returns]: `tuple<V1, V2, ..., VN>(t1, t2, ..., tN)`
|
||||
|
||||
template<typename T1, typename T2, ..., typename TN>
|
||||
tuple<T1&, T2&, ..., TN&> tie(T1& t1, T2& t2, ..., TN& tn);
|
||||
tuple<T1&, T2&, ..., TN&>
|
||||
tie(T1& t1, T2& t2, ..., TN& tn);
|
||||
|
||||
[*Returns]: tuple<T1&, T2&, ..., TN&>(t1, t2, ..., tN). When argument `ti` is `ignore`, assigning any value to the corresponding tuple element has no effect.
|
||||
|
||||
|
69
doc/view.qbk
@ -484,7 +484,7 @@ defined in the implemented models.
|
||||
[heading Description]
|
||||
|
||||
`nview` presents a view which iterates over a given __sequence__ in a specified order.
|
||||
An `nview` is constructed from an arbitrary __sequence__ and a list of indicies specifying
|
||||
An `nview` is constructed from an arbitrary __sequence__ and a list of indices specifying
|
||||
the elements to iterate over.
|
||||
|
||||
[heading Header]
|
||||
@ -494,7 +494,7 @@ the elements to iterate over.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Sequence, typename Indicies>
|
||||
template <typename Sequence, typename Indices>
|
||||
struct nview;
|
||||
|
||||
template <typename Sequence, int I1, int I2 = -1, ...>
|
||||
@ -507,7 +507,7 @@ the elements to iterate over.
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Sequence`] [An arbitrary Fusion __forward_sequence__]
|
||||
[]]
|
||||
[[`Indicies`] [A `mpl::vector_c<int, ...>` holding the indicies defining
|
||||
[[`Indices`] [A `mpl::vector_c<int, ...>` holding the indices defining
|
||||
the required iteration order.] []]
|
||||
[[`I1`, `I2`, `I3`...] [A list of integers specifying the required
|
||||
iteration order.] [`INT_MAX` for `I2`, `I3`...]]
|
||||
@ -530,7 +530,7 @@ defined in __random_access_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`NV(s)`] [Creates an `nview` given a sequence and a list of indicies.]]
|
||||
[[`NV(s)`] [Creates an `nview` given a sequence and a list of indices.]]
|
||||
[[`NV(nv1)`] [Copy constructs an `nview` from another `nview`, `nv1`.]]
|
||||
[[`nv1 = nv2`] [Assigns to an `nview`, `nv1`, from another `nview`, `nv2`.]]
|
||||
]
|
||||
@ -540,16 +540,15 @@ of the original Fusion __sequence__
|
||||
|
||||
[heading Example]
|
||||
typedef __vector__<int, char, double> vec;
|
||||
typedef mpl::vector_c<int, 2, 1, 0, 2, 0> indicies;
|
||||
typedef mpl::vector_c<int, 2, 1, 0, 2, 0> indices;
|
||||
|
||||
vec v1(1, 'c', 2.0);
|
||||
|
||||
std::cout << nview<vec, indicies>(v1) << std::endl; // (2.0 c 1 2.0 1)
|
||||
std::cout << nview<vec, indices>(v1) << std::endl; // (2.0 c 1 2.0 1)
|
||||
std::cout << as_nview<2, 1, 1, 0>(v1) << std::endl; // (2.0 c c 1)
|
||||
|
||||
[endsect]
|
||||
|
||||
|
||||
[section repetitive_view]
|
||||
|
||||
[heading Description]
|
||||
@ -593,7 +592,7 @@ printing a `repetitive_view` to `std::cout` is not.
|
||||
[[`RV(rv1)`] [] [Copy constructs an `repetitive_view` from another `repetitive_view`, `rv1`.]]
|
||||
[[`rv1 = rv2`] [] [Assigns to a `repetitive_view`, `rv1`, from another `repetitive_view`, `rv2`.]]
|
||||
[[`__begin__(rv)`] [__forward_iterator__] []]
|
||||
[[`__end__(rv)`] [__forward_iterator__] [Creates an unreachable iterator (since the sequnce is infinite)]]
|
||||
[[`__end__(rv)`] [__forward_iterator__] [Creates an unreachable iterator (since the sequence is infinite)]]
|
||||
]
|
||||
|
||||
[heading Result Type Expressions]
|
||||
@ -615,4 +614,58 @@ printing a `repetitive_view` to `std::cout` is not.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section flatten_view]
|
||||
|
||||
[heading Description]
|
||||
|
||||
`flatten_view` presents a view which iterates over its elements recursively in depth-first order.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/view/flatten_view.hpp>
|
||||
#include <boost/fusion/include/flatten_view.hpp>
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Sequence>
|
||||
struct flatten_view;
|
||||
|
||||
[heading Template parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Sequence`] [A __forward_sequence__] []]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
|
||||
* __forward_sequence__
|
||||
|
||||
[variablelist Notation
|
||||
[[`F`] [A `flatten_view` type]]
|
||||
[[`s`] [An instance of `Sequence`]]
|
||||
[[`f`, `f2`] [Instances of `F`]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
Semantics of an expression is defined only where it differs from, or is not
|
||||
defined in __forward_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`F(s)`] [Creates a `flatten_view` given sequence, `s`.]]
|
||||
[[`F(f)`] [Copy constructs a `flatten_view` from another `flatten_view`, `f`.]]
|
||||
[[`f = f2`] [Assigns to a `flatten_view`, `f`, from another `flatten_view`, `f2`.]]
|
||||
]
|
||||
|
||||
[heading Example]
|
||||
typedef __vector__<int, int, __vector__<int, int>, int> sequence_type;
|
||||
sequence_type seq;
|
||||
__flatten_view__<sequence_type> flattened(seq);
|
||||
__copy__(__make_vector__(1, 2, 3, 4, 5), flattened);
|
||||
assert(seq == __make_vector__(1, 2, __make_vector__(3, 4), 5));
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_ADAPTED_30122005_1420)
|
||||
#define BOOST_FUSION_ADAPTED_30122005_1420
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/adt.hpp>
|
||||
#include <boost/fusion/adapted/array.hpp>
|
||||
#include <boost/fusion/adapted/boost_array.hpp>
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_assoc_adt_named.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_adt_named.hpp>
|
||||
|
@ -2,6 +2,7 @@
|
||||
Copyright (c) 2001-2009 Joel de Guzman
|
||||
Copyright (c) 2009-2010 Hartmut Kaiser
|
||||
Copyright (c) 2010-2011 Christopher Schmidt
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
@ -10,8 +11,12 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_ADAPT_ADT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_ADAPT_ADT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/comparison/equal.hpp>
|
||||
#include <boost/preprocessor/comparison/less.hpp>
|
||||
#include <boost/type_traits/add_reference.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
@ -21,6 +26,7 @@
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/value_at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/category_of_impl.hpp>
|
||||
@ -31,17 +37,21 @@
|
||||
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
||||
#include <boost/fusion/adapted/adt/detail/extension.hpp>
|
||||
#include <boost/fusion/adapted/adt/detail/adapt_base.hpp>
|
||||
#include <boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_0(A, B, C, D)\
|
||||
((A, B, C, D)) BOOST_FUSION_ADAPT_ADT_FILLER_1
|
||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_1(A, B, C, D)\
|
||||
((A, B, C, D)) BOOST_FUSION_ADAPT_ADT_FILLER_0
|
||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_C(TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE) \
|
||||
BOOST_FUSION_ADAPT_ADT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE, 4)
|
||||
#define BOOST_FUSION_ADAPT_ADT_C( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
|
||||
BOOST_FUSION_ADAPT_ADT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ, \
|
||||
NAME_SEQ, \
|
||||
I, \
|
||||
BOOST_PP_IF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||
BOOST_PP_IF( \
|
||||
BOOST_PP_LESS( \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 4) \
|
||||
, 1, 0))
|
||||
|
||||
#define BOOST_FUSION_ADAPT_TPL_ADT(TEMPLATE_PARAMS_SEQ, NAME_SEQ , ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_ADAPT_ADT_NAMED_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_ADAPT_ADT_NAMED_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
Copyright (c) 2001-2009 Joel de Guzman
|
||||
Copyright (c) 2007 Dan Marsden
|
||||
Copyright (c) 2010-2011 Christopher Schmidt
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
@ -10,6 +11,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_ADAPT_ASSOC_ADT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_ADAPT_ASSOC_ADT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
@ -21,6 +23,7 @@
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/value_at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/category_of_impl.hpp>
|
||||
@ -34,25 +37,29 @@
|
||||
#include <boost/fusion/adapted/struct/detail/value_of_data_impl.hpp>
|
||||
#include <boost/fusion/adapted/adt/detail/extension.hpp>
|
||||
#include <boost/fusion/adapted/adt/detail/adapt_base.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(A, B, C, D, E)\
|
||||
((A, B, C, D, E)) BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1(A, B, C, D, E)\
|
||||
((A, B, C, D, E)) BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1_END
|
||||
#include <boost/fusion/adapted/adt/detail/adapt_base_assoc_attr_filler.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_C( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE) \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_ADT_C_BASE(TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,ATTRIBUTE,5) \
|
||||
BOOST_FUSION_ADAPT_ADT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ, \
|
||||
NAME_SEQ, \
|
||||
I, \
|
||||
BOOST_PP_IF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||
BOOST_PP_IF( \
|
||||
BOOST_PP_LESS( \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 5) \
|
||||
, 1, 0)) \
|
||||
\
|
||||
template< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
||||
> \
|
||||
struct struct_assoc_key<BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ), I> \
|
||||
{ \
|
||||
typedef BOOST_PP_TUPLE_ELEM(5, 4, ATTRIBUTE) type; \
|
||||
typedef BOOST_FUSION_ADAPT_ASSOC_ADT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) type;\
|
||||
};
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_TPL_ADT( \
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_ADAPT_ASSOC_ADT_NAMED_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_ADAPT_ASSOC_ADT_NAMED_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
|
||||
|
@ -10,11 +10,19 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp>
|
||||
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/seq/seq.hpp>
|
||||
#include <boost/preprocessor/seq/elem.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
||||
#include <boost/typeof/typeof.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ) \
|
||||
typename detail::get_identity< \
|
||||
@ -27,8 +35,72 @@
|
||||
\
|
||||
boost::remove_const<boost::remove_reference<lvalue>::type>::type
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||
BOOST_PP_IF(DEDUCE_TYPE, 0, 2), ATTRIBUTE)
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||
BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE)
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
struct deduced_attr_type { \
|
||||
static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
||||
BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
|
||||
ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
|
||||
};
|
||||
|
||||
#else
|
||||
# define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
struct deduced_attr_type { \
|
||||
static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
||||
typedef BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
|
||||
ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
BOOST_FUSION_DEDUCED_ATTR_TYPE( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
||||
boost::remove_const< \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
||||
deduced_attr_type::type \
|
||||
>::type type; \
|
||||
\
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
||||
boost::add_const< \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
||||
deduced_attr_type::type \
|
||||
>::type const_type;
|
||||
|
||||
#define BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type; \
|
||||
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) const_type;
|
||||
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE) \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX, \
|
||||
ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
||||
\
|
||||
template< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
||||
@ -38,27 +110,43 @@
|
||||
, I \
|
||||
> \
|
||||
{ \
|
||||
\
|
||||
BOOST_PP_IF(DEDUCE_TYPE, \
|
||||
BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
|
||||
BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE)( \
|
||||
NAME_SEQ, \
|
||||
ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, \
|
||||
PREFIX, \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
template<class Val> \
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static void \
|
||||
boost_fusion_adapt_adt_impl_set( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj, \
|
||||
Val const& val) \
|
||||
{ \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 3, ATTRIBUTE); \
|
||||
PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||
} \
|
||||
\
|
||||
static BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) \
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static type \
|
||||
boost_fusion_adapt_adt_impl_get( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
|
||||
{ \
|
||||
return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE); \
|
||||
return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||
} \
|
||||
\
|
||||
static BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) \
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static const_type \
|
||||
boost_fusion_adapt_adt_impl_get( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
|
||||
{ \
|
||||
return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE); \
|
||||
return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||
} \
|
||||
}; \
|
||||
\
|
||||
@ -71,14 +159,21 @@
|
||||
, true \
|
||||
> \
|
||||
{ \
|
||||
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) type; \
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
access::adt_attribute_access< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
||||
, I \
|
||||
>::const_type type; \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
explicit \
|
||||
adt_attribute_proxy( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& o) \
|
||||
: obj(&o) \
|
||||
{} \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
type get() const \
|
||||
{ \
|
||||
return access::adt_attribute_access< \
|
||||
@ -87,6 +182,7 @@
|
||||
>::boost_fusion_adapt_adt_impl_get(*obj); \
|
||||
} \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
operator type() const \
|
||||
{ \
|
||||
return get(); \
|
||||
@ -104,8 +200,14 @@
|
||||
, false \
|
||||
> \
|
||||
{ \
|
||||
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type; \
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
access::adt_attribute_access< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
||||
, I \
|
||||
>::type type; \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
explicit \
|
||||
adt_attribute_proxy( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& o) \
|
||||
@ -113,6 +215,7 @@
|
||||
{} \
|
||||
\
|
||||
template<class Val> \
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
adt_attribute_proxy& \
|
||||
operator=(Val const& val) \
|
||||
{ \
|
||||
@ -123,6 +226,7 @@
|
||||
return *this; \
|
||||
} \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
type get() const \
|
||||
{ \
|
||||
return access::adt_attribute_access< \
|
||||
@ -131,6 +235,7 @@
|
||||
>::boost_fusion_adapt_adt_impl_get(*obj); \
|
||||
} \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
operator type() const \
|
||||
{ \
|
||||
return get(); \
|
||||
@ -147,7 +252,13 @@
|
||||
, I \
|
||||
> \
|
||||
{ \
|
||||
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) lvalue; \
|
||||
typedef BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
adt_attribute_proxy< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
||||
, I \
|
||||
, false \
|
||||
>::type lvalue; \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
@ -170,6 +281,7 @@
|
||||
> \
|
||||
type; \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static type \
|
||||
call(Seq& obj) \
|
||||
{ \
|
||||
|
@ -0,0 +1,61 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
==============================================================================*/
|
||||
|
||||
#ifndef BOOST_FUSION_ADAPTER_ADT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
|
||||
#define BOOST_FUSION_ADAPTER_ADT_DETAIL_ADAPT_BASE_ASSOC_ATTR_FILLER_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#include <boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp>
|
||||
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/variadic/size.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/facilities/is_empty.hpp>
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(...) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(__VA_ARGS__) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1(...) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(__VA_ARGS__) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(...) \
|
||||
((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(A, B, C, D, E) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1(A, B, C, D, E) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E) \
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAP_ATTR(A, B, C, D, E) \
|
||||
BOOST_PP_IF(BOOST_PP_IS_EMPTY(A), \
|
||||
((3, (C,D,E))), \
|
||||
((5, (A,B,C,D,E))) \
|
||||
)
|
||||
|
||||
#endif // BOOST_PP_VARIADICS
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_1_END
|
||||
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_ADT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) \
|
||||
BOOST_PP_TUPLE_ELEM( \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||
BOOST_PP_SUB(BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 1), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE))
|
||||
|
||||
#endif
|
@ -0,0 +1,90 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
==============================================================================*/
|
||||
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_ATTR_FILLER_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
|
||||
|
||||
#include <boost/preprocessor/arithmetic/sub.hpp>
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/logical/or.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/tuple/size.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
#include <boost/preprocessor/facilities/is_empty.hpp>
|
||||
#include <boost/preprocessor/variadic/to_seq.hpp>
|
||||
#include <boost/preprocessor/variadic/to_tuple.hpp>
|
||||
#include <boost/preprocessor/variadic/elem.hpp>
|
||||
#include <boost/preprocessor/seq/for_each.hpp>
|
||||
#include <boost/preprocessor/seq/push_front.hpp>
|
||||
#include <boost/preprocessor/seq/rest_n.hpp>
|
||||
|
||||
#include <boost/preprocessor/tuple/reverse.hpp>
|
||||
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE) \
|
||||
BOOST_PP_TUPLE_ELEM(2, 0, ATTRIBUTE)
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE) \
|
||||
BOOST_PP_TUPLE_ELEM(2, 1, ATTRIBUTE)
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_0(...) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER(__VA_ARGS__) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER_1
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_1(...) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER(__VA_ARGS__) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER_0
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER(...) \
|
||||
BOOST_PP_IF( \
|
||||
BOOST_PP_OR( \
|
||||
BOOST_PP_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__)), \
|
||||
BOOST_PP_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(1, __VA_ARGS__))), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAP_ATTR( \
|
||||
BOOST_PP_VARIADIC_ELEM(2, __VA_ARGS__), \
|
||||
BOOST_FUSION_WORKAROUND_VARIADIC_EMPTINESS_LAST_ELEM(__VA_ARGS__) \
|
||||
), \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(__VA_ARGS__))
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(...) \
|
||||
((BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__)))
|
||||
|
||||
# define BOOST_FUSION_WORKAROUND_VARIADIC_EMPTINESS_LAST_ELEM(...) \
|
||||
BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REST_N( \
|
||||
BOOST_PP_SUB(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
|
||||
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_0(A, B, C, D) \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A,B,C,D) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER_1
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_1(A, B, C, D) \
|
||||
BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A,B,C,D) \
|
||||
BOOST_FUSION_ADAPT_ADT_FILLER_0
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
|
||||
# define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
|
||||
|
||||
# define BOOST_FUSION_ADAPT_ADT_WRAP_ATTR(A, B, C, D) \
|
||||
BOOST_PP_IF(BOOST_PP_IS_EMPTY(A), \
|
||||
((2, (C,D))), \
|
||||
((4, (A,B,C,D))) \
|
||||
)
|
||||
|
||||
#endif // BOOST_PP_VARIADICS
|
||||
|
||||
#endif
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_EXTENSION_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ADT_DETAIL_EXTENSION_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
#include <boost/fusion/support/as_const.hpp>
|
||||
@ -29,6 +30,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
// Overload as_const() to unwrap adt_attribute_proxy.
|
||||
template <typename T, int N, bool Const>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
typename adt_attribute_proxy<T, N, Const>::type as_const(const adt_attribute_proxy<T, N, Const>& proxy)
|
||||
{
|
||||
return proxy.get();
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_AT_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_AT_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/add_reference.hpp>
|
||||
#include <boost/type_traits/remove_extent.hpp>
|
||||
|
||||
@ -26,6 +27,7 @@ namespace boost { namespace fusion { namespace extension
|
||||
add_reference<typename remove_extent<Seq>::type>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Seq& seq)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_BEGIN_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_BEGIN_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/basic_iterator.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace extension
|
||||
@ -30,6 +31,7 @@ namespace boost { namespace fusion { namespace extension
|
||||
>
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Seq& seq)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_DEREF_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_DEREF_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/add_reference.hpp>
|
||||
#include <boost/type_traits/remove_extent.hpp>
|
||||
|
||||
@ -28,6 +29,7 @@ namespace boost { namespace fusion { namespace extension
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(It const& it)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_END_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_END_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/basic_iterator.hpp>
|
||||
#include <boost/type_traits/rank.hpp>
|
||||
#include <boost/type_traits/extent.hpp>
|
||||
@ -32,6 +33,7 @@ namespace boost { namespace fusion { namespace extension
|
||||
>
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Seq& seq)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_IS_SEQUENCE_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_IS_SEQUENCE_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace extension
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_IS_VIEW_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_IS_VIEW_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace extension
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_SIZE_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_SIZE_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/rank.hpp>
|
||||
#include <boost/type_traits/extent.hpp>
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_TAG_OF_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_TAG_OF_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_VALUE_AT_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_VALUE_AT_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/remove_extent.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace extension
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_ARRAY_VALUE_OF_IMPL_HPP
|
||||
#define BOOST_FUSION_ADAPTED_ARRAY_VALUE_OF_IMPL_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/remove_extent.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace extension
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_BOOST_ARRAY_27122005_1035)
|
||||
#define BOOST_FUSION_BOOST_ARRAY_27122005_1035
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_array/array_iterator.hpp>
|
||||
#include <boost/fusion/adapted/boost_array/tag_of.hpp>
|
||||
#include <boost/fusion/adapted/boost_array/detail/is_view_impl.hpp>
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_ARRAY_ITERATOR_26122005_2250)
|
||||
#define BOOST_FUSION_ARRAY_ITERATOR_26122005_2250
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <cstddef>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/mpl/int.hpp>
|
||||
@ -31,6 +32,7 @@ namespace boost { namespace fusion
|
||||
typedef mpl::int_<Pos> index;
|
||||
typedef Array array_type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
array_iterator(Array& a)
|
||||
: array(a) {}
|
||||
|
||||
@ -55,6 +57,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const & it)
|
||||
{
|
||||
@ -69,6 +72,7 @@ namespace boost { namespace fusion
|
||||
typedef typename Iterator::array_type array_type;
|
||||
typedef array_iterator<array_type, index::value + N::value> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& i)
|
||||
{
|
||||
@ -91,6 +95,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(I1 const&, I2 const&)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_AT_IMPL_27122005_1241)
|
||||
#define BOOST_FUSION_AT_IMPL_27122005_1241
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
|
||||
#include <boost/mpl/if.hpp>
|
||||
@ -32,6 +33,7 @@ namespace boost { namespace fusion {
|
||||
typename Sequence::const_reference,
|
||||
typename Sequence::reference>::type type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_BEGIN_IMPL_27122005_1117)
|
||||
#define BOOST_FUSION_BEGIN_IMPL_27122005_1117
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_array/array_iterator.hpp>
|
||||
|
||||
namespace boost { namespace fusion {
|
||||
@ -27,6 +28,7 @@ namespace boost { namespace fusion {
|
||||
{
|
||||
typedef array_iterator<Sequence, 0> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& v)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_CATEGORY_OF_IMPL_27122005_1044)
|
||||
#define BOOST_FUSION_CATEGORY_OF_IMPL_27122005_1044
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/config/no_tr1/utility.hpp>
|
||||
|
||||
namespace boost { namespace fusion {
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_END_IMPL_27122005_1120)
|
||||
#define BOOST_FUSION_END_IMPL_27122005_1120
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_array/array_iterator.hpp>
|
||||
|
||||
namespace boost { namespace fusion {
|
||||
@ -27,6 +28,7 @@ namespace boost { namespace fusion {
|
||||
{
|
||||
typedef array_iterator<Sequence, Sequence::static_size> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& v)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_SEQUENCE_IMPL_27122005_1648)
|
||||
#define BOOST_FUSION_IS_SEQUENCE_IMPL_27122005_1648
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion {
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_VIEW_IMPL_27042006_2221)
|
||||
#define BOOST_FUSION_IS_VIEW_IMPL_27042006_2221
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(FUSION_SEQUENCE_TAG_OF_27122005_1030)
|
||||
#define FUSION_SEQUENCE_TAG_OF_27122005_1030
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_BOOST_TUPLE_09272006_0732)
|
||||
#define BOOST_FUSION_BOOST_TUPLE_09272006_0732
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/tag_of.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp>
|
||||
@ -16,5 +17,7 @@
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/size_impl.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/convert_impl.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/mpl/clear.hpp>
|
||||
|
||||
#endif
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(FUSION_BOOST_TUPLE_ITERATOR_09262006_1851)
|
||||
#define FUSION_BOOST_TUPLE_ITERATOR_09262006_1851
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/iterator_facade.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
@ -41,12 +42,19 @@ namespace boost { namespace fusion
|
||||
struct boost_tuple_is_empty<tuples::tuple<> const> : mpl::true_ {};
|
||||
}
|
||||
|
||||
template <typename Cons>
|
||||
struct boost_tuple_iterator_identity;
|
||||
|
||||
template <typename Cons = tuples::null_type>
|
||||
struct boost_tuple_iterator
|
||||
: iterator_facade<boost_tuple_iterator<Cons>, forward_traversal_tag>
|
||||
{
|
||||
typedef Cons cons_type;
|
||||
|
||||
typedef boost_tuple_iterator_identity<
|
||||
typename add_const<Cons>::type> identity;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons& in_cons)
|
||||
: cons(in_cons) {}
|
||||
Cons& cons;
|
||||
@ -67,6 +75,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& iter)
|
||||
{
|
||||
@ -88,13 +97,14 @@ namespace boost { namespace fusion
|
||||
>::type>
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& iter)
|
||||
{
|
||||
return type(iter.cons.get_tail());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename I1, typename I2>
|
||||
struct distance;
|
||||
|
||||
@ -111,7 +121,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
>::type type;
|
||||
};
|
||||
|
||||
|
||||
template <typename I1, typename I2>
|
||||
struct distance
|
||||
{
|
||||
@ -120,7 +130,8 @@ namespace boost { namespace fusion
|
||||
mpl::int_<0>,
|
||||
lazy_next_distance<I1, I2>
|
||||
>::type type;
|
||||
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(I1 const&, I2 const&)
|
||||
{
|
||||
@ -128,6 +139,11 @@ namespace boost { namespace fusion
|
||||
}
|
||||
};
|
||||
|
||||
template <typename I1, typename I2>
|
||||
struct equal_to
|
||||
: is_same<typename I1::identity, typename I2::identity>
|
||||
{};
|
||||
|
||||
private:
|
||||
// silence MSVC warning C4512: assignment operator could not be generated
|
||||
boost_tuple_iterator& operator= (boost_tuple_iterator const&);
|
||||
@ -139,6 +155,9 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef Null cons_type;
|
||||
|
||||
typedef boost_tuple_iterator_identity<
|
||||
typename add_const<Null>::type> identity;
|
||||
|
||||
template <typename I1, typename I2>
|
||||
struct equal_to
|
||||
: mpl::or_<
|
||||
@ -156,6 +175,7 @@ namespace boost { namespace fusion
|
||||
: boost_tuple_null_iterator<tuples::null_type>
|
||||
{
|
||||
template <typename Cons>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons const&) {}
|
||||
};
|
||||
|
||||
@ -164,6 +184,7 @@ namespace boost { namespace fusion
|
||||
: boost_tuple_null_iterator<tuples::null_type const>
|
||||
{
|
||||
template <typename Cons>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons const&) {}
|
||||
};
|
||||
|
||||
@ -172,6 +193,7 @@ namespace boost { namespace fusion
|
||||
: boost_tuple_null_iterator<tuples::tuple<> >
|
||||
{
|
||||
template <typename Cons>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons const&) {}
|
||||
};
|
||||
|
||||
@ -180,6 +202,7 @@ namespace boost { namespace fusion
|
||||
: boost_tuple_null_iterator<tuples::tuple<> const>
|
||||
{
|
||||
template <typename Cons>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons const&) {}
|
||||
};
|
||||
}}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_AT_IMPL_09262006_1920)
|
||||
#define BOOST_FUSION_AT_IMPL_09262006_1920
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
|
||||
@ -37,6 +38,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_BEGIN_IMPL_09272006_0719)
|
||||
#define BOOST_FUSION_BEGIN_IMPL_09272006_0719
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
@ -26,6 +27,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef boost_tuple_iterator<Sequence> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& v)
|
||||
{
|
||||
|
@ -0,0 +1,59 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2012-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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_BUILD_CONS_10172012_0130)
|
||||
#define BOOST_FUSION_BUILD_CONS_10172012_0130
|
||||
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/fusion/iterator/equal_to.hpp>
|
||||
#include <boost/fusion/iterator/next.hpp>
|
||||
#include <boost/fusion/iterator/value_of.hpp>
|
||||
#include <boost/fusion/iterator/deref.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
{
|
||||
template <
|
||||
typename First
|
||||
, typename Last
|
||||
, bool is_empty = result_of::equal_to<First, Last>::value>
|
||||
struct build_tuple_cons;
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct build_tuple_cons<First, Last, true>
|
||||
{
|
||||
typedef boost::tuples::null_type type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const&, Last const&)
|
||||
{
|
||||
return type();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct build_tuple_cons<First, Last, false>
|
||||
{
|
||||
typedef
|
||||
build_tuple_cons<typename result_of::next<First>::type, Last>
|
||||
next_build_tuple_cons;
|
||||
|
||||
typedef boost::tuples::cons<
|
||||
typename result_of::value_of<First>::type
|
||||
, typename next_build_tuple_cons::type>
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const& f, Last const& l)
|
||||
{
|
||||
typename result_of::value_of<First>::type v = *f;
|
||||
return type(v, next_build_tuple_cons::call(fusion::next(f), l));
|
||||
}
|
||||
};
|
||||
}}}
|
||||
|
||||
#endif
|
@ -0,0 +1,50 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2012-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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_CONVERT_IMPL_10172012_0120)
|
||||
#define BOOST_FUSION_CONVERT_IMPL_10172012_0120
|
||||
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/detail/build_cons.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/begin.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/end.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct boost_tuple_tag;
|
||||
|
||||
namespace extension
|
||||
{
|
||||
template <typename T>
|
||||
struct convert_impl;
|
||||
|
||||
template <>
|
||||
struct convert_impl<boost_tuple_tag>
|
||||
{
|
||||
template <typename Sequence>
|
||||
struct apply
|
||||
{
|
||||
typedef typename
|
||||
detail::build_tuple_cons<
|
||||
typename result_of::begin<Sequence>::type
|
||||
, typename result_of::end<Sequence>::type
|
||||
>
|
||||
build_tuple_cons;
|
||||
|
||||
typedef typename build_tuple_cons::type type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
return build_tuple_cons::call(fusion::begin(seq), fusion::end(seq));
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_END_IMPL_09272006_0721)
|
||||
#define BOOST_FUSION_END_IMPL_09272006_0721
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
@ -41,6 +42,7 @@ namespace boost { namespace fusion
|
||||
>
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_SEQUENCE_IMPL_09272006_0726)
|
||||
#define BOOST_FUSION_IS_SEQUENCE_IMPL_09272006_0726
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_VIEW_IMPL_09272006_0725)
|
||||
#define BOOST_FUSION_IS_VIEW_IMPL_09272006_0725
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_SIZE_IMPL_09272006_0724)
|
||||
#define BOOST_FUSION_SIZE_IMPL_09272006_0724
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/mpl/int.hpp>
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_VALUE_AT_IMPL_09262006_1926)
|
||||
#define BOOST_FUSION_VALUE_AT_IMPL_09262006_1926
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
23
include/boost/fusion/adapted/boost_tuple/mpl/clear.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2012 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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_CLEAR_10172012_0100)
|
||||
#define BOOST_FUSION_CLEAR_10172012_0100
|
||||
|
||||
#include <boost/mpl/identity.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple/tag_of.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail {
|
||||
|
||||
template <typename Tag>
|
||||
struct clear;
|
||||
|
||||
template <>
|
||||
struct clear<boost_tuple_tag> : mpl::identity<boost::tuple<> > {};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_TAG_OF_09262006_1900)
|
||||
#define BOOST_FUSION_TAG_OF_09262006_1900
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||
|
||||
namespace boost { namespace tuples
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_MPL_31122005_1152)
|
||||
#define BOOST_FUSION_MPL_31122005_1152
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/mpl/detail/begin_impl.hpp>
|
||||
#include <boost/fusion/adapted/mpl/detail/end_impl.hpp>
|
||||
#include <boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp>
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_AT_IMPL_31122005_1642)
|
||||
#define BOOST_FUSION_AT_IMPL_31122005_1642
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/at.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
@ -27,6 +28,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef typename mpl::at<Sequence, N>::type type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_BEGIN_IMPL_31122005_1209)
|
||||
#define BOOST_FUSION_BEGIN_IMPL_31122005_1209
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
|
||||
#include <boost/mpl/begin.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
@ -32,6 +33,7 @@ namespace boost { namespace fusion {
|
||||
>::type iterator;
|
||||
typedef mpl_iterator<iterator> type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_CATEGORY_OF_IMPL_20060217_2141)
|
||||
#define BOOST_FUSION_CATEGORY_OF_IMPL_20060217_2141
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/support/detail/mpl_iterator_category.hpp>
|
||||
#include <boost/mpl/begin_end.hpp>
|
||||
#include <boost/mpl/is_sequence.hpp>
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_EMPTY_IMPL_31122005_1554)
|
||||
#define BOOST_FUSION_EMPTY_IMPL_31122005_1554
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/empty.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_END_IMPL_31122005_1237)
|
||||
#define BOOST_FUSION_END_IMPL_31122005_1237
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
|
||||
#include <boost/mpl/end.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
@ -32,6 +33,7 @@ namespace boost { namespace fusion
|
||||
>::type iterator;
|
||||
typedef mpl_iterator<iterator> type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence)
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_HAS_KEY_IMPL_31122005_1647)
|
||||
#define BOOST_FUSION_HAS_KEY_IMPL_31122005_1647
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/has_key.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_SEQUENCE_IMPL_31122005_1505)
|
||||
#define BOOST_FUSION_IS_SEQUENCE_IMPL_31122005_1505
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_VIEW_IMPL_03202006_0048)
|
||||
#define BOOST_FUSION_IS_VIEW_IMPL_03202006_0048
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_SIZE_IMPL_31122005_1508)
|
||||
#define BOOST_FUSION_SIZE_IMPL_31122005_1508
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/size.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -8,6 +8,7 @@
|
||||
#if !defined(BOOST_FUSION_VALUE_AT_IMPL_31122005_1621)
|
||||
#define BOOST_FUSION_VALUE_AT_IMPL_31122005_1621
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/at.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(FUSION_MPL_ITERATOR_05052005_0731)
|
||||
#define FUSION_MPL_ITERATOR_05052005_0731
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/support/detail/mpl_iterator_category.hpp>
|
||||
#include <boost/fusion/iterator/iterator_facade.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
@ -37,6 +38,7 @@ namespace boost { namespace fusion
|
||||
typename Iterator::iterator_type>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator)
|
||||
{
|
||||
@ -51,6 +53,7 @@ namespace boost { namespace fusion
|
||||
typename mpl::next<typename Iterator::iterator_type>::type>
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator)
|
||||
{
|
||||
@ -65,6 +68,7 @@ namespace boost { namespace fusion
|
||||
typename mpl::prior<typename Iterator::iterator_type>::type>
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator)
|
||||
{
|
||||
@ -79,6 +83,7 @@ namespace boost { namespace fusion
|
||||
typename mpl::advance<typename Iterator::iterator_type, N>::type>
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& /*i*/)
|
||||
{
|
||||
@ -99,6 +104,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(I1 const&, I2 const&)
|
||||
{
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STD_PAIR_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STD_PAIR_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <utility>
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_BOOST_TUPLE_09242011_1744)
|
||||
#define BOOST_FUSION_BOOST_TUPLE_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/is_sequence_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/category_of_impl.hpp>
|
||||
@ -15,7 +16,9 @@
|
||||
#include <boost/fusion/adapted/std_tuple/detail/size_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/value_at_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/convert_impl.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/std_tuple_iterator.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/tag_of.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/mpl/clear.hpp>
|
||||
|
||||
#endif
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_AT_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_AT_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <boost/mpl/if.hpp>
|
||||
@ -39,6 +40,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_BEGIN_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_BEGIN_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/std_tuple_iterator.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
@ -26,6 +27,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef std_tuple_iterator<Sequence, 0> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& v)
|
||||
{
|
||||
|
@ -0,0 +1,105 @@
|
||||
/*=============================================================================
|
||||
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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_BUILD_STD_TUPLE_05292014_0100)
|
||||
#define BOOST_FUSION_BUILD_STD_TUPLE_05292014_0100
|
||||
|
||||
#include <boost/mpl/eval_if.hpp>
|
||||
#include <boost/mpl/identity.hpp>
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/equal_to.hpp>
|
||||
#include <boost/fusion/iterator/next.hpp>
|
||||
#include <boost/fusion/iterator/value_of.hpp>
|
||||
#include <boost/fusion/iterator/deref.hpp>
|
||||
#include <tuple>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
{
|
||||
template <typename First, typename Last
|
||||
, bool is_empty = result_of::equal_to<First, Last>::value
|
||||
>
|
||||
struct build_std_tuple;
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct build_std_tuple<First, Last, true>
|
||||
{
|
||||
typedef std::tuple<> type;
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const&, Last const&)
|
||||
{
|
||||
return type();
|
||||
}
|
||||
};
|
||||
|
||||
template <int ...> struct indexed_tuple { };
|
||||
|
||||
template <int, typename = indexed_tuple<>>
|
||||
struct make_indexed_tuple;
|
||||
|
||||
template <int Head, int ...Tail>
|
||||
struct make_indexed_tuple<Head, indexed_tuple<Tail...>>
|
||||
{
|
||||
typedef typename
|
||||
boost::mpl::eval_if_c<
|
||||
(Head == 0),
|
||||
boost::mpl::identity<indexed_tuple<Tail...>>,
|
||||
make_indexed_tuple<Head - 1, indexed_tuple<Head - 1, Tail...>>
|
||||
>::type
|
||||
type;
|
||||
};
|
||||
|
||||
template <typename T, typename Rest>
|
||||
struct push_front_std_tuple;
|
||||
|
||||
template <typename T, typename ...Rest>
|
||||
struct push_front_std_tuple<T, std::tuple<Rest...>>
|
||||
{
|
||||
typedef std::tuple<T, Rest...> type;
|
||||
|
||||
template <int ...I>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
indexed_call(T const& first, std::tuple<Rest...> const& rest, indexed_tuple<I...>)
|
||||
{
|
||||
return type(first, std::get<I>(rest)...);
|
||||
}
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(T const& first, std::tuple<Rest...> const& rest)
|
||||
{
|
||||
typedef typename make_indexed_tuple<sizeof...(Rest)>::type gen;
|
||||
return indexed_call(first, rest, gen());
|
||||
}
|
||||
};
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct build_std_tuple<First, Last, false>
|
||||
{
|
||||
typedef
|
||||
build_std_tuple<typename result_of::next<First>::type, Last>
|
||||
next_build_std_tuple;
|
||||
|
||||
typedef push_front_std_tuple<
|
||||
typename result_of::value_of<First>::type
|
||||
, typename next_build_std_tuple::type>
|
||||
push_front;
|
||||
|
||||
typedef typename push_front::type type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const& f, Last const& l)
|
||||
{
|
||||
typename result_of::value_of<First>::type v = *f;
|
||||
return push_front::call(
|
||||
v, next_build_std_tuple::call(fusion::next(f), l));
|
||||
}
|
||||
};
|
||||
}}}
|
||||
|
||||
#endif
|
@ -0,0 +1,48 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2012-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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_CONVERT_IMPL_10172012_0940)
|
||||
#define BOOST_FUSION_CONVERT_IMPL_10172012_0940
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/detail/build_std_tuple.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/begin.hpp>
|
||||
#include <boost/fusion/sequence/intrinsic/end.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct std_tuple_tag;
|
||||
|
||||
namespace extension
|
||||
{
|
||||
template <typename T>
|
||||
struct convert_impl;
|
||||
|
||||
template <>
|
||||
struct convert_impl<std_tuple_tag>
|
||||
{
|
||||
template <typename Sequence>
|
||||
struct apply
|
||||
{
|
||||
typedef detail::build_std_tuple<
|
||||
typename result_of::begin<Sequence>::type
|
||||
, typename result_of::end<Sequence>::type
|
||||
> gen;
|
||||
|
||||
typedef typename gen::type type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& seq)
|
||||
{
|
||||
return gen::call(begin(seq), end(seq));
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_END_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_END_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/std_tuple_iterator.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
#include <tuple>
|
||||
@ -30,6 +31,7 @@ namespace boost { namespace fusion
|
||||
static int const size = std::tuple_size<seq_type>::value;
|
||||
typedef std_tuple_iterator<Sequence, size> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Sequence& v)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_SEQUENCE_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_IS_SEQUENCE_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_IS_VIEW_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_IS_VIEW_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_SIZE_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_SIZE_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <tuple>
|
||||
#include <boost/mpl/int.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_VALUE_AT_IMPL_09242011_1744)
|
||||
#define BOOST_FUSION_VALUE_AT_IMPL_09242011_1744
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <tuple>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
|
23
include/boost/fusion/adapted/std_tuple/mpl/clear.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2012 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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_CLEAR_10172012_0940)
|
||||
#define BOOST_FUSION_CLEAR_10172012_0940
|
||||
|
||||
#include <boost/mpl/identity.hpp>
|
||||
#include <boost/fusion/adapted/std_tuple/tag_of.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
{
|
||||
template <typename Tag>
|
||||
struct clear;
|
||||
|
||||
template <>
|
||||
struct clear<std_tuple_tag> : mpl::identity<std::tuple<> > {};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@
|
||||
#if !defined(FUSION_STD_TUPLE_ITERATOR_09112011_1905)
|
||||
#define FUSION_STD_TUPLE_ITERATOR_09112011_1905
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/iterator_facade.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
@ -35,7 +36,7 @@ namespace boost { namespace fusion
|
||||
typename add_const<Tuple>::type, Index>
|
||||
identity;
|
||||
|
||||
explicit std_tuple_iterator(Tuple& tuple)
|
||||
BOOST_FUSION_GPU_ENABLED explicit std_tuple_iterator(Tuple& tuple)
|
||||
: tuple(tuple) {}
|
||||
|
||||
Tuple& tuple;
|
||||
@ -57,6 +58,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& iter)
|
||||
{
|
||||
@ -71,6 +73,7 @@ namespace boost { namespace fusion
|
||||
typedef typename Iterator::tuple_type tuple_type;
|
||||
typedef std_tuple_iterator<tuple_type, index+N::value> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& i)
|
||||
{
|
||||
@ -93,6 +96,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef mpl::int_<Last::index-First::index> type;
|
||||
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const&, Last const&)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@
|
||||
#if !defined(BOOST_FUSION_TAG_OF_09112011_1842)
|
||||
#define BOOST_FUSION_TAG_OF_09112011_1842
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <tuple>
|
||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct_named.hpp>
|
||||
|
@ -10,6 +10,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_ASSOC_STRUCT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_ASSOC_STRUCT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
@ -20,6 +21,7 @@
|
||||
|
||||
#include <boost/fusion/adapted/struct/detail/extension.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base_assoc_attr_filler.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
||||
@ -34,32 +36,35 @@
|
||||
#include <boost/fusion/adapted/struct/detail/key_of_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/value_of_data_impl.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(X, Y, Z) \
|
||||
((X, Y, Z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1(X, Y, Z) \
|
||||
((X, Y, Z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_1_END
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX,ATTRIBUTE) \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW,I,PREFIX,ATTRIBUTE) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, PREFIX, ATTRIBUTE, 3) \
|
||||
TEMPLATE_PARAMS_SEQ, \
|
||||
NAME_SEQ, \
|
||||
IS_VIEW, \
|
||||
I, \
|
||||
PREFIX, \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||
BOOST_PP_IF(BOOST_PP_LESS( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE),3), 1, 0)) \
|
||||
\
|
||||
template< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
||||
> \
|
||||
struct struct_assoc_key<BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ), I> \
|
||||
{ \
|
||||
typedef BOOST_PP_TUPLE_ELEM(3, 2, ATTRIBUTE) type; \
|
||||
typedef \
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) type; \
|
||||
};
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_C( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ, I, ATTRIBUTE) \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW, I, ATTRIBUTE) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,BOOST_PP_EMPTY,ATTRIBUTE)
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW,I,BOOST_PP_EMPTY,ATTRIBUTE)
|
||||
|
||||
|
||||
#define BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, ATTRIBUTES) \
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_ASSOC_STRUCT_NAMED_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_ASSOC_STRUCT_NAMED_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2007 Joel de Guzman
|
||||
Copyright (c) 2009-2011 Christopher Schmidt
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
@ -9,8 +10,13 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/preprocessor/config/config.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/comparison/less.hpp>
|
||||
#include <boost/preprocessor/comparison/equal.hpp>
|
||||
#include <boost/type_traits/add_reference.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
@ -18,6 +24,7 @@
|
||||
|
||||
#include <boost/fusion/adapted/struct/detail/extension.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_base_attr_filler.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/at_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_view_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>
|
||||
@ -29,43 +36,88 @@
|
||||
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0(X, Y) \
|
||||
((X, Y)) BOOST_FUSION_ADAPT_STRUCT_FILLER_1
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1(X, Y) \
|
||||
((X, Y)) BOOST_FUSION_ADAPT_STRUCT_FILLER_0
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_FILLER_1_END
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_C( \
|
||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ, \
|
||||
NAME_SEQ, \
|
||||
IS_VIEW, \
|
||||
I, \
|
||||
BOOST_PP_IF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR(ATTRIBUTE), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||
BOOST_PP_IF( \
|
||||
BOOST_PP_LESS( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 2) \
|
||||
, 1, 0))
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_C(TEMPLATE_PARAMS_SEQ, NAME_SEQ, I, ATTRIBUTE)\
|
||||
BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,BOOST_PP_EMPTY,ATTRIBUTE,2)
|
||||
|
||||
#define BOOST_FUSION_ADAPT_TPL_STRUCT(TEMPLATE_PARAMS_SEQ,NAME_SEQ, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(1)TEMPLATE_PARAMS_SEQ, \
|
||||
(1)NAME_SEQ, \
|
||||
struct_tag, \
|
||||
0, \
|
||||
((0,0)) BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_0 ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
0, \
|
||||
BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
1, \
|
||||
BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
# define BOOST_FUSION_ADAPT_TPL_STRUCT(TEMPLATE_PARAMS_SEQ,NAME_SEQ, ...) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(1)TEMPLATE_PARAMS_SEQ, \
|
||||
(1)NAME_SEQ, \
|
||||
struct_tag, \
|
||||
0, \
|
||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT(NAME, ...) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
0, \
|
||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ...) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
1, \
|
||||
BOOST_FUSION_ADAPT_STRUCT_ATTRIBUTES_FILLER(__VA_ARGS__), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
# define BOOST_FUSION_ADAPT_TPL_STRUCT( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(1)TEMPLATE_PARAMS_SEQ, \
|
||||
(1)NAME_SEQ, \
|
||||
struct_tag, \
|
||||
0, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT(NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
0, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES, \
|
||||
_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_AS_VIEW(NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||
(0), \
|
||||
(0)(NAME), \
|
||||
struct_tag, \
|
||||
1, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES, \
|
||||
_END), \
|
||||
BOOST_FUSION_ADAPT_STRUCT_C)
|
||||
|
||||
|
||||
#endif // BOOST_PP_VARIADICS
|
||||
|
||||
#endif
|
||||
|
@ -10,30 +10,46 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_NAMED_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_ADAPT_STRUCT_NAMED_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/proxy_type.hpp>
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0(X, Y) \
|
||||
(X, obj.Y) BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1(X, Y) \
|
||||
(X, obj.Y) BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0_END
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_1_END
|
||||
#ifdef BOOST_PP_VARIADICS
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ...) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \
|
||||
WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \
|
||||
WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_AS_VIEW( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_FILLER_0 ATTRIBUTES,_END))
|
||||
BOOST_FUSION_ADAPT_STRUCT_AS_VIEW( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION( \
|
||||
(0)NAMESPACE_SEQ)NAME, \
|
||||
__VA_ARGS__)
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE,(boost)(fusion)(adapted),NAME,ATTRIBUTES)
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_NAMED(WRAPPED_TYPE, NAME, ...) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE,(boost)(fusion)(adapted),NAME,__VA_ARGS__)
|
||||
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \
|
||||
WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_AS_VIEW( \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION( \
|
||||
(0)NAMESPACE_SEQ)NAME, \
|
||||
ATTRIBUTES)
|
||||
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS( \
|
||||
WRAPPED_TYPE,(boost)(fusion)(adapted),NAME,ATTRIBUTES)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -8,9 +8,17 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DEFINE_ASSOC_STRUCT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_DEFINE_ASSOC_STRUCT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/define_struct.hpp>
|
||||
|
||||
#define BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_0(X, Y, Z) \
|
||||
((X, Y, Z)) BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_1
|
||||
#define BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_1(X, Y, Z) \
|
||||
((X, Y, Z)) BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_0
|
||||
#define BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_0_END
|
||||
#define BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_1_END
|
||||
|
||||
#define BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT( \
|
||||
TEMPLATE_PARAMS_SEQ, NAMESPACE_SEQ, NAME, ATTRIBUTES) \
|
||||
\
|
||||
@ -19,7 +27,7 @@
|
||||
(0)NAMESPACE_SEQ, \
|
||||
NAME, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(0,0,0)ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_0(0,0,0)ATTRIBUTES,_END), \
|
||||
3) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT( \
|
||||
@ -33,7 +41,7 @@
|
||||
(0)NAMESPACE_SEQ, \
|
||||
NAME, \
|
||||
BOOST_PP_CAT( \
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_FILLER_0(0,0,0)ATTRIBUTES,_END), \
|
||||
BOOST_FUSION_DEFINE_ASSOC_STRUCT_FILLER_0(0,0,0)ATTRIBUTES,_END), \
|
||||
3) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT( \
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DEFINE_STRUCT_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_DEFINE_STRUCT_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/define_struct.hpp>
|
||||
|
||||
@ -18,7 +19,7 @@
|
||||
TEMPLATE_PARAMS_SEQ, \
|
||||
(0)NAMESPACE_SEQ, \
|
||||
NAME, \
|
||||
BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
BOOST_PP_CAT(BOOST_FUSION_DEFINE_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
2) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT( \
|
||||
@ -31,7 +32,7 @@
|
||||
BOOST_FUSION_DEFINE_STRUCT_IMPL( \
|
||||
(0)NAMESPACE_SEQ, \
|
||||
NAME, \
|
||||
BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
BOOST_PP_CAT(BOOST_FUSION_DEFINE_STRUCT_FILLER_0(0,0)ATTRIBUTES,_END), \
|
||||
2) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT( \
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DEFINE_STRUCT_INLINE_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_DEFINE_STRUCT_INLINE_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/define_struct_inline.hpp>
|
||||
|
||||
|
15
include/boost/fusion/adapted/struct/detail/adapt_auto.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
==============================================================================*/
|
||||
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
|
||||
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
|
||||
#define BOOST_FUSION_ADAPT_AUTO BOOST_PP_EMPTY()
|
||||
|
||||
#endif
|
@ -2,6 +2,7 @@
|
||||
Copyright (c) 2001-2009 Joel de Guzman
|
||||
Copyright (c) 2005-2006 Dan Marsden
|
||||
Copyright (c) 2009-2011 Christopher Schmidt
|
||||
Copyright (c) 2013-2014 Damien Buhl
|
||||
|
||||
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)
|
||||
@ -10,8 +11,11 @@
|
||||
#ifndef BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_HPP
|
||||
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_BASE_HPP
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
|
||||
#include <boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp>
|
||||
|
||||
#include <boost/preprocessor/empty.hpp>
|
||||
#include <boost/preprocessor/stringize.hpp>
|
||||
@ -24,12 +28,16 @@
|
||||
#include <boost/preprocessor/tuple/eat.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
#include <boost/preprocessor/arithmetic/dec.hpp>
|
||||
#include <boost/preprocessor/comparison/less.hpp>
|
||||
#include <boost/mpl/bool.hpp>
|
||||
#include <boost/mpl/tag.hpp>
|
||||
#include <boost/mpl/eval_if.hpp>
|
||||
#include <boost/mpl/identity.hpp>
|
||||
#include <boost/type_traits/add_const.hpp>
|
||||
|
||||
#include <boost/typeof/typeof.hpp>
|
||||
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME_TEMPLATE_PARAMS(SEQ) \
|
||||
BOOST_PP_SEQ_HEAD(SEQ)<BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TAIL(SEQ))> \
|
||||
BOOST_PP_EMPTY()
|
||||
@ -54,6 +62,49 @@
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL, \
|
||||
BOOST_PP_TUPLE_EAT(1))(SEQ)
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# define BOOST_FUSION_ATTRIBUTE_TYPEOF( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
struct deduced_attr_type { \
|
||||
static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
BOOST_TYPEOF( PREFIX() obj.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||
0, ATTRIBUTE)) \
|
||||
type; \
|
||||
}; \
|
||||
\
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
deduced_attr_type::type attribute_type;
|
||||
|
||||
#else
|
||||
# define BOOST_FUSION_ATTRIBUTE_TYPEOF( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
struct deduced_attr_type { \
|
||||
static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
||||
typedef BOOST_TYPEOF( \
|
||||
PREFIX() obj.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE)) \
|
||||
type; \
|
||||
}; \
|
||||
\
|
||||
typedef \
|
||||
BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \
|
||||
deduced_attr_type::type attribute_type;
|
||||
|
||||
#endif
|
||||
|
||||
#define BOOST_FUSION_ATTRIBUTE_GIVENTYPE( \
|
||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
||||
typedef \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) attribute_type;
|
||||
|
||||
|
||||
#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
|
||||
# define BOOST_FUSION_ADAPT_STRUCT_TAG_OF_SPECIALIZATION( \
|
||||
MODIFIER, TEMPLATE_PARAMS_SEQ, NAME_SEQ, TAG) \
|
||||
@ -82,9 +133,10 @@
|
||||
#endif
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_BASE_UNPACK_AND_CALL(R,DATA,I,ATTRIBUTE) \
|
||||
BOOST_PP_TUPLE_ELEM(3,0,DATA)( \
|
||||
BOOST_PP_TUPLE_ELEM(3,1,DATA), \
|
||||
BOOST_PP_TUPLE_ELEM(3,2,DATA), \
|
||||
BOOST_PP_TUPLE_ELEM(4,0,DATA)( \
|
||||
BOOST_PP_TUPLE_ELEM(4,1,DATA), \
|
||||
BOOST_PP_TUPLE_ELEM(4,2,DATA), \
|
||||
BOOST_PP_TUPLE_ELEM(4,3,DATA), \
|
||||
I, \
|
||||
ATTRIBUTE)
|
||||
|
||||
@ -106,7 +158,9 @@
|
||||
#endif
|
||||
|
||||
#define BOOST_FUSION_ADAPT_STRUCT_C_BASE( \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX,ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE) \
|
||||
TEMPLATE_PARAMS_SEQ,NAME_SEQ,IS_VIEW, \
|
||||
I,PREFIX,ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE, \
|
||||
DEDUCE_TYPE) \
|
||||
\
|
||||
template< \
|
||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
||||
@ -116,9 +170,14 @@
|
||||
, I \
|
||||
> \
|
||||
{ \
|
||||
typedef \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) \
|
||||
attribute_type; \
|
||||
BOOST_PP_IF(DEDUCE_TYPE, \
|
||||
BOOST_FUSION_ATTRIBUTE_TYPEOF, BOOST_FUSION_ATTRIBUTE_GIVENTYPE)( \
|
||||
NAME_SEQ, \
|
||||
ATTRIBUTE, \
|
||||
ATTRIBUTE_TUPEL_SIZE, \
|
||||
PREFIX, \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
||||
TEMPLATE_PARAMS_SEQ) \
|
||||
\
|
||||
@ -137,11 +196,13 @@
|
||||
>::type \
|
||||
type; \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static type \
|
||||
call(Seq& seq) \
|
||||
{ \
|
||||
return seq.PREFIX() \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE); \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||
BOOST_PP_IF(DEDUCE_TYPE, 0, 1), ATTRIBUTE); \
|
||||
} \
|
||||
}; \
|
||||
}; \
|
||||
@ -156,11 +217,14 @@
|
||||
{ \
|
||||
typedef char const* type; \
|
||||
\
|
||||
BOOST_FUSION_GPU_ENABLED \
|
||||
static type \
|
||||
call() \
|
||||
{ \
|
||||
return BOOST_PP_STRINGIZE( \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)); \
|
||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||
BOOST_PP_IF(DEDUCE_TYPE, 0, 1), \
|
||||
ATTRIBUTE)); \
|
||||
} \
|
||||
};
|
||||
|
||||
@ -192,7 +256,7 @@ namespace boost
|
||||
BOOST_PP_TUPLE_EAT(4))( \
|
||||
1, \
|
||||
BOOST_FUSION_ADAPT_STRUCT_BASE_UNPACK_AND_CALL, \
|
||||
(ATTRIBUTES_CALLBACK,TEMPLATE_PARAMS_SEQ,NAME_SEQ), \
|
||||
(ATTRIBUTES_CALLBACK,TEMPLATE_PARAMS_SEQ,NAME_SEQ, IS_VIEW),\
|
||||
BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ)) \
|
||||
\
|
||||
template< \
|
||||
|