Compare commits
475 Commits
svn-branch
...
boost-1.58
Author | SHA1 | Date | |
---|---|---|---|
639cf2459d | |||
1ba1ac3ec8 | |||
0bbea1ea32 | |||
b56eb59595 | |||
01a2d6557e | |||
91cac41ada | |||
67f0863cdd | |||
2204f025d3 | |||
e881ea67cb | |||
84789ec1c3 | |||
8c72a0012f | |||
4b5eb0cde8 | |||
d8bca006ff | |||
0954000314 | |||
2b072973e0 | |||
2c5b52f3bd | |||
f45c94fa43 | |||
2114bfca6c | |||
3e66a56b9f | |||
d03f79b6fd | |||
52eb8768f2 | |||
197792ac53 | |||
06428298bb | |||
960ccf5d2c | |||
bd4b1cdac6 | |||
e23d153734 | |||
d9337979b1 | |||
92726da079 | |||
505d41ea67 | |||
02d15bfcb4 | |||
fb0f22a296 | |||
c5c0147d7d | |||
6ab68a29d8 | |||
aa1448b77a | |||
73a5dde412 | |||
b60219eb8a | |||
c6c9d872d3 | |||
fc1a60e8e6 | |||
de43345b34 | |||
382c1e5645 | |||
588896de45 | |||
70d5b40a7c | |||
e4d43b00c1 | |||
995202044c | |||
b3c560d3b6 | |||
3955f76511 | |||
98247fb97f | |||
5e4978b870 | |||
326104a9b7 | |||
ce8bf1079a | |||
28598a7919 | |||
0360dc44b2 | |||
fbd6a8a50f | |||
e572c382f7 | |||
205c0f1eb4 | |||
d7c918e36f | |||
f872d1326a | |||
54dedc5e98 | |||
af1bc25783 | |||
7d641cbc8f | |||
f349d48a3f | |||
97c863eaa0 | |||
85ce2a3eb2 | |||
a2269f447e | |||
51d638f51c | |||
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 | |||
3b24ed44f8 | |||
7922147716 | |||
13d00bd6c2 | |||
56d0d48eb9 | |||
e83960d3e9 | |||
92ee36a556 | |||
52298c686e | |||
80b4ce43c5 | |||
b36426c8e3 | |||
d354c5183b | |||
fb3bd4cea8 | |||
9672fe5385 | |||
085c3c25ca | |||
85119dbd21 | |||
764a31e9f5 | |||
228401d898 | |||
aba201eb4e | |||
9c5d6bcc8c | |||
7b6cf39540 | |||
996f4152d2 | |||
d128c6f6aa | |||
fec1da027c | |||
a1a6e42590 | |||
4272519a3c | |||
9dcdfa323f | |||
5a520585d8 | |||
1823f30420 | |||
f96bbef8fa | |||
f1687bffcf | |||
6c17c04ce6 | |||
b7d02a8c55 | |||
6a47d86d72 | |||
2f61e2b707 | |||
ea0cad5800 | |||
f9d6e05676 | |||
211b47b47d | |||
6d265316ed | |||
8d6200ef58 | |||
e1819c11b2 | |||
cfbbba272e | |||
d01148d339 | |||
fc38122f0f | |||
940c594d3e | |||
f760ed7b8f | |||
752f911a91 | |||
b57cd4ede9 | |||
a856857cb7 | |||
78ff3d8831 | |||
80799eed95 | |||
35ec74edbc | |||
106702d388 | |||
4382b64aa7 | |||
26ba07f36c | |||
a53f93ff1a | |||
705ca2b61b | |||
e587ad4d50 | |||
3613310b62 | |||
5946ab9936 | |||
c8b47ca3ca | |||
16de1dcd01 | |||
038976991e | |||
9cceb79cf8 | |||
4ccb4328f6 | |||
eaf9e79e85 | |||
a3b0cad1e7 | |||
5a51e5d9aa | |||
85583b5ea9 | |||
191a3d75ed | |||
136331963a | |||
bcb5fd9618 | |||
70589c53c6 | |||
ed3776ce8c | |||
a46bd7ab72 | |||
8ce40ebd0c | |||
51ade6529c | |||
b63c8214d7 | |||
e03dcc7c54 | |||
2e99690387 | |||
ee33ea5cfa | |||
93477e270e | |||
66e8a6d3b7 | |||
524769f6fb | |||
654dfbedb8 | |||
fad4a7ebeb | |||
01f002f084 | |||
c8224c8bdf | |||
b7eda8d0f4 | |||
ecc87abaab | |||
a3c2258017 | |||
d87b5a8000 | |||
b34a8c79e8 | |||
ec99f829f3 | |||
2936fd30fb | |||
a36f0f95cb | |||
93ce3bd9bf | |||
e15c27bc8b | |||
92d51dcfa8 | |||
221e07a7a3 | |||
2038772e90 | |||
b6142f1613 | |||
df0fbd1d9d | |||
b159898a47 | |||
38cd16639d | |||
1c51ad943a | |||
9a8955fbe1 | |||
a25a7092d8 | |||
48e4118768 | |||
0a520f6021 | |||
bbf10066bc | |||
44b337abb0 | |||
c2052a3c0c | |||
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 |
340
doc/adapted.qbk
@ -89,6 +89,35 @@ __std_pair_doc__, __tr1_tuple_pair__
|
||||
|
||||
[endsect]
|
||||
|
||||
[section std::tuple]
|
||||
|
||||
This module provides adapters for `std::tuple`. Including the module header
|
||||
makes `std::tuple` a fully conforming __random_access_sequence__.
|
||||
|
||||
[important To be fully conforming, compiler should support C++11 Variadic Templates.]
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/adapted/std_tuple.hpp>
|
||||
#include <boost/fusion/include/std_tuple.hpp>
|
||||
|
||||
[heading Model of]
|
||||
|
||||
* __random_access_sequence__
|
||||
|
||||
[heading Example]
|
||||
|
||||
std::tuple<int, std::string, float> p(123, "Hola!!!", 456.f);
|
||||
std::cout << __at_c__<0>(p) << std::endl;
|
||||
std::cout << __at_c__<1>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
|
||||
[heading See also]
|
||||
|
||||
__std_tuple_doc__
|
||||
|
||||
[endsect]
|
||||
|
||||
[section mpl sequence]
|
||||
|
||||
This module provides adapters for __mpl__ sequences. Including the module
|
||||
@ -168,8 +197,8 @@ header makes `boost::tuple` a fully conforming __forward_sequence__.
|
||||
[heading Example]
|
||||
|
||||
boost::tuple<int,std::string> example_tuple(101, "hello");
|
||||
std::cout << *boost::fusion::begin(example_tuple) << '\n';
|
||||
std::cout << *boost::fusion::next(boost::fusion::begin(example_tuple)) << '\n';
|
||||
std::cout << *__begin__(example_tuple) << '\n';
|
||||
std::cout << *__next__(__begin__(example_tuple)) << '\n';
|
||||
|
||||
[heading See also]
|
||||
|
||||
@ -185,10 +214,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 +235,13 @@ __random_access_sequence__.
|
||||
|
||||
The above macro generates the necessary code to adapt `struct_name`
|
||||
as a model of __random_access_sequence__.
|
||||
The sequence of `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are
|
||||
part of the sequence.
|
||||
|
||||
The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are part of
|
||||
the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macro should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be adapted.
|
||||
@ -208,7 +251,7 @@ namespace qualified name of the struct to be adapted.
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <boost/fusion/include/adapt_struct.hpp>
|
||||
|
||||
[heading Example]
|
||||
[heading Example: BOOST_FUSION_ADAPT_STRUCT ]
|
||||
namespace demo
|
||||
{
|
||||
struct employee
|
||||
@ -221,8 +264,15 @@ namespace qualified name of the struct to be adapted.
|
||||
// demo::employee is now a Fusion sequence
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
demo::employee,
|
||||
(std::string, name)
|
||||
(int, age))
|
||||
name,
|
||||
age)
|
||||
|
||||
// Without BOOST_PP_VARIADICS support :
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
demo::employee,
|
||||
(BOOST_FUSION_ADAPT_AUTO, name)
|
||||
(BOOST_FUSION_ADAPT_AUTO, age)
|
||||
)
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -234,11 +284,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 +312,12 @@ the template type parameters used.
|
||||
The sequence `(specialization_param0)(specialization_param1)...`
|
||||
declares the template parameters of the actual specialization of `struct_name`
|
||||
that is adapted as a fusion sequence.
|
||||
The sequence of `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are
|
||||
part of the sequence.
|
||||
The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are part of
|
||||
the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macro should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be adapted.
|
||||
@ -272,6 +335,7 @@ namespace qualified name of the struct to be adapted.
|
||||
{
|
||||
Name name;
|
||||
Age age;
|
||||
int employment_timestamp;
|
||||
};
|
||||
}
|
||||
|
||||
@ -280,7 +344,16 @@ namespace qualified name of the struct to be adapted.
|
||||
(Name)(Age),
|
||||
(demo::employee) (Name)(Age),
|
||||
(Name, name)
|
||||
(Age, age))
|
||||
(Age, age)
|
||||
(BOOST_FUSION_ADAPT_AUTO, employment_timestamp))
|
||||
|
||||
// Or by infering type completely
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT(
|
||||
(Name)(Age),
|
||||
(demo::employee) (Name)(Age),
|
||||
name,
|
||||
age,
|
||||
employment_timestamp)
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -293,10 +366,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 +400,12 @@ adapted using the given name.
|
||||
adapted_name,
|
||||
(member_type0, member_name0)
|
||||
(member_type1, member_name1)
|
||||
(BOOST_FUSION_ADAPT_AUTO, member_name2),
|
||||
...
|
||||
)
|
||||
|
||||
|
||||
|
||||
[heading Semantics]
|
||||
|
||||
The above macros generate the necessary code to adapt `struct_name`
|
||||
@ -321,9 +418,12 @@ If an empty namespace sequence is given (that is a macro that expands to
|
||||
nothing), the adapted view is placed in the global namespace.
|
||||
If no namespace sequence is given (i.e. `BOOST_FUSION_ADAPT_STRUCT_NAMED`), the
|
||||
adapted view is placed in the namespace `boost::fusion::adapted`.
|
||||
The sequence of `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are
|
||||
part of the sequence.
|
||||
The sequence of `member_nameN,` arguments or `(member_typeN, member_nameN)`
|
||||
pairs declares the type and names of each of the struct members that are part of
|
||||
the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macros should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be converted.
|
||||
@ -347,8 +447,14 @@ namespace qualified name of the struct to be converted.
|
||||
// referring to demo::employee
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED(
|
||||
demo::employee, adapted_employee,
|
||||
(std::string, name)
|
||||
(int, age))
|
||||
name,
|
||||
age)
|
||||
|
||||
// Without BOOST_PP_VARIADICS support :
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED(
|
||||
demo::employee, adapted_employee,
|
||||
(BOOST_FUSION_ADAPT_AUTO, name),
|
||||
(BOOST_FUSION_ADAPT_AUTO, age))
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -362,8 +468,8 @@ __random_access_sequence__ and __associative_sequence__.
|
||||
[heading Synopsis]
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
struct_name,
|
||||
(member_type0, member_name0, key_type0)
|
||||
(member_type1, member_name1, key_type1)
|
||||
([member_type0,] member_name0, key_type0)
|
||||
([member_type1,] member_name1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -371,10 +477,13 @@ __random_access_sequence__ and __associative_sequence__.
|
||||
|
||||
The above macro generates the necessary code to adapt `struct_name`
|
||||
as a model of __random_access_sequence__ and __associative_sequence__.
|
||||
The sequence of `(member_typeN, member_nameN, key_typeN)`
|
||||
triples declares the type, name and key type of each of the struct members
|
||||
The sequence of `([member_typeN,] member_nameN, key_typeN)` tuples
|
||||
declares the type, name and key type of each of the struct members
|
||||
that are part of the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macro should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be adapted.
|
||||
|
||||
@ -404,8 +513,14 @@ namespace qualified name of the struct to be adapted.
|
||||
// keys keys::name and keys::age present.
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
demo::employee,
|
||||
(std::string, name, keys::name)
|
||||
(int, age, keys::age))
|
||||
(name, keys::name)
|
||||
(age, keys::age))
|
||||
|
||||
// Without BOOST_PP_VARIADICS support :
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
demo::employee,
|
||||
(BOOST_FUSION_ADAPT_AUTO, name, keys::name),
|
||||
(BOOST_FUSION_ADAPT_AUTO, age, keys::name))
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -420,8 +535,8 @@ __random_access_sequence__ and __associative_sequence__.
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
|
||||
(template_param0)(template_param1)...,
|
||||
(struct_name) (specialization_param0)(specialization_param1)...,
|
||||
(member_type0, member_name0, key_type0)
|
||||
(member_type1, member_name1, key_type1)
|
||||
([member_type0,] member_name0, key_type0)
|
||||
([member_type1,] member_name1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -435,10 +550,13 @@ the template type parameters used.
|
||||
The sequence `(specialization_param0)(specialization_param1)...`
|
||||
declares the template parameters of the actual specialization of `struct_name`
|
||||
that is adapted as a fusion sequence.
|
||||
The sequence of `(member_typeN, member_nameN, key_typeN)`
|
||||
triples declares the type, name and key type of each of the struct members
|
||||
The sequence of `([member_typeN,] member_nameN, key_typeN)`
|
||||
tuples declares the type, name and key type of each of the struct members
|
||||
that are part of the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macro should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be adapted.
|
||||
|
||||
@ -467,6 +585,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 +611,8 @@ __associative_sequence__. The given struct is adapted using the given name.
|
||||
[heading Synopsis]
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
|
||||
struct_name, adapted_name,
|
||||
(member_type0, member_name0, key_type0)
|
||||
(member_type1, member_name1, key_type1)
|
||||
([member_type0,] member_name0, key_type0)
|
||||
([member_type1,] member_name1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -495,8 +620,8 @@ __associative_sequence__. The given struct is adapted using the given name.
|
||||
struct_name,
|
||||
(namespace0)(namespace1)...,
|
||||
adapted_name,
|
||||
(member_type0, member_name0, key_type0)
|
||||
(member_type1, member_name1, key_type1)
|
||||
([member_type0,] member_name0, key_type0)
|
||||
([member_type1,] member_name1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -516,6 +641,9 @@ The sequence of `(member_typeN, member_nameN, key_typeN)`
|
||||
triples declares the type, name and key type of each of the struct members
|
||||
that are part of the sequence.
|
||||
|
||||
When member_typeN is omitted or set to BOOST_FUSION_ADAPT_AUTO, the type is
|
||||
infered with Boost.TypeOf.
|
||||
|
||||
The macros should be used at global scope, and `struct_name` should be the fully
|
||||
namespace qualified name of the struct to be converted.
|
||||
|
||||
@ -544,8 +672,14 @@ namespace qualified name of the struct to be converted.
|
||||
// referring to demo::employee
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
|
||||
demo::employee, adapted_employee,
|
||||
(std::string, name, keys::name)
|
||||
(int, age, keys::age))
|
||||
(name, keys::name)
|
||||
(age, keys::age))
|
||||
|
||||
// Without BOOST_PP_VARIADICS support :
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
|
||||
demo::employee, adapted_employee,
|
||||
(BOOST_FUSION_ADAPT_AUTO, name, keys::name)
|
||||
(BOOST_FUSION_ADAPT_AUTO, age, keys::age))
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -559,8 +693,8 @@ __random_access_sequence__.
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
type_name,
|
||||
(attribute_type0, attribute_const_type0, get_expr0, set_expr0)
|
||||
(attribute_type1, attribute_const_type1, get_expr1, set_expr1)
|
||||
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0)
|
||||
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -569,7 +703,7 @@ __random_access_sequence__.
|
||||
The above macro generates the necessary code to adapt `type_name`
|
||||
as a model of __random_access_sequence__.
|
||||
The sequence of
|
||||
[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N])]
|
||||
[^([attribute_type['N], attribute_const_type['N],] get_expr['N], set_expr['N])]
|
||||
quadruples declares the types, const types, get-expressions and set-expressions
|
||||
of the elements that are part of the adapted fusion sequence.
|
||||
[^get_expr['N]] is the expression that is invoked to get the ['N]th element
|
||||
@ -577,7 +711,9 @@ of an instance of `type_name`. This expression may access a variable named
|
||||
`obj` of type `type_name&` or `type_name const&` which represents the underlying
|
||||
instance of `type_name`.
|
||||
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
|
||||
that [^get_expr['N]] denotes to.
|
||||
that [^get_expr['N]] denotes to, when omitted the type is deduced from
|
||||
[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
|
||||
variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
|
||||
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
|
||||
of an instance of `type_name`. This expression may access variables named
|
||||
`obj` of type `type_name&`, which represent the corresponding instance of
|
||||
@ -635,8 +771,8 @@ namespace qualified name of the class type to be adapted.
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
demo::employee,
|
||||
(std::string const&, std::string const&, obj.get_name(), obj.set_name(val))
|
||||
(int, int, obj.get_age(), obj.set_age(val)))
|
||||
(obj.get_name(), obj.set_name(val))
|
||||
(obj.get_age(), obj.set_age(val)))
|
||||
|
||||
demo::employee e;
|
||||
front(e)="Edward Norton";
|
||||
@ -658,11 +794,11 @@ __random_access_sequence__.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
BOOST_FUSION_ADAPT_TPL_ADT(
|
||||
(template_param0)(template_param1)...,
|
||||
(type_name) (specialization_param0)(specialization_param1)...,
|
||||
(attribute_type0, attribute_const_type0, get_expr0, set_expr0)
|
||||
(attribute_type1, attribute_const_type1, get_expr1, set_expr1)
|
||||
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0)
|
||||
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -685,7 +821,9 @@ of an instance of `type_name`. This expression may access a variable named
|
||||
`obj` of type `type_name&` or `type_name const&` which represents the underlying
|
||||
instance of `type_name`.
|
||||
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
|
||||
that [^get_expr['N]] denotes to.
|
||||
that [^get_expr['N]] denotes to, when omitted the type is deduced from
|
||||
[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
|
||||
variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
|
||||
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
|
||||
of an instance of `type_name`. This expression may access variables named
|
||||
`obj` of type `type_name&`, which represent the corresponding instance of
|
||||
@ -770,8 +908,8 @@ __random_access_sequence__ and __associative_sequence__.
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT(
|
||||
type_name,
|
||||
(attribute_type0, attribute_const_type0, get_expr0, set_expr0, key_type0)
|
||||
(attribute_type1, attribute_const_type1, get_expr1, set_expr1, key_type1)
|
||||
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
|
||||
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -788,7 +926,9 @@ of an instance of `type_name`. This expression may access a variable named
|
||||
`obj` of type `type_name&` or `type_name const&` which represents the underlying
|
||||
instance of `type_name`.
|
||||
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
|
||||
that [^get_expr['N]] denotes to.
|
||||
that [^get_expr['N]] denotes to, when omitted the type is deduced from
|
||||
[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
|
||||
variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
|
||||
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
|
||||
of an instance of `type_name`. This expression may access variables named
|
||||
`obj` of type `type_name&`, which represent the corresponding instance of
|
||||
@ -852,8 +992,8 @@ namespace qualified name of the class type to be adapted.
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT(
|
||||
demo::employee,
|
||||
(std::string const&, std::string const&, obj.get_name(), obj.set_name(val), keys::name)
|
||||
(int, int, obj.get_age(), obj.set_age(val), keys::age))
|
||||
(obj.get_name(), obj.set_name(val), keys::name)
|
||||
(obj.get_age(), obj.set_age(val), keys::age))
|
||||
|
||||
demo::employee e;
|
||||
at_key<keys::name>(e)="Edward Norton";
|
||||
@ -878,8 +1018,8 @@ __random_access_sequence__ and __associative_sequence__.
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
|
||||
(template_param0)(template_param1)...,
|
||||
(type_name) (specialization_param0)(specialization_param1)...,
|
||||
(attribute_type0, attribute_const_type0, get_expr0, set_expr0, key_type0)
|
||||
(attribute_type1, attribute_const_type1, get_expr1, set_expr1, key_type1)
|
||||
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
|
||||
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
|
||||
...
|
||||
)
|
||||
|
||||
@ -894,7 +1034,7 @@ The sequence `(specialization_param0)(specialization_param1)...`
|
||||
declares the template parameters of the actual specialization of `type_name`
|
||||
that is adapted as a fusion sequence.
|
||||
The sequence of
|
||||
[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N], key_type['N])]
|
||||
[^([attribute_type['N], attribute_const_type['N],] get_expr['N], set_expr['N], key_type['N])]
|
||||
5-tuples declares the types, const types, get-expressions, set-expressions and key types
|
||||
of the elements that are part of the adapted fusion sequence.
|
||||
[^get_expr['N]] is the expression that is invoked to get the ['N]th element
|
||||
@ -902,7 +1042,9 @@ of an instance of `type_name`. This expression may access a variable named
|
||||
`obj` of type `type_name&` or `type_name const&` which represents the underlying
|
||||
instance of `type_name`.
|
||||
[^attribute_type['N]] and [^attribute_const_type['N]] may specify the types
|
||||
that [^get_expr['N]] denotes to.
|
||||
that [^get_expr['N]] denotes to, when omitted the type is deduced from
|
||||
[get_expr['N]] return type via BOOST_TYPEOF. On compiler missing support for
|
||||
variadic macros BOOST_FUSION_ADAPT_AUTO can be used to avoid repeating the type.
|
||||
[^set_expr['N]] is the expression that is invoked to set the ['N]th element
|
||||
of an instance of `type_name`. This expression may access variables named
|
||||
`obj` of type `type_name&`, which represent the corresponding instance of
|
||||
@ -1115,6 +1257,100 @@ defined in __random_access_sequence__.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:define_struct_inline BOOST_FUSION_DEFINE_STRUCT_INLINE]
|
||||
|
||||
[heading Description]
|
||||
|
||||
BOOST_FUSION_DEFINE_STRUCT_INLINE is a macro that can be used to generate all
|
||||
the necessary boilerplate to define and adapt an arbitrary struct as a model of
|
||||
__random_access_sequence__. Unlike BOOST_FUSION_DEFINE_STRUCT, it can be used
|
||||
at class or namespace scope.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
BOOST_FUSION_DEFINE_STRUCT_INLINE(
|
||||
struct_name,
|
||||
(member_type0, member_name0)
|
||||
(member_type1, member_name1)
|
||||
...
|
||||
)
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
The semantics of BOOST_FUSION_DEFINE_STRUCT_INLINE are identical to those of
|
||||
BOOST_FUSION_DEFINE_STRUCT, with two differences:
|
||||
|
||||
# BOOST_FUSION_DEFINE_STRUCT_INLINE can be used at class or namespace scope, and
|
||||
thus does not take a namespace list parameter.
|
||||
# The structure generated by BOOST_FUSION_DEFINE_STRUCT_INLINE has a base class,
|
||||
and is thus not POD in C++03.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
|
||||
#include <boost/fusion/include/define_struct_inline.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
// enclosing::employee is a Fusion sequence
|
||||
class enclosing
|
||||
{
|
||||
BOOST_FUSION_DEFINE_STRUCT_INLINE(
|
||||
employee,
|
||||
(std::string, name)
|
||||
(int, age))
|
||||
};
|
||||
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:define_tpl_struct_inline BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE]
|
||||
|
||||
[heading Description]
|
||||
|
||||
BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE is a macro that can be used to generate
|
||||
all the necessary boilerplate to define and adapt an arbitrary template struct
|
||||
as a model of __random_access_sequence__. Unlike BOOST_FUSION_DEFINE_TPL_STRUCT,
|
||||
it can be used at class or namespace scope.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE(
|
||||
(template_param0)(template_param1)...,
|
||||
struct_name,
|
||||
(member_type0, member_name0)
|
||||
(member_type1, member_name1)
|
||||
...
|
||||
)
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
The semantics of BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE are identical to those of
|
||||
BOOST_FUSION_DEFINE_TPL_STRUCT, with two differences:
|
||||
|
||||
# BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE can be used at class or namespace scope,
|
||||
and thus does not take a namespace list parameter.
|
||||
# The structure generated by BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE has a base
|
||||
class, and is thus not POD in C++03.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
|
||||
#include <boost/fusion/include/define_struct_inline.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
// Any instantiated enclosing::employee is a Fusion sequence
|
||||
class enclosing
|
||||
{
|
||||
BOOST_FUSION_DEFINE_TPL_STRUCT(
|
||||
(Name)(Age), employee,
|
||||
(Name, name)
|
||||
(Age, age))
|
||||
};
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:define_assoc_struct BOOST_FUSION_DEFINE_ASSOC_STRUCT]
|
||||
|
||||
[heading Description]
|
||||
|
@ -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]
|
||||
@ -326,10 +441,10 @@ Linear, exactly `__result_of_size__<Sequence>::value` applications of `F`.
|
||||
[endsect]
|
||||
|
||||
[section for_each]
|
||||
A metafunction returning the result type of applying __for_each__ to a sequence. The
|
||||
return type of __for_each__ is always `void`.
|
||||
|
||||
[heading Description]
|
||||
A metafunction returning the result type of applying __for_each__ to a sequence. The
|
||||
return type of __for_each__ is always `void`.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
@ -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]]
|
||||
@ -609,8 +724,10 @@ or `__end__(seq)` if there is no such element.
|
||||
[heading Complexity]
|
||||
Linear. At most `__result_of_size__<Sequence>::value` comparisons.
|
||||
|
||||
#include <boost/fusion/algorithm/query/find_if.hpp>
|
||||
#include <boost/fusion/include/find_if.hpp>
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/query/find_if.hpp>
|
||||
#include <boost/fusion/include/find_if.hpp>
|
||||
|
||||
[heading Example]
|
||||
const __vector__<double,int> vec(1.0,2);
|
||||
@ -1246,7 +1363,7 @@ Returns a new sequence, with all the elements of the original sequence, except t
|
||||
typename T,
|
||||
typename Sequence
|
||||
>
|
||||
typename __result_of_remove__<Sequence const, T>::type replace(Sequence const& seq);
|
||||
typename __result_of_remove__<Sequence const, T>::type remove(Sequence const& seq);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
@ -1329,7 +1446,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 +1486,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 +1523,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 +1584,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 +1627,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 +1644,7 @@ position described by a given iterator.
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__insert__(seq, p, t);
|
||||
__insert__(seq, pos, t);
|
||||
|
||||
[*Return type]:
|
||||
|
||||
@ -1555,7 +1672,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 +1697,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 +1758,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<
|
||||
@ -1715,7 +1832,7 @@ Constant. Returns a view which is lazily evaluated.
|
||||
#include <boost/fusion/include/pop_back.hpp>
|
||||
|
||||
[heading Example]
|
||||
assert(___pop_back__(__make_vector__(1,2,3)) == __make_vector__(1,2));
|
||||
assert(__pop_back__(__make_vector__(1,2,3)) == __make_vector__(1,2));
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -1841,6 +1958,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]
|
||||
@ -1930,32 +2091,33 @@ Constant.
|
||||
[section transform]
|
||||
|
||||
[heading Description]
|
||||
For a sequence `seq` and function object or function pointer `f`, `transform` returns a new sequence
|
||||
with elements created by applying `f(e)` to each element of `e` of `seq`.
|
||||
Returns the result type of __transform__, given the types of the input sequence and unary __poly_func_obj__.
|
||||
|
||||
[heading Unary version synopsis]
|
||||
template<
|
||||
typename Sequence,
|
||||
typename F
|
||||
>
|
||||
typename __result_of_transform__<Sequence const, F>::type transform(
|
||||
Sequence const& seq, F f);
|
||||
struct transform
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
};
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`seq`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`f`][`f(e)` is a valid expression for each element `e` of `seq`. `__boost_result_of_call__<F(E)>::type` is the return type of `f` when called with a value of each element type `E`.][Transformation function]]
|
||||
[[`Sequence`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`F`][A model of unary __poly_func_obj__][Transformation metafunction]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__transform__(seq, f);
|
||||
__result_of_transform__<Sequence, F>::type
|
||||
|
||||
[*Return type]:
|
||||
|
||||
* A model of __forward_sequence__
|
||||
* A model of __associative_sequence__ if `Sequence` implements the __associative_sequence__ model.
|
||||
|
||||
[*Semantics]: Returns a new sequence, containing the return values of `f(e)` for each element `e` within `seq`.
|
||||
[*Semantics]: Returns a sequence that contains the types of `__result_of__<F(E)>::type` for each element `E` within `Sequence`.
|
||||
|
||||
[heading Binary version synopsis]
|
||||
template<
|
||||
@ -1963,41 +2125,33 @@ with elements created by applying `f(e)` to each element of `e` of `seq`.
|
||||
typename Sequence2,
|
||||
typename F
|
||||
>
|
||||
typename __result_of_transform__<Sequence1 const, Sequence2 const, F>::type transform(
|
||||
Sequence1 const& seq1, Sequence2 const& seq2, F f);
|
||||
struct transform
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
};
|
||||
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`seq1`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`seq2`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`f`][`f(e1,e2)` is a valid expression for each pair of elements `e1` of `seq1` and `e2` of `seq2`. `__boost_result_of_call__<F(E1,E2)>::type` is the return type of `f` when called with elements of type `E1` and `E2`][Transformation function]]
|
||||
[[`Sequence1`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`Sequence2`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`F`][A model of binary __poly_func_obj__][Transformation metafunction]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
__result_of_transform__<Sequence1, Sequence2, F>::type
|
||||
|
||||
[*Return type]: A model of __forward_sequence__.
|
||||
|
||||
[*Semantics]: Returns a new sequence, containing the return values of `f(e1, e2)` for each pair of elements `e1` and `e2` within `seq1` and `seq2` respectively.
|
||||
[*Semantics]: Returns a sequence, that contains the types of `__result_of__<F(E1, E2)>::type` for each pair of elements `E1` and `E2` within `Sequence1` and `Sequence2` respectively.
|
||||
|
||||
[heading Complexity]
|
||||
Constant. Returns a view which is lazily evaluated.
|
||||
Constant.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/algorithm/transformation/transform.hpp>
|
||||
#include <boost/fusion/include/transform.hpp>
|
||||
|
||||
[heading Example]
|
||||
struct triple
|
||||
{
|
||||
typedef int result_type;
|
||||
|
||||
int operator()(int t) const
|
||||
{
|
||||
return t * 3;
|
||||
};
|
||||
};
|
||||
...
|
||||
assert(__transform__(__make_vector__(1,2,3), triple()) == __make_vector__(3,6,9));
|
||||
|
||||
[endsect]
|
||||
|
||||
[section replace]
|
||||
@ -2041,7 +2195,7 @@ Constant.
|
||||
[section replace_if]
|
||||
|
||||
[heading Description]
|
||||
Returns the result type of __replace_if__, given the types of the sequence, __poly_func_obj__ predicate and replacement object.
|
||||
Returns the result type of __replace_if__, given the types of the sequence, unary __mpl_lambda_expression__ predicate and replacement object.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
@ -2056,7 +2210,7 @@ Returns the result type of __replace_if__, given the types of the sequence, __po
|
||||
[table Parameters
|
||||
[[Parameter][Requirement][Description]]
|
||||
[[`Sequence`][A model of __forward_sequence__][Operation's argument]]
|
||||
[[`F`][A model of unary __poly_func_obj__][Replacement predicate]]
|
||||
[[`F`][A model of unary __mpl_lambda_expression__][Replacement predicate]]
|
||||
[[`T`][Any type][The type of the replacement object]]
|
||||
]
|
||||
|
||||
@ -2106,7 +2260,7 @@ Returns the result type of __remove__, given the sequence and removal types.
|
||||
* A model of __forward_sequence__.
|
||||
* A model of __associative_sequence__ if `Sequence` implements the __associative_sequence__ model.
|
||||
|
||||
[*Semantics]: Returns a sequence containing the elements of `Sequence` not of type `T`. Equivalent to `__result_of_replace_if__<Sequence, boost::is_same<mpl::_, T> >::type`.
|
||||
[*Semantics]: Returns a sequence containing the elements of `Sequence` not of type `T`. Equivalent to `__result_of_remove_if__<Sequence, boost::is_same<mpl::_, T> >::type`.
|
||||
|
||||
[heading Complexity]
|
||||
Constant.
|
||||
@ -2427,7 +2581,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 +2598,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 +2787,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]
|
||||
|
@ -45,5 +45,8 @@ This section summarizes significant changes to the Fusion library.
|
||||
compilation (Joel de Guzman)
|
||||
* October 8, 2011: Added adaptor for std::tuple (Joel de Guzman)
|
||||
* October 10, 2011: Made map random access (Brandon Kohn)
|
||||
* April 7, 2012: Added C++11 version of deque
|
||||
* May 19, 2012: Added BOOST_FUSION_DEFINE_STRUCT_INLINE by Nathan Ridge
|
||||
* September 1, 2012: Added move support for deque and vector
|
||||
|
||||
[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,10 +21,11 @@ __views__. These containers are more or less counterparts of those in __stl__.
|
||||
|
||||
[heading Description]
|
||||
|
||||
`vector` is a __random_access_sequence__ of heterogenous 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, and in many cases the most efficient.
|
||||
`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
|
||||
cases the most efficient.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -95,7 +96,7 @@ including any Fusion header to change the default. Example:
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`T0`...`TN`] [Element types] [['unspecified]]]
|
||||
[[`T0`...`TN`] [Element types] [__unspecified__]]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
@ -156,7 +157,7 @@ time). The runtime cost of access to each element is peculiarly constant
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Car`] [Head type] []]
|
||||
[[`Car`] [Head type] [ ]]
|
||||
[[`Cdr`] [Tail type] [`nil`]]
|
||||
]
|
||||
|
||||
@ -190,7 +191,7 @@ defined in __forward_sequence__.
|
||||
[[`__at__<N>(l)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
]
|
||||
|
||||
[blurb __note__ `__at__<N>(l)` is provided for convenience and compatibility
|
||||
[note `__at__<N>(l)` is provided for convenience and compatibility
|
||||
with the original __tuple__ library, despite `cons` being a
|
||||
__forward_sequence__ only (`at` is supposed to be a
|
||||
__random_access_sequence__ requirement). The runtime complexity of __at__ is
|
||||
@ -208,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__).
|
||||
@ -246,7 +247,7 @@ including any Fusion header to change the default. Example:
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`T0`...`TN`] [Element types] [['unspecified-type]]]
|
||||
[[`T0`...`TN`] [Element types] [__unspecified__]]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
@ -275,7 +276,7 @@ defined in __forward_sequence__.
|
||||
[[`__at__<N>(l)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
]
|
||||
|
||||
[blurb __note__ `__at__<n>(l)` is provided for convenience and compatibility
|
||||
[note `__at__<n>(l)` is provided for convenience and compatibility
|
||||
with the original __tuple__ library, despite `list` being a
|
||||
__forward_sequence__ only (__at__ is supposed to be a
|
||||
__random_access_sequence__ requirement). The runtime complexity of __at__ is
|
||||
@ -289,11 +290,225 @@ constant (see __recursive_inline__).]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
`deque` is a simple __bidirectional_sequence__ that supports
|
||||
constant-time insertion and removal of elements at both ends. Like the
|
||||
__list__ and __cons__, `deque` is more efficient than __vector__
|
||||
(especially at compile time) when the target sequence is constructed
|
||||
piecemeal (a data at a time, e.g. when constructing expression
|
||||
templates). Like the __list__ and __cons__, runtime cost of access to
|
||||
each element is peculiarly constant (see __recursive_inline__).
|
||||
|
||||
Element insertion and removal are done by special `deque` helper classes
|
||||
__front_extended_deque__ and __back_extended_deque__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/deque.hpp>
|
||||
#include <boost/fusion/include/deque.hpp>
|
||||
#include <boost/fusion/container/deque/deque_fwd.hpp>
|
||||
#include <boost/fusion/include/deque_fwd.hpp>
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename ...Elements>
|
||||
struct deque;
|
||||
|
||||
For C++11 compilers, the variadic class interface has no upper bound.
|
||||
|
||||
For C++03 compilers, the variadic class interface accepts `0` to
|
||||
`FUSION_MAX_DEQUE_SIZE` elements, where `FUSION_MAX_DEQUE_SIZE` is a
|
||||
user definable predefined maximum that defaults to `10`. Example:
|
||||
|
||||
deque<int, char, double>
|
||||
|
||||
You may define the preprocessor constant `FUSION_MAX_DEQUE_SIZE` before
|
||||
including any Fusion header to change the default. Example:
|
||||
|
||||
#define FUSION_MAX_DEQUE_SIZE 20
|
||||
|
||||
[heading Template parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Elements`] [Element types] [ ]]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
|
||||
* __bidirectional_sequence__
|
||||
|
||||
[variablelist Notation
|
||||
[[`D`] [A `deque` type]]
|
||||
[[`d`, `d2`] [Instances of `deque`]]
|
||||
[[`e0`...`en`] [Heterogeneous values]]
|
||||
[[`s`] [A __forward_sequence__]]
|
||||
[[`N`] [An __mpl_integral_constant__]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
Semantics of an expression is defined only where it differs from, or is not
|
||||
defined in __bidirectional_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`D()`] [Creates a deque with default constructed elements.]]
|
||||
[[`D(e0, e1,... en)`] [Creates a deque with elements `e0`...`en`.]]
|
||||
[[`D(s)`] [Copy constructs a deque from a __forward_sequence__, `s`.]]
|
||||
[[`d = s`] [Assigns to a deque, `d`, from a __forward_sequence__, `s`.]]
|
||||
[[`__at__<N>(d)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
]
|
||||
|
||||
[note `__at__<N>(d)` is provided for convenience, despite
|
||||
`deque` being a __bidirectional_sequence__ only (`at` is supposed to be
|
||||
a __random_access_sequence__ requirement). The runtime complexity of
|
||||
__at__ is constant (see __recursive_inline__). `deque` element access
|
||||
utilizes operator overloading with argument dependent lookup (ADL) of
|
||||
the proper element getter function given a static constant index
|
||||
parameter. Interestingly, with modern C++ compilers, this lookup is very
|
||||
fast and rivals recursive template instantiations in compile time-speed,
|
||||
so much so that `deque` relies on ADL for all element access (indexing)
|
||||
as well as iteration.]
|
||||
|
||||
[heading Example]
|
||||
|
||||
deque<int, float> d(12, 5.5f);
|
||||
std::cout << __at_c__<0>(d) << std::endl;
|
||||
std::cout << __at_c__<1>(d) << std::endl;
|
||||
|
||||
[endsect]
|
||||
|
||||
[section front_extended_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
`front_extended_deque` allows a __deque__ to be front extended. It shares
|
||||
the same properties as the __deque__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
See __deque__
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Deque, typename T>
|
||||
struct front_extended_deque;
|
||||
|
||||
[heading Template parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Deque`] [Deque type] [ ]]
|
||||
[[`T`] [Element type] [ ]]
|
||||
]
|
||||
|
||||
[note `Deque` can be a __deque__, a __front_extended_deque__ or a
|
||||
__back_extended_deque__]
|
||||
|
||||
[heading Model of]
|
||||
|
||||
* __bidirectional_sequence__
|
||||
|
||||
[variablelist Notation
|
||||
[[`D`] [A `front_extended_deque` type]]
|
||||
[[`e`] [Heterogeneous value]]
|
||||
[[`N`] [An __mpl_integral_constant__]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
Semantics of an expression is defined only where it differs from, or is
|
||||
not defined in __bidirectional_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`D(d, e)`] [Extend `d` prepending `e` to its front.]]
|
||||
[[`__at__<N>(d)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
]
|
||||
|
||||
[note See __deque__ for further details.]
|
||||
|
||||
[heading Example]
|
||||
|
||||
typedef deque<int, float> initial_deque;
|
||||
initial_deque d(12, 5.5f);
|
||||
front_extended_deque<initial_deque, int> d2(d, 999);
|
||||
std::cout << __at_c__<0>(d2) << std::endl;
|
||||
std::cout << __at_c__<1>(d2) << std::endl;
|
||||
std::cout << __at_c__<2>(d2) << std::endl;
|
||||
|
||||
[endsect]
|
||||
|
||||
[section back_extended_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
`back_extended_deque` allows a __deque__ to be back extended. It shares
|
||||
the same properties as the __deque__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
See __deque__
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Deque, typename T>
|
||||
struct back_extended_deque;
|
||||
|
||||
[heading Template parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`Deque`] [Deque type] [ ]]
|
||||
[[`T`] [Element type] [ ]]
|
||||
]
|
||||
|
||||
[note `Deque` can be a __deque__, a __back_extended_deque__ or a
|
||||
__back_extended_deque__]
|
||||
|
||||
[heading Model of]
|
||||
|
||||
* __bidirectional_sequence__
|
||||
|
||||
[variablelist Notation
|
||||
[[`D`] [A `back_extended_deque` type]]
|
||||
[[`e`] [Heterogeneous value]]
|
||||
[[`N`] [An __mpl_integral_constant__]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
Semantics of an expression is defined only where it differs from, or is
|
||||
not defined in __bidirectional_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`D(d, e)`] [Extend `d` prepending `e` to its back.]]
|
||||
[[`__at__<N>(d)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
]
|
||||
|
||||
[note See __deque__ for further details.]
|
||||
|
||||
[heading Example]
|
||||
|
||||
typedef deque<int, float> initial_deque;
|
||||
initial_deque d(12, 5.5f);
|
||||
back_extended_deque<initial_deque, int> d2(d, 999);
|
||||
std::cout << __at_c__<0>(d2) << std::endl;
|
||||
std::cout << __at_c__<1>(d2) << std::endl;
|
||||
std::cout << __at_c__<2>(d2) << std::endl;
|
||||
|
||||
[endsect]
|
||||
|
||||
[section set]
|
||||
|
||||
[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
|
||||
@ -332,7 +547,7 @@ including any Fusion header to change the default. Example:
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`T0`...`TN`] [Element types] [['unspecified-type]]]
|
||||
[[`T0`...`TN`] [Element types] [__unspecified__]]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
@ -374,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
|
||||
@ -414,7 +629,7 @@ including any Fusion header to change the default. Example:
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Default]]
|
||||
[[`T0`...`TN`] [Element types] [['unspecified-type]]]
|
||||
[[`T0`...`TN`] [Element types] [__unspecified__]]
|
||||
]
|
||||
|
||||
[heading Model of]
|
||||
@ -515,7 +730,7 @@ before including any Fusion header to change the default. Example:
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_boost_ref__
|
||||
__note_ref_wrappers__
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -563,7 +778,7 @@ __result_of_make_cons__`<Car>::type`
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_boost_ref__
|
||||
__note_ref_wrappers__
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -613,7 +828,59 @@ default. Example:
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_boost_ref__
|
||||
__note_ref_wrappers__
|
||||
|
||||
[endsect]
|
||||
|
||||
[section make_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Create a __deque__ from one or more values.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename ...Elements>
|
||||
typename __result_of_make_deque__<Elements...>::type
|
||||
make_deque(Elements const&... 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_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
|
||||
Fusion header to change the default. Example:
|
||||
|
||||
#define FUSION_MAX_DEQUE_SIZE 20
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Description]]
|
||||
[[`elements`] [Instances of `Elements`] [The arguments to `make_deque`]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
make_deque(elements...);
|
||||
|
||||
[*Return type]: __result_of_make_deque__`<Elements...>::type`
|
||||
|
||||
[*Semantics]: Create a __deque__ from `elements...`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/generation/make_deque.hpp>
|
||||
#include <boost/fusion/include/make_deque.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
make_deque(123, "hello", 12.5)
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_ref_wrappers__
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -665,7 +932,7 @@ default. Example:
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_boost_ref__
|
||||
__note_ref_wrappers__
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -683,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
|
||||
@ -721,7 +990,7 @@ default. Example:
|
||||
|
||||
[heading See also]
|
||||
|
||||
__note_boost_ref__, __fusion_pair__
|
||||
__note_ref_wrappers__, __fusion_pair__
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -734,16 +1003,17 @@ succeeding sections document the various /tier/ flavors.
|
||||
* __list_tie__
|
||||
* __vector_tie__
|
||||
* __map_tie__
|
||||
* __deque_tie__
|
||||
|
||||
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.:
|
||||
@ -914,6 +1184,56 @@ including any Fusion header to change the default. Example:
|
||||
|
||||
[endsect]
|
||||
|
||||
[section deque_tie]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Constructs a tie using a __deque__ sequence.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename ...Elements>
|
||||
__deque__<Elements&...>
|
||||
deque_tie(Elements&... 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_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
|
||||
Fusion header to change the default. Example:
|
||||
|
||||
#define FUSION_MAX_DEQUE_SIZE 20
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Description] [Description]]
|
||||
[[`elements`] [Instances of `Elements`] [The arguments to `deque_tie`]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
deque_tie(elements...);
|
||||
|
||||
[*Return type]: __deque__<Elements&...>
|
||||
|
||||
[*Semantics]: Create a __deque__ of references from `elements...`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/generation/deque_tie.hpp>
|
||||
#include <boost/fusion/include/deque_tie.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
int i = 123;
|
||||
double d = 123.456;
|
||||
deque_tie(i, d)
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section MetaFunctions]
|
||||
@ -1039,8 +1359,8 @@ rules for __element_conversion__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/generation/make_list.hpp>
|
||||
#include <boost/fusion/include/make_list.hpp>
|
||||
#include <boost/fusion/container/generation/make_vector.hpp>
|
||||
#include <boost/fusion/include/make_vector.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
@ -1048,6 +1368,54 @@ rules for __element_conversion__.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section make_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Returns the result type of __make_deque__.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename ...Elements>
|
||||
struct make_deque;
|
||||
|
||||
For C++11 compilers, the variadic template interface has no upper bound.
|
||||
|
||||
For C++03 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 Fusion header to change the
|
||||
default. Example:
|
||||
|
||||
#define FUSION_MAX_DEQUE_SIZE 20
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Elements`] [Variadic template types] [Template arguments to `make_deque`]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
result_of::make_deque<Elements...>::type
|
||||
|
||||
[*Return type]: A __deque__ with elements of types converted following the
|
||||
rules for __element_conversion__.
|
||||
|
||||
[*Semantics]: Create a __deque__ from `Elements...`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/generation/make_deque.hpp>
|
||||
#include <boost/fusion/include/make_deque.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
result_of::make_deque<int, const char(&)[7], double>::type
|
||||
|
||||
[endsect]
|
||||
|
||||
[section make_set]
|
||||
|
||||
[heading Description]
|
||||
@ -1102,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 <
|
||||
@ -1109,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
|
||||
@ -1117,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
|
||||
@ -1127,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__.
|
||||
@ -1143,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]
|
||||
|
||||
@ -1240,6 +1637,53 @@ default. Example:
|
||||
|
||||
[endsect]
|
||||
|
||||
[section deque_tie]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Returns the result type of __deque_tie__.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename ...Elements>
|
||||
struct deque_tie;
|
||||
|
||||
For C++11 compilers, the variadic template interface has no upper bound.
|
||||
|
||||
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
|
||||
Fusion header to change the default. Example:
|
||||
|
||||
#define FUSION_MAX_DEQUE_SIZE 20
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Elements`] [Variadic template types] [Template arguments to `deque_tie`]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
result_of::deque_tie<Elements...>::type;
|
||||
|
||||
[*Return type]: __deque__<Elements&...>
|
||||
|
||||
[*Semantics]: Create a __deque__ of references from `Elements...`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/generation/deque_tie.hpp>
|
||||
#include <boost/fusion/include/deque_tie.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
result_of::deque_tie<int, double>::type
|
||||
|
||||
[endsect]
|
||||
|
||||
[section map_tie]
|
||||
|
||||
[heading Description]
|
||||
@ -1388,6 +1832,48 @@ Convert a fusion sequence to a __vector__.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section as_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Convert a fusion sequence to a __deque__.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Sequence>
|
||||
typename result_of::as_deque<Sequence>::type
|
||||
as_deque(Sequence& seq);
|
||||
|
||||
template <typename Sequence>
|
||||
typename result_of::as_deque<Sequence const>::type
|
||||
as_deque(Sequence const& seq);
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`seq`] [An instance of Sequence] [The sequence to convert.]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
as_deque(seq);
|
||||
|
||||
[*Return type]: __result_of_as_deque__`<Sequence>::type`
|
||||
|
||||
[*Semantics]: Convert a fusion sequence, `seq`, to a __deque__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/deque/convert.hpp>
|
||||
#include <boost/fusion/include/as_deque.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
as_deque(__make_vector__('x', 123, "hello"))
|
||||
|
||||
[endsect]
|
||||
|
||||
[section as_set]
|
||||
|
||||
[heading Description]
|
||||
@ -1463,7 +1949,7 @@ Convert a fusion sequence to a __map__.
|
||||
|
||||
[*Semantics]: Convert a fusion sequence, `seq`, to a __map__.
|
||||
|
||||
[*Precondition]: The elements of the sequence are assumed to be
|
||||
[*Precondition]: For non-associative sequence, the elements are assumed to be
|
||||
__fusion_pair__s. There may be no duplicate __fusion_pair__ key types.
|
||||
|
||||
[heading Header]
|
||||
@ -1473,9 +1959,25 @@ __fusion_pair__s. There may be no duplicate __fusion_pair__ key types.
|
||||
|
||||
[heading Example]
|
||||
|
||||
// from sequence of __fusion_pair__
|
||||
as_map(__make_vector__(
|
||||
__fusion_make_pair__<int>('X')
|
||||
, __fusion_make_pair__<double>("Men")))
|
||||
|
||||
// from associative sequence
|
||||
namespace ns
|
||||
{
|
||||
struct x_member;
|
||||
struct y_member;
|
||||
}
|
||||
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
|
||||
(ns),
|
||||
point,
|
||||
(int, x, ns::x_member)
|
||||
(int, y, ns::y_member)
|
||||
)
|
||||
...
|
||||
as_map(ns::point(123, 456))
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -1559,6 +2061,44 @@ Returns the result type of __as_vector__.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section as_deque]
|
||||
|
||||
[heading Description]
|
||||
|
||||
Returns the result type of __as_deque__.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename Sequence>
|
||||
struct as_deque;
|
||||
|
||||
[heading Parameters]
|
||||
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Sequence`] [A fusion __sequence__] [The sequence type to convert.]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
result_of::as_deque<Sequence>::type;
|
||||
|
||||
[*Return type]: A __deque__ with same elements as the input sequence,
|
||||
`Sequence`.
|
||||
|
||||
[*Semantics]: Convert a fusion sequence, `Sequence`, to a __deque__.
|
||||
|
||||
[heading Header]
|
||||
|
||||
#include <boost/fusion/container/deque/convert.hpp>
|
||||
#include <boost/fusion/include/as_deque.hpp>
|
||||
|
||||
[heading Example]
|
||||
|
||||
result_of::as_deque<__vector__<char, int> >::type
|
||||
|
||||
[endsect]
|
||||
|
||||
[section as_set]
|
||||
|
||||
[heading Description]
|
||||
@ -1626,7 +2166,7 @@ Returns the result type of __as_map__.
|
||||
|
||||
[*Semantics]: Convert a fusion sequence, `Sequence`, to a __map__.
|
||||
|
||||
[*Precondition]: The elements of the sequence are assumed to be
|
||||
[*Precondition]: For non-associative sequence, the elements are assumed to be
|
||||
__fusion_pair__s. There may be no duplicate __fusion_pair__ key types.
|
||||
|
||||
[heading Header]
|
||||
@ -1636,9 +2176,25 @@ __fusion_pair__s. There may be no duplicate __fusion_pair__ key types.
|
||||
|
||||
[heading Example]
|
||||
|
||||
// from sequence of __fusion_pair__
|
||||
result_of::as_map<__vector__<
|
||||
__fusion_pair__<int, char>
|
||||
, __fusion_pair__<double, std::string> > >::type
|
||||
|
||||
// from associative sequence
|
||||
namespace ns
|
||||
{
|
||||
struct x_member;
|
||||
struct y_member;
|
||||
}
|
||||
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
|
||||
(ns),
|
||||
point,
|
||||
(int, x, ns::x_member)
|
||||
(int, y, ns::y_member)
|
||||
)
|
||||
...
|
||||
result_of::as_map<ns::point>::type // __map__<__fusion_pair__<ns::x_member, int>, __fusion_pair__<ns::y_member, int> >
|
||||
|
||||
[endsect]
|
||||
|
||||
|
@ -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`.
|
||||
]
|
||||
@ -323,7 +323,7 @@ For our __random_access_sequence__ we will also need to implement `size_impl`,
|
||||
In order for `example_struct` to serve as an associative forward sequence,
|
||||
we need to adapt the traversal category of our sequence and our iterator
|
||||
accordingly and enable 3 intrinsic sequence lookup features, __at_key__,
|
||||
__value_at_key__ and __has_key__. We also need to enable 3 iterator lookup
|
||||
__result_of_value_at_key__ and __has_key__. We also need to enable 3 iterator lookup
|
||||
features, __result_of_key_of__, __result_of_value_of_data__ and __deref_data__.
|
||||
|
||||
To implement `at_key_impl` we need to associate the `fields::name` and `fields::age`
|
||||
@ -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
|
||||
@ -931,11 +931,11 @@ reference. Const qualification is preserved and propagated appropriately
|
||||
the target function object is const - or, in case the target function object
|
||||
is held by value, the adapter is const).
|
||||
|
||||
[blurb __note__ For Microsoft Visual C++ 7.1 (Visual Studio 2003) the detection
|
||||
[note For Microsoft Visual C++ 7.1 (Visual Studio 2003) the detection
|
||||
of the Function Object's const qualification easily causes an internal error.
|
||||
Therefore the adapter is always treated as if it was const. ]
|
||||
|
||||
[blurb __tip__ If the type sequence passed to this template contains
|
||||
[tip If the type sequence passed to this template contains
|
||||
non-reference elements, the element is copied only once - the call operator's
|
||||
signature is optimized automatically to avoid by-value parameters.]
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
[quickbook 1.3]
|
||||
[version 2.2]
|
||||
[authors [de Guzman, Joel], [Marsden, Dan], [Schwinger, Tobias]]
|
||||
[copyright 2001 2002 2003 2004 2005 2006 2011 Joel de Guzman, Dan Marsden, Tobias Schwinger]
|
||||
[copyright 2001 2002 2003 2004 2005 2006 2011 2012 Joel de Guzman, Dan Marsden, Tobias Schwinger]
|
||||
[purpose Statically Typed Heterogeneous Data Structures and Algorithms]
|
||||
[license
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
@ -20,17 +20,12 @@
|
||||
]
|
||||
]
|
||||
|
||||
[def __note__ [$images/note.png]]
|
||||
[def __alert__ [$images/alert.png]]
|
||||
[def __tip__ [$images/tip.png]]
|
||||
[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 +35,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,7 +48,9 @@
|
||||
[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_tuple_doc__ [@http://en.cppreference.com/w/cpp/utility/tuple `std::tuple`]]
|
||||
[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`]]
|
||||
|
||||
@ -116,6 +113,9 @@
|
||||
[def __vector__ [link fusion.container.vector `vector`]]
|
||||
[def __cons__ [link fusion.container.cons `cons`]]
|
||||
[def __list__ [link fusion.container.list `list`]]
|
||||
[def __deque__ [link fusion.container.deque `deque`]]
|
||||
[def __front_extended_deque__ [link fusion.container.front_extended_deque `front_extended_deque`]]
|
||||
[def __back_extended_deque__ [link fusion.container.back_extended_deque `back_extended_deque`]]
|
||||
[def __set__ [link fusion.container.set `set`]]
|
||||
[def __map__ [link fusion.container.map `map`]]
|
||||
|
||||
@ -128,6 +128,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`]]
|
||||
@ -173,6 +174,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]]
|
||||
@ -198,12 +201,16 @@
|
||||
[def __result_of_make_cons__ [link fusion.container.generation.metafunctions.make_cons `result_of::make_cons`]]
|
||||
[def __make_list__ [link fusion.container.generation.functions.make_list `make_list`]]
|
||||
[def __result_of_make_list__ [link fusion.container.generation.metafunctions.make_list `result_of::make_list`]]
|
||||
[def __make_deque__ [link fusion.container.generation.functions.make_deque `make_deque`]]
|
||||
[def __result_of_make_deque__ [link fusion.container.generation.metafunctions.make_deque `result_of::make_deque`]]
|
||||
[def __make_set__ [link fusion.container.generation.functions.make_set `make_set`]]
|
||||
[def __result_of_make_set__ [link fusion.container.generation.metafunctions.make_set `result_of::make_set`]]
|
||||
[def __make_map__ [link fusion.container.generation.functions.make_map `make_map`]]
|
||||
[def __result_of_make_map__ [link fusion.container.generation.metafunctions.make_map `result_of::make_map`]]
|
||||
[def __list_tie__ [link fusion.container.generation.functions.list_tie `list_tie`]]
|
||||
[def __result_of_list_tie__ [link fusion.container.generation.metafunctions.list_tie `result_of::list_tie`]]
|
||||
[def __deque_tie__ [link fusion.container.generation.functions.deque_tie `deque_tie`]]
|
||||
[def __result_of_deque_tie__ [link fusion.container.generation.metafunctions.deque_tie `result_of::deque_tie`]]
|
||||
|
||||
[def __out__ [link fusion.sequence.operator.i_o.out out]]
|
||||
[def __in__ [link fusion.sequence.operator.i_o.in in]]
|
||||
@ -217,6 +224,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`]]
|
||||
@ -281,6 +291,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`]]
|
||||
@ -305,17 +317,17 @@
|
||||
[def __result_of_invoke__ [link fusion.functional.invocation.metafunctions.invoke `result_of::invoke`]]
|
||||
[def __result_of_invoke_procedure__ [link fusion.functional.invocation.metafunctions.invoke_proc `result_of::invoke_procedure`]]
|
||||
[def __result_of_invoke_function_object__ [link fusion.functional.invocation.metafunctions.invoke_fobj `result_of::invoke_function_object`]]
|
||||
[def __result_of_make_fused__ [link fusion.functional.generation.metafunctions.mk_fused `make_fused`]]
|
||||
[def __result_of_make_fused_procedure__ [link fusion.functional.generation.metafunctions.mk_fused_proc `make_fused_procedure`]]
|
||||
[def __result_of_make_fused_function_object__ [link fusion.functional.generation.metafunctions.mk_fused_fobj `make_fused_function_object`]]
|
||||
[def __result_of_make_unfused__ [link fusion.functional.generation.metafunctions.mk_unfused `make_unfused`]]
|
||||
[def __result_of_make_fused__ [link fusion.functional.generation.metafunctions.mk_fused `result_of::make_fused`]]
|
||||
[def __result_of_make_fused_procedure__ [link fusion.functional.generation.metafunctions.mk_fused_proc `result_of::make_fused_procedure`]]
|
||||
[def __result_of_make_fused_function_object__ [link fusion.functional.generation.metafunctions.mk_fused_fobj `result_of::make_fused_function_object`]]
|
||||
[def __result_of_make_unfused__ [link fusion.functional.generation.metafunctions.mk_unfused `result_of::make_unfused`]]
|
||||
|
||||
[def __recursive_inline__ [link fusion.notes.recursive_inlined_functions Recursive Inlined Functions]]
|
||||
[def __overloaded_functions__ [link fusion.notes.overloaded_functions Overloaded Functions]]
|
||||
[def __tag_dispatching__ [link fusion.notes.tag_dispatching /tag dispatching/]]
|
||||
[def __element_conversion__ [link fusion.notes.element_conversion /element conversion/]]
|
||||
[def __see_element_conversion__ [link fusion.notes.element_conversion /see element conversion/]]
|
||||
[def __note_boost_ref__ [link fusion.notes.boost__ref `boost::ref`]]
|
||||
[def __note_ref_wrappers__ [link fusion.notes.reference_wrappers `Reference Wrappers`]]
|
||||
|
||||
[def __quick_start__ [link fusion.quick_start Quick Start]]
|
||||
[def __organization__ [link fusion.organization Organization]]
|
||||
|
Before Width: | Height: | Size: 603 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 722 B |
Before Width: | Height: | Size: 336 B |
Before Width: | Height: | Size: 658 B |
Before Width: | Height: | Size: 334 B |
Before Width: | Height: | Size: 867 B |
Before Width: | Height: | Size: 640 B |
Before Width: | Height: | Size: 370 B |
Before Width: | Height: | Size: 1.2 KiB |
@ -1,16 +1,283 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<!-- Copyright (C) 2002 Douglas Gregor <doug.gregor -at- gmail.com>
|
||||
|
||||
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) -->
|
||||
<title>Redirect to generated documentation</title>
|
||||
<meta http-equiv="refresh" content="0; URL=http://boost-sandbox.sourceforge.net/libs/fusion/doc/html/">
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="http://boost-sandbox.sourceforge.net/libs/fusion/doc/html/">http://boost-sandbox.sourceforge.net/libs/fusion/doc/html/</a>
|
||||
</body>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Chapter 1. Fusion 2.2</title>
|
||||
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
|
||||
<link rel="home" href="index.html" title="Chapter 1. Fusion 2.2">
|
||||
<link rel="next" href="fusion/preface.html" title="Preface">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav"><a accesskey="n" href="fusion/preface.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
|
||||
<div class="chapter">
|
||||
<div class="titlepage"><div>
|
||||
<div><h2 class="title">
|
||||
<a name="fusion"></a>Chapter 1. Fusion 2.2</h2></div>
|
||||
<div><div class="author"><h3 class="author">
|
||||
<span class="firstname">Joel</span> <span class="surname">de Guzman</span>
|
||||
</h3></div></div>
|
||||
<div><div class="author"><h3 class="author">
|
||||
<span class="firstname">Dan</span> <span class="surname">Marsden</span>
|
||||
</h3></div></div>
|
||||
<div><div class="author"><h3 class="author">
|
||||
<span class="firstname">Tobias</span> <span class="surname">Schwinger</span>
|
||||
</h3></div></div>
|
||||
<div><p class="copyright">Copyright © 2001-2006, 2011, 2012 Joel de Guzman,
|
||||
Dan Marsden, Tobias Schwinger</p></div>
|
||||
<div><div class="legalnotice">
|
||||
<a name="fusion.legal"></a><p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></div>
|
||||
</div></div>
|
||||
<div class="toc">
|
||||
<p><b>Table of Contents</b></p>
|
||||
<dl>
|
||||
<dt><span class="section"><a href="fusion/preface.html">Preface</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/introduction.html">Introduction</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/quick_start.html">Quick Start</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/organization.html">Organization</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support.html">Support</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/support/is_sequence.html">is_sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/is_view.html">is_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/tag_of.html">tag_of</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/category_of.html">category_of</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/deduce.html">deduce</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/deduce_sequence.html">deduce_sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/support/pair.html">pair</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/iterator.html">Iterator</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/iterator/concepts.html">Concepts</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/iterator/concepts/forward_iterator.html">Forward
|
||||
Iterator</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/concepts/bidirectional_iterator.html">Bidirectional
|
||||
Iterator</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/concepts/random_access_iterator.html">Random
|
||||
Access Iterator</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/concepts/associative_iterator.html">Associative
|
||||
Iterator</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions.html">Functions</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/deref.html">deref</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/next.html">next</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/prior.html">prior</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/distance.html">distance</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/advance.html">advance</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/advance_c.html">advance_c</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/functions/deref_data.html">deref_data</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/iterator/operator.html">Operator</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/iterator/operator/operator_unary_star.html">Operator
|
||||
*</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/operator/operator_equality.html">Operator
|
||||
==</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/operator/operator_inequality.html">Operator
|
||||
!=</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions.html">Metafunctions</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/value_of.html">value_of</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/deref.html">deref</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/next.html">next</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/prior.html">prior</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/equal_to.html">equal_to</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/distance.html">distance</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/advance.html">advance</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/advance_c.html">advance_c</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/key_of.html">key_of</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/value_of_data.html">value_of_data</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/iterator/metafunctions/deref_data.html">deref_data</a></span></dt>
|
||||
</dl></dd>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/sequence.html">Sequence</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/sequence/concepts.html">Concepts</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/sequence/concepts/forward_sequence.html">Forward
|
||||
Sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/concepts/bidirectional_sequence.html">Bidirectional
|
||||
Sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/concepts/random_access_sequence.html">Random
|
||||
Access Sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/concepts/associative_sequence.html">Associative
|
||||
Sequence</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/sequence/intrinsic.html">Intrinsic</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/sequence/intrinsic/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/sequence/intrinsic/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/sequence/operator.html">Operator</a></span></dt>
|
||||
<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>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/container/vector.html">vector</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/cons.html">cons</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/list.html">list</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/deque.html">deque</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/front_extended_deque.html">front_extended_deque</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/back_extended_deque.html">back_extended_deque</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/set.html">set</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/map.html">map</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/generation.html">Generation</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/container/generation/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/generation/metafunctions.html">MetaFunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/container/conversion.html">Conversion</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/container/conversion/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/container/conversion/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/view.html">View</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/view/single_view.html">single_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/filter_view.html">filter_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/iterator_range.html">iterator_range</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/joint_view.html">joint_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/zip_view.html">zip_view</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/view/transform_view.html">transform_view</a></span></dt>
|
||||
<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>
|
||||
<dt><span class="section"><a href="fusion/adapted/array.html">Array</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/std__pair.html">std::pair</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/std__tuple.html">std::tuple</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/mpl_sequence.html">mpl sequence</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/boost__array.html">boost::array</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/boost__tuple.html">boost::tuple</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_struct.html">BOOST_FUSION_ADAPT_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_tpl_struct.html">BOOST_FUSION_ADAPT_TPL_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_struct_named.html">BOOST_FUSION_ADAPT_STRUCT_NAMED</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_assoc.html">BOOST_FUSION_ADAPT_ASSOC_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_assoc_tpl_struct.html">BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_assoc_struct_named.html">BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_adt.html">BOOST_FUSION_ADAPT_ADT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_tpl_adt.html">BOOST_FUSION_ADAPT_TPL_ADT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_assoc_adt.html">BOOST_FUSION_ADAPT_ASSOC_ADT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/adapt_assoc_tpl_adt.html">BOOST_FUSION_ADAPT_ASSOC_TPL_ADT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_struct.html">BOOST_FUSION_DEFINE_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_tpl_struct.html">BOOST_FUSION_DEFINE_TPL_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_struct_inline.html">BOOST_FUSION_DEFINE_STRUCT_INLINE</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_tpl_struct_inline.html">BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_assoc_struct.html">BOOST_FUSION_DEFINE_ASSOC_STRUCT</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/adapted/define_assoc_tpl_struct.html">BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT</a></span></dt>
|
||||
</dl></dd>
|
||||
<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>
|
||||
<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>
|
||||
<dt><span class="section"><a href="fusion/algorithm/iteration/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/algorithm/query.html">Query</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/algorithm/query/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/algorithm/query/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/algorithm/transformation.html">Transformation</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/algorithm/transformation/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/algorithm/transformation/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/tuple.html">Tuple</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple.html">Class template tuple</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple/construction.html">Construction</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple/tuple_creation_functions.html">Tuple
|
||||
creation functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple/tuple_helper_classes.html">Tuple
|
||||
helper classes</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple/element_access.html">Element
|
||||
access</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/tuple/class_template_tuple/relational_operators.html">Relational
|
||||
operators</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/tuple/pairs.html">Pairs</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/extension.html">Extension</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/extension/ext_full.html">The Full Extension Mechanism</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/extension/sequence_facade.html">Sequence Facade</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/extension/iterator_facade.html">Iterator Facade</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/functional.html">Functional</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/functional/concepts.html">Concepts</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/functional/concepts/callable.html">Callable Object</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/concepts/reg_callable.html">Regular Callable
|
||||
Object</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/concepts/def_callable.html">Deferred Callable
|
||||
Object</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/concepts/poly.html">Polymorphic Function
|
||||
Object</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/functional/invocation.html">Invocation</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/functional/invocation/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/invocation/metafunctions.html">Metafunctions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/invocation/limits.html">Limits</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters.html">Adapters</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/fused.html">fused</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/fused_procedure.html">fused_procedure</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/fused_function_object.html">fused_function_object</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/unfused.html">unfused</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/unfused_typed.html">unfused_typed</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/adapters/limits.html">Limits</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/functional/generation.html">Generation</a></span></dt>
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="fusion/functional/generation/functions.html">Functions</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/functional/generation/metafunctions.html">Metafunctions</a></span></dt>
|
||||
</dl></dd>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="fusion/notes.html">Notes</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/change_log.html">Change log</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/acknowledgements.html">Acknowledgements</a></span></dt>
|
||||
<dt><span class="section"><a href="fusion/references.html">References</a></span></dt>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: May 10, 2013 at 05:54:18 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav"><a accesskey="n" href="fusion/preface.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -67,8 +67,7 @@ the following expressions are valid:
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
[
|
||||
table
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`__next__(i)`] [An iterator to the element following `i`]]
|
||||
[[`i == j`] [Iterator equality comparison]]
|
||||
@ -418,15 +417,15 @@ Moves an iterator by a specified distance.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename I,
|
||||
typename M
|
||||
typename M,
|
||||
typename I
|
||||
>
|
||||
typename __result_of_advance__<I, M>::type advance(I const& i);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`i`] [Model of __forward_iterator__] [Iterator to move relative to]]
|
||||
[[`N`] [An __mpl_integral_constant__] [Number of positions to move]]
|
||||
[[`M`] [An __mpl_integral_constant__] [Number of positions to move]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
@ -455,8 +454,8 @@ Moves an iterator by a specified distance.
|
||||
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename I,
|
||||
int N
|
||||
int N,
|
||||
typename I
|
||||
>
|
||||
typename __result_of_advance_c__<I, N>::type advance_c(I const& i);
|
||||
|
||||
@ -494,7 +493,7 @@ Deferences the data property associated with the element referenced by an associ
|
||||
template<
|
||||
typename I
|
||||
>
|
||||
typename __result_of_deref_data__<I>::type deref(I const& i);
|
||||
typename __result_of_deref_data__<I>::type deref_data(I const& i);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
@ -513,7 +512,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);
|
||||
@ -537,7 +536,7 @@ Dereferences an iterator.
|
||||
template<
|
||||
typename I
|
||||
>
|
||||
typename __result_of_deref__<I>::type operator*(__unspecified__<I> const& i);
|
||||
typename __result_of_deref__<I>::type operator*(I const& i);
|
||||
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
@ -677,7 +676,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 +720,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 +1043,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 +1065,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
|
||||
@ -100,7 +100,7 @@ Array arguments are deduced to reference to const types. For example
|
||||
[footnote Note that the type of a string literal is an array of const
|
||||
characters, not `const char*`. To get __make_list__ to create a __list__
|
||||
with an element of a non-const array type one must use the `ref` wrapper
|
||||
(see __note_boost_ref__).]:
|
||||
(see __note_ref_wrappers__).]:
|
||||
|
||||
__make_list__("Donald", "Daisy")
|
||||
|
||||
@ -121,7 +121,7 @@ creates a __list__ of type
|
||||
|
||||
__list__<void (*)(int)>
|
||||
|
||||
[heading boost::ref]
|
||||
[heading Reference Wrappers]
|
||||
|
||||
Fusion's generation functions (e.g. __make_list__) by default stores the
|
||||
element types as plain non-reference types. Example:
|
||||
@ -151,6 +151,8 @@ For example:
|
||||
|
||||
See __boost_ref__ for details.
|
||||
|
||||
Since C++11, the standard reference wrappers (`std::ref` and `std::cref`) work as well.
|
||||
|
||||
[heading adt_attribute_proxy]
|
||||
|
||||
To adapt arbitrary data types that do not allow direct access to their members,
|
||||
|
@ -36,20 +36,26 @@ link against.
|
||||
|
||||
* tuple
|
||||
* algorithm
|
||||
* auxiliary
|
||||
* iteration
|
||||
* query
|
||||
* transformation
|
||||
* adapted
|
||||
* adt
|
||||
* array
|
||||
* mpl
|
||||
* boost::array
|
||||
* boost::tuple
|
||||
* mpl
|
||||
* std_pair
|
||||
* std_tuple
|
||||
* struct
|
||||
* variant
|
||||
* view
|
||||
* filter_view
|
||||
* flatten_view
|
||||
* iterator_range
|
||||
* joint_view
|
||||
* nview
|
||||
* repetitive_view
|
||||
* reverse_view
|
||||
* single_view
|
||||
* transform_view
|
||||
@ -63,6 +69,9 @@ link against.
|
||||
* generation
|
||||
* mpl
|
||||
* functional
|
||||
* adapter
|
||||
* generation
|
||||
* invocation
|
||||
* sequence
|
||||
* comparison
|
||||
* intrinsic
|
||||
|
@ -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
|
||||
@ -49,16 +49,11 @@ and traversal routines. It was an instant /AHA!/ moment.
|
||||
Some icons are used to mark certain topics indicative of their relevance.
|
||||
These icons precede some text to indicate:
|
||||
|
||||
[table Icons
|
||||
[[Icon] [Name] [Meaning]]
|
||||
[[__note__] [Note] [Information provided is auxiliary but will
|
||||
give the reader a deeper insight into a specific
|
||||
topic. May be skipped.]]
|
||||
[[__alert__] [Alert] [Information provided is of utmost importance.]]
|
||||
[[__caution__] [Caution] [A mild warning.]]
|
||||
[[__tip__] [Tip] [A potentially useful and helpful piece of
|
||||
information.]]
|
||||
]
|
||||
[note Information provided is auxiliary but will give the reader a deeper
|
||||
insight into a specific topic. May be skipped.]
|
||||
[important Information provided is of utmost importance.]
|
||||
[caution A mild warning.]
|
||||
[tip A potentially useful and helpful piece of information.]
|
||||
|
||||
This documentation is automatically generated by Boost QuickBook documentation
|
||||
tool. QuickBook can be found in the __boost_tools__.
|
||||
|
213
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
|
||||
@ -142,8 +143,8 @@ __bidirectional_iterator__.
|
||||
__forward_sequence__
|
||||
|
||||
[variablelist Notation
|
||||
[[`s`] [A Forward Sequence]]
|
||||
[[`S`] [A Forward Sequence type]]
|
||||
[[`s`] [A Bidirectional Sequence]]
|
||||
[[`S`] [A Bidirectional Sequence type]]
|
||||
[[`o`] [An arbitrary object]]
|
||||
[[`e`] [A Sequence element]]
|
||||
]
|
||||
@ -213,7 +214,8 @@ __bidirectional_sequence__
|
||||
[variablelist Notation
|
||||
[[`s`] [A Random Access Sequence]]
|
||||
[[`S`] [A Random Access Sequence type]]
|
||||
[[`N`] [An __mpl_integral_constant__]]
|
||||
[[`M`] [An __mpl__ integral constant]]
|
||||
[[`N`] [An integral constant]]
|
||||
[[`o`] [An arbitrary object]]
|
||||
[[`e`] [A Sequence element]]
|
||||
]
|
||||
@ -227,12 +229,18 @@ any Random Access Sequence the following must be met:
|
||||
[[Expression] [Return type] [Type Requirements] [Runtime Complexity]]
|
||||
[[`__begin__(s)`] [__random_access_iterator__] [] [Constant]]
|
||||
[[`__end__(s)`] [__random_access_iterator__] [] [Constant]]
|
||||
[[`__at__<N>(s)`] [Any type] [] [Constant]]
|
||||
[[`__at__<N>(s) = o`] [Any type] [`s` is mutable and
|
||||
[[`__at_c__<N>(s)`] [Any type] [] [Constant]]
|
||||
[[`__at_c__<N>(s) = o`] [Any type] [`s` is mutable and
|
||||
`e = o`, where `e`
|
||||
is the first element
|
||||
in the sequence, is
|
||||
a valid expression.] [Constant]]
|
||||
a valid expression.] [Constant]]
|
||||
[[`__at__<M>(s)`] [Any type] [] [Constant]]
|
||||
[[`__at__<M>(s) = o`] [Any type] [`s` is mutable and
|
||||
`e = o`, where `e`
|
||||
is the first element
|
||||
in the sequence, is
|
||||
a valid expression.] [Constant]]
|
||||
]
|
||||
|
||||
[heading Result Type Expressions]
|
||||
@ -241,15 +249,18 @@ any Random Access Sequence the following must be met:
|
||||
[[Expression] [Compile Time Complexity]]
|
||||
[[`__result_of_begin__<S>::type`] [Amortized constant time]]
|
||||
[[`__result_of_end__<S>::type`] [Amortized constant time]]
|
||||
[[`__result_of_at__<S, N>::type`] [Amortized constant time]]
|
||||
[[`__result_of_value_at__<S, N>::type`] [Amortized constant time]]
|
||||
[[`__result_of_at__<S, M>::type`] [Amortized constant time]]
|
||||
[[`__result_of_at_c__<S, N>::type`] [Amortized constant time]]
|
||||
[[`__result_of_value_at__<S, M>::type`] [Amortized constant time]]
|
||||
[[`__result_of_value_at_c__<S, N>::type`] [Amortized constant time]]
|
||||
]
|
||||
|
||||
[blurb __note__ `__result_of_at__<S, N>` returns the actual type returned by
|
||||
`__at__<N>(s)`. In most cases, this is a reference. Hence, there is no way to
|
||||
know the exact element type using `__result_of_at__<S, N>`.The element at `N`
|
||||
[note `__result_of_at__<S, M>` returns the actual type returned by
|
||||
`__at__<M>(s)`. In most cases, this is a reference. Hence, there is no way to
|
||||
know the exact element type using `__result_of_at__<S, M>`.The element at `M`
|
||||
may actually be a reference to begin with. For this purpose, you can use
|
||||
`__result_of_value_at__<S, N>`.]
|
||||
`__result_of_value_at__<S, M>` (Note that, `__result_of_value_at_c__<S, N>`
|
||||
is a counterpart of `__result_of_at_c__<S, N>` as well).]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
@ -258,7 +269,8 @@ are not defined in __bidirectional_sequence__.
|
||||
|
||||
[table
|
||||
[[Expression] [Semantics]]
|
||||
[[`__at__<N>(s)`] [The Nth element from the beginning of the sequence; see __at__.]]
|
||||
[[`__at__<M>(s)`] [The Mth element from the beginning of the sequence; see __at__.]]
|
||||
[[`__at_c__<N>(s)`] [The Nth element from the beginning of the sequence; see __at_c__.]]
|
||||
]
|
||||
|
||||
[heading Models]
|
||||
@ -283,6 +295,7 @@ An Associative Sequence allows efficient retrieval of elements based on keys.
|
||||
Like associative sequences in __mpl__, and unlike associative containers in
|
||||
__stl__, Fusion associative sequences have no implied ordering relation.
|
||||
Instead, type identity is used to impose an equivalence relation on keys.
|
||||
Keys are not checked for uniqueness.
|
||||
|
||||
[variablelist Notation
|
||||
[[`s`] [An Associative Sequence]]
|
||||
@ -317,11 +330,11 @@ For any Associative Sequence the following expressions must be valid:
|
||||
[[`__result_of_value_at_key__<S, K>::type`] [Amortized constant time]]
|
||||
]
|
||||
|
||||
[blurb __note__ `__result_of_at_key__<S, K>` returns the actual type returned
|
||||
[note `__result_of_at_key__<S, K>` returns the actual type returned
|
||||
by `__at_key__<K>(s)`. In most cases, this is a reference. Hence, there is no
|
||||
way to know the exact element type using `__result_of_at_key__<S, K>`.The
|
||||
element at `K` may actually be a reference to begin with. For this purpose,
|
||||
you can use `__result_of_value_at_key__<S, N>`.]
|
||||
you can use `__result_of_value_at_key__<S, K>`.]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
@ -531,7 +544,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`
|
||||
@ -579,7 +592,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`
|
||||
@ -642,15 +655,15 @@ in the sequence.
|
||||
|
||||
[heading Description]
|
||||
|
||||
Returns the N-th element from the beginning of the sequence.
|
||||
Returns the M-th element from the beginning of the sequence.
|
||||
|
||||
[heading Synopsis]
|
||||
|
||||
template <typename N, typename Sequence>
|
||||
template <typename M, typename Sequence>
|
||||
typename __result_of_at__<Sequence, N>::type
|
||||
at(Sequence& seq);
|
||||
|
||||
template <typename N, typename Sequence>
|
||||
template <typename M, typename Sequence>
|
||||
typename __result_of_at__<Sequence const, N>::type
|
||||
at(Sequence const& seq);
|
||||
|
||||
@ -659,25 +672,25 @@ Returns the N-th element from the beginning of the sequence.
|
||||
[table
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`seq`] [Model of __random_access_sequence__] [The sequence we wish to investigate.]]
|
||||
[[`N`] [An __mpl_integral_constant__] [An index from the beginning of the
|
||||
[[`M`] [An __mpl_integral_constant__] [An index from the beginning of the
|
||||
sequence.]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
|
||||
at<N>(seq);
|
||||
at<M>(seq);
|
||||
|
||||
[*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
|
||||
[*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 N-th element from the beginning of the
|
||||
returns a type convertible to the M-th element from the beginning of the
|
||||
sequence.
|
||||
|
||||
[*Precondition]: `0 <= N::value < __size__(s)`
|
||||
[*Precondition]: `0 <= M::value < __size__(s)`
|
||||
|
||||
[*Semantics]: Equivalent to
|
||||
|
||||
__deref__(__advance__<N>(__begin__(s)))
|
||||
__deref__(__advance__<M>(__begin__(s)))
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -723,7 +736,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)`
|
||||
@ -818,7 +831,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`
|
||||
|
||||
@ -844,13 +857,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]
|
||||
@ -863,7 +877,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");
|
||||
@ -1115,7 +1132,7 @@ the actual element type, use __result_of_value_at__].
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Seq,
|
||||
typename N>
|
||||
typename M>
|
||||
struct at
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
@ -1124,15 +1141,15 @@ the actual element type, use __result_of_value_at__].
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq`][A model of __random_access_sequence__][Argument sequence]]
|
||||
[[`N`][An __mpl_integral_constant__][Index of element]]
|
||||
[[`M`][An __mpl_integral_constant__][Index of element]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::at<Seq, N>::type
|
||||
result_of::at<Seq, M>::type
|
||||
|
||||
[*Return type]: Any type.
|
||||
|
||||
[*Semantics]: Returns the result type of using __at__ to access the `N`th element of `Seq`.
|
||||
[*Semantics]: Returns the result type of using __at__ to access the `M`th element of `Seq`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -1157,7 +1174,7 @@ get the actual element type, use __result_of_value_at_c__].
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Seq,
|
||||
int M>
|
||||
int N>
|
||||
struct at_c
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
@ -1166,15 +1183,15 @@ get the actual element type, use __result_of_value_at_c__].
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq`][A model of __random_access_sequence__][Argument sequence]]
|
||||
[[`M`][Positive integer index][Index of element]]
|
||||
[[`N`][Positive integer index][Index of element]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::at_c<Seq, M>::type
|
||||
result_of::at_c<Seq, N>::type
|
||||
|
||||
[*Return type]: Any type
|
||||
|
||||
[*Semantics]: Returns the result type of using __at_c__ to access the `M`th element of `Seq`.
|
||||
[*Semantics]: Returns the result type of using __at_c__ to access the `N`th element of `Seq`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -1196,7 +1213,7 @@ Returns the actual type at a given index from the __sequence__.
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Seq,
|
||||
typename N>
|
||||
typename M>
|
||||
struct value_at
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
@ -1205,15 +1222,15 @@ Returns the actual type at a given index from the __sequence__.
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq`][A model of __random_access_sequence__][Argument sequence]]
|
||||
[[`N`][An __mpl_integral_constant__][Index of element]]
|
||||
[[`M`][An __mpl_integral_constant__][Index of element]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::value_at<Seq, N>::type
|
||||
result_of::value_at<Seq, M>::type
|
||||
|
||||
[*Return type]: Any type.
|
||||
|
||||
[*Semantics]: Returns the actual type at the `N`th element of `Seq`.
|
||||
[*Semantics]: Returns the actual type at the `M`th element of `Seq`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -1235,7 +1252,7 @@ Returns the actual type at a given index from the __sequence__.
|
||||
[heading Synopsis]
|
||||
template<
|
||||
typename Seq,
|
||||
int M>
|
||||
int N>
|
||||
struct value_at_c
|
||||
{
|
||||
typedef __unspecified__ type;
|
||||
@ -1244,15 +1261,15 @@ Returns the actual type at a given index from the __sequence__.
|
||||
[table Parameters
|
||||
[[Parameter] [Requirement] [Description]]
|
||||
[[`Seq`][A model of __random_access_sequence__][Argument sequence]]
|
||||
[[`M`][Positive integer index][Index of element]]
|
||||
[[`N`][Positive integer index][Index of element]]
|
||||
]
|
||||
|
||||
[heading Expression Semantics]
|
||||
result_of::value_at_c<Seq, M>::type
|
||||
result_of::value_at_c<Seq, N>::type
|
||||
|
||||
[*Return type]: Any type
|
||||
|
||||
[*Semantics]: Returns the actual type at the `M`th element of `Seq`.
|
||||
[*Semantics]: Returns the actual type at the `N`th element of `Seq`.
|
||||
|
||||
[heading Header]
|
||||
|
||||
@ -1309,7 +1326,7 @@ Returns the result type of __has_key__.
|
||||
[heading Description]
|
||||
|
||||
Returns the result type of __at_key__[footnote __result_of_at_key__
|
||||
reflects the actual return type of the function __at_key__. __sequence__s
|
||||
reflects the actual return type of the function __at_key__. __sequence__(s)
|
||||
typically return references to its elements via the __at_key__ function. If
|
||||
you want to get the actual element type, use __result_of_value_at_key__].
|
||||
|
||||
@ -1381,7 +1398,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]
|
||||
|
||||
@ -1405,9 +1422,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]
|
||||
|
||||
@ -1430,7 +1448,7 @@ operators for free.
|
||||
|
||||
The I/O operators: `<<` and `>>` work generically on all Fusion
|
||||
sequences. The I/O operators are overloaded in namespace `boost::fusion`
|
||||
[footnote __sequences__ and __views__ residing in different namespaces
|
||||
[footnote __sequence__(s) and __views__ residing in different namespaces
|
||||
will have to either provide their own I/O operators (possibly forwarding
|
||||
to fusion's I/O operators) or hoist fusion's I/O operators (using
|
||||
declaration), in their own namespaces for proper argument dependent
|
||||
@ -1478,7 +1496,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`.
|
||||
@ -1622,7 +1640,7 @@ compile time error.
|
||||
[*Semantics]:
|
||||
|
||||
For each element, `e1`, in sequence `a`, and for each element, `e2`, in
|
||||
sequence `b`, `e1 == e2` returns true. For any 2 zero length __sequence__s,
|
||||
sequence `b`, `e1 == e2` returns true. For any 2 zero length __sequence__(s),
|
||||
e and f, e == f returns true.
|
||||
|
||||
[heading Header]
|
||||
@ -1887,6 +1905,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]
|
||||
@ -254,7 +254,8 @@ Metafunction to apply __element_conversion__ to the full argument type.
|
||||
|
||||
It removes references to `const`, references to array types are kept, even
|
||||
if the array is `const`. Reference wrappers are removed (see
|
||||
__note_boost_ref__).
|
||||
__note_ref_wrappers__)[footnote Since C++11, the standard reference wrappers
|
||||
are also removed.].
|
||||
|
||||
[heading Header]
|
||||
|
||||
|
@ -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,21 +90,23 @@ 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 has no effect.
|
||||
[*Returns]: tuple<T1&, T2&, ..., TN&>(t1, t2, ..., tN). When argument `ti` is `ignore`, assigning any value to the corresponding tuple element has no effect.
|
||||
|
||||
[endsect]
|
||||
|
||||
@ -254,7 +269,7 @@ The __tr1__tuple__ interface is specified to provide uniform access to `std::pai
|
||||
|
||||
[*Type]: `T2`
|
||||
|
||||
[*Value]: Returns thetype of the second element of the pair
|
||||
[*Value]: Returns the type of the second element of the pair
|
||||
|
||||
template<int I, typename T1, typename T2>
|
||||
P& get(std::pair<T1, T2>& pr);
|
||||
|
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>
|
||||
@ -18,7 +19,7 @@
|
||||
|
||||
// The std_tuple_iterator adaptor only supports implementations
|
||||
// using variadic templates
|
||||
#if !defined(BOOST_NO_VARIADIC_TEMPLATES)
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
#include <boost/fusion/adapted/std_tuple.hpp>
|
||||
#endif
|
||||
|
||||
|
@ -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_CXX14_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CXX14_CONSTEXPR 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_CONSTEXPR 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,15 +10,32 @@
|
||||
#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>
|
||||
#include <boost/fusion/adapted/struct/detail/extension.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
template <typename T, typename Dummy>
|
||||
struct get_identity
|
||||
: remove_const<typename remove_reference<T>::type>
|
||||
{};
|
||||
}}}
|
||||
namespace detail
|
||||
{
|
||||
template <typename T, typename Dummy>
|
||||
struct get_identity
|
||||
: remove_const<typename remove_reference<T>::type>
|
||||
{};
|
||||
}
|
||||
|
||||
namespace extension
|
||||
{
|
||||
// Overload as_const() to unwrap adt_attribute_proxy.
|
||||
template <typename T, int N, bool Const>
|
||||
BOOST_CONSTEXPR 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();
|
||||
}
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
||||
|
@ -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_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
array_iterator(Array& a)
|
||||
: array(a) {}
|
||||
|
||||
@ -55,6 +57,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR 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_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& i)
|
||||
{
|
||||
@ -91,6 +95,7 @@ namespace boost { namespace fusion
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(I1 const&, I2 const&)
|
||||
{
|
||||
@ -104,4 +109,13 @@ namespace boost { namespace fusion
|
||||
};
|
||||
}}
|
||||
|
||||
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
|
||||
namespace std
|
||||
{
|
||||
template <typename Array, int Pos>
|
||||
struct iterator_traits< ::boost::fusion::array_iterator<Array, Pos> >
|
||||
{ };
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -8,12 +8,13 @@
|
||||
#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>
|
||||
|
||||
namespace boost { namespace fusion {
|
||||
|
||||
|
||||
struct boost_array_tag;
|
||||
|
||||
namespace extension
|
||||
@ -32,6 +33,7 @@ namespace boost { namespace fusion {
|
||||
typename Sequence::const_reference,
|
||||
typename Sequence::reference>::type type;
|
||||
|
||||
BOOST_CONSTEXPR 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 {
|
||||
@ -23,10 +24,11 @@ namespace boost { namespace fusion {
|
||||
struct begin_impl<boost_array_tag>
|
||||
{
|
||||
template <typename Sequence>
|
||||
struct apply
|
||||
struct apply
|
||||
{
|
||||
typedef array_iterator<Sequence, 0> type;
|
||||
|
||||
|
||||
BOOST_CONSTEXPR 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 {
|
||||
@ -23,10 +24,11 @@ namespace boost { namespace fusion {
|
||||
struct end_impl<boost_array_tag>
|
||||
{
|
||||
template <typename Sequence>
|
||||
struct apply
|
||||
struct apply
|
||||
{
|
||||
typedef array_iterator<Sequence, Sequence::static_size> type;
|
||||
|
||||
|
||||
BOOST_CONSTEXPR 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,10 +202,20 @@ namespace boost { namespace fusion
|
||||
: boost_tuple_null_iterator<tuples::tuple<> const>
|
||||
{
|
||||
template <typename Cons>
|
||||
BOOST_FUSION_GPU_ENABLED
|
||||
explicit boost_tuple_iterator(Cons const&) {}
|
||||
};
|
||||
}}
|
||||
|
||||
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
|
||||
namespace std
|
||||
{
|
||||
template <typename Cons>
|
||||
struct iterator_traits< ::boost::fusion::boost_tuple_iterator<Cons> >
|
||||
{ };
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -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&)
|
||||
{
|
||||
@ -108,6 +114,15 @@ namespace boost { namespace fusion
|
||||
};
|
||||
}}
|
||||
|
||||
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
|
||||
namespace std
|
||||
{
|
||||
template <typename Iterator>
|
||||
struct iterator_traits< ::boost::fusion::mpl_iterator<Iterator> >
|
||||
{ };
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -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,9 +7,10 @@
|
||||
#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/eval_if.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/fusion/support/detail/access.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
||||
@ -29,16 +30,17 @@ namespace boost { namespace fusion
|
||||
struct apply
|
||||
{
|
||||
typedef typename remove_const<Sequence>::type seq_type;
|
||||
typedef std::tuple_element<N::value, seq_type> element;
|
||||
typedef typename std::tuple_element<N::value, seq_type>::type element;
|
||||
|
||||
typedef typename
|
||||
mpl::eval_if<
|
||||
mpl::if_<
|
||||
is_const<Sequence>
|
||||
, fusion::detail::cref_result<element>
|
||||
, fusion::detail::ref_result<element>
|
||||
, typename fusion::detail::cref_result<element>::type
|
||||
, typename fusion::detail::ref_result<element>::type
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CONSTEXPR 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_CXX14_CONSTEXPR 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
|
@ -4,8 +4,8 @@
|
||||
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_CATEGORY_OF_IMPL_09272006_0726)
|
||||
#define BOOST_FUSION_CATEGORY_OF_IMPL_09272006_0726
|
||||
#if !defined(BOOST_FUSION_CATEGORY_OF_IMPL_04202013_0940)
|
||||
#define BOOST_FUSION_CATEGORY_OF_IMPL_04202013_0940
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
|
@ -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_CONSTEXPR 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_CONSTEXPR 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,12 +7,13 @@
|
||||
#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>
|
||||
#include <boost/fusion/support/detail/access.hpp>
|
||||
#include <boost/mpl/int.hpp>
|
||||
#include <boost/mpl/eval_if.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
||||
@ -35,6 +36,7 @@ namespace boost { namespace fusion
|
||||
typename add_const<Tuple>::type, Index>
|
||||
identity;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
explicit std_tuple_iterator(Tuple& tuple)
|
||||
: tuple(tuple) {}
|
||||
|
||||
@ -48,15 +50,16 @@ namespace boost { namespace fusion
|
||||
template <typename Iterator>
|
||||
struct deref
|
||||
{
|
||||
typedef value_of<Iterator> element;
|
||||
typedef typename value_of<Iterator>::type element;
|
||||
typedef typename
|
||||
mpl::eval_if<
|
||||
mpl::if_<
|
||||
is_const<typename Iterator::tuple_type>
|
||||
, fusion::detail::cref_result<element>
|
||||
, fusion::detail::ref_result<element>
|
||||
, typename fusion::detail::cref_result<element>::type
|
||||
, typename fusion::detail::ref_result<element>::type
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& iter)
|
||||
{
|
||||
@ -71,6 +74,7 @@ namespace boost { namespace fusion
|
||||
typedef typename Iterator::tuple_type tuple_type;
|
||||
typedef std_tuple_iterator<tuple_type, index+N::value> type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(Iterator const& i)
|
||||
{
|
||||
@ -93,6 +97,7 @@ namespace boost { namespace fusion
|
||||
{
|
||||
typedef mpl::int_<Last::index-First::index> type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const&, Last const&)
|
||||
{
|
||||
@ -102,6 +107,15 @@ namespace boost { namespace fusion
|
||||
};
|
||||
}}
|
||||
|
||||
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
|
||||
namespace std
|
||||
{
|
||||
template <typename Tuple, int Index>
|
||||
struct iterator_traits< ::boost::fusion::std_tuple_iterator<Tuple, Index> >
|
||||
{ };
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -7,15 +7,10 @@
|
||||
#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>
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <typename... Elements>
|
||||
class tuple;
|
||||
}
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct std_tuple_tag;
|
||||
|
@ -10,11 +10,13 @@
|
||||
#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>
|
||||
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/define_struct.hpp>
|
||||
#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
|
||||
|
||||
#endif
|
||||
|
@ -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
|
||||
|