Compare commits

..

1274 Commits

Author SHA1 Message Date
4e57acbce7 Make fusion::pair trivially copyable if possible 2018-03-23 02:26:05 +09:00
44ef9e56e6 Added tests for support/pair 2018-03-23 02:25:38 +09:00
e3b053f969 Remove detail metafunctions to simplify template 2018-03-15 20:49:38 +09:00
11a3f250b8 Remove unused header 2018-03-15 19:56:07 +09:00
d8f608c8f1 Move is_native_fusion_sequence to detail
in order to reuse it in is_mpl_sequence
2018-03-14 14:53:30 +09:00
2aea153be0 Use fold expression to improbe compile speed 2018-03-14 14:53:07 +09:00
4734cf4a13 Fixed detail::and test
it should be used mpl/assert instead of runtime facility.
2018-03-14 14:41:43 +09:00
d5bd71c886 Update dead/moved links 2018-03-14 00:51:48 +09:00
c3dec40e72 Fixed links to support list.
Gmane had been closed and not back yet.
2018-03-13 23:18:03 +09:00
101a056a92 Merge pull request #171 from ldionne/develop
Allow incomplete types in fusion::tag_of and fusion::is_native_fusion_sequence
2018-03-03 13:31:22 +09:00
82f677c169 Allow incomplete types in fusion::tag_of and fusion::is_native_fusion_sequence 2018-03-02 02:03:43 -08:00
f61bffb21f Remove $$$ JDG temp $$$ 2018-02-24 16:00:57 +09:00
4c67886cc2 Merge pull request #168 from Kojoley/add-limits-precheck
Add limits precheck
2018-02-21 21:45:13 +09:00
38818fbe3d Add limits precheck 2018-02-20 22:44:34 +03:00
0a8f0f49b2 Merge pull request #167 from boostorg/enhancement/ci
Improve CI performance, like phoenix
2018-01-29 20:04:18 +09:00
cdd1408d2b Update dependency
functional/hash was branched off into contaienr_hash
2018-01-29 12:35:30 +09:00
540ea0ef0c Use build time configuration 2018-01-29 12:03:19 +09:00
671f22b013 Use new common CI marker 2018-01-29 10:34:33 +09:00
dfceaffc58 Update copyright year 2018-01-29 10:30:55 +09:00
2c86e9d18c Added hash option to b2
to mitigate max path length exceeding.
2018-01-29 10:17:06 +09:00
d8e6f406ab Mark as CI in Jamfile not command line
super-project also runs regression test, but they doesn't define that.
2018-01-29 10:15:39 +09:00
b42314fb02 Enabling parallel option to CI job 2018-01-29 10:10:15 +09:00
806b621931 Merge pull request #166 from Kojoley/cwg-defect-945
vector: Fix for compilers not compatible with CWG defect 945
2017-12-24 11:40:58 +09:00
39fb05e40f vector: Fix for compilers not compatible with CWG defect 945
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#945
2017-12-23 18:17:04 +03:00
dc47261890 Merge pull request #164 from Kojoley/fix-map-vs2017-15.5
map: Switch to SFINAE in template parameters
2017-12-14 06:45:27 +08:00
099333b61d map: Switch to SFINAE in template parameters
Fixes #163.

Since C++11 we can do SFINAE in template parameters. VS2017 15.5 doesn't like
the SFINAE on argument here, but do not ask me why, because I have no idea.
2017-12-14 00:05:28 +03:00
821aaee960 Merge pull request #161 from boostorg/regression/msvc-defects
Fixed a regression with msvc 10/11/12
2017-11-25 06:23:17 +08:00
b12c6b6af6 Regenerate preprocessed files. 2017-11-23 22:59:02 +09:00
4eda545405 Fixed a regression with msvc 10/11/12 defect 2017-11-23 22:48:11 +09:00
5fd8c36079 Added test for GitHub issue #159 2017-11-23 22:27:59 +09:00
33ce5701ae Remove depth option from submodule update.
We need `back to the future` sometime, such as merge develop to master.
2017-10-30 14:34:59 +09:00
3cd289836d likewise 2017-10-29 16:40:07 +09:00
ffff00b1a2 Fixed clang and libstdc++ combination. 2017-10-28 09:49:27 +09:00
c19cd1b0b7 Specify toolset version via command line. 2017-10-27 20:59:04 +09:00
3452deb057 Remove unnecessary source. 2017-10-27 20:53:14 +09:00
0876b9558d Remove invalid compiler: key 2017-10-27 20:40:29 +09:00
580364a19e trusty is already default image 2017-10-27 20:34:16 +09:00
d6921c112a Use <cxxstd> to speedup build cycle. 2017-10-27 20:10:23 +09:00
254d570b3d Increase shallow clone depth
to mitigate clone failure because of autocommit bot delay.
2017-10-21 12:19:44 +09:00
5c78fea465 Fixed wording 2017-10-20 22:30:59 +09:00
da4abd0dce Added gcc 4.4 as expected failure. 2017-10-20 22:30:42 +09:00
1faac814e3 Merge pull request #156 from danieljames/develop
Make explicit-failures-markup.xml valid
2017-10-19 19:15:31 +09:00
3085f76d31 Make explicit-failures-markup.xml valid
The xml needs to be valid according to:

https://github.com/boostorg/boost/blob/develop/status/explicit-failures.xsd

It requires that the elements are in a certain order. I suspect that the
scripts don't actually require that, but I don't know for sure.
2017-10-19 10:54:10 +01:00
e18aa85602 Merge pull request #155 from Flast/ci
Update CI status
2017-10-19 13:21:43 +09:00
320386dcf1 Revert "Remove unused env value."
This reverts commit 3e7d928ddd.

This env value is needed to prevent run job with default compiler.
2017-10-18 23:50:10 +09:00
cbda55b962 Added repo local failure markups. 2017-10-18 23:35:48 +09:00
e992658ce3 Skipping some tests due to compiler bug.
It is better to skip such tests on AppVeyor to detect regression.
2017-10-18 23:09:27 +09:00
99699ede5d Added define to determine where running on. 2017-10-18 22:43:08 +09:00
8243b3088b Remove notification 2017-10-18 08:35:15 +09:00
3e7d928ddd Remove unused env value. 2017-10-18 08:09:30 +09:00
26f69719d0 Merge pull request #154 from boostorg/bugfix/forwarding-on-non-variadics
Fixed bugs nesting and copying on c++03.
2017-10-15 14:01:45 +09:00
0e0de6c4f1 Regenerate preprocessed files. 2017-10-15 07:10:25 +09:00
984fcfd276 Delete needless overload. 2017-10-14 03:18:47 +09:00
62f5ccac53 Fixed compile error on copy construction. 2017-10-14 03:16:44 +09:00
cf33f3db4e Added copy assign to deque(03).
move ctor will delete defaulted copy assign.
2017-10-14 03:16:00 +09:00
dfe08dec2c Fixed incorrect overload resolution.
Those functions should not be chosen for copying/moving.
2017-10-14 02:34:44 +09:00
7ec3f1a68f Merge pull request #153 from boostorg/bugfix/array-and-libcxx
Fixed compile error with std::array
2017-10-13 22:12:02 +09:00
42a01fc3f4 Fixed compile error with std::array
libc++ enables std::array in c++98 mode, but <type_traits> doesn't.
2017-10-13 20:04:11 +09:00
0d37235d1c Merge pull request #152 from boostorg/ci
Enabe CI services
2017-10-13 17:03:50 +09:00
e97f58749f Reduce ln flags
BSD coreutils doesn't know -T switch.
2017-10-13 14:46:30 +09:00
80a86fbcd4 Move instead of link
bjam may confuse relative path.
2017-10-13 13:15:38 +09:00
6bef7c98b2 Fixed missing modules. 2017-10-13 13:12:08 +09:00
e4b1233262 Fixed directory hijacking error. 2017-10-13 12:46:54 +09:00
38535926bd Enabling CI services
based on smart_ptr repo
2017-10-13 12:30:17 +09:00
1bce525b30 Merge pull request #151 from boostorg/change-base-of-tuple
Change base of tuple
2017-10-12 23:56:23 +09:00
e606ceeff0 Improve vector value_at performance. 2017-10-07 14:18:29 +09:00
24d1c7fd1a Reduce type deduction which is already known. 2017-10-04 01:43:45 +09:00
e5d073d786 Use compiler generated ctor. 2017-10-04 01:30:27 +09:00
6a9b7f314d Remove unnecessary base check.
fusion::tuple doesn't inherit from fusion::vector now.
2017-10-04 01:13:26 +09:00
0471a65ca2 Change fusion::tuple its base class to vector_data.
This change aims to improve compile time performance for both of vector and tuple.
2017-10-03 22:25:03 +09:00
b6e5285430 Merge pull request #150 from gjasny/remove-circular-include
Remove circular preprocessor include
2017-09-03 05:30:35 +08:00
9cb23af898 Remove circular preprocessor include 2017-09-02 16:09:12 +02:00
437cea006a Merge pull request #149 from kuhlenough/develop
isspace(c) is not a macro in Dinkum clib for VxWorks
2017-08-11 04:42:26 +08:00
7c15df79f2 isspace(c) is not a macro in Dinkum clib for VxWorks, must be in std namespace 2017-08-10 12:19:32 -04:00
503a89dc89 Merge pull request #148 from vtnerd/bugfix/test_nest
Fixed bug in test/sequence/nest.hpp where some results were ignored
2017-07-26 08:01:19 +08:00
b24dfd635b Fixed bug in test/sequence/nest.hpp where some results were ignored 2017-07-25 15:29:57 -04:00
36eac2e77c Added missing include file. 2017-06-18 23:12:50 +09:00
bb782de1ff Merge pull request #146 from Flast/update-workarounds
Update workarounds for msvc 14.1
2017-05-01 13:12:56 +09:00
451e21adb3 Update workarounds for msvc 14.1 2017-04-30 23:26:24 +09:00
e0ceefafb6 Merge pull request #145 from boostorg/test-config
Refresh Jamfile
2017-04-30 22:41:34 +09:00
2952fd254f Use build time config to filter tests. 2017-04-27 22:23:39 +09:00
1ec001888d Reformatting. 2017-02-02 22:08:16 +09:00
98b81ee102 Remove use of deprecated binder. (#144) 2016-11-20 16:58:04 +09:00
f1a619428a Remove unintended file. 2016-11-20 16:41:23 +09:00
fcdcfcd2c5 Merge pull request #143 from boostorg/bugfix/returing-tmp-variable
Fix returing temporary variable warning on MSVC.
2016-11-01 02:44:58 +09:00
6f43cd7f66 Correct testcase condition. 2016-11-01 02:28:45 +09:00
c630611626 Fix returing temporary variable warning on MSVC. 2016-11-01 01:54:10 +09:00
0d8243b36d Merge pull request #142 from Flast/std_array
Adaptor for std::array.
2016-10-31 01:40:57 +09:00
ea9a176312 Include <array> instead of declare std::array.
Some implementations declare it as std::tr1::array and conflict.
2016-10-31 01:13:36 +09:00
1747703b1a Merge pull request #140 from Flast/bugfix/define_struct
Workarounds for older compilers.
2016-10-29 22:28:34 +09:00
c158886591 Workaround for MSVC 12 variadics bug. 2016-10-29 21:29:26 +09:00
5135b5109b Likewise. 2016-10-29 20:57:06 +09:00
490baac6e2 Added workaround for older gcc. 2016-10-29 15:34:49 +09:00
6bd644d43d Don't use iterator for copy/move assign op. 2016-10-29 14:40:47 +09:00
64af83d999 Merge pull request #138 from Flast/movable-define_struct
DEFINE_STRUCT now allows move construct/assign.
2016-10-24 00:00:06 +09:00
e74ccb1cf5 DEFINE_STRUCT now allows move construct/assign. 2016-10-19 01:33:43 +09:00
7b13053c7e Merge pull request #135 from vtnerd/bugfix/vector_conversion_constructor
Make C++11 fusion::vector more consistent with C++03 fusion::vector
2016-10-14 13:51:52 +09:00
ef2dc2aaae Merge pull request #137 from boostorg/empty_struct
Allow to define empty struct.
2016-10-14 11:44:55 +09:00
ef1ca12e81 Added tests for adapted empty struct. 2016-10-14 01:47:02 +09:00
a2b8a8f254 Don't define user-provided special functions.
To allow to define empty struct.
2016-10-13 00:18:14 +09:00
16a069be14 Fix test for non C++11/14. 2016-10-11 08:22:35 +09:00
61fab16418 Merge branch 'mloskot/boost_fusion_std_array' into develop 2016-10-10 18:46:29 +09:00
928ced256a Adjust directory structure. 2016-10-09 22:14:42 +09:00
599b8d4aef Add, and update, documentation build targets. 2016-10-07 23:07:34 -05:00
1a2a8d67aa Merge pull request #136 from Kojoley/fix-extra-semicolon
Fixed extra semicolon
2016-09-02 00:32:41 +08:00
d5740f8310 Fixed extra semicolon 2016-09-01 17:57:15 +03:00
5906d9c316 Make C++11 fusion::vector more consistent with C++03 fusion::vector
- Construct from elements is enabled iff each argument is_convertible to
    corresponding element.
  - Construct from sequence is enabled iff the single argument is a fusion
    sequence.
  - C++11 vector and tuple also disable construct from sequence that are
    shorter than the destination. C++03 gives incorrect is_convertible
    responses in this situation and fails to compile if that constructor is
    used; C++11 can have instantation errors in
    and_<is_convertible<U, T>...> without the additional check.
  - C++11 tuple and vector support truncation conversion and assignment like
    all other sequences.
2016-08-26 12:45:11 -04:00
45d9b49ee5 Merge pull request #134 from vtnerd/bugfix/tuple_element_construction
Add DISABLE_VARIADIC_VECTOR and SFINAE for c++11 tuple element construction
2016-07-31 15:58:17 +09:00
55150a7fa6 Add DISABLE_VARIADIC_VECTOR and SFINAE for c++11 tuple element construction 2016-07-26 14:53:26 -04:00
27321dd18e Merge pull request #132 from vtnerd/bugfix/nested_sequence_cpp11
Added to nested tests, and fixed C++11 vector copy-from-sequence
2016-06-01 06:47:21 +08:00
79d8e9d11c Added to nested tests, and fixed C++11 vector copy-from-sequence 2016-05-31 16:52:57 -04:00
7e4ab4f804 Merge pull request #130 from Flast/bugfix/gcc34
Added workaround for GCC 3.4 due to ambiguous.
2016-03-16 21:36:54 +08:00
3189580857 Added workaround for GCC 3.4 due to ambiguous.
NOTE: GCC 3.3 and earlier are not supported officially by Boost community.
2016-03-16 20:25:59 +09:00
71dcb3e02c Merge pull request #129 from Flast/testfix/gcc44-std_tuple
Tweak std::tuple test for GCC 4.4
2016-03-11 13:24:42 +08:00
82f24e0f73 Tweak std::tuple test for GCC 4.4
due to https://gcc.gnu.org/PR41530 .
2016-03-11 01:01:12 +09:00
f29e1e8209 Merge pull request #128 from Flast/patch-1
Correct workaround condition.
2016-03-09 10:00:31 +08:00
12b25c2c99 Correct workaround condition. 2016-03-09 10:19:22 +09:00
bc6eaf7ab0 Merge pull request #127 from Flast/workaround/for-older-gcc
Workaround for ICE on GCC 4.0/4.1.
2016-03-08 16:26:56 +08:00
275236f86e Workaround for ICE on GCC 4.0 and 4.1. 2016-03-08 15:36:21 +09:00
a8b70d6679 Workaround for ICE on GCC 4.0.0. 2016-03-08 14:43:32 +09:00
7472e70951 Merge pull request #126 from Flast/patch-1
Remove outdated comment.
2016-03-07 19:26:41 +08:00
104f508cef Remove outdated comment. 2016-03-07 19:42:23 +09:00
f7b90f2981 Merge pull request #124 from Flast/feature/ticket-11157-remove-BOOST_PP_IS_EMPTY
Remove use of BOOST_PP_IS_EMPTY.
2016-02-17 04:45:16 +08:00
d314798241 Merge pull request #123 from Flast/drop-bom
Drop BOM.
2016-02-17 04:43:51 +08:00
5ed26ec932 Drop Byte-order-Marker. 2016-02-16 23:55:59 +09:00
4ebc028769 Optimize. 2016-02-16 19:32:57 +09:00
99ad77b92f Fix typos. 2016-02-16 16:52:27 +09:00
e3d16edfb3 Merge pull request #122 from Flast/suppress-warnings
Suppress conversion warnings on MSVC.
2016-02-16 02:19:41 +08:00
4173b4b97b Suppress conversion warnings on MSVC. 2016-02-16 01:02:58 +09:00
9b43ac8ee0 More optimization. 2016-02-16 00:40:27 +09:00
c9c2c3bad6 Optimize macros. 2016-02-14 23:53:38 +09:00
d7d47619b4 Tweak PP includes. 2016-02-14 23:41:22 +09:00
100d223be4 Merge pull request #121 from Flast/std-integer_sequence
Detect std::integer_sequence availability.
2016-02-13 13:21:14 +08:00
44c21e0f10 Fixes invalid use of hardcoded "obj." prefix for ADAPT_ASSOC_STRUCT_NAMED and btw. fixes test error since removal of BOOST_PP_IS_EMPTY. 2016-02-13 14:15:53 +09:00
3125c15ff4 Fix BOOST_PP_EMPTY replacement with adapt_assoc_struct 2016-02-13 14:15:53 +09:00
11cc331f82 Add test with namespaced names, as it could break with the macro concatenation to check for BOOST_MPL_PP_TOKEN_EQUAL_auto equality. 2016-02-13 14:15:53 +09:00
d1cd721969 Replace BOOST_FUSION_ADAPT_AUTO with the standard auto keyword.
While BOOST_FUSION_ADAPT_AUTO is still supported for backward compatibiltiy,
auto as been put because it has a better readability.
2016-02-13 14:15:53 +09:00
2e466ac054 Remove BOOST_PP_IS_EMPTY in favor of BOOST_MPL_PP_TOKEN_EQUAL and added auto as synonym for BOOST_FUSION_ADAPT_AUTO.
Fix ticket https://svn.boost.org/trac/boost/ticket/11157
BOOST_MPL_PP_TOKEN_EQUAL is now used to check if auto/BOOST_FUSION_ADAPT_AUTO
was provided as type, telling to deduce members types.
2016-02-13 14:15:53 +09:00
b88daeb697 Detect std::integer_sequence availability.
It will allow to reuse compiler cache easier.
2016-02-13 11:57:41 +09:00
1774972237 Merge pull request #120 from Flast/remove-trailing-void-support
Remove trailing void_ support on variadic vector.
2016-02-11 23:52:35 +08:00
b46aad996a Remove trailing void_ support on variadic vector. 2016-02-11 23:56:07 +09:00
0526f7c04f Merge pull request #118 from Flast/bugfix/ambiguous-ctor
Fix ambiguous ctor, close #11766
2016-01-08 05:39:51 +08:00
64b8406c16 Introduce detail::enabler instead of fusion::void_. 2015-12-10 17:06:04 +09:00
2492ff9b25 regen 2015-12-01 01:26:08 +09:00
3919f3ed73 Fix missing header. 2015-12-01 01:16:01 +09:00
12792a6c11 Fix compile error with ambiguous ctor, close #11766.
When a) first elem is sequence b) second (and third) elem is(are) void*,
both of conversion ctor and forwarding ctor are candidate since SFINAE
expression has void* type.
2015-12-01 01:14:52 +09:00
e9d489c07c Merge pull request #117 from fiesh/develop
error: reference to 'ws' is ambiguous
2015-11-24 05:36:16 +08:00
8767d374ea manip.hpp: Do not use "using namespace std;"
Changed "using namespace std;  ws()" into "std::ws()" to avoid ambiguities with a possible "::ws" namespace.
2015-11-23 17:21:59 +01:00
ee718b363f Merge pull request #116 from Flast/workaround/msvc-8/fold
Fix fusion::fold regression with MSVC 8.
2015-11-15 07:12:07 +08:00
87fffbead3 Fix conditional of workaround. 2015-11-14 23:32:46 +09:00
1c05cfc795 Regenerate fusion::fold family. 2015-11-14 20:34:41 +09:00
7cf404d096 SFINAE expression obstructs compile on MSVC 8. 2015-11-13 21:49:27 +09:00
0c18e85ecd Partly fixed fusion::fold regression for MSVC <=8.
It implicitly includes MSVC 9's workaround.
2015-11-13 20:03:12 +09:00
bb8b5afc7f Merge pull request #115 from NumScale/fix-fast-vector-value_at
Fix fusion::at<vector<...>, N> for C array types
2015-11-11 10:02:52 +08:00
3298875ecc Add double identity trick for fast value_at (vectors)
This is a workaround to make decltype(expr)::type compiles
with old compilers.
2015-11-10 14:04:16 +01:00
74c0d5d0ec Fix fusion::at<vector<...>, N> for C array types 2015-11-10 10:55:13 +01:00
e7ec658b62 Merge pull request #114 from ldionne/bugfix/declval
Remove invalid odr-usages of boost::declval.
2015-11-09 07:16:25 +08:00
4d3891ed31 Remove invalid odr-usages of boost::declval. 2015-11-07 16:11:06 -05:00
1bc343660b Merge pull request #113 from Flast/use-enable_if_has_type-instead
Use boost::enable_if_has_type instead.
2015-11-01 16:45:46 +08:00
981f71d04f Use boost::enable_if_has_type instead. 2015-11-01 11:10:11 +09:00
f88dbb6876 Merge pull request #112 from Flast/suppress-undefined-inline-warning
Suppress undefined inline function warning.
2015-10-27 07:32:06 +08:00
4d5da0371b Suppress undefined inline function warning. 2015-10-27 07:59:55 +09:00
76f49608c7 Merge pull request #110 from Flast/regression/vector-ctor
Fix compile error on by-elem ctor.
2015-10-24 07:58:06 +08:00
73045b4d49 Fix compile error on by-elem ctor.
Single element vector of fusion sequence cannot construct from its
element type.
2015-10-23 08:29:05 +09:00
18742c6922 Merge pull request #105 from boostorg/variadics
Merge variadics into develop.
2015-10-22 15:40:04 +08:00
277e5ca034 Merge pull request #109 from Flast/o1-vector-at
Make fusion::at<vector<...>,N> O(1).
2015-10-21 09:43:00 +08:00
1ad2e59e07 Make fusion::at<vector<...>,N> O(1). 2015-10-20 20:12:14 +09:00
2c5c74069f Merge pull request #108 from Flast/regen
Regenerate preprocessed files.
2015-10-18 10:28:04 +08:00
a81024f617 Regenerate preprocessed files. 2015-10-17 11:24:19 +09:00
c537da605b Merge pull request #107 from Flast/variadics/rvalue-references
Compliant container-wide requirements.
2015-10-17 10:09:30 +08:00
1d45a87201 Merge pull request #102 from Flast/sfinae-friendly-fold
SFINAE-friendly fusion::fold
2015-10-16 06:32:12 +08:00
ce4ccb929c Check the argument being fusion sequence or not. 2015-10-08 22:23:10 +09:00
5114d9419e Drop unnecessary ctor. 2015-10-07 17:40:55 +09:00
ca0d92e68d R-value references are now container-wide requirements. 2015-10-06 21:29:02 +09:00
c750552a02 Tweak coding style. 2015-10-06 11:28:16 +09:00
a61285a0a1 Merge pull request #106 from Flast/docfix/return-type-of-algorithms
doc: Fix return type of algorithms, close #3358.
2015-10-06 03:48:07 +08:00
999dad386e doc: Fix return type of algorithms, close #3358. 2015-10-06 01:24:45 +09:00
d512378f4e Merge pull request #104 from Flast/doc-updates-for-variadics
Update docs for variadic containers.
2015-09-25 05:37:37 +08:00
ef39bc8651 Update docs for variadic containers. 2015-09-21 16:19:41 +09:00
d2f8ee9f32 Merge pull request #103 from Flast/suppress-warnings
Suppress some warnings.
2015-09-09 17:27:12 +08:00
cbd2e1dc1d Suppress unused warning. 2015-09-09 18:05:04 +09:00
a6d1b303b3 Fix block comment style.
Intel Compiler warns on nested comment.
2015-09-09 13:35:03 +09:00
76b7697ba5 fusion::fold allows to take non-const lv-ref state properly. 2015-09-08 15:14:27 +09:00
1df7fc1dca Revert "Remove unnecessary overloads, state should always be const."
This reverts commit 9b77c26a24.

As discussed on github, the original code was wrong.
2015-09-08 13:59:48 +09:00
9b77c26a24 Remove unnecessary overloads, state should always be const. 2015-09-08 00:22:58 +09:00
59dfeec815 Add workarounds for older MSVC. 2015-09-08 00:18:37 +09:00
4855d1fac1 Merge pull request #101 from Flast/sfinae-friendly-deque
Apply 7fdb320 change into C++98 interface.
2015-09-07 08:36:07 +08:00
d3449ab5e5 Overhaul the fusion::fold family to make SFINAE-friendly. 2015-09-04 00:51:56 +09:00
c30fabf98f Apply 7fdb320 change into C++98 interface. 2015-08-30 17:13:36 +09:00
de3730c325 Merge pull request #100 from Flast/feature/variadic/tuple
Implement C++11 variadic templates based fusion::tuple.
2015-08-27 14:55:11 +08:00
efd595fd10 Merge pull request #99 from Flast/bugfix/issue-11572
Retrieve convert<deque_tag>.
2015-08-26 06:00:13 +08:00
e61d08d953 Fix broken convert<deque_tag>, close issue 11572. 2015-08-26 00:20:07 +09:00
10d9f0ffba Add convert tests for non-assoc containers. 2015-08-25 23:36:32 +09:00
d9e5a620be Merge pull request #97 from Flast/feature/variadic/set
Variadics for fusion::set.
2015-08-20 21:57:19 +08:00
c5ba3af4c0 Added move functions for set. 2015-08-20 22:30:41 +09:00
22994d7e96 Fix a discrepance of element types in make_set. 2015-08-04 16:23:13 +09:00
1bde5c6fa3 Merge pull request #96 from Flast/bugfix/issue-11517
Fix #11517
2015-08-03 08:48:56 +08:00
8242c688e7 Older GCC doesn't accept use of this in constexpr.
Fix #11517
2015-08-03 00:03:40 +09:00
24f527d401 Use BOOST_CONSTEXPR_OR_CONST instead.
Older GCC cannot specify both of const and constexpr to variable decl.

Partially fix #11517
2015-08-02 21:58:20 +09:00
6689de502b Implement variadic make_set. 2015-07-30 11:56:09 +09:00
8761ed1b8d Merge pull request #94 from Flast/preprocess
Regenerate preprocessed files.
2015-07-28 08:03:22 +08:00
e37fd170ce Preprocessing... 2015-07-28 01:02:41 +09:00
74f0758bca Fix path to preprocessed files. 2015-07-28 01:02:03 +09:00
b1bb9921e2 Merge pull request #92 from Flast/bugfix/issue-11140
Fix a issue with nested fusion::tuple.
2015-07-27 15:26:10 +08:00
4fa0a5f550 Add tests for nested fusion::tuple. 2015-07-27 13:31:19 +09:00
ed30a7ca6a Fix issue 11140 2015-07-27 13:12:46 +09:00
e0debe282c Merge pull request #91 from ldionne/develop
[Deque] Make the from-sequence constructor SFINAE friendly
2015-07-25 06:24:46 +08:00
7fdb3201fa [Deque] Make the from-sequence constructor SFINAE friendly 2015-07-24 22:11:53 +02:00
8eee897e3f Merge pull request #90 from Flast/feature/variadic/nview
Variadic fusion::nview.
2015-07-16 14:07:41 +08:00
daea1c3142 Merge pull request #89 from Flast/feature/variadic/vector
Variadic fusion::vector.
2015-07-15 16:05:19 +08:00
2f6e162a7e Merge pull request #88 from boostorg/develop
Boost 1.59 beta
2015-07-07 23:26:29 +08:00
bc01b7fa24 Implement C++11 variadic templates based fusion::tuple. 2015-07-03 01:36:49 +09:00
00823cc315 Merge pull request #84 from Flast/feature/variadic/list
Variadic fusion::list.
2015-07-01 08:35:47 +08:00
fc92ba530d Merge pull request #87 from Flast/patch-1
Prevent use of conversion ctor  for copy purpose.
2015-07-01 07:05:05 +08:00
c0fcaae951 Prevent use of conversion ctor for copy purpose.
Some compilers elect conversion ctor for copy purpose in implicitly defined copy ctor with derived class.
2015-07-01 02:25:13 +09:00
298eeef9c9 Remove evil numbered_vector_tag. 2015-06-30 01:28:01 +09:00
62d9833bbf Add missing remove_const. 2015-06-29 21:55:51 +09:00
b4133761e8 Implement C++11 variadic templates based fusion::set 2015-06-29 18:14:25 +09:00
7739e4026d Adjust fusion::nview for variadic templates based fusion::vector
since FUSION_MAX_VECTOR_SIZE won't define in c++11.
2015-06-29 12:11:06 +09:00
f9fda7ce06 Remove intermediate specialization. 2015-06-28 19:42:08 +09:00
1f8ccd7bc3 Support move for make_vector. 2015-06-28 13:46:56 +09:00
969b475462 Implement variadic templates based fusion::vector.
Thanks to Lee Clagett.
2015-06-28 01:15:51 +09:00
c77f84749f Implement variadic generators for fusion::vector. 2015-06-28 01:15:51 +09:00
d937003962 Prepare implementing c++11 variadic based fusion::vector. 2015-06-28 01:15:51 +09:00
6fe816fe89 Merge pull request #85 from Flast/feature/no_bounds_sequence
Feature/no bounds sequence
2015-06-25 23:09:18 +08:00
d29dc277e6 Renaming No-bounds concept to Unbounded concept. 2015-06-25 22:42:44 +09:00
d5ce74dffd Added move ctor/assign for c++11 fusion::list. 2015-06-24 15:26:33 +09:00
a31009e73c at_key and value_at_key are aware of no-bounds sequence. 2015-06-23 11:36:14 +09:00
8aa35da4c4 Add documents for No-bounds sequences. 2015-06-23 11:36:13 +09:00
1e21a4eb7a Add new traits named has_no_bounds.
It is for special usecase: some thing like a window function.
This commit relative to c9ae4fc886 .
Users who wants to access out-of-bounds of sequence, specify new
category to it.

    struct sequence {
        struct category
            : fusion::random_access_traversal_tag
            , fusion::no_bounds_tag {};
        ...
    };

All of bounds related intrinsics of the /no-bounds-sequence/ *should*
guarantee to be well-defined or SFINAE-friendly, or compile error.
2015-06-23 09:44:03 +09:00
5cceded23b Drop unnecessary specialization. 2015-06-23 08:56:58 +09:00
78c5228d93 Move internal type into private. 2015-06-23 00:37:24 +09:00
0e8e857c2f Fix fusion::make_list return type. 2015-06-22 23:43:49 +09:00
d197380540 Implement C++11 list_tie. 2015-06-22 23:08:55 +09:00
3d0412bfd1 constexpr support for variadic list. 2015-06-22 23:08:55 +09:00
275f65f9ad Implement C++11 Variadic Templates based list. 2015-06-22 23:08:55 +09:00
9c7b7754fb Merge pull request #83 from Flast/feature/integer_sequence
C++14 like integer_sequence.
2015-06-22 21:38:44 +08:00
2b14951660 Split c++14 like index_sequence into support/detail. 2015-06-22 21:58:54 +09:00
973f2d3940 Merge pull request #82 from Flast/refactor/just-move-into-cpp03
Move cpp03 list_tie into detail dir.
2015-06-20 06:03:28 +08:00
60cf66ad89 Adjust include path. 2015-06-18 08:26:11 +09:00
fb2e4c502f Move list_tie. 2015-06-18 08:21:08 +09:00
fffbbdebdf Merge pull request #81 from Flast/refactor/just-move-into-cpp03
Move non-variadics into its own cpp03 dir and adjust include paths.
2015-06-17 05:58:07 +08:00
ddcd3cdf93 Likewise. 2015-06-17 01:40:45 +09:00
6df8d5a599 Merge pull request #80 from Flast/refactor/just-move-into-cpp03
[WIP] Just move non-variadics into its own cpp03 dir.
2015-06-16 07:53:27 +08:00
78afb4d3fc Likewise. 2015-06-14 23:05:06 +09:00
94f3b2a08b Merge pull request #79 from Flast/bugfix/nested
Fix issue 11267
2015-06-08 21:57:09 +08:00
3521ea3417 Suppress warnings. 2015-06-08 21:41:54 +09:00
ff25066be2 Remove unnecessary include of mpl::print. 2015-06-08 13:36:49 +09:00
e0f10734b1 Fix issue 11267.
Compiler yields compile error within a function witch used in unevaluate
context of constexpr function because of CWG 1581 [2].

1. https://llvm.org/bugs/show_bug.cgi?id=23135
2. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1581
2015-06-08 11:53:17 +09:00
22268eb083 Merge pull request #78 from Flast/remove_old_workaround
Remove obsolete workaround.
2015-05-23 08:58:40 +08:00
869513768d Remove obsolete workaround.
now it doesn't work properly.
2015-05-23 09:51:06 +09:00
65fae37660 Merge pull request #77 from jzmaddock/patch-3
Stop Using type_traits details.
2015-05-22 08:36:10 +08:00
cac994a7c6 Stop Using type_traits details.
Best not to use type_traits undocumented details, these will be moving soon, and use of this header will warn loud and clear if you continue to use it.
2015-05-21 19:14:12 +01:00
14228e9250 Merge pull request #76 from daminetreg/feature/fix-ticket-11269-adapt-empty-struct
Adds test case for each adapter macros we support to adapt an empty type
2015-05-15 21:20:25 +08:00
9911e05838 Adds test for each case adapter macros we support to adapt an empty type. 2015-05-15 09:09:10 +02:00
f22f1624b5 Merge pull request #75 from daminetreg/feature/fix-ticket-11269-adapt-empty-struct
Fix ticket #11269 to adapt an empty struct
2015-05-06 15:34:31 +08:00
8b1da45bfe Fix 11269 (https://svn.boost.org/trac/boost/ticket/11269) and add test case for it. 2015-05-06 08:21:02 +02:00
3b86f61f15 Merge pull request #74 from Flast/bugfix/11249
Fix #11249
2015-05-05 13:39:04 +08:00
2445f60981 Fix #11249: missing includes. 2015-05-05 14:09:20 +09:00
6f8c02eb6f Merge pull request #73 from daminetreg/develop
Merging master in develop
2015-04-29 22:54:15 +08:00
3c34d639df Merge branch 'master' into develop 2015-04-29 16:20:05 +02:00
b10d91ac82 Merge pull request #72 from daminetreg/master
Fix testcase when BOOST_PP_VARIADICS is disabled
2015-04-29 22:14:33 +08:00
b902afa5a0 fix testcase when BOOST_PP_VARIADICS is disabled. 2015-04-29 15:58:41 +02:00
528e6d16f0 Merge pull request #69 from felgru/develop
fix some typos in the documentation
2015-04-29 16:37:18 +08:00
2153df596b Merge pull request #71 from daminetreg/master
Further test cases and fixes for #11211
2015-04-29 16:16:45 +08:00
ce62bb49f3 fix constructors of DEFINE_STRUCT_INLINE to allow construction with non-constexpr compatible. 2015-04-26 22:19:44 +02:00
265de03026 Add test cases for non-constexpr compatible types. 2015-04-26 22:19:31 +02:00
83fb0ef7a2 Merge branch 'master' into develop 2015-04-23 08:27:30 +08:00
294a5ce644 Merge pull request #70 from daminetreg/feature/fix-for-11211
Remove BOOST_CONSTEXPR on BOOST_FUSION_DEFINE_STRUCT
2015-04-21 15:22:18 +08:00
bbdfc9972e Remove BOOST_CONSTEXPR on BOOST_FUSION_DEFINE_STRUCT constructor as it however adds the requirement that the user provided types are constant enabled. 2015-04-21 08:59:24 +02:00
91966ae524 added test case for https://svn.boost.org/trac/boost/ticket/11211 2015-04-21 03:46:25 +08:00
94f53a8d4c fix a typo 2015-04-20 11:12:54 +02:00
0fcd2aa328 doc: fix typo in documentation of fused_procedure 2015-04-20 11:12:45 +02:00
83a08934c8 Prepare to merge 2015-04-19 11:56:21 +09:00
ccb1aa20d9 Merge pull request #68 from Flast/develop
Fix workaround condition: || v.s. &&.
2015-04-14 18:31:06 +08:00
6e569bcdc3 Fix workaround condition: || v.s. &&.
see: 01a2d6557e (commitcomment-10697799)
2015-04-14 13:39:50 +09:00
de50f65380 fixes #11161 2015-04-01 19:09:42 +08:00
639cf2459d Merge pull request #67 from Flast/master
doc: Fix a typo
2015-04-01 09:15:28 +08:00
1ba1ac3ec8 Merge pull request #66 from boostorg/develop
Last chance for 1.58.0.
2015-04-01 09:15:11 +08:00
0bbea1ea32 doc: Fix a typo 2015-04-01 09:57:55 +09:00
b56eb59595 Merge pull request #65 from Flast/bugfix/msvc
Adjust LWG2408 workaround enabling condition.
2015-03-31 00:00:44 +08:00
01a2d6557e Adjust LWG2408 workaround enabling condition. 2015-03-25 21:49:22 +09:00
91cac41ada Merge pull request #64 from Flast/hotfix/1.58.0
Fix includes.
2015-03-23 10:05:59 +08:00
67f0863cdd Fix includes. 2015-03-22 12:24:18 +09:00
2204f025d3 Merge pull request #61 from Flast/feature/sfinae-friendly-result_of
SFINAE-friendly result_of::invoke
2015-03-19 09:39:54 +08:00
e881ea67cb Merge pull request #63 from Flast/develop
Add tests and documents
2015-03-16 08:43:34 +08:00
84789ec1c3 Merge pull request #62 from Flast/feature/sfinae-friendly-result_of
SFINAE-friendly result_of::invoke for develop
2015-03-12 15:56:13 +08:00
8c72a0012f Merge remote-tracking branch 'origin/develop' into feature/sfinae-friendly-result_of 2015-03-09 10:45:42 +09:00
4b5eb0cde8 Merge pull request #60 from daminetreg/master
After merge of #55 regenerated preprocessed headers as needed by #49.
2015-03-07 08:00:37 +08:00
d8bca006ff Merge pull request #59 from daminetreg/develop
Regenerated preprocessed header as of fix for #49
2015-03-07 08:00:33 +08:00
0954000314 After merge of #55 regenerated preprocessed headers as needed by #49. 2015-03-06 14:51:52 +01:00
2b072973e0 Merge pull request #55 from boostorg/develop
Release Candidate 2 for Boost 1.58.0
2015-03-06 12:15:09 +08:00
2c5b52f3bd Merge pull request #58 from Flast/feature/constexpr
More (maybe fully) support C++11/14 constexpr
2015-03-04 06:56:29 +08:00
f45c94fa43 Merge remote-tracking branch 'origin/develop' into feature/constexpr 2015-03-04 02:20:52 +09:00
2114bfca6c More constexpr and noexcept support.
Note 1: Forwarding functions are specified as a C++14 constexpr since
std::forward is not a constexpr within C++11.

Note 2: Though I'm not sure why it doesn't compile, some declarations
are specified as a C++14 constexpr or non-constexpr.

Note 3: Boost.Tuple adaptation and TR1-based tuple implementations are
not constexpr.
2015-03-03 02:21:02 +09:00
3e66a56b9f Merge pull request #56 from Flast/doc-update
Update docs
2015-02-22 04:39:31 +08:00
d03f79b6fd Update documents and tests for #8270 from Jamboree.
https://svn.boost.org/trac/boost/ticket/8270

see also: b36426c8e3
2015-02-22 01:06:27 +09:00
52eb8768f2 Add test for #9418, abstract types for key of map.
https://svn.boost.org/trac/boost/ticket/9418
2015-02-22 00:11:04 +09:00
197792ac53 Conforming admonitions style to quickbook.
http://www.boost.org/doc/libs/1_57_0/doc/html/quickbook/syntax/block.html#quickbook.syntax.block.admonitions
2015-02-21 19:58:15 +09:00
06428298bb Add docs for std::tuple adaptation. 2015-02-21 19:16:13 +09:00
960ccf5d2c Fix dead links: caused by pull-request #51. 2015-02-21 19:15:49 +09:00
bd4b1cdac6 Fix #10443: SFINAE-friendly result_of::invoke.
It means previous pull-requests (#24) is still incomplete.
2015-02-12 21:21:01 +09:00
e23d153734 Merge pull request #54 from boostorg/fusion_adapters
Type Deducing Fusion adapters into develop
2015-02-11 06:53:28 +08:00
d9337979b1 Merge pull request #50 from daminetreg/fusion_adapters
fusion_adapters : auto adaptation working also in MSVC
2015-02-09 17:57:25 +08:00
92726da079 Merge pull request #48 from boostorg/develop
Release Candidate for Boost 1.58
2015-02-09 06:55:09 +08:00
505d41ea67 Merge pull request #49 from Flast/bugfix/msvc
Fix two major MSVC issues.
2015-02-09 06:53:57 +08:00
02d15bfcb4 Merge pull request #52 from Flast/bugfix/lwg/2408
Workaround for LWG 2408: SFINAE-friendly std::iterator_traits.
2015-02-09 06:53:12 +08:00
fb0f22a296 Merge pull request #53 from Flast/bugfix/documentation
Documentation bugfix.
2015-02-09 06:35:12 +08:00
c5c0147d7d Add many tests for SFINAE-friendly result_of::invoke. 2015-02-08 19:23:06 +09:00
6ab68a29d8 Workaround for LWG 2408: SFINAE-friendly std::iterator_traits.
Now available for GCC(libstdc++v3) < 4.5 and MSVC 12.0.
It means, there is no ambiguous about calling next/prior/... via ADL.
2015-02-05 23:04:36 +09:00
aa1448b77a Merge pull request #51 from Flast/develop
Support removing the C++11 standard reference wrappers.
2015-02-04 04:37:02 +08:00
73a5dde412 Merge remote-tracking branch 'official/develop' into fusion_adapters
Conflicts:
	test/sequence/adapt_struct.cpp
2015-02-02 07:06:52 +01:00
b60219eb8a Fix testcase for MSVC 10.0.
MSVC 10.0/11.0 have <tuple> but don't compile variadic templates.
2015-02-02 04:08:13 +09:00
c6c9d872d3 Factored out the IS_TPL macro. 2015-02-01 17:20:31 +01:00
fc1a60e8e6 Adding typename in front of BOOST_TYPEOF is only needed in MSVC when we check the type of a template. 2015-01-30 18:17:36 +01:00
de43345b34 BUGFIX: Forwarding template parameters for MSVC to deduced_attr_type context thanks to BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS. 2015-01-25 23:05:42 +01:00
382c1e5645 BUGFIX: Expands typename for attribute_type only in case it is really a dependent scope. 2015-01-25 21:48:49 +01:00
588896de45 Revert "BUGFIX: MSVC doesn't accept typename to specify a dependent scope within"
This reverts commit 98247fb97f.
2015-01-25 16:14:45 +01:00
70d5b40a7c BUGFIX: Expands typename for attribute_type only in case it is really a dependent scope. 2015-01-25 16:10:34 +01:00
e4d43b00c1 Cosmetic 2015-01-22 01:02:28 +09:00
995202044c Basic move support for c++03 map 2015-01-21 23:11:57 +09:00
b3c560d3b6 Fix some typos. 2015-01-21 19:38:06 +09:00
3955f76511 Cosmetic 2015-01-21 17:27:14 +09:00
98247fb97f BUGFIX: MSVC doesn't accept typename to specify a dependent scope within
template specialization in C++03 as standard specify it.

This also works on GCC 4.6, 4.8.2 and 4.9 in C++11 and C++03, I needlessly
added this during some debugging where the compiler was telling me to do so.

I shouldn't have followed it's advice, as this breaks compatibility with
other compilers.
2015-01-21 00:28:13 +01:00
5e4978b870 Fix some warnings within tests. 2015-01-21 01:13:19 +09:00
326104a9b7 Fix unexpected overload resolution on MSVC. 2015-01-18 14:15:20 +09:00
ce8bf1079a Support removing the C++11 standard reference wrappers. 2015-01-15 18:58:33 +09:00
28598a7919 doc: Plural form and links. 2015-01-15 18:24:44 +09:00
0360dc44b2 Fix documentation typo of sequence concepts. 2015-01-15 17:48:17 +09:00
fbd6a8a50f Fixing template parameter order and a function parameter type. 2015-01-15 16:13:12 +09:00
e572c382f7 Fixing a broken table notation. 2015-01-15 14:57:48 +09:00
205c0f1eb4 update overview of directory structure. 2015-01-12 23:34:13 +09:00
d7c918e36f Fix ODR-used violations. 2015-01-11 02:15:45 +09:00
f872d1326a The ctor should check which is seqence or not. 2015-01-11 01:15:52 +09:00
54dedc5e98 Update auxiliary.hpp 2015-01-08 19:20:56 +09:00
af1bc25783 - disabling test for now (todo later)
- removing irrelevant tuple test
2015-01-05 17:43:35 +08:00
7d641cbc8f - Update generated preprocessed files
- Disable variadics for MSVC 2013 (flaky compiler still)
2015-01-05 15:49:06 +08:00
f349d48a3f Merge branch 'develop' of github.com:boostorg/fusion into develop 2015-01-05 15:04:34 +08:00
97c863eaa0 (Re)Generating preprocessed files. 2015-01-05 15:03:54 +08:00
85ce2a3eb2 Fix link of result_of::remove_if. 2015-01-05 08:24:14 +09:00
a2269f447e Fix requirements documentation of replace_if. 2015-01-05 08:23:21 +09:00
51d638f51c Fix documentation of transform correctly. 2015-01-05 08:19:31 +09:00
5eb36f590a Merge pull request #47 from Flast/develop
Add tests and flat includes.
2014-12-18 10:38:41 +08:00
b7febc887a Flat includes for std::tuple 2014-12-09 19:54:53 +09:00
45aa4ccf95 Merge pull request #46 from Flast/develop
Improve fusion::deque
2014-12-05 06:17:59 +08:00
24e95c34fb Add tests for #9914 2014-12-05 01:39:27 +09:00
223c7d520f Fix overload resolution failure.
Because the ctor `deque(U &&...)` is also performed as `deque(U const&...)`.
2014-12-05 01:39:27 +09:00
ed9880c161 Fix out of bounds access within {front|back}_extended_deque with empty deque.
The insertion point is not correct with empty deque since the range
{next_down, next_up} is not half-open range.
2014-12-05 01:39:27 +09:00
d05b854c58 Correct variadic based fusion::deque requirements 2014-12-02 08:37:58 +09:00
d185bd5df6 Use call_param for deducing type better. 2014-12-02 08:37:58 +09:00
aa4d67258b Fixed for non rv-ref supporting compiler. 2014-11-30 02:04:32 +09:00
147c76573e Merge pull request #45 from Flast/workaround/for-msvc
Workarounds for MSVC
2014-11-26 07:13:44 +08:00
fbbfc16d2d Workaround for MSVC8.0
I'm not sure why it doesn't compile...
2014-11-26 01:49:07 +09:00
9ab7774fd7 Replace some usage of std::forward to static_cast.
For more details, See inline comment of include/boost/fusion/support/config.hpp .
2014-11-26 01:35:55 +09:00
687668c110 Fix sprious compile error on VS2015 Preview.
MSVC 2015 Preview will treat unary-ctor call as a variable declaration
even if member call follows, which member has the same name with any
other class (i.e. there are no relations between the member and such
class). This issue already reported at [1].

1. https://connect.microsoft.com/VisualStudio/feedback/details/1037783/unary-ctor-call-v-s-variable-decl

    struct foo
    {
        foo(int) {}
        void set() {}
    };

    struct set;

    int main()
    {
        int i;
        foo(i).set(); // VS2015 try to decl `i` here and conflict with above.
    }
2014-11-24 03:07:16 +09:00
2093bf82db Merge pull request #44 from Flast/develop
Fix wrong include
2014-11-19 21:15:46 +08:00
4dd4773d3d Fix wrong include
and add tests for move.
2014-11-19 17:38:16 +09:00
08a6ea79b3 Merge pull request #43 from Flast/vs2015/name-hiding-warning
Mitigate too noisy name-hiding warnings (C4453) on VS2015 Preview.
2014-11-19 16:04:28 +08:00
9075da0790 Mitigate too noisy name-hiding warnings (C4453) on VS2015 Preview.
NOTE: This commit doesn't contain new preprocessed file to review easier.
2014-11-19 13:20:36 +09:00
f68b7b1f5a Merge pull request #42 from daminetreg/fusion_adapters
ADAPT_STRUCT macros supporting type deduction fixes for Clang
2014-11-19 08:33:30 +08:00
2a50f7caad Better patch from Kohei Takahashi! Allows good forwarding on C++11
while still allowing C++03.
2014-11-19 08:31:35 +08:00
c952a5c053 Const correctness fix for result_of::deref_data 2014-11-19 07:54:37 +08:00
bc07cac46c Fix use of non-static "obj" in unevaluated expression context of decltype. 2014-11-18 23:39:53 +01:00
b5018586aa Breaking change of BOOST_FUSION_ADAPT_ADT_NAMED and BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED API to be coherent with the expressions of BOOST_FUSION_ADAPT_ADT thanks to correct usage of BOOST_FUSION_PROXY_PREFIX. 2014-11-18 23:38:47 +01:00
c65000eac8 Merge pull request #41 from Flast/patch-2
`result_of::at<Seq, N>::type` is't defined when sizeof of sequence is less than N
2014-11-19 06:33:04 +08:00
d10f40c489 Merge pull request #40 from Flast/patch-1
result_of::size::value and result_of::size::type::value should be same type
2014-11-19 06:22:41 +08:00
18fa262a4e BUGFIX: Use of non-static member in typedef to retrieve the type. clang doesn't allow this even in unevaluated context like decltype. 2014-11-18 22:50:07 +01:00
c9ae4fc886 result_of::at<Seq, N>::type is't defined when sizeof of sequence is less than N, close #6507, #7651
Original proposals suggest making as a hard error (by MPL asssert /
static assert), however this change just doesn't define due to
SFINAE-friendly.
2014-11-19 02:05:58 +09:00
0f34b3a692 Fixed C++11 implementation of map's result_of::deref_data to return a
reference as expected.
2014-11-18 23:11:20 +08:00
68b4683e95 added missing include 2014-11-18 14:12:07 +08:00
63045e8611 remove unnecessary actor to tighten ADL resolution. the one above it is
sufficient.
2014-11-15 09:54:21 +08:00
f3fa7a1dc6 Fix for fusion pair to make the compiler select the proper copy
constructor and remove a viable, but wrong, constructor. test added.
2014-11-15 09:35:50 +08:00
cc9b043168 result_of::size::value and result_of::size::type::value should be same type, rels to: #7304. 2014-11-13 15:44:30 +09:00
a4660f41af added failing test as per https://github.com/boostorg/fusion/pull/38 2014-11-13 09:03:37 +08:00
6da646631c Merge pull request #38 from ldionne/develop
Fix compilation error with as_deque in C++11.
2014-11-13 07:12:55 +08:00
0ed591d214 Fix compilation error with as_deque in C++11. 2014-11-12 14:59:28 -05:00
15dd9c9d97 test that adapted members can actually be expressions 2014-11-12 11:13:19 +08:00
1dccb553ea Merge pull request #35 from Flast/develop
Minor fixes
2014-11-12 07:39:17 +08:00
a2e32493bb Merge pull request #37 from ldionne/develop
Use BOOST_CONSTEXPR instead of (nonexistant) BOOST_CXX14_CONSTEXPR. (reverted from commit 3280267ed4)
2014-11-12 07:35:19 +08:00
3280267ed4 Merge pull request #37 from ldionne/develop
Use BOOST_CONSTEXPR instead of (nonexistant) BOOST_CXX14_CONSTEXPR.
2014-11-12 07:23:14 +08:00
b7f95ee853 Use BOOST_CONSTEXPR instead of (nonexistant) BOOST_CXX14_CONSTEXPR. 2014-11-11 18:02:03 -05:00
dec799caa8 Merge pull request #36 from ldionne/develop
Fix hard compilation error with nested fusion::cons.
2014-11-12 05:53:39 +08:00
d93e675408 Fix hard compilation error with nested fusion::cons. 2014-11-11 10:23:36 -05:00
06cac9da1a Fix document typo 2014-11-10 16:03:36 +09:00
465c3f273b result_of::{copy,move,swap} are now SFINAE-friendly 2014-11-10 14:38:42 +09:00
6314f1a450 fusion::swap should be inline 2014-11-10 14:34:02 +09:00
916df63a14 Add result_of::{copy,move}, close #5886
Thanks to: Jamboree
2014-11-10 14:32:23 +09:00
b637f2569b Merge pull request #34 from Flast/develop
Misc...
2014-11-09 07:26:20 +08:00
95d2a111ab Add tests for #3225 2014-11-09 02:55:59 +09:00
ff56beaf55 Remove use of boost::blank, close #8622 2014-11-09 00:49:29 +09:00
5dc9f457a0 Merge remote-tracking branch 'origin/develop' into develop 2014-11-09 00:33:56 +09:00
5ff35b6540 Merge pull request #33 from mkurdej/fix/doc-spelling
Fix spelling errors in documentation.
2014-11-08 06:30:29 +08:00
a62956bb12 Fix spelling errors in documentation. 2014-11-07 18:34:18 +01:00
bd5ce92e10 Replace type_traits::ice_and with well documented mpl::and_. 2014-11-08 02:32:06 +09:00
834250a4c8 Describe find(_if) return type clearly. 2014-11-07 13:20:43 +09:00
a87a665072 Fix description of find_if document. 2014-11-07 12:40:25 +09:00
7a7b225fb1 Add boost_tuple_iterator_identity to compare iterator correctly.
And add test for boost_tuple_iterator.
2014-11-06 17:10:31 +09:00
5f416e24fc Use category_of to get correct iterator category. 2014-11-06 17:10:31 +09:00
a7e9bb2df4 Fix to meet constexpr requirements 2014-11-06 17:10:31 +09:00
20ee8d192a Fix missing includes, close ticket #8457.
e.g. Now can compile following simple case.

    #include <boost/fusion/iterator/iterator_facade.hpp>
    #include <boost/fusion/iterator/iterator_adapter.hpp>

    struct null_iterator
        : iterator_facade<null_iterator, forward_traversal_tag> {};

    struct null_adapter
        : iterator_adapter<null_adapter, null_iterator> {};
2014-11-06 17:10:25 +09:00
bf10307430 Merge pull request #32 from Flast/develop
Minor document fixes.
2014-11-03 17:38:43 +08:00
4835310623 Remove unnecessary header, see 5adcb5b 2014-11-03 06:25:08 +09:00
ba0e753cff Fix document typo, close #6090. 2014-11-03 06:24:20 +09:00
b7f0f8856c Tuple document's cosmetic changes 2014-11-03 06:24:20 +09:00
416cd2e2d9 Fix dead links 2014-11-03 06:24:20 +09:00
f3921fee95 Fix tuple heading, close #5324 2014-11-03 06:24:20 +09:00
ec3cefd86f Merge pull request #31 from Flast/develop
Fix three test failures on older and c++03 compiler.
2014-11-02 20:49:23 +08:00
0a13aa5ee4 Change the result_of behaviour with BOOST_RESULT_OF_USE_DECLTYPE
to make consistency between boost::result_of.
2014-11-02 15:08:56 +09:00
7ef4b03249 Fix typo/missing copyright notice, reported by Boost Inspection Report. 2014-11-01 22:12:11 +09:00
f716d2f410 Merge various hotfixes into develop. 2014-11-01 22:00:45 +09:00
1b4acaa1b0 Fix unexpected lookup failure with GCC < 4.5. 2014-11-01 21:16:26 +09:00
4c110d9a88 Regen preprocessed headers. 2014-11-01 20:50:11 +09:00
f73b5362c5 Fix test error with C++03 mode, due to C++11 using-declaration. 2014-11-01 16:53:37 +09:00
df7b766247 Merge pull request #30 from Flast/bugfix/10190/declval
Use boost::declval instead of std::declval, close #10190.
2014-10-31 10:21:38 +08:00
3b3da1a10a Use boost::declval instead of std::declval, close #10190.
Thanks-to: Niklas Angare
2014-10-31 10:09:30 +09:00
6b6d613e15 Merge pull request #29 from Flast/bugfix/msvc-10.0
Fix compile error on MSVC-10 and 11 due to no variadic templates.
2014-10-31 08:21:16 +08:00
c10b94472d Fix compile error on MSVC-10 and 11 due to no variadic templates.
see http://thread.gmane.org/gmane.comp.lib.boost.devel/255086

Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-30 19:44:48 +09:00
101d9d5505 Merge pull request #28 from daminetreg/fusion_adapters
develop merged into fusion_adapters branch
2014-10-29 09:42:55 +08:00
0ffc0f04e3 Merge pull request #27 from Flast/bugfix/misc
Fix some misc issues
2014-10-29 07:22:39 +08:00
c6cb25846c Fix doc typo and describe about c++11 make_map.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-28 18:34:24 +09:00
8dc502d33a Remove dup of internal macro
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-28 14:25:04 +09:00
179e36fa42 Do not expand BOOST_NO_CXX11_RVALUE_REFERENCES while preprocessing.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-28 14:24:48 +09:00
90206f5da9 Fix result type mismatch
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-28 11:45:47 +09:00
ae23ffb8b6 Fix include guard mismatch
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-28 11:45:47 +09:00
5ae01ad6a9 - Added sfinae test case for fold
- Some cleanup
2014-10-28 09:06:42 +08:00
d5eb1e793c Merge pull request #26 from ldionne/master
Improve support for constexpr in fusion::nil and its iterators.
2014-10-28 08:12:04 +08:00
3933df13fb Merge pull request #26 from ldionne/master
Improve support for constexpr in fusion::nil and its iterators.
2014-10-27 22:29:56 +08:00
cdfb1a46b3 Improve support for constexpr in fusion::nil and its iterators. 2014-10-27 10:09:26 -04:00
2f850604e8 Merge remote-tracking branch 'official/develop' into fusion_adapters 2014-10-27 14:00:49 +01:00
c704efb49c correct fix for ticket 10676. this is a temporary fix until we overhaul the fold implementation. 2014-10-27 19:45:38 +08:00
06a46de636 Merge pull request #18 from Flast/fix/test/tr1_tuple
Fix test error on non c++11 environment; Boost.TR1 is deprecated.
2014-10-26 22:07:28 +08:00
3192da28e6 Merge pull request #25 from daminetreg/fusion_adapters
BOOST_FUSION_ADAPT_*_ADT macros supporting type deduction
2014-10-23 08:48:07 +08:00
e50f5852e4 Changes the test cases, as the behaviour about const-qualifier for
attribute_type and attribute_const_type when type is deduced can be
different than when the type is provided.

Indeed when specifying attribute_type and attribute_const_type manually
it's possible to provide a type which isn't const qualified as
attribute_const_type. When deducing the types from the get_expr, a const
and a non const qualified type is taken respectively for attribute_type
and attribute_const_type.
2014-10-22 22:06:31 +02:00
98b71154ec Merge pull request #24 from Flast/bugfix/invoke
Fix tickets #10443 completely (SFINAE-friendly invoke).
2014-10-22 19:08:07 +08:00
e014a1d173 Fix #10443 completely.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-22 19:42:48 +09:00
812e9e379e Fix wrong partial specializations.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-22 01:02:39 +09:00
ba723a2cad Merge pull request #23 from Flast/bugfix/cxx14-constexpr
Improve constexpr supports
2014-10-21 22:55:54 +08:00
020b22f9b9 Fix test for compiler not supporting BOOST_PP_VARIADIC. 2014-10-20 22:32:28 +02:00
3a28c3fd81 Updates the doc of ADAPT_ADTs macros 2014-10-20 21:35:01 +02:00
cfcdbe1195 Change adapt_assoc_tpl_adt to test type inference from templated type. 2014-10-20 21:25:07 +02:00
03ba146d84 lvalue typedef for acess::struct_member is a dependent scope to templated
parameter when used within BOOST_FUSION_ADAPT_ASSOC_TPL_ADT.

This fixes test sequence/adapt_assoc_tpl_adt.cpp.
2014-10-20 12:54:31 +02:00
acf25e3986 Merge pull request #22 from klemensbaum/master
Avoid unused parameter warning in BOOST_FUSION_DEFINE_STRUCT_INLINE
2014-10-20 17:57:59 +08:00
c921b9ca99 Avoid unused parameter warning in BOOST_FUSION_DEFINE_STRUCT_INLINE 2014-10-20 11:48:42 +02:00
6cad6bef99 fixes ticket #10443. invoke is now sfinae friendly. 2014-10-20 06:23:52 +08:00
3d19bf9d96 fixes ticket 10676. for now, we'll use tr1_result_of. we'll have to do an overhaul of the fold implementation because making it sfinae friendly goes deep down into the low level internals. 2014-10-20 05:55:48 +08:00
bebd553dd6 Use BOOST_CXX14_CONSTEXPR instead of BOOST_CONSTEXPR.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-19 23:46:36 +09:00
fdb6598194 Make fold as a single return stmt due to C++11 constexpr.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-18 22:49:09 +09:00
badf3f2a47 Fix forward declaration in conflict with constexpr.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-18 22:49:08 +09:00
bcc2530f19 Do not expand BOOST_{CXX14_}CONSTEXPR while preprocessing.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-18 22:49:08 +09:00
ec9530eb15 Merge pull request #21 from Flast/bugfix/include-guard-mismatch
Fix include guard mismatch.
2014-10-17 21:14:57 +08:00
6adde75b54 Merge pull request #20 from Flast/hotfix/include-guard-mismatch
Fix include guard mismatch.
2014-10-17 21:14:39 +08:00
73f058b381 Fix include guard mismatch.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-17 18:53:45 +09:00
1b2e62f4b9 Fix include guard mismatch.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-17 18:53:03 +09:00
2b5da49628 lvalue access::struct_member was wrongly set to be adt_attribute_proxy<> instead of adt_attribute_proxy<>::type. Shame on me. 2014-10-12 16:25:59 +02:00
cd0d3ce09a add comments for readability. 2014-10-12 14:51:34 +02:00
644d72ccfe adds type deduction support for BOOST_FUSION_ADAPT_ASSOC_ADT. 2014-10-12 14:51:04 +02:00
103b02fda2 add test for BOOST_FUSION_ADAPT_ADT_NAMED deducing types. 2014-10-12 12:50:56 +02:00
d0b3d163c5 Merge pull request #19 from mgaunard/master
avoid unused argument warning in map_impl
2014-10-10 06:11:22 +08:00
561b762f57 avoid unused argument warning in map_impl 2014-10-09 14:17:17 +02:00
b8c65b976c Fix test error on non-c++11 env.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-09 00:57:37 +09:00
790810757a Rename the test tr1_tuple_auto_conv to std_tuple_auto_conv.
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-10-09 00:56:17 +09:00
c8ffc6498b add documentation for BOOST_FUSION_ADAPT_ADT and type deduction. 2014-10-07 21:39:18 +02:00
0f2f1776be Merge pull request #17 from jzmaddock/patch-1
Change to test std::tuple now that Boost.TR1 is deprecated
2014-09-27 22:28:07 +08:00
f869aa1591 Change to test std::tuple now that Boost.TR1 is deprecated and due to be removed. 2014-09-27 13:22:56 +01:00
aa7b0a6972 Factoring out the workaround to access last variadic parameter.
Indeed when some parameter are BOOST_PP_EMPTY the last parameter is
accessed correctly but results in a compilation error which doesn't stop
some compiler (e.g. g++) to go through the preprocessing pass and still
compile the binary correctly. But to avoid the error message I used a
workaround which behaves better. I preferred factoring it out to make
clear that there are some reason why this element is strangely accessed.
2014-09-23 23:07:00 +02:00
69e67cd1ad BUGFIX: When VARIADICS are active supporting any of the input combination.
That is : BOOST_FUSION_ADAPT_AUTO, omitting type or specifying type.
2014-09-17 00:47:52 +02:00
f0bc2a2ac1 Fix dependents scopes and typedefs with typename keywords. 2014-08-26 23:32:26 +02:00
727f49b49e Improve adapt_adt test to check more case with type deduction. 2014-08-26 22:00:16 +02:00
0eedba5796 Merge pull request #16 from wmamrak/patch-1
Update according to ticket #10403.
2014-08-26 22:29:38 +08:00
0873af5d3c Update according to ticket #10403.
Someone more familiar with this formatting please verify my changes :)
2014-08-26 14:23:32 +02:00
5102d6874f Merge pull request #15 from danieljames/metadata
Create metadata file.
2014-08-19 06:08:17 +08:00
b6c2e9e10b Add metadata file. 2014-08-18 14:59:22 +01:00
7b089aa589 Add support for BOOST_FUSION_ADAPT_ADT to either deduce types or use specified ones. 2014-08-10 17:09:57 +02:00
52d280983b Fix some includes for consistency and use correct accessors macros.
Since we have accessors macros for wrapped attributes we better use them,
to improve readability of the macros.
2014-08-10 15:27:55 +02:00
fe3682ac02 add type deduction support to BOOST_FUSION_ADAPT_ADT_C_BASE. 2014-08-10 15:15:31 +02:00
c8e4172021 Fix indentation. 2014-08-10 15:11:34 +02:00
64c3fc568c Merge pull request #14 from gnzlbg/develop
Initial constexpr support
2014-08-06 20:15:53 +08:00
c2abefbab8 Initial constexpr support
This allows to use, e.g., boost::fusion::fold within constexpr functions.

The BOOST_CONSTEXPR macro is used to declare functions constexpr.
2014-08-06 11:09:40 +02:00
904ec1e676 Merge pull request #13 from daminetreg/fusion_adapters
BOOST_FUSION_ADAPT_ASSOC_STRUCT* deducing types
2014-07-30 06:03:39 +08:00
0715e996e2 Fix the DEFINE_ASSOC_STRUCT macros to use specific FILLER macros, because they cannot need type deduction. 2014-07-29 22:24:23 +02:00
047b052548 Add missing include. 2014-07-29 22:22:54 +02:00
4f941d9760 Merge pull request #12 from fiesh/develop
add automatic hash function creation
2014-07-28 21:03:12 -03:00
fcb579f208 Documented BOOST_FUSION_ADAT_ASSOC* macros with type inference. 2014-07-27 17:19:15 +02:00
a54c543dd7 Adapted test cases for adapt_assoc_tpl_struct with type deduction. 2014-07-27 16:31:15 +02:00
4b0bed40f7 Renamed macro wrapping attribute to a more descriptive name. 2014-07-27 16:07:47 +02:00
a13d1346f6 Adapted tests of assoc_struct to the type-deducing version of the ADAPT* macros. 2014-07-27 15:51:12 +02:00
d71cf19e0f fix documentation, introduce "See also" block 2014-07-24 17:44:37 +02:00
70410d1e07 replaced tabs with 4 spaces 2014-07-24 14:45:45 +02:00
f7685b1194 add automatic hash function creation 2014-07-24 14:22:55 +02:00
a5d6fd0800 Test adapt_assoc_tpl_struct checking support for type deduction. 2014-07-23 02:49:28 +02:00
5422ba7f8f Adds the possibility to omit the member type in ADAPT_ASSOC* macros usage.
This feature is enabled when BOOST_PP_VARIADICS also is, as it rely on it.
A placeholder for the type can be used when BOOST_PP_VARIADICS isn't
active.
2014-07-23 02:42:30 +02:00
17e49ba448 Adds accessors for the wrapped attributes and provide preliminary support for type deduction to ADAPT_ASSOC* macros. 2014-07-23 00:36:07 +02:00
1ab5eef418 Merge pull request #11 from daminetreg/fusion_adapters
ADAPT_STRUCT_NAMED macros supporting type deduction
2014-06-26 03:57:43 +08:00
34fac0c449 Fix ADAPT_*_C / ADAPT_*_C_BASE macros responsible.
These macros are used to handle generation of boilerplate code or each
member to add to the adapted sequence. And in the commit
abff92ab65 we changed the signature of these
macros to handle generation of proxied object field type deduction, this
change simply fix the related macros.
2014-06-25 00:45:38 +02:00
bf66c12cde Fix the unit test of adapt_struct for consistency with other tests of the same kind. 2014-06-25 00:25:14 +02:00
dd0cee1721 Documented type deduction for ADAPT_STRUCT_NAMED. 2014-06-25 00:24:26 +02:00
abff92ab65 Add support for members types deduction to the ADAPT_STRUCT_NAMED macro. 2014-06-25 00:11:40 +02:00
f64c396c66 Merge pull request #10 from daminetreg/fusion_adapters
Fixes the DEFINE_STRUCT* macros after addition of type deduction for ADAPT_STRUCT
2014-06-18 05:54:22 +08:00
c008b0dc3a Fixes the BOOST_FUSION_DEFINE_STRUCT* macros with an appropriate attributes FILLER macro.
As the BOOST_FUSION_ADAPT_STRUCT_FILLER* macros were changed to handle type
deduction, this breaks the usage that BOOST_FUSION_DEFINE_STRUCT makes from
them.

That is BOOST_FUSION_DEFINE_STRUCT_IMPL expects a simple tuple, while we
now provide a tuple containing the size of a nested tuple which either has
or not the type provided. But in the case of the DEFINE* macros it would be
a non-sense to support this kind of API as a field being defined cannot be
deduced. :)
2014-06-17 22:35:10 +02:00
f022949764 Merge pull request #9 from daminetreg/fusion_adapters
Version of ADAPT_STRUCT that does not require specifying the types of the fields
2014-06-15 08:42:32 +08:00
ae0c976926 Fixes missing inclusion of BOOST_PP_LESS.
This was bringing the std::pair adapt test to fail, because it wasn't
including BOOST_PP_LESS like the other tests.
2014-06-14 12:11:44 +02:00
af812e6207 Fixed ADAPT_STRUCT_FILLER macro call for consistency. 2014-06-14 12:09:04 +02:00
f0eab528e9 Fix adapt_struct test which was missing an using keyword. 2014-06-14 11:40:51 +02:00
9a501785e6 Removed the old auto_* headers. 2014-06-13 23:09:39 +02:00
0e50a02fbc Remove deleted unit tests from Jamfile. 2014-06-13 23:09:39 +02:00
2e60ba6f29 Fixed typos and inconsistencies in ADAPT_STRUCT documentation. 2014-06-13 23:09:39 +02:00
4cf96e14f3 Added test for the new ADAPT_STRUCT API capable to deduce member types. 2014-06-13 23:09:39 +02:00
0000ca263b Removing AUTO_ADAPT_STRUCT_NAMED, AUTO_ADAPT_ASSOC_STRUCT and AUTO_ADAPT_ASSOC_STRUCT_NAMED.
As discussed with Agustín Bergé and Joel de Guzman on https://github.com/boostorg/fusion/pull/3,
it's better to remove the separate macro for the type deducting macros, and
to instead support a flexible API allowing backward compatibility and type
omission.

This is what ADAPT_STRUCT and ADAPT_STRUCT_TPL now provides. All other
macros will be improved in the same way in the following commits.
2014-06-13 23:09:39 +02:00
6483cf4058 Adding documentation of the new ADAPT_STRUCT and ADAPT_STRUCT_TPL macros,
capable of deducing type.
2014-06-13 23:09:39 +02:00
04ce8a788b Enabled new ADAPT_STRUCT_API for ADAPT_TPL_STRUCT. 2014-06-13 23:09:38 +02:00
ce3f2d6020 Added new ADAPT_STRUCT API support for the ADAPT_STRUCT_AS_VIEW macro. 2014-06-13 23:09:38 +02:00
687b2cf097 Factoring out of adapt_struct.hpp all the FILLER_* macros details.
As of BOOST_FUSION_ADAPT_STRUCT without type deduction, there were only
simple attributes filler. Now this need more complex logic to handle both
API: the backward compatible one with type specificiation, the one without
type specification and the non-variadic one which enables omitting the type
specification by providing BOOST_FUSION_ADAPT_AUTO instead of the type.

That's why I extracted the FILLER_* macros details in a separate source
file.
2014-06-13 23:09:38 +02:00
c851252f65 Renaming macros for ADAPT_STRUCT to deduce type or take provided attribute types. 2014-06-13 23:09:38 +02:00
557b3d2dc6 Fix detection of member_type parameter emptiness for BOOST_FUSION_ADAPT_STRUCT.
As BOOST_PP_IS_EMPTY is not a general purpose emptiness checker, we limit
the ways it can be used.
2014-06-13 23:09:38 +02:00
7ef202b794 Moved BOOST_FUSION_ADAPT_STRUCT implementation details to detail/adapt_base.hpp 2014-06-13 23:09:38 +02:00
02b776360a FEATURE: BOOST_FUSION_ADAPT_STRUCT can now also be called completely with
variadics arguments.

The following signature is possible :

 BOOST_FUSION_ADAPT_STRUCT(
        struct_name,
        member_name0,
        (BOOST_FUSION_ADAPT_AUTO, member_name1)
        (member_type2, member_name2)
	member_name3,
        ...
        )
2014-06-13 23:09:38 +02:00
37fc1443ad Improve the BOOST_FUSION_ADAPT_STRUCT macro to work also when there is no variadic support.
This enable the following flexible macro signature when there is
no BOOST_PP_VARIADICS support:

BOOST_FUSION_ADAPT_STRUCT(
    struct_name,
    (member_type0, member_name0)
    (BOOST_FUSION_ADAPT_AUTO, member_name1)
    (,member_name2)
    ...
    )

If BOOST_PP_VARIADICS is active then there is quite more flexibility as it
allows to avoid the type specification:

BOOST_FUSION_ADAPT_STRUCT(
    struct_name,
    (member_type0, member_name0)
    (BOOST_FUSION_ADAPT_AUTO, member_name1)
    (,member_name2)
    (member_name3)
    ...
    )
2014-06-13 23:09:29 +02:00
944c363787 Remove dependency to variadics macros for the old API not deducing types. 2014-06-13 23:07:49 +02:00
6f6bfb3a27 EDITORIAL: Cleaning the ADAPT_STRUCT which can deduce types. 2014-06-13 23:07:32 +02:00
04cbf0d4c6 BUGFIX: Presents the correct field name as a string even if type is deduced. 2014-06-13 23:07:32 +02:00
703bff4ff9 FEATURE: Types of a struct can freely pe provided or deduced, following the user preferences. 2014-06-13 23:07:32 +02:00
7e1c6cdf47 FEATURE: Type deduction for BOOST_FUSION_ADAPT_STRUCT_C_BASE, with preliminary support for providing or deducing the type. 2014-06-13 23:07:16 +02:00
3ca94f5762 DOC: Add some comments to help me understand the adapt macros. 2014-06-13 23:04:09 +02:00
c052b4b452 FEATURE: Making BOOST_FUSION_AUTO_ADAPT_STRUCT variadic. 2014-06-13 23:04:09 +02:00
166132789a DOC: Document the BOOST_FUSION_AUTO* macros.
This documents the AUTO_ADAPT macros :
  * BOOST_FUSION_AUTO_ADAPT_STRUCT
  * BOOST_FUSION_AUTO_ADAPT_STRUCT_NAMED
  * BOOST_FUSION_AUTO_ADAPT_ASSOC_STRUCT
  * BOOST_FUSION_AUTO_ADAPT_ASSOC_STRUCT_NAMED
2014-06-13 23:04:09 +02:00
435fb5c29f EDITORIAL: Reorganize imports. 2014-06-13 23:04:09 +02:00
934463c7b4 FEATURE: BOOST_FUSION_AUTO_ADAPT_ASSOC_STRUCT_NAMED now allows defining a Random Access Sequence and an Associative sequence without providing the type. 2014-06-13 23:04:08 +02:00
a5f87696f2 EDITORIAL: Rename the macro for type deduction to a more expressive and correct name. 2014-06-13 23:04:08 +02:00
2d37b9c22c EDITORIAL: Fixes typos. 2014-06-13 23:04:08 +02:00
f7b14aee35 FEATURE: BOOST_FUSION_AUTO_ADAPT_ASSOC_STRUCT now allows defining a Random Access Sequence and an Associative sequence without providing the type. 2014-06-13 23:04:08 +02:00
8a132ea44a BUGFIX: Fix include path. 2014-06-13 23:04:08 +02:00
5ffab5001e REFACTORING: reused the BOOST_FUSION_AUTO_ADAPT_STRUCT_NAMED_NS macro in BOOST_FUSION_AUTO_ADAPT_STRUCT_NAMED to mimic the non-AUTO versions. 2014-06-13 23:04:08 +02:00
e58bd91f27 EDITORIAL: fixed indentation. 2014-06-13 23:04:08 +02:00
5aa9a89fb8 FEATURE: BOOST_FUSION_AUTO_ADAPT_STRUCT_NAMED_NS which allows listing class attributes to adapt without specifying types. 2014-06-13 23:04:07 +02:00
0d7ad9f6e2 FEATURE: BOOST_FUSION_AUTO_ADAPT_STRUCT_NAMED that does not require specifying the types of the fields. 2014-06-13 23:04:07 +02:00
946957d3dc EDITORIAL: Change parameter names for consistency. 2014-06-13 23:04:07 +02:00
3f965e00d3 #9516 BOOST_FUSION_AUTO_ADAPT_STRUCT that does not require specifying the types of the fields. 2014-06-13 23:04:07 +02:00
10d363837a Merge pull request #8 from Flast/pr/msvc-10.0/test
Fix test error in msvc-10.0
2014-06-12 17:59:44 +08:00
25bb75e3f8 Fix test error in msvc-10.0
Including fusion/adapted/std_tuple.hpp will occur compile error.
  Therefore, entire test should be ignored.

Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-12 12:24:46 +09:00
2cc2729f51 Merge pull request #7 from Flast/pr/adapt/tuple
Additional supports adapting (BoostTuple implementations
2014-06-09 21:11:03 +08:00
059c041659 Add test for convert seq to std::tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-09 21:59:06 +09:00
f7adae2b3d Add test for convert seq to tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-09 21:59:06 +09:00
f5fe438f14 Add mpl::clear implementation for std::tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-09 21:59:05 +09:00
38bcd6e779 Add mpl::clear implementation for Boost.Tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-09 21:59:05 +09:00
219b4124d7 Add convert implementation for std::tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-09 21:59:05 +09:00
39785ddb0e Add convert implementation for Boost.Tuple
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-05-29 01:05:19 +09:00
a0c1ec2018 Merge branch 'develop' 2014-05-27 08:45:08 +08:00
1fde7cc293 Merge branch 'origin/develop' 2014-05-01 13:46:22 +08:00
74a5d8804c reverting support for ref pending review 2014-05-01 13:44:45 +08:00
8e4dd16b2d Merge pull request #5 from ericniebler/nil-hpp
Move definition of struct nil_ into its own header
2014-04-24 08:55:17 +08:00
d2633616dc fix copyright 2014-04-23 16:50:58 -07:00
01ed85e0e5 put struct nil_ in its own header to fix incomplete type error with nvcc 2014-04-23 16:47:03 -07:00
6c904779af fixes #5208 2014-04-09 10:03:23 +08:00
41e18be5cf Merge pull request #4 from jamboree/develop
flatten/flatten_view/ref
2014-04-04 14:50:25 +08:00
fd3a18ce1a flatten/flatten_view/ref 2014-04-04 14:38:38 +08:00
21a2621cce Merge branch 'origin/develop' 2014-03-18 23:44:59 +08:00
efad85a925 fixes Ticket #9455 2014-03-18 23:43:23 +08:00
ad90e29cd6 Merge branch 'origin/develop' 2014-03-17 11:04:37 +08:00
72912925cb Merge pull request #3 from correaa/patch-1
Update tag_of.hpp

Declare std::array with struct keyword, as per C++11, not class.
2014-02-08 10:28:43 +00:00
da294ebc6d Update tag_of.hpp
avoid mismatched-tags warning in clang
2014-02-07 22:24:29 -08:00
beba23f36c Merge pull request #2 from alfC/patch-1
Changed static assertion that checks array size
2014-02-04 11:52:57 -08:00
a2874ea5fe Changed static assertion that checks array size
to a more standard way. This avoids an obscure error involving `extension::std_array_size<Array>`
2014-02-04 11:33:06 -08:00
a9ed19e3b8 Merge pull request #2 from ericniebler/gpu-enabled-2
Add function annotations necessary to run Fusion on GPUs
2014-01-28 15:04:23 -08:00
26b28eff93 Merge remote-tracking branch 'upstream/develop' into gpu-enabled-2 2014-01-28 14:35:41 -08:00
e113b31fdd final gpu-enabling tweaks 2014-01-28 14:32:03 -08:00
44d5dca98b Fixed test to work with an explicit operator bool 2014-01-26 19:06:16 -06:00
c04e912866 gpu-enable vector assign 2014-01-23 21:48:52 -08:00
125a8b5957 Merge remote-tracking branch 'upstream/develop' into gpu-enabled-2 2014-01-23 21:30:44 -08:00
e5b0f3c2e1 gpu-enable more functions, but not stream inserters and extractors 2014-01-23 21:30:18 -08:00
4b139914b1 Fixed issue with vectorN calling the wrong vector_dataN constructor 2014-01-23 08:31:50 -06:00
c4f9f0d1b6 gpu-enable functions 2014-01-22 23:55:53 -08:00
aa78028662 Updated changelog
removed unmaintained todo.txt

[SVN r80347]
2014-01-22 22:26:56 -08:00
ec5f8dc5ec Merge branch 'origin/master'
Conflicts:
	doc/html/index.html
	include/boost/fusion/container/map/map_fwd.hpp
2014-01-23 01:08:13 +08:00
867c7e5dfb Merge pull request #1 from ericniebler/preprocess
build target for preprocessing Fusion with wave
2014-01-21 15:12:28 -08:00
e1dc534877 build target for preprocessing Fusion with wave 2014-01-21 14:17:09 -08:00
14580550cf Merge r86524 (Correct broken links to C++ standard papers); fixes #9212
[SVN r86673]
2013-11-13 03:22:55 +00:00
f2e7a184a0 Correct broken links to C++ standard papers. Refs #9212.
[SVN r86524]
2013-10-30 12:51:24 +00:00
93447d3382 Merged 84441 to release
[SVN r86251]
2013-10-12 01:35:27 +00:00
266a7622ba Fixes #9110
[SVN r86165]
2013-10-05 18:47:44 +00:00
de18e59c85 Fixes Ticket #7513
[SVN r86128]
2013-10-01 23:41:38 +00:00
94618528b6 Remove use of obsolete BOOST_NO_TEMPLATED_STREAMS macro.
It was only defined for no-longer-supported-gcc.

[SVN r86062]
2013-09-30 15:56:52 +00:00
a9335aa664 big merge from trunk
[SVN r85669]
2013-09-15 06:27:58 +00:00
8aef19648b big merge from trunk
[SVN r85668]
2013-09-15 06:16:39 +00:00
1f718e4520 Wave: Merging from trunk
[SVN r85641]
2013-09-10 12:47:28 +00:00
66ddb762d3 merge [84937] from trunk, fixes #8759
[SVN r85426]
2013-08-22 19:45:30 +00:00
e12f59ebf2 Add Jonathan Wakely's opinion from Boost ml 2013-07-07 23:17:42 +01:00
0e24ec0a85 Format 2013-07-06 01:03:18 +01:00
31b1ee7f73 Link N3257 paper and the latest Boost thread 2013-07-06 00:57:08 +01:00
53a1a74a10 Refine the ADL comment 2013-07-06 00:55:58 +01:00
1e2841c683 Add comment on conflicts with C++11 range access 2013-07-05 23:51:23 +01:00
17928ac385 Call build-project to build test from top dir 2013-07-05 23:47:48 +01:00
789b86fd6c Wrap #pragma warning BOOST_MSVC 2013-07-05 23:46:46 +01:00
abb15d1158 Add all-in-one header for std_array 2013-07-04 00:57:44 +01:00
cccbc785d6 Include missing array_size.hpp 2013-07-04 00:57:22 +01:00
6849e31db0 Ignore bin directory 2013-07-04 00:56:53 +01:00
6c130b9e44 Fix ticket number 2013-07-02 13:38:38 +01:00
a49eb03483 Fix links 2013-07-02 13:31:37 +01:00
93a1fc3b87 Initial version of std::array for Boost.Fusion
Functional, though ADL issues have not been solved (see README).
2013-07-02 13:28:20 +01:00
3b24ed44f8 specialization of convert_impl for map_tag, refs #8759
[SVN r84937]
2013-07-02 02:10:04 +00:00
7922147716 update fusion Nil template parameters to Nil_ to make ObjC happy. trac #5010
[SVN r84441]
2013-05-23 01:02:52 +00:00
13d00bd6c2 minor updates to fusion docs
[SVN r84440]
2013-05-22 23:28:12 +00:00
56d0d48eb9 added static assert when N is > size of vector
[SVN r84283]
2013-05-14 21:10:02 +00:00
e83960d3e9 allow map keys to be forward declared only
[SVN r84275]
2013-05-13 23:01:05 +00:00
92ee36a556 Fixes #8336
[SVN r84002]
2013-04-21 14:07:21 +00:00
52298c686e Fixes #8456
[SVN r84001]
2013-04-21 14:00:37 +00:00
80b4ce43c5 Fixes #8418
[SVN r84000]
2013-04-21 13:54:59 +00:00
b36426c8e3 patches from tongari: allow custom Associative Sequence which doesn't have fusion::pair
as elements.

[SVN r83455]
2013-03-16 07:28:23 +00:00
d354c5183b Tweaks for MSVC. MSVC version of map is not yet move enables so it is failing the move test
[SVN r82728]
2013-02-04 12:15:02 +00:00
fb3bd4cea8 minor cleanup
[SVN r82727]
2013-02-04 11:54:59 +00:00
9672fe5385 map move supported + value_at_impl added
[SVN r82726]
2013-02-04 11:52:58 +00:00
085c3c25ca more map tests (including move test)
[SVN r82725]
2013-02-04 11:52:18 +00:00
85119dbd21 added as_map
fixed bug: wrong iterator category for map_iterator

[SVN r82721]
2013-02-04 09:52:52 +00:00
764a31e9f5 fixed typo
[SVN r82714]
2013-02-04 06:22:50 +00:00
228401d898 More map tests and more API features implemented + tweaks to affected components
[SVN r82713]
2013-02-04 06:21:45 +00:00
aba201eb4e Added more map tests
[SVN r82712]
2013-02-04 06:20:10 +00:00
9c5d6bcc8c added pair < operator for case where key (first type) is the same.
[SVN r82709]
2013-02-04 04:10:29 +00:00
7b6cf39540 modern c++11 map implemented + various tweaks
[SVN r82708]
2013-02-04 03:49:34 +00:00
996f4152d2 modern c++11 map implemented
[SVN r82707]
2013-02-04 03:46:42 +00:00
d128c6f6aa Moving non-variadic map implementation to detail/cpp03 directory
[SVN r82701]
2013-02-03 11:50:48 +00:00
fec1da027c Cleanup deque to clearly separate the C++03 code from c++11 code
[SVN r82698]
2013-02-03 10:31:46 +00:00
a1a6e42590 Removing the preprocessed file generation which is meant for internal use only
[SVN r82697]
2013-02-03 10:13:41 +00:00
4272519a3c cleanup
[SVN r82670]
2013-01-31 15:56:00 +00:00
9dcdfa323f Better deque conversion
[SVN r82669]
2013-01-31 15:31:28 +00:00
5a520585d8 Fixes #7955
[SVN r82668]
2013-01-31 13:01:36 +00:00
1823f30420 Some cleanup
[SVN r82636]
2013-01-27 14:41:39 +00:00
f96bbef8fa MSVC (VC11) fixes for latest updates
[SVN r82634]
2013-01-27 12:15:26 +00:00
f1687bffcf Added LF at the end
[SVN r82632]
2013-01-27 10:14:40 +00:00
6c17c04ce6 Workaround for some tests on C++11 to allow disambiguation of && and const& arguments to ctors
[SVN r82631]
2013-01-27 10:14:16 +00:00
b7d02a8c55 + Fixes ticket #7914
+ C++11 implementations for make_deque, deque_tie and as_deque

[SVN r82630]
2013-01-27 07:17:01 +00:00
6a47d86d72 C++ fixes
[SVN r82629]
2013-01-27 07:13:58 +00:00
2f61e2b707 disabling some tests with errors on c++11
[SVN r82628]
2013-01-27 04:24:40 +00:00
ea0cad5800 Added fusion::move algorithm
[SVN r82550]
2013-01-19 14:37:00 +00:00
f9d6e05676 Applied patches for Tickets #7738, #7737 and #7646
[SVN r82348]
2013-01-04 01:43:06 +00:00
211b47b47d clarify in fusion docs that associative sequences are not checked for key uniqueness.
[SVN r81891]
2012-12-13 09:41:50 +00:00
6d265316ed Workaround for ObjC (mis)use of nil (from Mathias Gaunard)
[SVN r81628]
2012-11-30 02:31:23 +00:00
8d6200ef58 Removed usage of deprecated macros in Boost.Fusion and Boost.Spirit
[SVN r81569]
2012-11-26 18:44:46 +00:00
e1819c11b2 Remove usage of deprecated macros
[SVN r81452]
2012-11-21 03:12:31 +00:00
cfbbba272e Fixes for Ticket #7569 ( Compile Error using BOOST_FUSION_DEFINE_STRUCT_INLINE with VC10 and GCC <4.5 )
[SVN r81165]
2012-11-04 00:18:41 +00:00
d01148d339 Fixed typo
[SVN r81164]
2012-11-03 23:44:36 +00:00
fc38122f0f Merge from trunk
[SVN r81061]
2012-10-25 02:06:21 +00:00
940c594d3e Merge from trunk
[SVN r81060]
2012-10-25 02:06:04 +00:00
f760ed7b8f removing c++11 requirements in jamfile (mistakenly added)
[SVN r80865]
2012-10-05 06:15:02 +00:00
752f911a91 #7427 (Warning fixes in fusion)
[SVN r80812]
2012-10-02 01:12:19 +00:00
b57cd4ede9 - patch from nathan ridge
- fixed deque regression 

[SVN r80458]
2012-09-09 00:27:37 +00:00
a856857cb7 - Fixed code to allow decltype implementation of boost::result_of with BOOST_RESULT_OF_USE_DECLTYPE defined.
- Reverted sequence/iterator.hpp to original <correct-no-workaround> version.

[SVN r80396]
2012-09-04 13:42:14 +00:00
78ff3d8831 Fixed code to allow decltype implementation of boost::result_of with BOOST_RESULT_OF_USE_DECLTYPE defined.
[SVN r80395]
2012-09-04 13:40:38 +00:00
80799eed95 C++11 fixes for deque
[SVN r80392]
2012-09-04 05:04:26 +00:00
35ec74edbc C++11 fixes for deque
[SVN r80391]
2012-09-04 05:04:25 +00:00
106702d388 Fix to silence MSVC warnings (Nathan Ridge)
[SVN r80368]
2012-09-03 07:08:47 +00:00
4382b64aa7 Updated changelog
removed unmaintained todo.txt

[SVN r80347]
2012-09-01 02:12:46 +00:00
26ba07f36c move-assign test tweaks
[SVN r80346]
2012-09-01 02:02:09 +00:00
a53f93ff1a move-assign for vector
[SVN r80345]
2012-09-01 02:01:26 +00:00
705ca2b61b move-assign for deque
[SVN r80344]
2012-09-01 01:04:12 +00:00
e587ad4d50 Added move-assign test
[SVN r80343]
2012-09-01 01:02:46 +00:00
3613310b62 deque move-ctor OK on gcc
[SVN r80334]
2012-08-31 15:58:31 +00:00
5946ab9936 deque move-ctor OK on gcc
[SVN r80333]
2012-08-31 15:57:49 +00:00
c8b47ca3ca Added move ctors for vector and deque (deque for gcc partially working for now)
no preprocessed files yet

[SVN r80331]
2012-08-31 14:33:12 +00:00
16de1dcd01 Added move ctors for vector and deque (deque for gcc partially working for now)
[SVN r80330]
2012-08-31 14:32:08 +00:00
038976991e Fixed MSVC errors (from Nathan Ridge)
[SVN r80326]
2012-08-31 04:12:29 +00:00
9cceb79cf8 update from trunk fixing http://boost.2283326.n4.nabble.com/fusion-g-4-6-deque-and-c-0x-compile-error-td4632499.html
[SVN r79958]
2012-08-11 02:36:08 +00:00
4ccb4328f6 Fusion: fixing bogus preprocessor directive (missing newline at end of file)
[SVN r79788]
2012-07-28 20:44:56 +00:00
eaf9e79e85 latest patch from Nathan Ridge
[SVN r79306]
2012-07-05 23:40:17 +00:00
a3b0cad1e7 latest oatch from Nathan Ridge
[SVN r79305]
2012-07-05 23:39:50 +00:00
5a51e5d9aa Merge from trunk
[SVN r79274]
2012-07-05 04:40:37 +00:00
85583b5ea9 allow boolean traits implementations to use std::true_type and std::false_type
[SVN r79131]
2012-06-27 04:27:50 +00:00
191a3d75ed Fix for Ticket #6965 from Joel Falcou
[SVN r79099]
2012-06-26 10:16:35 +00:00
136331963a Added test for Ticket #6965
[SVN r79098]
2012-06-26 10:14:49 +00:00
bcb5fd9618 Merge r77879 from trunk.
I think it should have been merged in r78201, and was messing up the doc build
(you can see it in the content in 1.50 beta1).


[SVN r78876]
2012-06-11 01:30:33 +00:00
70589c53c6 BOOST_FUSION_DEFINE_STRUCT_INLINE patch by Nathan Ridge
[SVN r78509]
2012-05-19 01:24:55 +00:00
ed3776ce8c BOOST_FUSION_DEFINE_STRUCT_INLINE patch by Nathan Ridge
[SVN r78508]
2012-05-19 01:24:16 +00:00
a46bd7ab72 patch for ticket #6910 by michel
[SVN r78507]
2012-05-19 01:18:43 +00:00
8ce40ebd0c Patch by Nathan Ridge to allow BOOST_FUSION_ADAPT_ADT adapted classes to be compared using relational operators.
[SVN r78490]
2012-05-17 01:10:20 +00:00
51ade6529c typo fix by Mario Lang
[SVN r78464]
2012-05-14 00:41:42 +00:00
b63c8214d7 Patches from Nathan Ridge using SFINAE to disable the Fusion algorithms for non-{Fusion sequence} types
[SVN r78463]
2012-05-14 00:37:21 +00:00
e03dcc7c54 added missing file from last merge
[SVN r78203]
2012-04-26 02:27:13 +00:00
2e99690387 added missing file from last merge
[SVN r78202]
2012-04-26 00:26:25 +00:00
ee33ea5cfa Merging 77932-78199 from trunk
[SVN r78201]
2012-04-26 00:18:58 +00:00
93477e270e Merging 77932-78199 from trunk
[SVN r78200]
2012-04-26 00:18:51 +00:00
66e8a6d3b7 Doc updates for deque
[SVN r78199]
2012-04-26 00:03:42 +00:00
524769f6fb patch for clang from Michel Morin
[SVN r78176]
2012-04-24 01:40:17 +00:00
654dfbedb8 patch for clang from Michel Morin
[SVN r78175]
2012-04-24 01:39:43 +00:00
fad4a7ebeb rearranging files
[SVN r78106]
2012-04-21 06:09:54 +00:00
01f002f084 tweaked cref_result and ref_result to be non-lazy (for consistency).
[SVN r78058]
2012-04-18 02:57:56 +00:00
c8224c8bdf deque fix for ambiguity and making ctors explicit
[SVN r78056]
2012-04-18 01:18:10 +00:00
b7eda8d0f4 Doc updates for deque
[SVN r77984]
2012-04-15 09:47:19 +00:00
ecc87abaab more deque updates
[SVN r77967]
2012-04-14 00:57:15 +00:00
a3c2258017 Added deque docs
[SVN r77879]
2012-04-10 02:30:18 +00:00
d87b5a8000 minor tweaks
[SVN r77814]
2012-04-07 12:02:16 +00:00
b34a8c79e8 hide detail stuff
[SVN r77812]
2012-04-07 11:07:35 +00:00
ec99f829f3 updates
[SVN r77811]
2012-04-07 10:57:10 +00:00
2936fd30fb missing include
[SVN r77810]
2012-04-07 10:26:23 +00:00
a36f0f95cb c++ port of deque working
[SVN r77809]
2012-04-07 10:08:00 +00:00
93ce3bd9bf c++ port of deque underway
[SVN r77808]
2012-04-07 09:56:07 +00:00
e15c27bc8b partial update (upgrade to c++11)
[SVN r77805]
2012-04-07 07:54:18 +00:00
92d51dcfa8 c++11 version start
[SVN r77803]
2012-04-07 07:43:05 +00:00
221e07a7a3 + bumped copyright date
+ mpl::int_ optimizations

[SVN r77802]
2012-04-07 07:34:00 +00:00
2038772e90 fixed wrong spelling
[SVN r77472]
2012-03-22 10:45:12 +00:00
b6142f1613 Add newlines at end of file to avoid warnings like this:
boost/include/boost/fusion/tuple/detail/preprocessed/tuple.hpp:21:7: warning: no newline at end of file



[SVN r77424]
2012-03-20 02:12:55 +00:00
df0fbd1d9d typo fix
[SVN r77114]
2012-02-25 01:09:58 +00:00
b159898a47 Fix missed merge from 6338
[SVN r76791]
2012-01-30 00:13:38 +00:00
38cd16639d Fixes Ticket #6372
[SVN r76395]
2012-01-10 02:03:43 +00:00
1c51ad943a Fix for ticket #6338
[SVN r76238]
2011-12-31 05:48:27 +00:00
9a8955fbe1 Merge from trunk
[SVN r75980]
2011-12-16 02:14:17 +00:00
a25a7092d8 Patches from Tim Blechmann
[SVN r75976]
2011-12-16 00:14:49 +00:00
48e4118768 Fixes for MSVC workarounds from Freundlich: http://codepad.org/wRelwDJt
[SVN r75595]
2011-11-21 14:43:19 +00:00
0a520f6021 fix problem where sizeof(int) != sizeof(long)
[SVN r75563]
2011-11-20 10:59:09 +00:00
bbf10066bc C++11 patches by Michel Morin
[SVN r75394]
2011-11-07 22:07:05 +00:00
44b337abb0 Fix Ticket #6067
[SVN r75320]
2011-11-05 01:05:04 +00:00
c2052a3c0c Fix Ticket #6067
[SVN r75318]
2011-11-04 20:37:33 +00:00
480183059e + Fixes Ticket #6016 using a two-level specialization such that specialization is preferred over SFINAE.
+ Removes tag_of_fallback. It's not needed anymore. The proper way is to specialize tag_of.

[SVN r74934]
2011-10-13 00:23:40 +00:00
af16a84f09 Bumped copyright date and version to 2.1 (it's about time!) + fixed copyright notices and dates.
[SVN r74887]
2011-10-10 10:38:37 +00:00
fd82b51cec Wrong version. Should be 2.2 + fixed copyright notices and dates
[SVN r74886]
2011-10-10 10:37:53 +00:00
24bca52c5e Wrong version. Should be 2.2.
[SVN r74885]
2011-10-10 10:08:44 +00:00
4b6dddde03 Bumped copyright date and version to 2.1 (it's about time!).
[SVN r74884]
2011-10-10 10:07:45 +00:00
459a1dba3d Bumped copyright date and version to 2.1 (it's about time!).
[SVN r74883]
2011-10-10 10:05:49 +00:00
10274e7884 Made map random access. Thanks to Brandon Kohn!
[SVN r74882]
2011-10-10 09:55:52 +00:00
b6df98e86c Made map random access. Thanks to Brandon Kohn!
[SVN r74881]
2011-10-10 09:55:41 +00:00
01156b172a Fix for ticket #6000
[SVN r74873]
2011-10-10 02:33:13 +00:00
4be9e08af7 Fix for ticket #6000
[SVN r74872]
2011-10-10 00:59:32 +00:00
f46b2aeb73 Fix for ticket #6000
[SVN r74871]
2011-10-10 00:58:24 +00:00
21301c93dc Fix for ticket #6000
[SVN r74870]
2011-10-10 00:47:40 +00:00
295bacb652 Merge from trunk
[SVN r74791]
2011-10-08 08:23:11 +00:00
b905aa11af Added adapter for std::tuple (only for implementations using variadic templates)
[SVN r74788]
2011-10-08 03:47:16 +00:00
e08976a68d fix for case where Sequence is const
[SVN r74589]
2011-09-27 11:45:24 +00:00
a0db9cc855 Fusion: fix tag_of_fallback
[SVN r74574]
2011-09-26 12:02:10 +00:00
0b875180bf Removed unmaintained changelist.txt. Just use SVN log.
[SVN r74570]
2011-09-26 05:44:44 +00:00
b7fb20e69a Fusion: updates
[SVN r74566]
2011-09-25 17:36:13 +00:00
159426b8af Added adapter for std::tuple (only for implementations using variadic templates)
[SVN r74547]
2011-09-24 13:07:24 +00:00
b2c3737eaf Added adapter for std::tuple (only for implementations using variadic templates)
[SVN r74546]
2011-09-24 13:07:09 +00:00
d1a397c427 Patch to make deriving from fusion::sequence_facade makes the derived class an MPL sequence by Nathan Ridge.
[SVN r74473]
2011-09-20 01:48:47 +00:00
674f60e9b1 const-correctness patch by Nathan Ridge.
[SVN r74472]
2011-09-20 01:41:38 +00:00
2dd633a572 fixed missing includes in main hpp files
[SVN r74463]
2011-09-19 00:12:42 +00:00
9b16a51364 preprocessed files gen for algorithm
[SVN r74449]
2011-09-18 10:48:29 +00:00
5ee02a7546 wave preprocessor driver update
[SVN r74448]
2011-09-18 10:45:06 +00:00
223e14f702 More preprocessed files. This completes the container module.
[SVN r74446]
2011-09-18 10:03:59 +00:00
af90b6660b patch to silence clang warning
[SVN r74441]
2011-09-18 00:28:09 +00:00
b1b90af9be More preprocessed files
[SVN r74431]
2011-09-17 06:55:06 +00:00
3c92230f82 More preprocessed files
[SVN r74429]
2011-09-17 05:52:59 +00:00
0ed54e9ea3 added iterator_adapter 'Category' template parameter which defaults to Iterator_::category
[SVN r74428]
2011-09-17 03:21:13 +00:00
265bdc7342 Added default typedef mpl::false_ is_segmented;
[SVN r74427]
2011-09-17 03:14:12 +00:00
5f4d31abc7 Added preprocessed files to speed compilation
[SVN r74426]
2011-09-17 02:41:58 +00:00
f31150f58a fixed and updated copyright dates
[SVN r74415]
2011-09-16 07:00:41 +00:00
41fe830b8a Added preprocessed files to speed compilation
[SVN r74414]
2011-09-16 06:51:21 +00:00
473ef579b9 Added preprocessed files to speed compilation
[SVN r74412]
2011-09-16 06:44:55 +00:00
7365eb0a36 Added preprocessed files to speed compilation
[SVN r74411]
2011-09-16 06:22:19 +00:00
d5eaf8b496 Bumped copyright date
[SVN r74410]
2011-09-16 05:56:36 +00:00
7847f22a2c Bumped copyright date
[SVN r74409]
2011-09-16 05:55:52 +00:00
b23e05741c Added preprocessed files to speed compilation
[SVN r74408]
2011-09-16 05:47:57 +00:00
0e7a013851 Bumped copyright date
[SVN r74407]
2011-09-16 05:30:23 +00:00
86063cada9 Bumped copyright date
[SVN r74406]
2011-09-16 05:27:16 +00:00
619280939a include vectorN for only what's needed depending on FUSION_MAX_VECTOR_SIZE
[SVN r74405]
2011-09-16 05:12:58 +00:00
601415c6bb Added preprocessed files to speed compilation
[SVN r74404]
2011-09-16 05:07:53 +00:00
2a8b3f9c5b Added preprocessed files to speed compilation
[SVN r74403]
2011-09-16 04:50:19 +00:00
a21a748f24 Added preprocessed files to speed compilation
[SVN r74397]
2011-09-16 03:13:52 +00:00
5ebd31fe32 Added preprocessed files to speed compilation
[SVN r74393]
2011-09-16 01:35:29 +00:00
e7ed008af5 Added preprocessed files to speed compilation
[SVN r74392]
2011-09-16 01:34:26 +00:00
0ba9acbfa4 Replace fusion documentation with redirect.
[SVN r74332]
2011-09-10 07:42:13 +00:00
adb2d8bef0 merge [70965] [73644] [73668] [73669] [73683] [73770] [73771] [73831] [73834] [73854] [73892] [73898] [73899] [73906] [73908] [73927] [74019] [74048] [74113] from trunk to release
[SVN r74325]
2011-09-09 03:27:28 +00:00
90b15e1c9b add missing include to try to make msvc9~stlport toolset happy
[SVN r74113]
2011-08-28 22:48:40 +00:00
df6017dc1c fix use of incomplete fusion::nil as caught by clang
[SVN r74019]
2011-08-23 15:13:30 +00:00
def510808d bug fixes to segmented fusion support, more fwd headers
[SVN r73927]
2011-08-19 18:41:11 +00:00
eb903d71a7 enable segmented tests
[SVN r73908]
2011-08-19 02:04:40 +00:00
9fcb3105e5 make fold aware of segments
[SVN r73906]
2011-08-18 23:14:48 +00:00
5ff6210759 make for_each aware of segments
[SVN r73899]
2011-08-18 22:09:59 +00:00
b8bb98a36b simplify segmented_fold_until interface
[SVN r73898]
2011-08-18 21:33:39 +00:00
9dd14c435e make find and find_if algorithms segment-aware, stylistic consistency tweaks
[SVN r73892]
2011-08-18 17:12:05 +00:00
528ad04fdb baking segmented Fusion
[SVN r73854]
2011-08-17 18:53:56 +00:00
2baebc560a continue great segmented Fusion reorg
[SVN r73834]
2011-08-16 23:43:24 +00:00
2ccb8d604f progress with integrating the segmented Fusion work
[SVN r73831]
2011-08-16 23:07:51 +00:00
2212f57287 Fix Ticket #5784
[SVN r73774]
2011-08-15 10:53:13 +00:00
afbda073a3 naming tweaks
[SVN r73771]
2011-08-15 06:53:35 +00:00
9ed1f3d606 use iterator_facade to simplify implementation of segmented_iterator
[SVN r73770]
2011-08-15 06:20:24 +00:00
a339669d05 Better is_equal test
[SVN r73699]
2011-08-12 12:16:23 +00:00
1c8d339bb0 Better is_equal test
[SVN r73698]
2011-08-12 12:07:36 +00:00
adbdf8550c Back on track. The code is fine again.
[SVN r73697]
2011-08-12 11:51:57 +00:00
b3649b9343 Back on track. The code is fine again.
[SVN r73696]
2011-08-12 11:45:11 +00:00
c1dd1fa279 Back on track. The code is fine again.
[SVN r73695]
2011-08-12 11:43:24 +00:00
8b80a11877 revert to prior (again).
[SVN r73692]
2011-08-12 07:24:00 +00:00
faa5746f6d added main empty_impl template forward decl
[SVN r73689]
2011-08-12 05:18:44 +00:00
acc306d783 Added Eric's test cases for pop_back
[SVN r73687]
2011-08-12 05:15:08 +00:00
734b9222d2 revert the implementation to previous version, but changed it such that prior is not used. used advance instead which is ok for forward iterators.
[SVN r73686]
2011-08-12 05:14:06 +00:00
744dbcbbc7 added case for equal_to that returns false immediately if the tags are different in the first place
[SVN r73685]
2011-08-12 05:13:03 +00:00
48a0546eea added static sanity check
[SVN r73684]
2011-08-12 05:11:41 +00:00
f0fa80ca1a const-correctness tweaks
[SVN r73683]
2011-08-11 23:58:03 +00:00
5d07df005b fix find_s and find_if_s to return the end iterator when item not found
[SVN r73669]
2011-08-11 17:49:02 +00:00
b83a2954f5 segmented_fold_until should unpack the state's value before invoking the user's function
[SVN r73668]
2011-08-11 17:28:17 +00:00
3af35683ff QOI + small bug fixes
[SVN r73659]
2011-08-11 15:34:58 +00:00
5497ea367e QOI + small bug fixes
[SVN r73658]
2011-08-11 15:34:39 +00:00
5bca571dd1 - Made pop_back not use prior.-
Refactored pop_back_iterator into a reusable iterator_adaptor

[SVN r73657]
2011-08-11 14:49:55 +00:00
5ebfd961aa Refactored pop_back_iterator into a reusable iterator_adaptor
[SVN r73656]
2011-08-11 14:46:22 +00:00
1865ded339 Refactored pop_back_iterator into a reusable iterator_adaptor
[SVN r73655]
2011-08-11 14:45:10 +00:00
e8b0f98a55 Refactored pop_back_iterator into a reusable iterator_adaptor
[SVN r73654]
2011-08-11 14:43:59 +00:00
760c1a534c minor tweaks
[SVN r73645]
2011-08-11 08:52:10 +00:00
d9c5b32687 new cleaner(?) implementation for segmented fusion
[SVN r73644]
2011-08-11 04:14:50 +00:00
00b2cfc52e Made pop_back not use prior.
[SVN r73643]
2011-08-10 22:03:09 +00:00
21c17fda63 Added pop_back test for lists
[SVN r73642]
2011-08-10 22:01:37 +00:00
518ac25a80 merged [73583] from trunk
[SVN r73606]
2011-08-08 06:29:25 +00:00
491b6fb7d8 remove bogus compile-time asserts
[SVN r73583]
2011-08-07 00:06:32 +00:00
adc8be256f fixed wording to make it clear that I/O operators are only available for sequences in fusion's namespace
[SVN r73247]
2011-07-19 23:29:06 +00:00
efea9aec4b merge [72977] from trunk, regenerate docs
[SVN r73156]
2011-07-16 21:16:10 +00:00
f27ed26e44 make single_view random access
[SVN r72977]
2011-07-08 19:42:35 +00:00
0a54764a6a Added docs for copy
[SVN r72930]
2011-07-06 18:29:02 +00:00
f4f93005ad Added docs for copy
[SVN r72929]
2011-07-06 18:16:56 +00:00
92c2362cef Fix Ticket #4755
[SVN r72601]
2011-06-14 22:57:24 +00:00
01424b06b3 added version of fold (overload) accepting non-const State.
[SVN r71179]
2011-04-10 23:45:34 +00:00
ed4206ee1b Fixes Ticket #5426
[SVN r71026]
2011-04-06 04:55:57 +00:00
b17d6b9147 Fixes Ticket #5420
[SVN r71025]
2011-04-06 04:29:02 +00:00
b54e4b1b06 MPL bug workaround. Fixes Trac ticket: #5411
[SVN r70965]
2011-04-03 23:20:13 +00:00
b3226a5107 Applied patch #5275
[SVN r70841]
2011-04-01 23:38:39 +00:00
756af8cc4c Include <utility> instead of forward declaring std::pair
[SVN r70731]
2011-03-30 00:23:23 +00:00
c411c4b479 Spirit: merging from trunk (68457,68496,68522,68865,69218-69219,69294,69476,69546,70042-70043,70049-70050
68320,68374,68377,68386,68449,68461,68485,68487,68489,68491,68494-68495
68519-68520,68523,68536,68538-68539,68548-68549,68576,68645-68646,68657,68676
68687,68690,68707,68725,68744-68746,68852-68853,68861,68870,68904,68906-68908
68938,68989,69020,69022-69024,69091-69092,69103-69104,69114,69136,69138,69193
69202,69204,69233,69292-69293,69295,69297-69298,69323,69337,69378-69380,69405,69429,69431-69433,69444,69450
69495-69498,69501,69503,69505,69527,69599,69618,69623,69670-69671,69673,69675,69772-69774,69780
69811,69813-69814,69833,69851,70045,70211-70216,70224-70225,70483,70549-70550
Fusion: 69113,69118,69137,69583,69589,70008-70009)


[SVN r70577]
2011-03-26 17:18:36 +00:00
13aca9d862 Fusion: merging from trunk stuff needed for Spirit (69113,69118,69137,69583,69589,70008-70009)
[SVN r70575]
2011-03-26 17:10:26 +00:00
407657d56c Updateded: fixed 'requirement' errors
[SVN r70297]
2011-03-21 04:08:44 +00:00
690735de20 added test for copy
[SVN r70009]
2011-03-16 00:02:38 +00:00
80e3f4128b Added missing include
[SVN r70008]
2011-03-15 23:57:13 +00:00
7215d8835f fixed assign bug
[SVN r69589]
2011-03-05 23:37:25 +00:00
21588d6dac fixed wrong return type
[SVN r69583]
2011-03-05 14:48:47 +00:00
dcbebe60f1 Merge from trunk
[SVN r69453]
2011-03-02 00:08:13 +00:00
1efa444f24 renamed assign to copy and moved it to a new algorithm/auxiliary category
[SVN r69137]
2011-02-22 01:30:12 +00:00
dc2303d38b assign should be void
[SVN r69118]
2011-02-21 10:15:24 +00:00
7bfe445d72 new assign intrinsic
[SVN r69113]
2011-02-21 01:08:53 +00:00
0521159fdc sequence/comparison/less_equal.hpp: bug fix in code used only by Visual C++ 7.1 and 8.0
[SVN r68358]
2011-01-21 20:41:06 +00:00
577a607a14 fix for VC8 (connected to ticket 5084 -showstopper)
[SVN r68325]
2011-01-20 20:47:25 +00:00
5129f45066 fix for VC8
[SVN r68323]
2011-01-20 19:57:20 +00:00
beec2bff62 Fusion: adapt-macros: allow empty boost.pp sequences; refs #5093
[SVN r68303]
2011-01-19 17:46:05 +00:00
aa30bad7e4 fix 1.46 showstopper, fix #5084
[SVN r68264]
2011-01-19 04:28:17 +00:00
7f3cd8b46a putting is_native_fusion_sequence in is_sequence.hpp where it belongs.
[SVN r68259]
2011-01-19 00:10:13 +00:00
1da53e2c3f - hoisted enable_equality, enable_comparison and is_native_fusion_sequence to fusion::traits namespace
- added SFINAE-enable
(http://article.gmane.org/gmane.comp.parsers.spirit.devel/3902)

[SVN r68225]
2011-01-18 12:49:01 +00:00
94f5406936 Merging fixes to release; fixes #2294 fixes #4918 fixes #3645 refs #2823 refs #1427 refs #2893
[SVN r67792]
2011-01-08 18:38:08 +00:00
d4f11a0537 Applied patch; refs #2823; will merge to release once tests cycle
[SVN r67745]
2011-01-07 01:17:40 +00:00
cd811f56bc Fusion: merge from trunk
[SVN r67492]
2010-12-29 19:54:59 +00:00
c15dd57405 Fusion: mask fusion::begin/fusion::end with SFINAE, fixes #4028
[SVN r67352]
2010-12-19 18:35:52 +00:00
e8539e1165 Fusion: typo fix, fixes #4877
[SVN r67337]
2010-12-19 15:11:12 +00:00
b508b8e62c Fusion: fixed missing is_native_fusion_sequence for MSVC 7.1 and MSVC 8.0
[SVN r66477]
2010-11-10 07:59:18 +00:00
6eba238b69 Fusion: removed fusion::sequence_root; Fixes #2335
[SVN r66411]
2010-11-06 12:21:18 +00:00
09bd088660 Fusion: functional includes fixes; fixes #4729
[SVN r65974]
2010-10-15 11:40:37 +00:00
7aa4e2cbda Fusion: merge from trunk - fixed minor doc typos
[SVN r65895]
2010-10-10 20:57:01 +00:00
8abe272391 Fusion: fixed minor doc typos
[SVN r65894]
2010-10-10 20:23:28 +00:00
9792f67700 Fusion: merge from trunk
[SVN r65821]
2010-10-07 22:58:44 +00:00
088b8a0201 Fusion: ADAPT_xxxADTxxx; documentation&new testcase
[SVN r65816]
2010-10-07 20:38:54 +00:00
b8784f6bbc Fusion: fixed yet another typo
[SVN r65758]
2010-10-04 21:34:44 +00:00
569e23c71c Fusion: BOOST_FUSION_ADAPT_ADT documentation (2)
[SVN r65757]
2010-10-04 21:16:42 +00:00
b761e0e0c0 Fusion: BOOST_FUSION_ADAPT_ADT documentation
[SVN r65756]
2010-10-04 20:50:31 +00:00
a3427ea75b Fusion: merge from trunk
[SVN r65735]
2010-10-03 09:46:00 +00:00
21d676dd87 Fusion: added adt_attribute_proxy-getter
[SVN r65728]
2010-10-02 18:39:23 +00:00
f723f870c7 Fusion/Spirit: adt_attribute_proxy refactorization
[SVN r65445]
2010-09-17 20:38:23 +00:00
5adcb5b4d2 Fusion: BOOST_FUSION_ADAPT_xxxCLASSxxx -> BOOST_FUSION_ADAPT_xxxADTxxx
[SVN r65439]
2010-09-16 16:33:25 +00:00
e5dd49bc15 Fusion: documentation fixes
[SVN r65060]
2010-08-27 20:36:00 +00:00
a18ab9db86 lvalue fold states. Fixes #4582
[SVN r64947]
2010-08-22 13:16:49 +00:00
084b3028d8 fix for #4580
[SVN r64946]
2010-08-22 11:29:45 +00:00
aa1bcfaa9a refactored extension::struct_member to extension::access::struct_member
[SVN r64490]
2010-07-31 00:17:34 +00:00
134fbf9600 fix for adapted classes' category
[SVN r63805]
2010-07-10 10:06:33 +00:00
c879ab02c3 fix for adapted classes' category
[SVN r63804]
2010-07-10 10:01:57 +00:00
199d8b548f merged fusion from the trunk (3)
[SVN r63757]
2010-07-08 18:32:12 +00:00
237165e1e9 added the new folds to the changelist
[SVN r63752]
2010-07-08 17:25:24 +00:00
0f4ac2e9e3 Merge rebuilt fusion documentation with missing file.
[SVN r63737]
2010-07-08 07:50:58 +00:00
05edb33019 Rebuild fusion docs - with missing file this time.
[SVN r63731]
2010-07-08 07:10:41 +00:00
32adb57290 Merge rebuilt fusion documentation.
[SVN r63631]
2010-07-04 20:19:01 +00:00
880f7ed33e Rebuild fusion documentation.
[SVN r63626]
2010-07-04 19:20:50 +00:00
02b2a88bea merged fusion from the trunk (2)
[SVN r63562]
2010-07-03 20:31:16 +00:00
a1af4051cd added missing doc files
[SVN r63561]
2010-07-03 20:28:03 +00:00
1572e0e9c3 merged fusion from the trunk
[SVN r63560]
2010-07-03 20:10:58 +00:00
649770fdcd merged revision 62675
[SVN r63528]
2010-07-02 18:53:17 +00:00
38319d25cc fixed c/p error
[SVN r63440]
2010-06-29 19:55:22 +00:00
6f0af5db0a Merge documentation fixes.
* Use `doc/src/*.css` instead of `doc/html/*.css`.
* Remove wiki and people directories.
* Some documentation fixes.
* Left out `minimal.css` changes and boostbook changes because of clashes.


[SVN r63347]
2010-06-26 12:30:09 +00:00
4b1e5607e1 Fix a copy/paste error.
[SVN r63220]
2010-06-22 04:20:26 +00:00
c57b658e79 Document repetitive_view. Fixes #1864.
[SVN r63219]
2010-06-22 04:17:12 +00:00
f26c90729a Update various libraries' documentation build.
Mostly to use the images and css files under doc/src instead of
doc/html, usually be deleting the settings in order to use the defaults.
Also add 'boost.root' to some builds in order to fix links which rely on
it.

[SVN r63146]
2010-06-20 18:00:48 +00:00
758178a2a8 added reverse_fold/iter_fold/reverse_iter_fold (2) (fixes #1623)
[SVN r63083]
2010-06-18 17:23:20 +00:00
ea89db72cb added reverse_fold/iter_fold/reverse_iter_fold (1)
[SVN r63066]
2010-06-17 21:21:37 +00:00
7d14098b21 Explicitly cast array::static_size to an int. Fixes #2761
[SVN r62893]
2010-06-13 03:06:14 +00:00
378858f270 Fix headers for set_fwd and map_fwd. Fixes #3237
[SVN r62891]
2010-06-13 01:45:12 +00:00
9b7b9db979 Translate fusion iterator categories to MPL iteraotr categories for fusion_iterator. Fixes #3204.
[SVN r62889]
2010-06-13 01:22:41 +00:00
c9a5364472 Clean up GCC warnings. Fixes #3033.
[SVN r62869]
2010-06-12 17:59:10 +00:00
7c986ebd61 Clean up MSVC build. Fixes #1619. Fixes #3074.
[SVN r62854]
2010-06-12 15:58:31 +00:00
d5f6d5eafe Fix #include guard of boost/fusion/include/has_key.hpp. Fixes #4070
[SVN r62828]
2010-06-12 00:52:14 +00:00
d250c447b2 fixed conflict detected by g++4.x between fusion::at and mpl::at
[SVN r62675]
2010-06-09 17:39:26 +00:00
c02a3ba001 documentation update - fixes #4281
[SVN r62398]
2010-06-03 08:29:23 +00:00
11228c420f fusion::tag_of/fusion::detail::is_specialized should not complain for non-adapted std::pair/boost::array/...
[SVN r61836]
2010-05-07 15:02:22 +00:00
6465c3b3ea adapted proxy types are views now
[SVN r61833]
2010-05-07 13:37:34 +00:00
909f1bba8f added /fusion/view/single_view.hpp and /fusion/view/nview.hpp to /fusion/view.hpp
[SVN r61761]
2010-05-04 16:23:01 +00:00
95555f3f20 removes outdated and defunct files
[SVN r61599]
2010-04-26 23:34:55 +00:00
837d5b0604 fix #1614
[SVN r61488]
2010-04-22 13:15:01 +00:00
0f33972fe9 fix #1614
[SVN r61487]
2010-04-22 13:14:47 +00:00
a0733ce5ee merge from trunk
[SVN r61204]
2010-04-11 15:41:36 +00:00
8d5aefc7de documentation update
[SVN r61202]
2010-04-11 15:01:17 +00:00
dc8225a7aa merge from trunk
[SVN r61189]
2010-04-11 00:31:21 +00:00
2f8b22dd93 documentation update
[SVN r61187]
2010-04-10 18:55:44 +00:00
83db52797b ADAPT_STRUCT_DEFINE_PROXY_TYPE refactoring
[SVN r61178]
2010-04-10 14:35:13 +00:00
994b37e4d5 merge from trunk
[SVN r61043]
2010-04-04 14:43:54 +00:00
073ce9e4a3 added intrusive struct generating macros
[SVN r61018]
2010-04-03 13:34:20 +00:00
d8a40f48a6 Fusion: applied workaround for broken VC10
[SVN r60263]
2010-03-07 02:19:16 +00:00
f8c6e5efb6 Fusion: added missing #include's
[SVN r60262]
2010-03-07 02:15:59 +00:00
e67765747d better adapt structs/classes implementation
[SVN r59913]
2010-02-25 20:10:37 +00:00
f84bc30bd3 adapt template classes/structs
[SVN r59846]
2010-02-22 22:55:54 +00:00
bb88841f47 adapt plain old array types (3)
[SVN r59578]
2010-02-07 19:12:26 +00:00
47f535df5b adapt plain old array types (2)
[SVN r59577]
2010-02-07 18:48:09 +00:00
5eb9c03cd2 adapt plain old array types (1)
[SVN r59576]
2010-02-07 18:22:06 +00:00
b86d7dbe80 Fusion: fixed ambiguities in tests on VC10
[SVN r59347]
2010-01-29 16:02:14 +00:00
83ed7ffada Fusion: minor fix for adapt_class_named
[SVN r59346]
2010-01-29 15:45:50 +00:00
4910f26ce9 Fusion: minor fix for adapt_class_named
[SVN r59345]
2010-01-29 15:45:24 +00:00
c24441c83d Fusion: added tests for adapt_class_named
[SVN r59341]
2010-01-29 15:04:57 +00:00
6647f0c8a4 Fusion: fixed adapt_class to be usable with Spirit, added adapt_class_named
[SVN r59340]
2010-01-29 15:03:35 +00:00
0d5ff2fc01 Fusion: added tests for adapt_struct_named
[SVN r59339]
2010-01-29 13:49:38 +00:00
95ccc6f48f Fusion: added docs for BOOST_FUSION_ADAPTED_STRUCT_NAMED
[SVN r59338]
2010-01-29 03:03:31 +00:00
3873f007e8 Fusion: more work on adapt_struct_named
[SVN r59337]
2010-01-29 01:58:50 +00:00
e7c00c1843 Fusion adding ADAPT_NAMED_STRUCT
[SVN r59335]
2010-01-28 21:27:32 +00:00
dae19f1781 Fusion: adding overload for const parameter types
[SVN r59276]
2010-01-27 16:25:41 +00:00
3f4d3eb887 Copy generated fusion documentation from trunk.
[SVN r59021]
2010-01-15 06:35:28 +00:00
cda74605fc fusion: merge of associative iterators/views and the new fold interface
[SVN r58618]
2010-01-01 22:00:21 +00:00
f7fd836354 corrected category_of documentation (2)
[SVN r58568]
2009-12-29 18:29:59 +00:00
b1b171f130 corrected category_of documentation
[SVN r58559]
2009-12-29 14:10:17 +00:00
d366a4f0e2 updated changelog
[SVN r58558]
2009-12-29 13:44:01 +00:00
514d48903b associative forward iterators in example and docs
[SVN r58549]
2009-12-28 17:45:42 +00:00
f0cd405f04 mpl::sequence_tag specialization for adapted types
[SVN r58396]
2009-12-15 13:30:02 +00:00
2587757d47 corrected reverse_view
[SVN r58299]
2009-12-11 21:01:22 +00:00
f1da55c1e9 avoid iterator invalidation in segmented_range, fixes #3583
[SVN r57622]
2009-11-13 02:52:34 +00:00
b605617c4f Fusion: merged fixes for MSVC warnings from trunk
[SVN r57533]
2009-11-10 02:37:19 +00:00
03290abb85 Fusion: silenced a couple of MSVC warnings created during Spirit test runs
[SVN r57502]
2009-11-09 03:57:40 +00:00
65895017bd associative_sequence_tag -> associative_tag
[SVN r57337]
2009-11-03 17:35:33 +00:00
60fabbdf9a Fusion: adding a missing 'const'
[SVN r57248]
2009-10-30 15:14:50 +00:00
dab67207cf associative iterators & views (Fixes #3473)
[SVN r57242]
2009-10-30 00:19:19 +00:00
9b26b4a0f7 associative iterators & views
[SVN r57156]
2009-10-25 22:59:54 +00:00
35e469e2d5 fix for #2355: discrepancy between std::accumulate and fusion::accumulate
[SVN r57125]
2009-10-24 10:59:01 +00:00
43f861ca87 rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
b22e2b64da rm cmake from the release branch before it goes out broken. Policy dictates that you never commit to release, you commit to trunk and merge to release.
[SVN r56941]
2009-10-17 01:10:45 +00:00
46fc256c2f Sync from trunk (except adapt class)
[SVN r56714]
2009-10-11 16:12:54 +00:00
7615b492af Sync from trunk (except adapt class)
[SVN r56713]
2009-10-11 16:08:54 +00:00
d978cec6b6 Fix default construction of vector
[SVN r56709]
2009-10-11 04:00:00 +00:00
e26d26d511 Fusion: added size_impl for nview
[SVN r56610]
2009-10-05 22:30:23 +00:00
9ebe273fb3 Fusion: fixing nview tests
[SVN r56609]
2009-10-05 22:29:10 +00:00
a110ea9304 Fixing mismatch of default parameter values
[SVN r56607]
2009-10-05 22:00:09 +00:00
959b0b0839 Fusion: fixing mismatch in default parameter to nview
[SVN r56604]
2009-10-05 21:36:55 +00:00
9a1bc7d677 BOOST_FUSION_ADAPT_CLASS
[SVN r56576]
2009-10-04 16:59:50 +00:00
178973a05c BOOST_FUSION_ADAPT_CLASS
[SVN r56575]
2009-10-04 16:59:37 +00:00
e0a17b552c Fusion: merged nview from trunk
[SVN r56490]
2009-09-30 02:33:30 +00:00
7b89755a67 Fusion: fixed a couple of typos in docs
[SVN r56472]
2009-09-29 14:48:36 +00:00
fdb399e022 Fusion: fixing regression tests
[SVN r56435]
2009-09-27 16:36:53 +00:00
cb5b63fa93 Fusion: fixed another const correctness problem
[SVN r56383]
2009-09-25 17:24:55 +00:00
8ce4280e27 Fusion: doc fix
[SVN r56382]
2009-09-25 14:00:55 +00:00
37f57fbf7f Fusion: resolved const correctness issue
[SVN r56381]
2009-09-25 13:57:30 +00:00
10c0665ffa Fusion: added nview and friends, docs and tests
[SVN r56377]
2009-09-25 00:21:53 +00:00
43645b3764 Fusion: added nview and friends
[SVN r56376]
2009-09-25 00:20:03 +00:00
2e805be6df merge from trunk
[SVN r56179]
2009-09-14 07:47:53 +00:00
2f8b91828b merge from trunk
[SVN r56178]
2009-09-14 07:40:39 +00:00
b16d42a31b reduce fusion, proto and xpressive warnings under msvc /Za switch
[SVN r55838]
2009-08-28 16:45:21 +00:00
0dd1f341c8 Fix PDF image paths.
[SVN r55759]
2009-08-24 10:32:39 +00:00
ea5ea7f001 Fix up logic and date_time Jamfiles so they build needed dependencies.
Fix PDF image paths in fusion Jamfile.v2.
Add fusion to the PDF build.

[SVN r55757]
2009-08-24 10:31:43 +00:00
564280e622 Make the unrolled implementation of all work for multiples of four. Fixes #2599.
[SVN r55686]
2009-08-20 14:01:39 +00:00
2e33d288b1 Copyrights on CMakeLists.txt to keep them from clogging up the inspect
reports.  This is essentially the same commit as r55095 on the release
branch.



[SVN r55159]
2009-07-26 00:49:56 +00:00
df633002dd Add basic copyright/license to keep cmake out of the inspection report
[SVN r55095]
2009-07-22 21:51:01 +00:00
c0eebc8121 Fix #1601
[SVN r54850]
2009-07-10 00:50:05 +00:00
14b27978e3 Fix #1601
[SVN r54849]
2009-07-10 00:49:51 +00:00
04cf9c863b typo fix
[SVN r54325]
2009-06-25 03:07:23 +00:00
fb7671141a fix ticket#1894
[SVN r54047]
2009-06-18 03:23:51 +00:00
08045fc46e Fix ticket #2158
[SVN r53985]
2009-06-17 02:11:43 +00:00
cb0a2c3c2e patched ticket #4512
[SVN r53956]
2009-06-16 02:23:44 +00:00
253c763b45 Fix Ticket #1614:
[SVN r53917]
2009-06-15 03:30:35 +00:00
3ed2803482 Fix Ticket #1614:
[SVN r53916]
2009-06-15 02:07:19 +00:00
63ce990a8c fix trac issue #1608
[SVN r53915]
2009-06-15 01:54:01 +00:00
363ff5750f fix trac issue #1608
[SVN r53914]
2009-06-15 01:53:43 +00:00
8f34038ddd introduces test case for unfusing adapter
[SVN r53906]
2009-06-14 18:31:09 +00:00
c88e8803fb introduces test for unfusing adapter
[SVN r53905]
2009-06-14 18:30:02 +00:00
fb3de90679 introduces unfused adapter
[SVN r53903]
2009-06-14 11:09:03 +00:00
916077ce6b update for trac #1893
[SVN r53856]
2009-06-13 06:29:32 +00:00
dace0940b7 fix ticket #1529
[SVN r53765]
2009-06-09 04:02:33 +00:00
d726756148 Fusion: merging from trunk
[SVN r53596]
2009-06-03 12:44:26 +00:00
efcab8aae4 Merged revisions 53158,53182,53334,53337,53419,53421,53521,53566-53568,53578,53590 via svnmerge from
https://svn.boost.org/svn/boost/trunk



[SVN r53591]
2009-06-03 04:32:30 +00:00
6447c5371e reduce number of template instantiations
[SVN r53566]
2009-06-02 05:46:21 +00:00
f0b6c8b1e2 Fusion: added explicit disambiguation for fusion::at
[SVN r53029]
2009-05-15 15:28:34 +00:00
e1ac68f526 Trying to fix ambiguities of operator<<() for unused_type.
[SVN r52511]
2009-04-20 14:57:57 +00:00
9acd9b2feb added default implementation for iterator_facade
[SVN r51864]
2009-03-20 09:45:36 +00:00
c81456f35e Protected unused_type by an ADL barrier
[SVN r51654]
2009-03-09 01:17:20 +00:00
08a038ad51 Fix: remove non-existent test
[SVN r51393]
2009-02-22 16:33:27 +00:00
b7e3828810 adjusts to changes in functional module, also resolves compile problems
[SVN r51383]
2009-02-22 06:36:52 +00:00
534809fbb7 updates functional module: only two unfused variants, now
[SVN r51382]
2009-02-22 06:35:35 +00:00
aaf89a67a6 updates functional module: only two unfused variants, now
[SVN r51381]
2009-02-22 06:27:12 +00:00
2fdfd41b17 updates functional module: only two unfused variants, now
[SVN r51380]
2009-02-22 06:24:38 +00:00
a26354b70e updates functional module: only two unfused variants, now
[SVN r51379]
2009-02-22 06:23:56 +00:00
064dbedaa5 #define to allow testing if unused_type has IO
[SVN r51286]
2009-02-17 11:18:20 +00:00
35149161aa use vectorN instead of vector for shorter names
[SVN r51285]
2009-02-17 10:37:31 +00:00
010c94ba87 fix wrong include
[SVN r50937]
2009-02-01 00:00:58 +00:00
5dff610007 merge of cmake build files from trunk per beman
[SVN r50756]
2009-01-24 18:57:20 +00:00
1c8e2ccfe4 added streaming for unused_type
[SVN r50168]
2008-12-06 23:35:05 +00:00
fad40f6c9d changed the result of as_vector to return the numbered forms (i.e vectorN)
[SVN r49778]
2008-11-16 01:00:37 +00:00
7c8f9e3b6d changed as_vector to return the numbered forms (i.e. vectorN)
[SVN r49777]
2008-11-16 00:59:42 +00:00
6ff5a74d9d updated make_vector to return numered forms instead
[SVN r49768]
2008-11-15 11:08:49 +00:00
b543bd13e7 minor doc typo
[SVN r49767]
2008-11-15 11:07:56 +00:00
82fd215b99 Updating dependency information for modularized libraries.
[SVN r49628]
2008-11-07 17:05:27 +00:00
e0cc53e8a9 Continuing merge of CMake build system files into trunk with the encouragement of Doug Gregor
[SVN r49510]
2008-11-01 13:15:41 +00:00
e2d23b8a63 bugfix to fold test, and new transform test
[SVN r49470]
2008-10-27 22:13:20 +00:00
d3f057e88c added fold test and simplified repetition in the Makefile
[SVN r49456]
2008-10-26 14:39:59 +00:00
38147bb4d6 Adding simple compile time tests
[SVN r49409]
2008-10-20 21:36:04 +00:00
d004046aa5 Merge from Trunk
[SVN r49252]
2008-10-10 15:05:47 +00:00
a046e43990 Merge from Trunk
[SVN r49251]
2008-10-10 14:49:19 +00:00
575ce8ca26 Fix cyclic dependencies between Boost.fusion.tuples and TR1.
Fixes #2261.

[SVN r48820]
2008-09-17 17:20:22 +00:00
b1ebdd60a6 Merged revisions 48769 via svnmerge from
https://svn.boost.org/svn/boost/trunk

........
  r48769 | eric_niebler | 2008-09-13 21:46:32 -0700 (Sat, 13 Sep 2008) | 1 line
  
  attempt to work around early instantiation problem on edg-based compilers
........


[SVN r48817]
2008-09-17 15:54:23 +00:00
d8d881ac6f attempt to work around early instantiation problem on edg-based compilers
[SVN r48769]
2008-09-14 04:46:32 +00:00
399b268bf1 fix #1600 (duplicate include guard)
[SVN r48600]
2008-09-05 02:39:34 +00:00
24f0323699 added missing include
[SVN r48369]
2008-08-25 07:14:20 +00:00
a8fe0fa44a more conformance tweaks to std tr1
[SVN r48258]
2008-08-20 12:56:53 +00:00
814c40a093 fixed typo
[SVN r48256]
2008-08-20 12:36:13 +00:00
7c74332487 conform to TR1 to the letter
[SVN r48244]
2008-08-20 08:20:40 +00:00
e165418461 conform to TR1 to the letter
[SVN r48243]
2008-08-20 08:20:19 +00:00
c51fc2ebee fixed non-ascii chars
[SVN r47676]
2008-07-22 09:07:07 +00:00
4a2214739c fixed non-ascii chars
[SVN r47675]
2008-07-22 09:06:54 +00:00
0b58f052b3 doc updates (mini tweaks)
[SVN r47668]
2008-07-22 02:06:42 +00:00
ef1e821173 added info on how to map to and from MPL
[SVN r47647]
2008-07-21 07:25:52 +00:00
af0e42f13e list-at optimization
[SVN r47643]
2008-07-20 23:14:15 +00:00
36736edec5 pair doc fix
[SVN r47528]
2008-07-17 23:59:40 +00:00
8506cd8be6 pair doc fix
[SVN r47527]
2008-07-17 23:59:22 +00:00
57725cb393 merge from trunk
[SVN r47205]
2008-07-08 02:43:21 +00:00
099deb4385 merge from trunk
[SVN r47204]
2008-07-08 02:39:55 +00:00
d150ba8498 Fixed non-ascii chars
[SVN r46898]
2008-06-30 12:06:07 +00:00
df2abdab6b Fixed non-ascii chars
[SVN r46897]
2008-06-30 12:04:15 +00:00
780b8bc1b0 With his kind permission, change Jaakko "Järvi" to "Jarvi"
[SVN r46809]
2008-06-28 13:57:20 +00:00
8b749bef46 With his kind permission, change Jaakko "Järvi" to "Jarvi"
[SVN r46808]
2008-06-28 13:45:21 +00:00
91ea13a593 Fusion: Fixed a VC level 4 warning
[SVN r44794]
2008-04-27 01:04:25 +00:00
6d462cbd63 Changed macro BOOST_PARTIAL_SPECIALIZATION_EXPLICIT_ARGS to BOOST_NO_PARTIAL_SPECIALIZATION_DEFAULT_ARGS.
Changed <utility> to <boost/config/no_tr1/utility.hpp> in order to prevent cyclic dependencies between Fusion Tuples and TR1.

[SVN r44692]
2008-04-21 12:06:02 +00:00
813930aee6 Rebuild a lot of documentation.
[SVN r43650]
2008-03-16 11:38:32 +00:00
9e8d8b1871 Merged revisions 43206,43208-43213 via svnmerge from
https://svn.boost.org/svn/boost/trunk

........
  r43206 | danieljames | 2008-02-10 09:55:03 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Fix some broken links.
........
  r43209 | danieljames | 2008-02-10 14:56:22 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Link to people pages on the website, as they've been removed from the download.
........
  r43210 | danieljames | 2008-02-10 15:02:17 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Point links to the pages that used to be in 'more' to the site.
........
  r43212 | danieljames | 2008-02-10 16:10:16 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Fix links on the home page as well.
........
  r43213 | danieljames | 2008-02-10 16:21:22 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Generated documentation which is no longer generated.
........


[SVN r43214]
2008-02-10 16:39:38 +00:00
9a622b6904 Generated documentation which is no longer generated.
[SVN r43213]
2008-02-10 16:21:22 +00:00
4a29dd2a7c merge from trunk
[SVN r42226]
2007-12-21 03:13:31 +00:00
7bd2fd716d merge from trunk
[SVN r42225]
2007-12-21 02:45:20 +00:00
f199472458 Removing fusion variant adapter
[SVN r42224]
2007-12-20 23:28:26 +00:00
2c1a03f785 Removing fusion variant adapter
[SVN r42223]
2007-12-20 23:24:28 +00:00
bcbd2ff112 tweakbug fix for end_impl (tweak).
[SVN r42167]
2007-12-19 10:42:04 +00:00
67279d5c3d bug fix for end_impl. (test)
[SVN r42165]
2007-12-19 10:33:39 +00:00
61bf0151da bug fix for end_impl.
[SVN r42164]
2007-12-19 10:33:14 +00:00
e9fd448376 fixed documentation bug
[SVN r42116]
2007-12-17 09:27:42 +00:00
300f35fadd Strips top-level cv-qualifiers off non-reference types, now.
[SVN r41642]
2007-12-03 13:25:26 +00:00
6168061f97 remove old unused file
[SVN r41519]
2007-12-01 01:11:44 +00:00
9a1f176df2 fixed link
[SVN r41489]
2007-11-30 10:07:41 +00:00
d57e8cfe9e Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41370]
2007-11-25 18:38:02 +00:00
ed9cb87ac3 Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41369]
2007-11-25 18:07:19 +00:00
6e7e8a12eb bug fix
[SVN r41299]
2007-11-22 08:39:46 +00:00
4919faec58 removing failing test on EDG compilers
[SVN r41117]
2007-11-15 21:15:47 +00:00
d785c34d56 fix support for segmented iteration
[SVN r41093]
2007-11-14 16:36:15 +00:00
5359a24800 refresh docs
[SVN r41080]
2007-11-14 10:17:09 +00:00
d7c204356f removes superfluous remove_reference in result computation, as reported by Eric Niebler
[SVN r41008]
2007-11-11 17:56:21 +00:00
b241cdf25d fix mismatch include guard
[SVN r40975]
2007-11-09 22:38:18 +00:00
ac449e933d added copyright and license info for each page.
[SVN r40873]
2007-11-07 03:46:23 +00:00
9f2f31c8ec added copyright and license info for each page.
[SVN r40868]
2007-11-07 03:25:59 +00:00
2016e8e53b added license info in copyright notice at the footer
[SVN r40866]
2007-11-07 03:06:23 +00:00
e10f3e17b3 added copyright and license info for each page.
[SVN r40863]
2007-11-07 02:12:28 +00:00
0acc783f19 Added a quick reference to the sequence and iterator facade example
[SVN r40856]
2007-11-06 21:53:41 +00:00
353bf4bc09 Adding an example of using sequence facade and iterator facade.
[SVN r40853]
2007-11-06 20:55:58 +00:00
73f4f6667c todo update
[SVN r40833]
2007-11-06 12:17:26 +00:00
a326739705 Regenerating/reorganizing docs
[SVN r40832]
2007-11-06 12:13:52 +00:00
a8ac3c3413 doc updates + some more header tweaks
[SVN r40831]
2007-11-06 12:05:12 +00:00
41c46501db doc updates + some more header tweaks
[SVN r40830]
2007-11-06 11:58:37 +00:00
58b2bccbe4 Regenerating/reorganizing docs
[SVN r40828]
2007-11-06 11:40:27 +00:00
0baf64588c doc updates to reflect structure changes
[SVN r40827]
2007-11-06 10:09:38 +00:00
c9ee80e47a fixed spelling mistake in documentation
[SVN r40817]
2007-11-05 22:24:53 +00:00
1c5bc499a7 Workarounds for Fusion on IBM xlc
[SVN r40766]
2007-11-05 02:10:42 +00:00
b9ab685b44 Basic sequence and iterator fascade docs
[SVN r40737]
2007-11-04 15:26:51 +00:00
dde6fe6f40 Documentation for the struct extension macros
[SVN r40534]
2007-10-28 17:40:45 +00:00
78a8321eab fixing missing traversal category on binary transform view, by reusing zip_view algorithm
[SVN r40516]
2007-10-27 22:18:13 +00:00
5bf6dfa508 fixing performance tests, mainly result of issues, and arity issues with unfused typed
[SVN r40515]
2007-10-27 22:16:35 +00:00
17e42e5650 reverts clobbered changes before merge
[SVN r40479]
2007-10-26 12:16:37 +00:00
56ad076390 fix remaining includes
[SVN r40442]
2007-10-24 23:29:54 +00:00
2b9389ef5a merging tobias changes
[SVN r40397]
2007-10-24 04:58:50 +00:00
3307c806c8 Fusion 2.1 one more time with care
[SVN r40392]
2007-10-24 02:36:29 +00:00
7c85a51d48 Fusion 2.1 one more time with care
[SVN r40390]
2007-10-24 02:32:28 +00:00
d10270f755 remove superfluous include
[SVN r40383]
2007-10-23 23:29:08 +00:00
75fddd89a2 remove superfluous include
[SVN r40359]
2007-10-23 13:39:15 +00:00
839b519852 adjusts test: deduce_sequence removes top-level cv-qualifiers from element types, now
[SVN r40355]
2007-10-23 13:26:56 +00:00
fff2c2ff34 removes dependencies to MPL intrinsics (removes top-level cv-qualifiers from element types, now)
[SVN r40354]
2007-10-23 13:25:57 +00:00
ea0da68ccd missing copyright
[SVN r40257]
2007-10-21 05:51:31 +00:00
db4f2ba847 more flat includes
[SVN r40254]
2007-10-21 05:41:23 +00:00
6c40cc9307 more flat includes
[SVN r40253]
2007-10-21 05:39:33 +00:00
4f92073a2e more flat includes
[SVN r40252]
2007-10-21 05:23:50 +00:00
02c08d10c9 updates for fusion 2.1
[SVN r40251]
2007-10-21 05:13:03 +00:00
4be5caeff9 more flat includes
[SVN r40250]
2007-10-21 04:25:02 +00:00
cb3bd83e2a more includes
[SVN r40245]
2007-10-21 03:01:13 +00:00
32f1c58ce7 branch for creating branch for fusion 2.1
[SVN r40237]
2007-10-21 00:52:09 +00:00
7a6e82b7cf Removed file/folder
[SVN r40234]
2007-10-21 00:47:59 +00:00
fc57a566cb creating branch for fusion 2.1
[SVN r40232]
2007-10-20 23:59:59 +00:00
c3fec7efe6 creating branch for fusion 2.1
[SVN r40231]
2007-10-20 23:52:36 +00:00
13b01b0bfe Removed file/folder
[SVN r40230]
2007-10-20 23:49:46 +00:00
66cc9bbc28 made a copy
[SVN r40229]
2007-10-20 23:48:12 +00:00
5f024c18ca Created folder remotely
[SVN r40225]
2007-10-20 23:43:20 +00:00
361635c5ab reverting to 2.0
[SVN r40220]
2007-10-20 22:33:52 +00:00
fc1df001c6 reverting to 2.0
[SVN r40219]
2007-10-20 22:21:43 +00:00
c35180f4f9 phase4: refactoring for v2.1
[SVN r40213]
2007-10-20 13:13:58 +00:00
e894481f5b phase4: refactoring for v2.1
[SVN r40212]
2007-10-20 13:13:46 +00:00
16bcb17c06 phase3: refactoring for v2.1
[SVN r40211]
2007-10-20 11:50:27 +00:00
d0d540064d phase3: refactoring for v2.1
[SVN r40210]
2007-10-20 11:49:17 +00:00
9243ee2450 phase2: refactoring for v2.1
[SVN r40209]
2007-10-20 11:31:03 +00:00
a77599ed49 refactoring for v2.1
[SVN r40208]
2007-10-20 11:01:50 +00:00
0f11e531ac fix for incomplete type is not allowed when tuple is forward declared. fixed the other as_xxx files as well.
[SVN r39724]
2007-10-06 14:10:30 +00:00
3de9048e8a adds concept examples
[SVN r39474]
2007-09-22 11:09:35 +00:00
dbd122cee3 bugfix tuples::null_type and tuples::tuple<> iterators not comparing ok.
[SVN r39469]
2007-09-22 01:08:51 +00:00
1f2087092f Doc updates
[SVN r39468]
2007-09-22 01:05:29 +00:00
6344096709 fixing result of related fusion docs issues for fold, accumulate, and transform view/alg
[SVN r39448]
2007-09-21 15:44:57 +00:00
6b56ded55a bugfix tuples::null_type and tuples::tuple<> iterators not comparing ok.
[SVN r39359]
2007-09-18 00:18:56 +00:00
f8e8b4bbf5 push/pop pragma warning
[SVN r38559]
2007-08-10 01:45:05 +00:00
e90a217a2c removing files added by the cvs import incorrectly
[SVN r38407]
2007-08-02 20:34:13 +00:00
2536037ff7 removing another dead file from the cvs import
[SVN r38406]
2007-08-02 20:24:47 +00:00
fac8e082b8 removing dead file recovered by cvs transfer
[SVN r38405]
2007-08-02 20:10:01 +00:00
0bb0d5798b accomodate recent fusion result_of changes
[SVN r38275]
2007-07-22 16:38:18 +00:00
887906aa69 changes docs to reflect changed semantics of unfused_type
(operator() overloads for only onw arity now)


[SVN r38269]
2007-07-22 08:35:29 +00:00
f6b7afa277 changes semantics to contain only operator() overloads for one arity
[SVN r38268]
2007-07-22 08:30:58 +00:00
1484ae8e06 adjusts test to semantic changes:
unfused_typed only contains operator() overloads for one arity now


[SVN r38267]
2007-07-22 08:29:54 +00:00
367a572f54 qualifies lookup of type traits names
[SVN r38256]
2007-07-17 21:44:36 +00:00
97a49614f9 removes unnecessary #includeS
[SVN r38255]
2007-07-17 21:43:14 +00:00
50bd63adcd fixes const-correctness
[SVN r38222]
2007-07-15 16:25:11 +00:00
76bb8db5b7 code tidying (insignificant changes)
[SVN r38220]
2007-07-14 20:22:30 +00:00
50d52fa1c4 code tidying
[SVN r38219]
2007-07-14 20:21:54 +00:00
aebd8a01cb removes unnecessary #includeS
[SVN r38218]
2007-07-14 20:20:28 +00:00
a83c9b89a3 removes unnecessary #include
[SVN r38217]
2007-07-14 20:17:38 +00:00
1ed9b6204b fixes compilation problems with msvc
[SVN r38212]
2007-07-13 21:36:02 +00:00
b4fe17385c silences msvc warning when used with infinite sequences
[SVN r38211]
2007-07-13 21:27:35 +00:00
9df373af5f revises function object concepts and functional module documenation to reflect
boost::result_of-based result computation


[SVN r38209]
2007-07-13 19:25:34 +00:00
f05493abf0 fixes result computation problem
[SVN r38208]
2007-07-13 18:47:02 +00:00
8525c2b0b5 changes result computation to use boost::result_of-based scheme
[SVN r38207]
2007-07-13 18:46:28 +00:00
042735fd06 ported to boost::result_of-based result computation scheme
[SVN r38206]
2007-07-13 18:31:16 +00:00
f119120d24 corrects missing references in boost::result_of signature
[SVN r38205]
2007-07-13 16:37:22 +00:00
c57e840377 adds const correctness, simplifies code, fixes nullary member function invocation
[SVN r38204]
2007-07-13 16:29:45 +00:00
685d26c847 adds const correctness, disables variadic tests, for now
[SVN r38203]
2007-07-13 16:27:55 +00:00
909825a34f simplifies code (minor changes)
[SVN r38202]
2007-07-13 16:26:50 +00:00
f598633cd0 adds const-correctness, simplification
[SVN r38201]
2007-07-13 15:12:14 +00:00
897a312766 adds const correctness
[SVN r38200]
2007-07-13 15:11:20 +00:00
8ff2dca34a adds missing include
[SVN r38199]
2007-07-13 14:20:38 +00:00
e2015823f6 makes unfused_* work exclusively through boost::result_of
[SVN r38198]
2007-07-13 14:09:25 +00:00
7a1017dce3 makes unfused_* work through boost::result_of only
[SVN r38197]
2007-07-13 14:06:50 +00:00
f6184f5f29 fixes bad parameter lists for template friends
[SVN r38195]
2007-07-12 15:57:18 +00:00
8eda5d32ca completes boost::result_of-based result type computation
[SVN r38194]
2007-07-12 09:08:46 +00:00
046d853d63 fixing issues with fusion zip_view size on intel
[SVN r38167]
2007-07-08 14:26:01 +00:00
eb79a48868 testing zero length sequences have converting ctors
[SVN r38156]
2007-07-06 20:48:04 +00:00
3612acb0ef adding working converting ctors for zero length sequences
[SVN r38155]
2007-07-06 20:47:11 +00:00
d20847afd7 don't use forward declarations of partial specializations.
[SVN r38129]
2007-07-02 06:52:31 +00:00
8f8cf8145f handling fusion fold and accumulate function argument by value rather than const ref to fix free function usage
[SVN r38064]
2007-06-22 18:05:55 +00:00
996a4da2d6 testing fusion transform and fold work with free functions now that only Boost.ResultOf support is required
[SVN r38063]
2007-06-22 18:02:58 +00:00
09a6da1f80 fusion fold and transform passing refs for lvalues as per result_of protocol
[SVN r38039]
2007-06-19 21:30:06 +00:00
0e5cb04b99 documents concept preserving semantics of iterator_range (new) and zip_range (forgotten)
[SVN r38005]
2007-06-16 11:56:14 +00:00
6605340726 fixing some defects in fusion::fold loop unrolling
[SVN r37985]
2007-06-13 20:32:30 +00:00
8e93460511 tests covering defect in fusion::fold loop unrolling picked up by Christian Holmquist
[SVN r37984]
2007-06-13 20:30:30 +00:00
a2046a5aa6 fixes for msvc related to fusion result_of compatibility
[SVN r37971]
2007-06-11 21:09:44 +00:00
0fcbc5b467 result_of and polymorphic function obj compatibility
[SVN r37962]
2007-06-11 07:01:05 +00:00
414b87dbdb fixing bug in internal use of fusion::result_of::distance
[SVN r37934]
2007-06-07 20:43:50 +00:00
d68dd4d43e more flat includes
[SVN r37909]
2007-06-06 01:23:45 +00:00
35ec412acf more flat includes
[SVN r37908]
2007-06-06 01:13:33 +00:00
6fbd010bbc more flat includes
[SVN r37907]
2007-06-06 00:18:13 +00:00
2bbf2a7ec4 added include/swap.hpp
[SVN r37905]
2007-06-05 22:09:51 +00:00
40524cfda1 loop unrolling count(_if)
[SVN r37875]
2007-06-02 21:48:14 +00:00
b33ce64895 correcting defective fusion count_if test case
[SVN r37874]
2007-06-02 16:48:49 +00:00
d2f019514e fusion find_if loop unrolling and use of advance optimization for random traversal sequences
[SVN r37856]
2007-06-01 22:47:49 +00:00
a4268d3cf9 loop unrolling for compile time perf in any, all and none
[SVN r37820]
2007-05-30 06:56:32 +00:00
da31732ca3 fixing defective test case with bad rvalue / lvalue handling issue
[SVN r37819]
2007-05-30 06:47:39 +00:00
6097406ca1 covering accumulate as part of fusion fold tests
[SVN r37807]
2007-05-28 23:13:46 +00:00
b935ea84a9 loop unrolling for fusion iteration algorithms
[SVN r37806]
2007-05-28 23:12:53 +00:00
2c7e484787 fix to transform view distance impl
[SVN r37805]
2007-05-28 22:57:59 +00:00
0ff8dd230d Removed tabs.
[SVN r37804]
2007-05-27 16:30:35 +00:00
05a706599a fix for swap picked up with gcc 4.1.2
[SVN r37791]
2007-05-26 19:54:13 +00:00
1bf333a444 fixes bug reported by John Maddock. Typo: associative structures have associative members.
[SVN r37762]
2007-05-24 21:08:34 +00:00
d171c25dd2 fixes bug in unfused_generic reported by Eric Niebler
[SVN r37739]
2007-05-22 10:53:49 +00:00
5ec07406da Adding file...
[SVN r37702]
2007-05-16 16:25:48 +00:00
f2f3b2cf1e Adding file...
[SVN r37701]
2007-05-16 16:10:58 +00:00
dfcadb449b tests for assoc struct adaptor
[SVN r37639]
2007-05-08 22:16:09 +00:00
f8bb69dc9a adding struct associative adaptor
[SVN r37638]
2007-05-08 22:14:58 +00:00
8b2e69c764 Added file.
[SVN r37604]
2007-05-06 19:18:27 +00:00
bb27fc1089 fusion swap documentation
[SVN r37570]
2007-05-02 22:47:23 +00:00
73d47b7267 Added file
[SVN r37562]
2007-05-02 18:14:22 +00:00
a1b7949dce tests for swap
[SVN r37553]
2007-05-01 20:57:15 +00:00
77c04b0e57 swap implementation
[SVN r37552]
2007-05-01 20:56:32 +00:00
da82119dd3 more flat includes
[SVN r37534]
2007-04-29 16:18:01 +00:00
416b82b14a some changes for conceptgcc-4.3
[SVN r37529]
2007-04-28 21:22:55 +00:00
4c4e91a3ce more flat includes
[SVN r37490]
2007-04-22 23:20:21 +00:00
1a1fe819dc more flat includes
[SVN r37487]
2007-04-22 10:09:38 +00:00
a7ca680c0f mpl.hpp header now includes 2 way mapping to and from mpl and fusion
#include <boost/fusion/sequence/adapted/mpl.hpp>
#include <boost/fusion/sequence/intrinsic/mpl.hpp>


[SVN r37484]
2007-04-22 08:06:36 +00:00
11a0b0acce more flat includes
[SVN r37479]
2007-04-22 06:40:33 +00:00
d87b6aaf57 fixed bug where first element is convertible from input sequence
[SVN r37475]
2007-04-20 03:45:36 +00:00
bf4c542d5d more flat includes
[SVN r37436]
2007-04-14 08:27:24 +00:00
bf4de4d0af typo fix
[SVN r37413]
2007-04-10 22:27:41 +00:00
02005e075f more flat includes
[SVN r37342]
2007-04-03 06:17:56 +00:00
8da8ce2c61 updates link to boost::shared_ptr
[SVN r37341]
2007-04-02 15:50:23 +00:00
33b2d3b750 changes phrasing (minor)
[SVN r37340]
2007-04-02 15:49:35 +00:00
67525cf4ab fixes typos: at<0>(...
[SVN r37339]
2007-04-02 15:45:59 +00:00
d19c24a886 functional module
[SVN r37338]
2007-04-02 15:43:37 +00:00
6a01312869 workaround for VC7.1 getting confused with optional and variant boost::get functions
[SVN r37337]
2007-04-02 13:20:16 +00:00
0913d82b43 forgot to commit.
[SVN r37336]
2007-04-02 12:41:10 +00:00
5e9e7f31a4 wrong library, FUSION, not SPIRIT
[SVN r37332]
2007-04-02 05:13:25 +00:00
bf05751f9e added BOOST_SPIRIT_ADAPT_STRUCT macro
[SVN r37331]
2007-04-02 04:34:24 +00:00
5423cde1f1 updates
[SVN r37329]
2007-04-02 03:52:41 +00:00
6002bc9bb4 added struct wrapping facilities to make it very easy to make any struct a conforming fusion sequence
[SVN r37328]
2007-04-02 03:31:13 +00:00
ddf9cb743a updates VC7.1 workaround
[SVN r37293]
2007-03-26 19:58:44 +00:00
ddf3aaed17 adds VC7.1 portability note, changes [tip ...] to [blurb __tip__ ...]
[SVN r37292]
2007-03-26 19:56:08 +00:00
20e0ffc461 hides effect of VC7.1 workaround
[SVN r37291]
2007-03-26 19:54:26 +00:00
db545933b5 removes dependency to deleted adapted/mpl/tag_of.hpp
[SVN r37288]
2007-03-26 18:05:18 +00:00
5d935861c6 added todo item
[SVN r37280]
2007-03-24 23:48:35 +00:00
f98528a2af using the correct PP constant for map_tie
[SVN r37267]
2007-03-22 22:45:27 +00:00
4904567639 added documentation for map_tie
[SVN r37266]
2007-03-22 22:43:09 +00:00
85801896c4 mo' to do
[SVN r37263]
2007-03-22 21:18:00 +00:00
ae0b09292e fixes ambiguity in tag_of specialization
[SVN r37260]
2007-03-22 19:21:29 +00:00
0c3a766ee8 mo' to do
[SVN r37258]
2007-03-21 19:31:13 +00:00
1a1b40925b adds repetitive_view test
[SVN r37257]
2007-03-21 18:41:35 +00:00
05ea6cfab9 added entry
[SVN r37249]
2007-03-20 23:43:06 +00:00
f8d675d38d added some simple tests for map_tie
[SVN r37248]
2007-03-20 21:33:12 +00:00
d879cfcb97 added some additional todo notes
[SVN r37247]
2007-03-20 21:04:30 +00:00
19ded670ac removed obsolete include
[SVN r37241]
2007-03-20 16:07:52 +00:00
c2275cefdb updated todo
[SVN r37240]
2007-03-20 13:02:26 +00:00
fd64eec23d adds repetitive_view
[SVN r37233]
2007-03-19 21:03:35 +00:00
29a57477e0 adds intrinsics to support the concept of the underlying sequence
[SVN r37232]
2007-03-19 19:03:41 +00:00
324923acc2 changes is_convertible<category_of... to is_<concept>
[SVN r37231]
2007-03-19 18:16:21 +00:00
e82ddaed38 support for sequences weaker than Forward Sequence
[SVN r37230]
2007-03-19 18:13:24 +00:00
798ebd7593 updates hopelessly outdated version (from pre-CVS era of fusion/functional)
[SVN r37201]
2007-03-16 15:14:46 +00:00
41b16b8717 iterator_range can't be more than a forward sequence, until we implement more intrinsics
[SVN r37200]
2007-03-16 15:10:55 +00:00
8f51212782 fix missing include
[SVN r37199]
2007-03-16 14:49:48 +00:00
74724c32dd testing the zip algorithm with unused arg
[SVN r37151]
2007-03-06 21:51:06 +00:00
d1cc519a44 unused entries in zip
[SVN r37150]
2007-03-06 21:37:26 +00:00
fad42340ad zip ignore capabilities
[SVN r37149]
2007-03-06 21:26:54 +00:00
92e7e32ed8 update copyright notice
[SVN r37131]
2007-03-02 10:44:14 +00:00
f19c0b767d unpack_args has been removed - there are docs for its replacement
[SVN r37075]
2007-02-25 22:25:29 +00:00
a3b3411384 removes obsolete unpack_args
[SVN r37074]
2007-02-25 22:15:59 +00:00
4d65880283 removes test for obsolete unpack_args
[SVN r37073]
2007-02-25 22:15:08 +00:00
5c77671af1 updates html files
[SVN r37072]
2007-02-25 22:02:27 +00:00
1a3b7b5d8c abbreviates section names in functional module, adds missing copyright
[SVN r37071]
2007-02-25 21:56:30 +00:00
e9c82ee03a abbreviated section names
[SVN r37070]
2007-02-25 21:55:40 +00:00
e9a597a1eb adds functional section TOC
[SVN r37069]
2007-02-25 21:13:57 +00:00
2522e62409 reduces chunk depth (Boost inspection complaints about path length)
[SVN r37068]
2007-02-25 21:12:10 +00:00
49a118d2b4 reduces accidentally high TOC level
[SVN r37067]
2007-02-25 20:56:47 +00:00
f0abc88775 Correct testing bugs:
either changing assert(...) or BOOST_ASSERT(...) to BOOST_TEST
    (in my code only)

    or adding "return boost::report_errors();" where it was clearly
    missing (and a pure bug, in anyone's code).


[SVN r37057]
2007-02-24 22:40:59 +00:00
9d5a463806 added flat include directory
[SVN r36993]
2007-02-18 16:07:55 +00:00
a9a9bd9475 adds MSVC workaround
[SVN r36988]
2007-02-18 00:42:14 +00:00
74d062d2da adds deduce metafunctions
[SVN r36964]
2007-02-15 23:31:33 +00:00
a56348497f adds O(1) empty implementation
[SVN r36963]
2007-02-15 23:28:40 +00:00
50e7b2c933 adds benchmark for functional components - draft version
[SVN r36962]
2007-02-15 23:20:27 +00:00
e710609227 adds example implementation of bind
[SVN r36961]
2007-02-15 23:19:09 +00:00
70a39b554f adds test suite for functional module
[SVN r36960]
2007-02-15 23:14:42 +00:00
ca6f831b96 adds documentation for functional module
[SVN r36959]
2007-02-15 23:11:24 +00:00
67f0df4958 moves Polymorphic Function Object concept to functional module
[SVN r36957]
2007-02-15 23:01:23 +00:00
0832de9bb3 adds functional module
[SVN r36956]
2007-02-15 22:48:01 +00:00
0ea1bbb067 adds functional module
[SVN r36955]
2007-02-15 22:41:45 +00:00
f975648eea vc7.1 bugfix
[SVN r36919]
2007-02-09 12:16:50 +00:00
94c2c0e526 vc7.1 bugfix (ICE)
[SVN r36918]
2007-02-09 12:16:39 +00:00
693200182f fixes
[SVN r36908]
2007-02-07 22:59:25 +00:00
a0a0613e36 fixing binary transform equal_to
[SVN r36823]
2007-01-28 20:52:15 +00:00
bd6f62ea3c fixing iterator comparison for transform view
[SVN r36822]
2007-01-28 10:17:56 +00:00
ef114d537d changes TOC settings to make all components reachable, again
[SVN r36814]
2007-01-27 13:05:23 +00:00
586440e16e introduces documentation for deduce / deduce_sequence
[SVN r36813]
2007-01-27 10:52:43 +00:00
1c542fa544 introduces test for deduce / deduce_sequence
[SVN r36812]
2007-01-27 10:49:00 +00:00
aa1d326ba4 introduces deduce metafunctions
[SVN r36811]
2007-01-27 10:42:55 +00:00
469a4a2d7a minor presentation tweaks
[SVN r36767]
2007-01-23 06:15:17 +00:00
63c122f0d8 Deeper TOC level + typo fix: rename apply->result in algo docs
[SVN r36766]
2007-01-22 00:40:36 +00:00
64a8b5e7f3 doc tweaks
[SVN r36747]
2007-01-18 07:26:33 +00:00
c5f8494832 prevents potential ODR violation through mpl::begin / mpl::is_sequence
[SVN r36727]
2007-01-14 13:35:28 +00:00
bc7d10ec94 added is_empty test
[SVN r36725]
2007-01-14 03:22:54 +00:00
bce9a2f6ff adds #undef to fix macro leak
[SVN r36722]
2007-01-13 19:44:15 +00:00
a5bb66618d removes outdated workaround for broken mpl::is_sequence
[SVN r36561]
2007-01-02 09:10:04 +00:00
2be540e903 some updates
[SVN r36555]
2007-01-01 02:23:51 +00:00
ef48d728ef fixing level at which sequence base is applied
[SVN r36460]
2006-12-19 14:46:40 +00:00
6ed683b610 added deque tests
[SVN r36458]
2006-12-18 22:36:43 +00:00
2fba7fb2f3 added initial version of deque
[SVN r36457]
2006-12-18 21:09:53 +00:00
31f5b55766 renamed Jamfile.v2 to Jamfile and updated the docs
[SVN r36379]
2006-12-14 08:41:22 +00:00
eba11fc229 Updates for boost::tuple and boost::variant
[SVN r36178]
2006-11-26 22:41:04 +00:00
e5cf298835 variant and boost tuple adaptor docs
[SVN r36140]
2006-11-21 22:49:05 +00:00
4f14542256 better operator handling
[SVN r36126]
2006-11-21 02:01:13 +00:00
1b7f4a1a47 Documentation fix + stuff
[SVN r36122]
2006-11-20 23:17:25 +00:00
141dac45fe no more #include <iostream>
[SVN r36102]
2006-11-20 06:18:12 +00:00
15ff870381 added code to peek into assembler
[SVN r36088]
2006-11-19 16:06:02 +00:00
70eb7e588d updates + zip tests
[SVN r36087]
2006-11-19 14:17:29 +00:00
4a0304a699 sequence performance tests
[SVN r36086]
2006-11-19 05:15:31 +00:00
5386f5dd3e corrected iterator comparison defect
[SVN r36063]
2006-11-16 22:09:39 +00:00
37baabd5d5 variant missing include fixes
[SVN r36062]
2006-11-16 22:08:50 +00:00
f742cee848 minor tweak
[SVN r36020]
2006-11-13 09:28:04 +00:00
fe9949a59c added variant traits tests
[SVN r36019]
2006-11-13 08:13:12 +00:00
e3f20b5224 added missing traits support
[SVN r36018]
2006-11-13 08:12:20 +00:00
165910e4a3 minor tweaks for intel
[SVN r36017]
2006-11-13 01:32:27 +00:00
c0c9bbc700 minor tweaks
[SVN r36016]
2006-11-13 01:16:28 +00:00
6860872d7b adding tests for variant as adapted sequence
[SVN r36015]
2006-11-12 23:08:59 +00:00
2a652e5424 variant as a fusion sequence
[SVN r36014]
2006-11-12 23:07:18 +00:00
0faf16666f segmented_size, for calculating the size of any segmented data structure
[SVN r35945]
2006-11-09 06:36:04 +00:00
c621277c07 usability tweaks: functions that return iterators return them as *const* to allow chaining when the recipient function expects a reference (e.g. foo(Iter&) )
[SVN r35940]
2006-11-09 01:48:46 +00:00
1326 changed files with 152946 additions and 0 deletions

205
.travis.yml Normal file
View File

@ -0,0 +1,205 @@
# Copyright 2016, 2017 Peter Dimov
# Copyright 2017-2018 Kohei Takahashi
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
language: cpp
sudo: false
os:
- linux
- osx
branches:
only:
- master
- develop
env:
matrix:
- BOGUS_JOB=true
matrix:
exclude:
- env: BOGUS_JOB=true
include:
# trusty default (gcc 4.8.4)
- os: linux
env: TOOLSET=gcc CXXSTD=03,11,1y
- os: linux
env: TOOLSET=gcc-4.7 CXXSTD=03,11
addons:
apt:
packages:
- g++-4.7
- os: linux
env: TOOLSET=gcc-4.8 CXXSTD=03,11,1y
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc-4.9 CXXSTD=03,11,1y
addons:
apt:
packages:
- g++-4.9
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc-5 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc-6 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc-7 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-7
sources:
- ubuntu-toolchain-r-test
# trusty default (clang 3.9.0)
- os: linux
env: TOOLSET=clang CXXSTD=03,11,14,1z
addons:
apt:
packages:
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang-3.5 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.5
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang-3.6 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.6
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6
- os: linux
env: TOOLSET=clang-3.7 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.7
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
- os: linux
env: TOOLSET=clang-3.8 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.8
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang-3.9 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.9
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang-4.0 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-4.0
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-4.0
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
install:
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
- cd ..
- git clone --depth 1 -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init libs/array
- git submodule init libs/assert
- git submodule init libs/bind
- git submodule init libs/concept_check
- git submodule init libs/config
- git submodule init libs/container_hash
- git submodule init libs/conversion
- git submodule init libs/core
- git submodule init libs/detail
- git submodule init libs/function
- git submodule init libs/function_types
- git submodule init libs/functional
- git submodule init libs/integer
- git submodule init libs/iterator
- git submodule init libs/lambda
- git submodule init libs/move
- git submodule init libs/mpl
- git submodule init libs/optional
- git submodule init libs/predef
- git submodule init libs/preprocessor
- git submodule init libs/smart_ptr
- git submodule init libs/static_assert
- git submodule init libs/throw_exception
- git submodule init libs/tuple
- git submodule init libs/type_index
- git submodule init libs/type_traits
- git submodule init libs/typeof
- git submodule init libs/utility
- git submodule init tools/build
- git submodule update
- rm -rf libs/fusion
- mv $TRAVIS_BUILD_DIR libs/fusion
- ln -s $(pwd)/libs/fusion $TRAVIS_BUILD_DIR
- ./bootstrap.sh
- ./b2 headers
script:
- ./b2 -j`(nproc || sysctl -n hw.ncpu) 2> /dev/null` libs/fusion/test toolset=$TOOLSET cxxstd=$CXXSTD

75
appveyor.yml Normal file
View File

@ -0,0 +1,75 @@
# Copyright 2016, 2017 Peter Dimov
# Copyright 2017-2018 Kohei Takahashi
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
version: 1.0.{build}-{branch}
shallow_clone: true
branches:
only:
- master
- develop
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-9.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-10.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-11.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-12.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-14.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLSET: msvc-14.1
install:
- set BOOST_BRANCH=develop
- if "%APPVEYOR_REPO_BRANCH%" == "master" set BOOST_BRANCH=master
- cd ..
- git clone --depth 1 -b %BOOST_BRANCH% https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init libs/array
- git submodule init libs/assert
- git submodule init libs/bind
- git submodule init libs/concept_check
- git submodule init libs/config
- git submodule init libs/container_hash
- git submodule init libs/conversion
- git submodule init libs/core
- git submodule init libs/detail
- git submodule init libs/function
- git submodule init libs/function_types
- git submodule init libs/functional
- git submodule init libs/integer
- git submodule init libs/iterator
- git submodule init libs/lambda
- git submodule init libs/move
- git submodule init libs/mpl
- git submodule init libs/optional
- git submodule init libs/predef
- git submodule init libs/preprocessor
- git submodule init libs/smart_ptr
- git submodule init libs/static_assert
- git submodule init libs/throw_exception
- git submodule init libs/tuple
- git submodule init libs/type_index
- git submodule init libs/type_traits
- git submodule init libs/typeof
- git submodule init libs/utility
- git submodule init tools/build
- git submodule update
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\fusion
- cmd /c bootstrap
- b2 headers
build: off
test_script:
- b2 -j%NUMBER_OF_PROCESSORS% --hash libs/fusion/test toolset=%TOOLSET%

32
doc/Jamfile Normal file
View File

@ -0,0 +1,32 @@
#==============================================================================
# Copyright (c) 2003-2011 Joel de Guzman
#
# Use, modification and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#==============================================================================
project boost/libs/fusion/doc ;
import boostbook : boostbook ;
using quickbook ;
path-constant images_location : html ;
boostbook quickbook
:
fusion.qbk
:
<xsl:param>boost.root=../../../..
<xsl:param>chunk.section.depth=4
<xsl:param>chunk.first.sections=1
<xsl:param>toc.section.depth=3
<xsl:param>toc.max.depth=3
<xsl:param>generate.section.toc.level=4
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/fusion/doc/html
<format>pdf:<xsl:param>img.src.path=$(images_location)/
;
###############################################################################
alias boostdoc ;
explicit boostdoc ;
alias boostrelease : quickbook ;
explicit boostrelease ;

24
doc/acknowledgements.qbk Normal file
View File

@ -0,0 +1,24 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Acknowledgements]
Special thanks to David Abrahams, Douglas Gregor, Hartmut Kaiser, Aleksey
Gurtovoy, Peder Holt, Daniel Wallin, Jaakko Jarvi, Jeremiah Willcock, Dan
Marsden, Eric Niebler, Joao Abecasis and Andy Little. These people are
instrumental in the design and development of Fusion.
Special thanks to Ronald Garcia, the review manager and to all the people in the
boost community who participated in the review: Andreas Pokorny, Andreas Huber,
Jeff Flinn, David Abrahams, Pedro Lamarao, Larry Evans, Ryan Gallagher, Andy
Little, Gennadiy Rozental, Tobias Schwinger, Joao Abecasis, Eric Niebler, Oleg
Abrosimov, Gary Powell, Eric Friedman, Darren Cook, Martin Bonner and Douglas
Gregor.
[endsect]

1501
doc/adapted.qbk Normal file

File diff suppressed because it is too large Load Diff

2848
doc/algorithm.qbk Normal file

File diff suppressed because it is too large Load Diff

52
doc/changelog.qbk Normal file
View File

@ -0,0 +1,52 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2006 Tobias Schwinger
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Change log]
This section summarizes significant changes to the Fusion library.
* Sep 27, 2006: Added `boost::tuple` support. (Joel de Guzman)
* Nov 17, 2006: Added `boost::variant` support. (Joel de Guzman)
* Feb 15, 2007: Added functional module. (Tobias Schwinger)
* April 2, 2007: Added struct adapter. (Joel de Guzman)
* May 8, 2007: Added associative struct adapter. (Dan Marsden)
* Dec 20, 2007: Removed `boost::variant` support. After thorough
investigation, I think now that the move to make variant a
fusion sequence is rather quirky. A variant will always
have a size==1 regardless of the number of types it can contain
and there's no way to know at compile time what it contains.
Iterating over its types is simply wrong. All these imply that
the variant is *not* a fusion sequence. (Joel de Guzman)
* Oct 12, 2009: The accumulator is the first argument to the functor of
__fold__ and __accumulate__. (Christopher Schmidt)
* Oct 30, 2009: Added support for associative iterators and views. (Christopher
Schmidt)
* March 1, 2010: Added __adapt_struct_named__ and __adapt_struct_named_ns__
(Hartmut Kaiser)
* April 4, 2010: Added __array__ support, __adapt_tpl_struct__,
__adapt_assoc_tpl_struct__, __adapt_assoc_struct_named__ and
__adapt_assoc_struct_named_ns__ (Christopher Schmidt)
* April 5, 2010: Added __define_struct__, __define_tpl_struct__,
__define_assoc_struct__ and __define_assoc_tpl_struct__ (Christopher Schmidt)
* June 18, 2010: Added __reverse_fold__, __iter_fold__ and __reverse_iter_fold__
(Christopher Schmidt)
* October 7, 2010: Added __adapt_adt__, __adapt_tpl_adt__,
__adapt_assoc_adt__ and __adapt_assoc_tpl_adt__ (Joel de Guzman,
Hartmut Kaiser and Christopher Schmidt)
* August 29, 2011: Added support for segmented sequences and iterators (Eric Niebler)
* September 16, 2011: Added preprocessed files (using wave) to speed up
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]

2247
doc/container.qbk Normal file

File diff suppressed because it is too large Load Diff

490
doc/extension.qbk Normal file
View File

@ -0,0 +1,490 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Extension]
[section:ext_full The Full Extension Mechanism]
The Fusion library is designed to be extensible, new sequences types can easily
be added. In fact, the library support for `std::pair`, `boost::array` and __mpl__
sequences is entirely provided using the extension mechanism.
The process for adding a new sequence type to Fusion is:
# Enable the __tag_dispatching__ mechanism used by Fusion for your sequence type
# Design an iterator type for the sequence
# Provide specialized behaviour for the intrinsic operations of the new Fusion sequence
[heading Our example]
In order to illustrate enabling a new sequence type for use with Fusion, we
are going to use the type:
namespace example
{
struct example_struct
{
std::string name;
int age;
example_struct(
const std::string& n,
int a)
: name(n), age(a)
{}
};
}
We are going to pretend that this type has been provided by a 3rd party
library, and therefore cannot be modified. We shall work through all the
necessary steps to enable `example_struct` to serve as an __associative_sequence__
as described in the __quick_start__ guide.
[heading Enabling Tag Dispatching]
The Fusion extensibility mechanism uses __tag_dispatching__ to call the
correct code for a given sequence type. In order to exploit the tag
dispatching mechanism we must first declare a new tag type for the
mechanism to use. For example:
namespace example {
struct example_sequence_tag; // Only definition needed
}
Next we need to enable the `traits::tag_of` metafunction to return our newly chosen
tag type for operations involving our sequence. This is done by specializing
`traits::tag_of` for our sequence type.
#include <boost/fusion/support/tag_of_fwd.hpp>
#include <boost/fusion/include/tag_of_fwd.hpp>
namespace boost { namespace fusion { namespace traits {
template<>
struct tag_of<example_struct>
{
typedef example::example_sequence_tag type;
};
}}}
`traits::tag_of` also has a second template argument,
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:
#include <boost/fusion/adapted/array/tag_of.hpp>
#include <boost/fusion/include/tag_of.hpp>
[heading Designing a suitable iterator]
We need an iterator to describe positions, and provide access to
the data within our sequence. As it is straightforward to do,
we are going to provide a random access iterator in our example.
We will use a simple design, in which the 2 members of
`example_struct` are given numbered indices, 0 for `name` and
1 for `age` respectively.
template<typename Struct, int Pos>
struct example_struct_iterator
: boost::fusion::iterator_base<example_struct_iterator<Struct, Pos> >
{
BOOST_STATIC_ASSERT(Pos >=0 && Pos < 3);
typedef Struct struct_type;
typedef boost::mpl::int_<Pos> index;
typedef boost::fusion::random_access_traversal_tag category;
example_struct_iterator(Struct& str)
: struct_(str) {}
Struct& struct_;
};
A quick summary of the details of our iterator:
# The iterator is parameterized by the type it is iterating over, and the index of the current element.
# The typedefs `struct_type` and `index` provide convenient access to information we will need later in
the implementation.
# The typedef `category` allows the `traits::__category_of__` metafunction to establish
the traversal category of the iterator.
# The constructor stores a reference to the `example_struct` being iterated over.
We also need to enable __tag_dispatching__ for our iterator type, with another specialization of
`traits::tag_of`.
In isolation, the iterator implementation is pretty dry. Things should become clearer as we
add features to our implementation.
[heading A first couple of instructive features]
To start with, we will get the __result_of_value_of__ metafunction working. To
do this, we provide a specialization of the `boost::fusion::extension::value_of_impl` template for
our iterator's tag type.
template<>
struct value_of_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply;
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 0> >
{
typedef std::string type;
};
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 1> >
{
typedef int type;
};
};
The implementation itself is pretty simple, it just uses 2 partial specializations to
provide the type of the 2 different members of `example_struct`, based on the index of the iterator.
To understand how `value_of_impl` is used by the library we will look at the implementation of __result_of_value_of__:
template <typename Iterator>
struct value_of
: extension::value_of_impl<typename detail::tag_of<Iterator>::type>::
template apply<Iterator>
{};
So __result_of_value_of__ uses __tag_dispatching__ to select an __mpl_metafunction_class__
to provide its functionality. You will notice this pattern throughout the
implementation of Fusion.
Ok, lets enable dereferencing of our iterator. In this case we must provide a suitable
specialization of `deref_impl`.
template<>
struct deref_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply;
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 0> >
{
typedef typename mpl::if_<
is_const<Struct>, std::string const&, std::string&>::type type;
static type
call(example::example_struct_iterator<Struct, 0> const& it)
{
return it.struct_.name;
}
};
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 1> >
{
typedef typename mpl::if_<
is_const<Struct>, int const&, int&>::type type;
static type
call(example::example_struct_iterator<Struct, 1> const& it)
{
return it.struct_.age;
}
};
};
}
The use of `deref_impl` is very similar to that of `value_of_impl`, but it also
provides some runtime functionality this time via the `call` static member function.
To see how `deref_impl` is used, lets have a look at the implementation of __deref__:
namespace result_of
{
template <typename Iterator>
struct __deref__
: extension::deref_impl<typename detail::tag_of<Iterator>::type>::
template apply<Iterator>
{};
}
template <typename Iterator>
typename result_of::deref<Iterator>::type
__deref__(Iterator const& i)
{
typedef result_of::deref<Iterator> deref_meta;
return deref_meta::call(i);
}
So again __result_of_deref__ uses __tag_dispatching__ in exactly the
same way as the __result_of_value_of__ implementation. The runtime functionality used
by __deref__ is provided by the `call` static function of the selected
__mpl_metafunction_class__.
The actual implementation of `deref_impl` is slightly more complex than that of `value_of_impl`.
We also need to implement the `call` function, which returns a reference
to the appropriate member of the underlying sequence. We also require a little
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 significant concepts
required. The remainder of the process is very repetitive, simply requiring
implementation of a suitable `xxxx_impl` for each feature `xxxx`.
]
[heading Implementing the remaining iterator functionality]
Ok, now we have seen the way __result_of_value_of__ and __deref__ work, everything else will work
in pretty much the same way. Lets start with forward iteration,
by providing a `next_impl`:
template<>
struct next_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply
{
typedef typename Iterator::struct_type struct_type;
typedef typename Iterator::index index;
typedef example::example_struct_iterator<struct_type, index::value + 1> type;
static type
call(Iterator const& i)
{
return type(i.struct_);
}
};
};
This should be very familiar from our `deref_impl` implementation, we will be
using this approach again and again now. Our design is simply to increment
the `index` counter to move on to the next element. The various other iterator
manipulations we need to perform will all just involve simple calculations
with the `index` variables.
We also need to provide a suitable `equal_to_impl` so that iterators can be
correctly compared. A __bidirectional_iterator__ will also need an implementation of `prior_impl`. For a
__random_access_iterator__ `distance_impl` and `advance_impl` also need to be provided
in order to satisfy the necessary complexity guarantees. As our iterator is
a __random_access_iterator__ we will have to implement all of these functions.
Full implementations of `prior_impl`, `advance_impl`, `distance_impl` and `equal_to_impl` are
provided in the example code.
[heading Implementing the intrinsic functions of the sequence]
In order that Fusion can correctly identify our sequence as a Fusion sequence, we
need to enable `is_sequence` for our sequence type. As usual we just create
an `impl` type specialized for our sequence tag:
template<>
struct is_sequence_impl<example::example_sequence_tag>
{
template<typename T>
struct apply : mpl::true_ {};
};
We've some similar formalities to complete, providing `category_of_impl` so Fusion
can correctly identify our sequence type, and `is_view_impl` so Fusion can correctly
identify our sequence as not being a __view__ type. Implementations are
provide in the example code.
Now we've completed some formalities, on to more interesting features. Lets get
__begin__ working so that we can get an iterator to start accessing the data in
our sequence.
template<>
struct begin_impl<example::example_sequence_tag>
{
template<typename Sequence>
struct apply
{
typedef example::example_struct_iterator<Sequence, 0> type;
static type
call(Sequence& seq)
{
return type(seq);
}
};
};
The implementation uses the same ideas we have applied throughout, in this case
we are just creating one of the iterators we developed earlier, pointing to the
first element in the sequence. The implementation of __end__ is very similar, and
is provided in the example code.
For our __random_access_sequence__ we will also need to implement `size_impl`,
`value_at_impl` and `at_impl`.
[heading Enabling our type as an associative sequence]
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__,
__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`
types described in the __quick_start__ guide with the appropriate members of `example_struct`.
Our implementation is as follows:
template<>
struct at_key_impl<example::example_sequence_tag>
{
template<typename Sequence, typename Key>
struct apply;
template<typename Sequence>
struct apply<Sequence, fields::name>
{
typedef typename mpl::if_<
is_const<Sequence>,
std::string const&,
std::string&>::type type;
static type
call(Sequence& seq)
{
return seq.name;
};
};
template<typename Sequence>
struct apply<Sequence, fields::age>
{
typedef typename mpl::if_<
is_const<Sequence>,
int const&,
int&>::type type;
static type
call(Sequence& seq)
{
return seq.age;
};
};
};
Its all very similar to the implementations we've seen previously,
such as `deref_impl` and `value_of_impl`. Instead of identifying
the members by index or position, we are now selecting them using
the types `fields::name` and `fields::age`. The implementations of
the other functions are equally straightforward, and are provided in
the example code.
[heading Summary]
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 long-winded, but followed
a simple repeating pattern.
The support for `std::pair`, __mpl__ sequences, and `boost::array` all
use the same approach, and provide additional examples of the approach
for a variety of types.
[endsect]
[section Sequence Facade]
[heading Description]
The __sequence_facade__ template provides an intrusive mechanism for
producing a conforming Fusion sequence.
[heading Synopsis]
template<typename Derived, typename TravesalTag, typename IsView = mpl::false_>
struct sequence_facade;
[heading Usage]
The user of __sequence_facade__ derives his sequence type from a specialization of __sequence_facade__ and passes the derived sequence type as the first template parameter. The second template parameter should be the traversal category of the sequence being implemented. The 3rd parameter should be set to `mpl::true_` if the sequence is a view.
The user must implement the key expressions required by their sequence type.
[table Parameters
[[Name][Description]]
[[`sequence`, `Seq`][A type derived from __sequence_facade__]]
[[`N`][An __mpl_integral_constant__]]
]
[table Key Expressions
[[Expression][Result]]
[[`sequence::template begin<Seq>::type`][The type of an iterator to the beginning of a sequence of type `Seq`]]
[[`sequence::template begin<Seq>::call(seq)`][An iterator to the beginning of sequence `seq`]]
[[`sequence::template end<Seq>::type`][The type of an iterator to the end of a sequence of type `Seq`]]
[[`sequence::template end<Seq>::call(seq)`][An iterator to the end of sequence `seq`]]
[[`sequence::template size<Seq>::type`][The size of a sequence of type `Seq` as an __mpl_integral_constant__]]
[[`sequence::template size<Seq>::call(seq)`][The size of sequence `seq`]]
[[`sequence::template empty<Seq>::type`][Returns `mpl::true_` if `Seq` has zero elements, `mpl::false_` otherwise.]]
[[`sequence::template empty<Seq>::call`][Returns a type convertible to `bool` that evaluates to true if the sequence is empty, else, evaluates to false. ]]
[[`sequence::template at<Seq, N>::type`][The type of element `N` in a sequence of type `Seq`]]
[[`sequence::template at<Seq, N>::call(seq)`][Element `N` in sequence `seq`]]
[[`sequence::template value_at<Sequence, N>::type`][The type of the `N`th element in a sequence of type `Seq`]]
]
[heading Include]
#include <boost/fusion/sequence/sequence_facade.hpp>
#include <boost/fusion/include/sequence_facade.hpp>
[heading Example]
A full working example using __sequence_facade__ is provided in triple.cpp in the extension examples.
[endsect]
[section Iterator Facade]
[heading Description]
The __iterator_facade__ template provides an intrusive mechanism for
producing a conforming Fusion iterator.
[heading Synopsis]
template<typename Derived, typename TravesalTag>
struct iterator_facade;
[heading Usage]
The user of iterator_facade derives his iterator type from a specialization of iterator_facade and passes the derived iterator type as the first template parameter. The second template parameter should be the traversal category of the iterator being implemented.
The user must implement the key expressions required by their iterator type.
[table Parameters
[[Name][Description]]
[[`iterator`, `It`, `It1`, `It2`][A type derived from __iterator_facade__]]
[[`N`][An __mpl_integral_constant__]]
]
[table Key Expressions
[[Expression][Result][Default]]
[[`iterator::template value_of<It>::type`][The element stored at iterator position `It`][None]]
[[`iterator::template deref<It>::type`][The type returned when dereferencing an iterator of type `It`][None]]
[[`iterator::template deref<It>::call(it)`][Dereferences iterator `it`][None]]
[[`iterator::template next<It>::type`][The type of the next element from `It`][None]]
[[`iterator::template next<It>::call(it)`][The next iterator after `it`][None]]
[[`iterator::template prior<It>::type`][The type of the next element from `It`][None]]
[[`iterator::template prior<It>::call(it)`][The next iterator after `it`][None]]
[[`iterator::template advance<It, N>::type`][The type of an iterator advanced `N` elements from `It`][Implemented in terms of `next` and `prior`]]
[[`iterator::template advance<It, N>::call(it)`][An iterator advanced `N` elements from `it`][Implemented in terms of `next` and `prior`]]
[[`iterator::template distance<It1, It2>::type`][The distance between iterators of type `It1` and `It2` as an __mpl_integral_constant__][None]]
[[`iterator::template distance<It1, It2>::call(it1, it2)`][The distance between iterator `it1` and `it2`][None]]
[[`iterator::template equal_to<It1, It2>::type`][Returns `mpl::true_` if `It1` is equal to `It2`, `mpl::false_` otherwise.][`boost::same_type<It1, It2>::type`]]
[[`iterator::template equal_to<It1, It2>::call(it1, it2)`][Returns a type convertible to `bool` that evaluates to `true` if `It1` is equal to `It2`, `false` otherwise.][`boost::same_type<It1, It2>::type()`]]
[[`iterator::template key_of<It>::type`][The key type associated with the element from `It`][None]]
[[`iterator::template value_of_data<It>::type`][The type of the data property associated with the element from `It`][None]]
[[`iterator::template deref_data<It>::type`][The type that will be returned by dereferencing the data property of the element from `It`][None]]
[[`iterator::template deref_data<It>::call(it)`][Deferences the data property associated with the element referenced by `it`][None]]
]
[heading Header]
#include <boost/fusion/iterator/iterator_facade.hpp>
#include <boost/fusion/include/iterator_facade.hpp>
[heading Example]
A full working example using __iterator_facade__ is provided in triple.cpp in the extension examples.
[endsect]
[endsect]

1402
doc/functional.qbk Normal file

File diff suppressed because it is too large Load Diff

361
doc/fusion.qbk Normal file
View File

@ -0,0 +1,361 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Copyright (C) 2018 Kohei Takahashi
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[library Fusion
[quickbook 1.3]
[version 2.2]
[authors [de Guzman, Joel], [Marsden, Dan], [Schwinger, Tobias]]
[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.
(See accompanying file LICENSE_1_0.txt or copy at
[@http://www.boost.org/LICENSE_1_0.txt])
]
]
[def __spirit__ [@http://boost-spirit.com/home/ Spirit]]
[def __phoenix__ [@http://www.boost.org/libs/phoenix Phoenix]]
[def __mpl__ [@http://www.boost.org/libs/mpl MPL]]
[def __stl__ [@http://en.wikipedia.org/wiki/Standard_Template_Library STL]]
[def __tuple__ [@http://www.boost.org/libs/tuple Boost.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://sourceforge.net/projects/spirit/lists/spirit-general Spirit Mailing List]]
[def __list_archive__ [@https://sourceforge.net/p/spirit/mailman/spirit-general/ archive]]
[def __jaakko_jarvi__ [@http://www.boost.org/people/jaakko_jarvi.htm Jaakko Jarvi]]
[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://www.boost.org/libs/any Boost.Any Library]]
[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/libs/array Boost.Array Library]]
[def __boost_variant_library__ [@http://www.boost.org/libs/variant Boost.Variant Library]]
[def __boost_tuple_library__ [@http://www.boost.org/libs/tuple Boost.Tuple Library]]
[def __boost_ref__ [@http://www.boost.org/libs/core/ref.html Ref utility]]
[def __boost_ref_call__ [@http://www.boost.org/libs/core/ref.html `ref`]]
[def __boost_result_of__ [@http://www.boost.org/libs/utility/utility.htm#result_of ResultOf utility]]
[def __boost_result_of_call__ [@http://www.boost.org/libs/utility/utility.htm#result_of `boost::result_of`]]
[def __boost_enable_if__ [@http://www.boost.org/libs/core/doc/html/core/enable_if.html EnableIf utility]]
[def __boost_shared_ptr_call__ [@http://www.boost.org/libs/smart_ptr#shared_ptr `boost::shared_ptr`]]
[def __boost_func_forward__ [@http://www.boost.org/libs/functional/forward Boost.Functional/Forward Library]]
[def __boost_func_factory__ [@http://www.boost.org/libs/functional/factory Boost.Functional/Factory Library]]
[def __boost_func_hash__ [@http://www.boost.org/doc/html/hash.html Boost.ContainerHash Library]]
[def __std_pair_doc__ [@http://en.cppreference.com/w/cpp/utility/pair `std::pair`]]
[def __std_tuple_doc__ [@http://en.cppreference.com/w/cpp/utility/tuple `std::tuple`]]
[def __std_plus_doc__ [@http://en.cppreference.com/w/cpp/utility/functional/plus `std::plus`]]
[def __std_minus_doc__ [@http://en.cppreference.com/w/cpp/utility/functional/minus `std::minus`]]
[def __mpl_integral_constant__ [@http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html MPL Integral Constant]]
[def __mpl_boolean_constant__ [@http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html MPL Boolean Constant]]
[def __mpl_metafunction_class__ [@http://www.boost.org/libs/mpl/doc/refmanual/metafunction-class.html MPL Metafunction Class]]
[def __mpl_lambda_expression__ [@http://www.boost.org/libs/mpl/doc/refmanual/lambda-expression.html MPL Lambda Expression]]
[def __lvalue__ LValue]
[def __unspecified__ /unspecified/]
[def __support__ [link fusion.support Support]]
[def __is_sequence__ [link fusion.support.is_sequence `is_sequence`]]
[def __is_view__ [link fusion.support.is_view `is_view`]]
[def __tag_of__ [link fusion.support.tag_of `tag_of`]]
[def __category_of__ [link fusion.support.category_of `category_of`]]
[def __deduce__ [link fusion.support.deduce `deduce`]]
[def __deduce_sequence__ [link fusion.support.deduce_sequence `deduce_sequence`]]
[def __fusion_pair__ [link fusion.support.pair `fusion::pair`]]
[def __pair__ [link fusion.support.pair `pair`]]
[def __fusion_make_pair__ [link fusion.support.pair `make_pair`]]
[def __iterator__ [link fusion.iterator Iterator]]
[def __iterator_concepts__ [link fusion.iterator.concepts Iterator Concepts]]
[def __forward_iterator__ [link fusion.iterator.concepts.forward_iterator Forward Iterator]]
[def __bidirectional_iterator__ [link fusion.iterator.concepts.bidirectional_iterator Bidirectional Iterator]]
[def __random_access_iterator__ [link fusion.iterator.concepts.random_access_iterator Random Access Iterator]]
[def __associative_iterator__ [link fusion.iterator.concepts.associative_iterator Associative Iterator]]
[def __unbounded_iterator__ [link fusion.iterator.concepts.unbounded_iterator Unbounded Iterator]]
[def __next__ [link fusion.iterator.functions.next `next`]]
[def __prior__ [link fusion.iterator.functions.prior `prior`]]
[def __advance__ [link fusion.iterator.functions.advance `advance`]]
[def __advance_c__ [link fusion.iterator.functions.advance_c `advance_c`]]
[def __distance__ [link fusion.iterator.functions.distance `distance`]]
[def __deref__ [link fusion.iterator.functions.deref `deref`]]
[def __deref_data__ [link fusion.iterator.functions.deref_data `deref_data`]]
[def __result_of_next__ [link fusion.iterator.metafunctions.next `result_of::next`]]
[def __result_of_prior__ [link fusion.iterator.metafunctions.prior `result_of::prior`]]
[def __result_of_equal_to__ [link fusion.iterator.metafunctions.equal_to `result_of::equal_to`]]
[def __result_of_advance__ [link fusion.iterator.metafunctions.advance `result_of::advance`]]
[def __result_of_advance_c__ [link fusion.iterator.metafunctions.advance_c `result_of::advance_c`]]
[def __result_of_distance__ [link fusion.iterator.metafunctions.distance `result_of::distance`]]
[def __result_of_deref__ [link fusion.iterator.metafunctions.deref `result_of::deref`]]
[def __result_of_value_of__ [link fusion.iterator.metafunctions.value_of `result_of::value_of`]]
[def __result_of_key_of__ [link fusion.iterator.metafunctions.key_of `result_of::key_of`]]
[def __result_of_value_of_data__ [link fusion.iterator.metafunctions.value_of_data `result_of::value_of_data`]]
[def __result_of_deref_data__ [link fusion.iterator.metafunctions.deref_data `result_of::deref_data`]]
[def __sequence__ [link fusion.sequence Sequence]]
[def __sequence_concepts__ [link fusion.sequence.concepts Sequence Concepts]]
[def __traversal_concept__ [link fusion.sequence.concepts.traversal Sequence Traversal Concept]]
[def __associativity_concept__ [link fusion.sequence.concepts.associativity Sequence Associativity Concept]]
[def __forward_sequence__ [link fusion.sequence.concepts.forward_sequence Forward Sequence]]
[def __bidirectional_sequence__ [link fusion.sequence.concepts.bidirectional_sequence Bidirectional Sequence]]
[def __random_access_sequence__ [link fusion.sequence.concepts.random_access_sequence Random Access Sequence]]
[def __associative_sequence__ [link fusion.sequence.concepts.associative_sequence Associative Sequence]]
[def __unbounded_sequence__ [link fusion.sequence.concepts.unbounded_sequence Unbounded Sequence]]
[def __containers__ [link fusion.container Container]]
[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`]]
[def __view__ [link fusion.view View]]
[def __views__ [link fusion.view Views]]
[def __single_view__ [link fusion.view.single_view `single_view`]]
[def __filter_view__ [link fusion.view.filter_view `filter_view`]]
[def __iterator_range__ [link fusion.view.iterator_range `iterator_range`]]
[def __joint_view__ [link fusion.view.joint_view `joint_view`]]
[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`]]
[def __boost_array__ [link fusion.adapted.boost__array `boost::array`]]
[def __mpl_sequence__ [link fusion.adapted.mpl_sequence mpl sequence]]
[def __adapt_tpl_struct__ [link fusion.adapted.adapt_tpl_struct `BOOST_FUSION_ADAPT_TPL_STRUCT`]]
[def __adapt_struct_named__ [link fusion.adapted.adapt_struct_named `BOOST_FUSION_ADAPT_STRUCT_NAMED`]]
[def __adapt_struct_named_ns__ [link fusion.adapted.adapt_struct_named `BOOST_FUSION_ADAPT_STRUCT_NAMED_NS`]]
[def __adapt_assoc_tpl_struct__ [link fusion.adapted.adapt_assoc_tpl_struct `BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT`]]
[def __adapt_assoc_struct_named__ [link fusion.adapted.adapt_assoc_struct_named `BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED`]]
[def __adapt_assoc_struct_named_ns__ [link fusion.adapted.adapt_assoc_struct_named `BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS`]]
[def __adapt_adt__ [link fusion.adapted.adapt_adt `BOOST_FUSION_ADAPT_ADT`]]
[def __adapt_tpl_adt__ [link fusion.adapted.adapt_tpl_adt `BOOST_FUSION_ADAPT_TPL_ADT`]]
[def __adapt_assoc_adt__ [link fusion.adapted.adapt_assoc_adt `BOOST_FUSION_ADAPT_ASSOC_ADT`]]
[def __adapt_assoc_tpl_adt__ [link fusion.adapted.adapt_assoc_tpl_adt `BOOST_FUSION_ADAPT_ASSOC_TPL_ADT`]]
[def __define_struct__ [link fusion.adapted.define_struct `BOOST_FUSION_DEFINE_STRUCT`]]
[def __define_tpl_struct__ [link fusion.adapted.define_tpl_struct `BOOST_FUSION_DEFINE_TPL_STRUCT`]]
[def __define_assoc_struct__ [link fusion.adapted.define_assoc_struct `BOOST_FUSION_DEFINE_ASSOC_STRUCT`]]
[def __define_assoc_tpl_struct__ [link fusion.adapted.define_assoc_tpl_struct `BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT`]]
[def __intrinsic__ [link fusion.sequence.intrinsic Intrinsic]]
[def __intrinsics__ [link fusion.sequence.intrinsic Intrinsics]]
[def __begin__ [link fusion.sequence.intrinsic.functions.begin `begin`]]
[def __result_of_begin__ [link fusion.sequence.intrinsic.metafunctions.begin `result_of::begin`]]
[def __end__ [link fusion.sequence.intrinsic.functions.end `end`]]
[def __result_of_end__ [link fusion.sequence.intrinsic.metafunctions.end `result_of::end`]]
[def __size__ [link fusion.sequence.intrinsic.functions.size `size`]]
[def __result_of_size__ [link fusion.sequence.intrinsic.metafunctions.size `result_of::size`]]
[def __empty__ [link fusion.sequence.intrinsic.functions.empty `empty`]]
[def __result_of_empty__ [link fusion.sequence.intrinsic.metafunctions.empty `result_of::empty`]]
[def __front__ [link fusion.sequence.intrinsic.functions.front `front`]]
[def __result_of_front__ [link fusion.sequence.intrinsic.metafunctions.front `result_of::front`]]
[def __back__ [link fusion.sequence.intrinsic.functions.back `back`]]
[def __result_of_back__ [link fusion.sequence.intrinsic.metafunctions.back `result_of::back`]]
[def __at__ [link fusion.sequence.intrinsic.functions.at `at`]]
[def __result_of_at__ [link fusion.sequence.intrinsic.metafunctions.at `result_of::at`]]
[def __at_c__ [link fusion.sequence.intrinsic.functions.at_c `at_c`]]
[def __result_of_at_c__ [link fusion.sequence.intrinsic.metafunctions.at_c `result_of::at_c`]]
[def __at_key__ [link fusion.sequence.intrinsic.functions.at_key `at_key`]]
[def __result_of_at_key__ [link fusion.sequence.intrinsic.metafunctions.at_key `result_of::at_key`]]
[def __has_key__ [link fusion.sequence.intrinsic.functions.has_key `has_key`]]
[def __result_of_has_key__ [link fusion.sequence.intrinsic.metafunctions.has_key `result_of::has_key`]]
[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]]
[def __as_vector__ [link fusion.container.conversion.functions.as_vector `as_vector`]]
[def __result_of_as_vector__ [link fusion.container.conversion.metafunctions.as_vector `result_of::as_vector`]]
[def __as_list__ [link fusion.container.conversion.functions.as_list `as_list`]]
[def __result_of_as_list__ [link fusion.container.conversion.metafunctions.as_list `result_of::as_list`]]
[def __as_set__ [link fusion.container.conversion.functions.as_set `as_set`]]
[def __result_of_as_set__ [link fusion.container.conversion.metafunctions.as_set `result_of::as_set`]]
[def __as_map__ [link fusion.container.conversion.functions.as_map `as_map`]]
[def __result_of_as_map__ [link fusion.container.conversion.metafunctions.as_map `result_of::as_map`]]
[def __generation__ [link fusion.container.generation.functions Generation]]
[def __result_of_generation__ [link fusion.container.generation.metafunctions Generation Metafunctions]]
[def __make_vector__ [link fusion.container.generation.functions.make_vector `make_vector`]]
[def __result_of_make_vector__ [link fusion.container.generation.metafunctions.make_vector `result_of::make_vector`]]
[def __vector_tie__ [link fusion.container.generation.functions.vector_tie `vector_tie`]]
[def __map_tie__ [link fusion.container.generation.functions.vector_tie `map_tie`]]
[def __result_of_vector_tie__ [link fusion.container.generation.metafunctions.vector_tie `result_of::vector_tie`]]
[def __make_vector__ [link fusion.container.generation.functions.make_vector `make_vector`]]
[def __result_of_make_vector__ [link fusion.container.generation.metafunctions.make_vector `result_of::make_vector`]]
[def __make_cons__ [link fusion.container.generation.functions.make_cons `make_cons`]]
[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]]
[def __eq__ [link fusion.sequence.operator.comparison.equal equal]]
[def __neq__ [link fusion.sequence.operator.comparison.not_equal not equal]]
[def __lt__ [link fusion.sequence.operator.comparison.less_than less than]]
[def __lte__ [link fusion.sequence.operator.comparison.less_than_equal less than equal]]
[def __gt__ [link fusion.sequence.operator.comparison.greater_than greater than]]
[def __gte__ [link fusion.sequence.operator.comparison.greater_than_equal greater than equal]]
[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`]]
[def __result_of_reverse_fold__ [link fusion.algorithm.iteration.metafunctions.reverse_fold `result_of::reverse_fold`]]
[def __iter_fold__ [link fusion.algorithm.iteration.functions.iter_fold `iter_fold`]]
[def __result_of_iter_fold__ [link fusion.algorithm.iteration.metafunctions.iter_fold `result_of::iter_fold`]]
[def __reverse_iter_fold__ [link fusion.algorithm.iteration.functions.reverse_iter_fold `reverse_iter_fold`]]
[def __result_of_reverse_iter_fold__ [link fusion.algorithm.iteration.metafunctions.reverse_iter_fold `result_of::reverse_iter_fold`]]
[def __accumulate__ [link fusion.algorithm.iteration.functions.accumulate `accumulate`]]
[def __result_of_accumulate__ [link fusion.algorithm.iteration.metafunctions.accumulate `result_of::accumulate`]]
[def __for_each__ [link fusion.algorithm.iteration.functions.for_each `for_each`]]
[def __result_of_for_each__ [link fusion.algorithm.iteration.metafunctions.for_each `result_of::for_each`]]
[def __any__ [link fusion.algorithm.query.functions.any `any`]]
[def __result_of_any__ [link fusion.algorithm.query.metafunctions.any `result_of::any`]]
[def __all__ [link fusion.algorithm.query.functions.all `all`]]
[def __result_of_all__ [link fusion.algorithm.query.metafunctions.all `result_of::all`]]
[def __none__ [link fusion.algorithm.query.functions.none `none`]]
[def __result_of_none__ [link fusion.algorithm.query.metafunctions.none `result_of::none`]]
[def __find__ [link fusion.algorithm.query.functions.find `find`]]
[def __result_of_find__ [link fusion.algorithm.query.metafunctions.find `result_of::find`]]
[def __find_if__ [link fusion.algorithm.query.functions.find_if `find_if`]]
[def __result_of_find_if__ [link fusion.algorithm.query.metafunctions.find_if `result_of::find_if`]]
[def __count__ [link fusion.algorithm.query.functions.count `count`]]
[def __result_of_count__ [link fusion.algorithm.query.metafunctions.count `result_of::count`]]
[def __count_if__ [link fusion.algorithm.query.functions.count_if `count_if`]]
[def __result_of_count_if__ [link fusion.algorithm.query.metafunctions.count_if `result_of::count_if`]]
[def __filter__ [link fusion.algorithm.transformation.functions.filter `filter`]]
[def __result_of_filter__ [link fusion.algorithm.transformation.metafunctions.filter `result_of::filter`]]
[def __filter_if__ [link fusion.algorithm.transformation.functions.filter_if `filter_if`]]
[def __result_of_filter_if__ [link fusion.algorithm.transformation.metafunctions.filter_if `result_of::filter_if`]]
[def __transform__ [link fusion.algorithm.transformation.functions.transform `transform`]]
[def __result_of_transform__ [link fusion.algorithm.transformation.metafunctions.transform `result_of::transform`]]
[def __replace__ [link fusion.algorithm.transformation.functions.replace `replace`]]
[def __result_of_replace__ [link fusion.algorithm.transformation.metafunctions.replace `result_of::replace`]]
[def __replace_if__ [link fusion.algorithm.transformation.functions.replace_if `replace_if`]]
[def __result_of_replace_if__ [link fusion.algorithm.transformation.metafunctions.replace_if `result_of::replace_if`]]
[def __remove__ [link fusion.algorithm.transformation.functions.remove `remove`]]
[def __result_of_remove__ [link fusion.algorithm.transformation.metafunctions.remove `result_of::remove`]]
[def __remove_if__ [link fusion.algorithm.transformation.functions.remove_if `remove_if`]]
[def __result_of_remove_if__ [link fusion.algorithm.transformation.metafunctions.remove_if `result_of::remove_if`]]
[def __reverse__ [link fusion.algorithm.transformation.functions.reverse `reverse`]]
[def __result_of_reverse__ [link fusion.algorithm.transformation.metafunctions.reverse `result_of::reverse`]]
[def __clear__ [link fusion.algorithm.transformation.functions.clear `clear`]]
[def __result_of_clear__ [link fusion.algorithm.transformation.metafunctions.clear `result_of::clear`]]
[def __erase__ [link fusion.algorithm.transformation.functions.erase `erase`]]
[def __result_of_erase__ [link fusion.algorithm.transformation.metafunctions.erase `result_of::erase`]]
[def __erase_key__ [link fusion.algorithm.transformation.functions.erase_key `erase_key`]]
[def __result_of_erase_key__ [link fusion.algorithm.transformation.metafunctions.erase_key `result_of::erase_key`]]
[def __insert__ [link fusion.algorithm.transformation.functions.insert `insert`]]
[def __result_of_insert__ [link fusion.algorithm.transformation.metafunctions.insert `result_of::insert`]]
[def __insert_range__ [link fusion.algorithm.transformation.functions.insert_range `insert_range`]]
[def __result_of_insert_range__ [link fusion.algorithm.transformation.metafunctions.insert_range `result_of::insert_range`]]
[def __join__ [link fusion.algorithm.transformation.functions.join `join`]]
[def __result_of_join__ [link fusion.algorithm.transformation.metafunctions.join `result_of::join`]]
[def __zip__ [link fusion.algorithm.transformation.functions.zip `zip`]]
[def __result_of_zip__ [link fusion.algorithm.transformation.metafunctions.zip `result_of::zip`]]
[def __pop_back__ [link fusion.algorithm.transformation.functions.pop_back `pop_back`]]
[def __result_of_pop_back__ [link fusion.algorithm.transformation.metafunctions.pop_back `result_of::pop_back`]]
[def __pop_front__ [link fusion.algorithm.transformation.functions.pop_front `pop_front`]]
[def __result_of_pop_front__ [link fusion.algorithm.transformation.metafunctions.pop_front `result_of::pop_front`]]
[def __push_back__ [link fusion.algorithm.transformation.functions.push_back `push_back`]]
[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`]]
[def __callable_obj__ [link fusion.functional.concepts.callable Callable Object]]
[def __def_callable_obj__ [link fusion.functional.concepts.def_callable Deferred Callable Object]]
[def __reg_callable_obj__ [link fusion.functional.concepts.reg_callable Regular Callable Object]]
[def __poly_func_obj__ [link fusion.functional.concepts.poly Polymorphic Function Object]]
[def __functional_adapters__ [link fusion.functional.adapters functional adapters]]
[def __fused__ [link fusion.functional.adapters.fused `fused`]]
[def __fused_procedure__ [link fusion.functional.adapters.fused_procedure `fused_procedure`]]
[def __fused_function_object__ [link fusion.functional.adapters.fused_function_object `fused_function_object`]]
[def __unfused__ [link fusion.functional.adapters.unfused `unfused`]]
[def __unfused_typed__ [link fusion.functional.adapters.unfused_typed `unfused_typed`]]
[def __invoke__ [link fusion.functional.invocation.functions.invoke `invoke`]]
[def __invoke_procedure__ [link fusion.functional.invocation.functions.invoke_proc `invoke_procedure`]]
[def __invoke_function_object__ [link fusion.functional.invocation.functions.invoke_fobj `invoke_function_object`]]
[def __make_fused__ [link fusion.functional.generation.functions.mk_fused `make_fused`]]
[def __make_fused_procedure__ [link fusion.functional.generation.functions.mk_fused_proc `make_fused_procedure`]]
[def __make_fused_function_object__ [link fusion.functional.generation.functions.mk_fused_fobj `make_fused_function_object`]]
[def __make_unfused__ [link fusion.functional.generation.functions.mk_unfused `make_unfused`]]
[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 `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_ref_wrappers__ [link fusion.notes.reference_wrappers `Reference Wrappers`]]
[def __quick_start__ [link fusion.quick_start Quick Start]]
[def __organization__ [link fusion.organization Organization]]
[def __extension__ [link fusion.extension Extension]]
[def __sequence_facade__ [link fusion.extension.sequence_facade `sequence_facade`]]
[def __iterator_facade__ [link fusion.extension.iterator_facade `iterator_facade`]]
[def __adt_attribute_proxy__ [link fusion.notes.adt_attribute_proxy `adt_attribute_proxy`]]
[def __window_function__ [@http://en.wikipedia.org/wiki/Window_function Window Function]]
[include preface.qbk]
[include introduction.qbk]
[include quick_start.qbk]
[include organization.qbk]
[include support.qbk]
[include iterator.qbk]
[include sequence.qbk]
[include container.qbk]
[include view.qbk]
[include adapted.qbk]
[include algorithm.qbk]
[include tuple.qbk]
[include extension.qbk]
[include functional.qbk]
[include notes.qbk]
[include changelog.qbk]
[include acknowledgements.qbk]
[include references.qbk]

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

287
doc/html/index.html Normal file
View File

@ -0,0 +1,287 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Chapter&#160;1.&#160;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&#160;1.&#160;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&#160;1.&#160;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 &#169; 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>
<dt><span class="section"><a href="fusion/iterator/concepts/unbounded_iterator.html">Unbounded
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>
<dt><span class="section"><a href="fusion/sequence/concepts/unbounded_sequence.html">Unbounded
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: June 25, 2015 at 13:41:27 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>

91
doc/introduction.qbk Normal file
View File

@ -0,0 +1,91 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Introduction]
An advantage other languages such as Python and Lisp/ Scheme, ML and
Haskell, etc., over C++ is the ability to have heterogeneous containers
that can hold arbitrary element types. All the containers in the standard
library can only hold a specific type. A `vector<int>` can only hold
`int`s. A `list<X>` can only hold elements of type `X`, and so on.
True, you can use inheritance to make the containers hold different types,
related through subclassing. However, you have to hold the objects through
a pointer or smart reference of some sort. Doing this, you'll have to rely
on virtual functions to provide polymorphic behavior since the actual type
is erased as soon as you store a pointer to a derived class to a pointer to
its base. The held objects must be related: you cannot hold objects of
unrelated types such as `char`, `int`, `class X`, `float`, etc. Oh sure you
can use something like __boost_any__ to hold arbitrary types, but then you
pay more in terms of runtime costs and due to the fact that you practically
erased all type information, you'll have to perform dangerous casts to get
back the original type.
The __tuple__ library written by __jaakko_jarvi__ provides heterogeneous
containers in C++. The `tuple` is a basic data structure that can hold
heterogeneous types. It's a good first step, but it's not complete. What's
missing are the algorithms. It's nice that we can store and retrieve data
to and from tuples, pass them around as arguments and return types. As it
is, the __tuple__ facility is already very useful. Yet, as soon as you use
it more often, usage patterns emerge. Eventually, you collect these
patterns into algorithm libraries.
Hmmm, kinda reminds us of STL right? Right! Can you imagine how it would be
like if you used STL without the algorithms? Everyone will have to reinvent
their own /algorithm/ wheels.
Fusion is a library and a framework similar to both __stl__ and the boost
__mpl__. The structure is modeled after __mpl__, which is modeled
after __stl__. It is named "fusion" because the library is reminiscent of
the "fusion" of compile time meta-programming with runtime programming. The
library inherently has some interesting flavors and characteristics of both
__mpl__ and __stl__. It lives in the twilight zone between compile time
meta-programming and run time programming. __stl__ containers work on
values. MPL containers work on types. Fusion containers work on both types
and values.
Unlike __mpl__, Fusion algorithms are lazy and non sequence-type
preserving. What does that mean? It means that when you operate on a
sequence through a Fusion algorithm that returns a sequence, the sequence
returned may not be of the same class as the original. This is by design.
Runtime efficiency is given a high priority. Like __mpl__, and unlike
__stl__, fusion algorithms are functional in nature such that algorithms
are non mutating (no side effects). However, due to the high cost of
returning full sequences such as vectors and lists, /Views/ are returned
from Fusion algorithms instead. For example, the __transform__ algorithm
does not actually return a transformed version of the original sequence.
__transform__ returns a __transform_view__. This view holds a reference to
the original sequence plus the transform function. Iteration over the
__transform_view__ will apply the transform function over the sequence
elements on demand. This /lazy/ evaluation scheme allows us to chain as
many algorithms as we want without incurring a high runtime penalty.
The /lazy/ evaluation scheme where algorithms return views allows
operations such as __push_back__ to be totally generic. In Fusion,
__push_back__ is actually a generic algorithm that works on all sequences.
Given an input sequence `s` and a value `x`, Fusion's __push_back__
algorithm simply returns a __joint_view__: a view that holds a reference to
the original sequence `s` and the value `x`. Functions that were once
sequence specific and need to be implemented N times over N different
sequences are now implemented only once.
Fusion provides full round compatibility with __mpl__. Fusion sequences are
fully conforming __mpl__ sequences and __mpl__ sequences are fully compatible
with Fusion. You can work with Fusion sequences on __mpl__ if you wish to work
solely on types [footnote Choose __mpl__ over fusion when doing pure type
calculations. Once the static type calculation is finished, you can instantiate
a fusion sequence (see __conversion__) for the runtime part.]. In __mpl__,
Fusion sequences follow __mpl__'s sequence-type preserving semantics (i.e.
algorithms preserve the original sequence type. e.g. transforming a vector
returns a vector). You can also convert from an __mpl__ sequence to a Fusion
sequence. For example, there are times when it is convenient to work solely on
__mpl__ using pure __mpl__ sequences, then, convert them to Fusion sequences as
a final step before actual instantiation of real runtime objects with data. You
have the best of both worlds.
[endsect]

1087
doc/iterator.qbk Normal file

File diff suppressed because it is too large Load Diff

231
doc/notes.qbk Normal file
View File

@ -0,0 +1,231 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Notes]
[heading Recursive Inlined Functions]
An interesting peculiarity of functions like __at__ when applied to a
__forward_sequence__ like __list__ is that what could have been linear
runtime complexity effectively becomes constant O(1) due to compiler
optimization of C++ inlined functions, however deeply recursive (up to a
certain compiler limit of course). Compile time complexity remains linear.
[heading Overloaded Functions]
Associative sequences use function overloading to implement membership
testing and type associated key lookup. This amounts to constant runtime
and amortized constant compile time complexities. There is an overloaded
function, `f(k)`, for each key /type/ `k`. The compiler chooses the
appropriate function given a key, `k`.
[heading Tag Dispatching]
Tag dispatching is a generic programming technique for selecting template
specializations. There are typically 3 components involved in the tag
dispatching mechanism:
# A type for which an appropriate template specialization is required
# A metafunction that associates the type with a tag type
# A template that is specialized for the tag type
For example, the fusion `result_of::begin` metafunction is implemented
as follows:
template <typename Sequence>
struct begin
{
typedef typename
result_of::begin_impl<typename traits::tag_of<Sequence>::type>::
template apply<Sequence>::type
type;
};
In the case:
# `Sequence` is the type for which a suitable implementation of
`result_of::begin_impl` is required
# `traits::tag_of` is the metafunction that associates `Sequence`
with an appropriate tag
# `result_of::begin_impl` is the template which is specialized to provide
an implementation for each tag type
[heading Extensibility]
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 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
"intrinsic" functions that actually return whole sequences. __mpl__ is
purely functional and can not have side effects. For example, __mpl__'s
`push_back` does not actually mutate an `mpl::vector`. It can't do that.
Instead, it returns an extended `mpl::vector`.
Like __mpl__, Fusion too is purely functional and can not have side
effects. With runtime efficiency in mind, Fusion sequences are extended
through generic functions that return __views__. __views__ are sequences
that do not actually contain data, but instead impart an alternative
presentation over the data from one or more underlying sequences. __views__
are proxies. They provide an efficient yet purely functional way to work on
potentially expensive sequence operations. For example, given a __vector__,
Fusion's __push_back__ returns a __joint_view__, instead of an actual
extended __vector__. A __joint_view__ holds a reference to the original
sequence plus the appended data --making it very cheap to pass around.
[heading Element Conversion]
Functions that take in elemental values to form sequences (e.g.
__make_list__) convert their arguments to something suitable to be stored
as a sequence element. In general, the element types are stored as plain
values. Example:
__make_list__(1, 'x')
returns a __list__`<int, char>`.
There are a few exceptions, however.
[*Arrays:]
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_ref_wrappers__).]:
__make_list__("Donald", "Daisy")
creates a __list__ of type
__list__<const char (&)[7], const char (&)[6]>
[*Function pointers:]
Function pointers are deduced to the plain non-reference type (i.e. to
plain function pointer). Example:
void f(int i);
...
__make_list__(&f);
creates a __list__ of type
__list__<void (*)(int)>
[heading Reference Wrappers]
Fusion's generation functions (e.g. __make_list__) by default stores the
element types as plain non-reference types. Example:
void foo(const A& a, B& b) {
...
__make_list__(a, b)
creates a __list__ of type
__list__<A, B>
Sometimes the plain non-reference type is not desired. You can use
`boost::ref` and `boost::cref` to store references or const references
(respectively) instead. The mechanism does not compromise const correctness
since a const object wrapped with ref results in a tuple element with const
reference type (see the fifth code line below). Examples:
For example:
A a; B b; const A ca = a;
__make_list__(cref(a), b); // creates list<const A&, B>
__make_list__(ref(a), b); // creates list<A&, B>
__make_list__(ref(a), cref(b)); // creates list<A&, const B&>
__make_list__(cref(ca)); // creates list<const A&>
__make_list__(ref(ca)); // creates list<const A&>
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,
but allow indirect access via expressions (such as invocations of get- and
set-methods), fusion's [^BOOST\_FUSION\_ADAPT\_['xxx]ADT['xxx]]-family (e.g.
__adapt_adt__) may be used.
To bypass the restriction of not having actual lvalues that
represent the elements of the fusion sequence, but rather a sequence of paired
expressions that access the elements, the actual return type of fusion's
intrinsic sequence access functions (__at__, __at_c__, __at_key__, __deref__,
and __deref_data__) is a proxy type, an instance of
`adt_attribute_proxy`, that encapsulates these expressions.
`adt_attribute_proxy` is defined in the namespace `boost::fusion::extension` and
has three template arguments:
namespace boost { namespace fusion { namespace extension
{
template<
typename Type
, int Index
, bool Const
>
struct adt_attribute_proxy;
}}}
When adapting a class type, `adt_attribute_proxy` is specialized for every
element of the adapted sequence, with `Type` being the class type that is
adapted, `Index` the 0-based indices of the elements, and `Const` both `true`
and `false`. The return type of fusion's intrinsic sequence access functions
for the ['N]th element of an adapted class type `type_name` is
[^adt_attribute_proxy<type_name, ['N], ['Const]>], with [^['Const]] being `true`
for constant instances of `type_name` and `false` for non-constant ones.
[variablelist Notation
[[`type_name`]
[The type to be adapted, with M attributes]]
[[`inst`]
[Object of type `type_name`]]
[[`const_inst`]
[Object of type `type_name const`]]
[[[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N])]]
[Attribute descriptor of the ['N]th attribute of `type_name` as passed to the adaption macro, 0\u2264['N]<M]]
[[[^proxy_type['N]]]
[[^adt_attribute_proxy<type_name, ['N], `false`>] with ['N] being an integral constant, 0\u2264['N]<M]]
[[[^const_proxy_type['N]]]
[[^adt_attribute_proxy<type_name, ['N], `true`>] with ['N] being an integral constant, 0\u2264['N]<M]]
[[[^proxy['N]]]
[Object of type [^proxy_type['N]]]]
[[[^const_proxy['N]]]
[Object of type [^const_proxy_type['N]]]]
]
[*Expression Semantics]
[table
[[Expression] [Semantics]]
[[[^proxy_type['N](inst)]] [Creates an instance of [^proxy_type['N]] with underlying object `inst`]]
[[[^const_proxy_type['N](const_inst)]] [Creates an instance of [^const_proxy_type['N]] with underlying object `const_inst`]]
[[[^proxy_type['N]::type]] [Another name for [^attribute_type['N]]]]
[[[^const_proxy_type['N]::type]] [Another name for [^const_attribute_type['N]]]]
[[[^proxy['N]=t]] [Invokes [^set_expr['N]], with `t` being an arbitrary object. [^set_expr['N]] may access the variables named `obj` of type `type_name&`, which represent the corresponding instance of `type_name`, and `val` of an arbitrary const-qualified reference template type parameter `Val`, which represents `t`.]]
[[[^proxy['N].get()]] [Invokes [^get_expr['N]] and forwards its return value. [^get_expr['N]] may access the variable named `obj` of type `type_name&` which represents the underlying instance of `type_name`. [^attribute_type['N]] may specify the type that [^get_expr['N]] denotes to.]]
[[[^const_proxy['N].get()]] [Invokes [^get_expr['N]] and forwards its return value. [^get_expr['N]] may access the variable named `obj` of type `type_name const&` which represents the underlying instance of `type_name`. [^attribute_const_type['N]] may specify the type that [^get_expr['N]] denotes to.]]
]
Additionally, [^proxy_type['N]] and [^const_proxy_type['N]] are copy
constructible, copy assignable and implicitly convertible to
[^proxy_type['N]::type] or [^const_proxy_type['N]::type].
[tip To avoid the pitfalls of the proxy type, an arbitrary class type may also
be adapted directly using fusion's [link fusion.extension intrinsic extension
mechanism].]
[endsect]

97
doc/organization.qbk Normal file
View File

@ -0,0 +1,97 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Organization]
The library is organized into layers of modules, with each module addressing a particular
area of responsibility. A module may not depend on modules in higher layers.
The library is organized in three layers:
[heading Layers]
[:[$images/fusion_org.png]]
The entire library is found in the `"boost/fusion"` directory. Modules are
organized in directories. Each module has its own header file placed in
the same directory with the actual module-directory. For example, there
exists `"boost/fusion/support.hpp"` in the same directory as
"boost/fusion/support". Everything, except those found inside "detail"
directories, is public.
There is also a `"boost/fusion/include/"` directory that contains all the
headers to all the components and modules. If you are unsure where to
find a specific component or module, or don't want to fuss with
hierarchy and nesting, use this.
The library is header-only. There is no need to build object files to
link against.
[heading Directory]
* tuple
* algorithm
* auxiliary
* iteration
* query
* transformation
* adapted
* adt
* array
* boost::array
* boost::tuple
* mpl
* std_pair
* std_tuple
* struct
* view
* filter_view
* flatten_view
* iterator_range
* joint_view
* nview
* repetitive_view
* reverse_view
* single_view
* transform_view
* zip_view
* container
* deque
* list
* map
* set
* vector
* generation
* mpl
* functional
* adapter
* generation
* invocation
* sequence
* comparison
* intrinsic
* io
* iterator
* support
[heading Example]
If, for example, you want to use `list`, depending on the granularity that
you desire, you may do so by including one of
#include <boost/fusion/container.hpp>
#include <boost/fusion/include/container.hpp>
#include <boost/fusion/container/list.hpp>
#include <boost/fusion/include/list.hpp>
The first includes all containers The second includes only `list`
[footnote Modules may contain smaller components. Header file
information for each component will be provided as part of the
component's documentation.].
[endsect]

68
doc/preface.qbk Normal file
View File

@ -0,0 +1,68 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Preface]
[:['["Algorithms + Data Structures = Programs.]]]
[:*--Niklaus Wirth*]
[heading Description]
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
as sequences, and Fusion has a suite of algorithms that operate upon the
various sequence types, using an iterator concept that binds everything
together.
The architecture is modeled after __mpl__ which in turn is modeled after
__stl__. It is named "fusion" because the library is a "fusion" of compile
time metaprogramming with runtime programming.
[heading Motivation]
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 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
takes place.
As __spirit__ and __phoenix__ evolved, patterns and idioms related to tuple
manipulation emerged. Soon, it became clear that those patterns and idioms
were best assembled in a tuples algorithms library. __david_abrahams__
outlined such a scheme in 2002. At that time, it just so happened that
__spirit__ and __phoenix__ had an adhoc collection of tuple manipulation
and traversal routines. It was an instant /AHA!/ moment.
[heading How to use this manual]
Some icons are used to mark certain topics indicative of their relevance.
These icons precede some text to indicate:
[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__.
[heading Support]
Please direct all questions to Spirit's mailing list. You can subscribe to the
__spirit_list__. The mailing list has a searchable archive. Here is a link to
the archives: __list_archive__.
[endsect]

169
doc/quick_start.qbk Normal file
View File

@ -0,0 +1,169 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Quick Start]
I assume the reader is already familiar with tuples (__tuple__) and its
ancestor `std::pair`. The tuple is a generalization of `std::pair` for
multiple heterogeneous elements (triples, quadruples, etc.). The tuple is
more or less a synonym for fusion's `__vector__`.
For starters, we shall include all of Fusion's __sequence__(s) [footnote There
are finer grained header files available if you wish to have more control
over which components to include (see section __organization__ for
details).]:
#include <boost/fusion/sequence.hpp>
#include <boost/fusion/include/sequence.hpp>
Let's begin with a `__vector__` [footnote Unless otherwise noted, components are
in namespace `boost::fusion`. For the sake of simplicity, code in this
quick start implies `using` directives for the fusion components we will be
using.]:
__vector__<int, char, std::string> stuff(1, 'x', "howdy");
int i = __at_c__<0>(stuff);
char ch = __at_c__<1>(stuff);
std::string s = __at_c__<2>(stuff);
Just replace `tuple` for `__vector__` and `get` for `__at_c__` and this is exactly
like __tuple__. Actually, either names can be used interchangeably. Yet,
the similarity ends there. You can do a lot more with Fusion `__vector__` or
`tuple`. Let's see some examples.
[heading Print the vector as XML]
First, let's include the algorithms:
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/include/algorithm.hpp>
Now, let's write a function object that prints XML of the form <type>data</type>
for each member in the tuple.
struct print_xml
{
template <typename T>
void operator()(T const& x) const
{
std::cout
<< '<' << typeid(x).name() << '>'
<< x
<< "</" << typeid(x).name() << '>'
;
}
};
Now, finally:
__for_each__(stuff, print_xml());
That's it! `__for_each__` is a fusion algorithm. It is a generic algorithm
similar to __stl__'s. It iterates over the sequence and calls a user
supplied function. In our case, it calls `print_xml`'s `operator()` for
each element in `stuff`.
[caution The result of `typeid(x).name()` is platform specific. The code
here is just for exposition. Of course you already know that :-)]
`__for_each__` is generic. With `print_xml`, you can use it to print just about
any Fusion __sequence__.
[heading Print only pointers]
Let's get a little cleverer. Say we wish to write a /generic/ function
that takes in an arbitrary sequence and XML prints only those elements
which are pointers. Ah, easy. First, let's include the `is_pointer` boost
type trait:
#include <boost/type_traits/is_pointer.hpp>
Then, simply:
template <typename Sequence>
void xml_print_pointers(Sequence const& seq)
{
__for_each__(__filter_if__<boost::is_pointer<_> >(seq), print_xml());
}
`__filter_if__` is another Fusion algorithm. It returns a __filter_view__,
a conforming Fusion sequence. This view reflects only those elements that
pass the given predicate. In this case, the predicate is
`boost::is_pointer<_>`. This "filtered view" is then passed to the
__for_each__ algorithm, which then prints the "filtered view" as XML.
Easy, right?
[heading Associative tuples]
Ok, moving on...
Apart from `__vector__`, fusion has a couple of other sequence types to choose
from. Each sequence has its own characteristics. We have `__list__`, `__set__`,
`__map__`, plus a multitude of `views` that provide various ways to present the
sequences.
Fusion's `__map__` associate types with elements. It can be used as a cleverer
replacement of the `struct`. Example:
namespace fields
{
struct name;
struct age;
}
typedef __map__<
__fusion_pair__<fields::name, std::string>
, __fusion_pair__<fields::age, int> >
person;
`__map__` is an associative sequence. Its elements are Fusion pairs which differ
somewhat from `std::pair`. Fusion pairs only contain one member, with the type of
their second template parameter. The first type parameter of the pair is used as an
index to the associated element in the sequence. For example, given a `a_person`
of type, `person`, you can do:
using namespace fields;
std::string person_name = __at_key__<name>(a_person);
int person_age = __at_key__<age>(a_person);
Why go through all this trouble, you say? Well, for one, unlike the
`struct`, we are dealing with a generic data structure. There are a
multitude of facilities available at your disposal provided out of the box
with fusion or written by others. With these facilities, introspection
comes for free, for example. We can write one serialization function (well,
two, if you consider loading and saving) that will work for all your fusion
`__map__`s. Example:
struct saver
{
template <typename Pair>
void operator()(Pair const& data) const
{
some_archive << data.second;
}
};
template <typename Stuff>
void save(Stuff const& stuff)
{
__for_each__(stuff, saver());
}
The `save` function is generic and will work for all types of `stuff`
regardless if it is a `person`, a `dog` or a whole `alternate_universe`.
[heading Tip of the Iceberg]
And... we've barely scratched the surface! You can compose and expand the
data structures, remove elements from the structures, find specific data
types, query the elements, filter out types for inspection, transform data
structures, etc. What you've seen is just the tip of the iceberg.
[endsect]

28
doc/references.qbk Normal file
View File

@ -0,0 +1,28 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2018 Kohei Takahashi
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section References]
# [@http://www.boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts],
David Abrahams, Jeremy Siek, Thomas Witt, 2004-11-01.
# [@http://www.boost.org/libs/tuple The Boost Tuple Library],
Jaakko Jarvi, 2001.
# [@http://www.boost.org/libs/spirit Spirit Parser Library],
Joel de Guzman, 2001-2006.
# [@http://www.boost.org/libs/mpl The Boost MPL Library],
Aleksey Gurtovoy and David Abrahams, 2002-2004.
# [@http://www.boost.org/libs/array The Boost Array Library],
Nicolai Josuttis, 2002-2004.
# [@http://www.boost.org/libs/core/ref.html Boost.Core / Ref utility],
Jaakko Jarvi, Peter Dimov, Douglas Gregor, Dave Abrahams, 1999-2002.
# [@http://www.boost.org/libs/hana The Boost Hana Library],
Louis Dionne, 2017.
[endsect]

2058
doc/sequence.qbk Normal file

File diff suppressed because it is too large Load Diff

427
doc/support.qbk Normal file
View File

@ -0,0 +1,427 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Support]
A couple of classes and metafunctions provide basic support for Fusion.
[section is_sequence]
[heading Description]
Metafunction that evaluates to `mpl::true_` if a certain type `T` is a
conforming Fusion __sequence__, `mpl::false_` otherwise. This may be
specialized to accommodate clients which provide Fusion conforming sequences.
[heading Synopsis]
namespace traits
{
template <typename T>
struct is_sequence
{
typedef __unspecified__ type;
};
}
[heading Parameters]
[table
[[Parameter] [Requirement] [Description]]
[[`T`] [Any type] [The type to query.]]
]
[heading Expression Semantics]
typedef traits::is_sequence<T>::type c;
[*Return type]: An __mpl_boolean_constant__.
[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type
`T` is a conforming Fusion sequence, `mpl::false_` otherwise.
[heading Header]
#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/include/is_sequence.hpp>
[heading Example]
BOOST_MPL_ASSERT_NOT(( traits::is_sequence< std::vector<int> > ));
BOOST_MPL_ASSERT_NOT(( is_sequence< int > ));
BOOST_MPL_ASSERT(( traits::is_sequence<__list__<> > ));
BOOST_MPL_ASSERT(( traits::is_sequence<__list__<int> > ));
BOOST_MPL_ASSERT(( traits::is_sequence<__vector__<> > ));
BOOST_MPL_ASSERT(( traits::is_sequence<__vector__<int> > ));
[endsect]
[section is_view]
[heading Description]
Metafunction that evaluates to `mpl::true_` if a certain type `T` is a
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 accommodate clients providing Fusion conforming views.
[heading Synopsis]
namespace traits
{
template <typename T>
struct is_view
{
typedef __unspecified__ type;
};
}
[heading Parameters]
[table
[[Parameter] [Requirement] [Description]]
[[`T`] [Any type] [The type to query.]]
]
[heading Expression Semantics]
typedef traits::is_view<T>::type c;
[*Return type]: An __mpl_boolean_constant__.
[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type
`T` is a conforming Fusion view, `mpl::false_` otherwise.
[heading Header]
#include <boost/fusion/support/is_view.hpp>
#include <boost/fusion/include/is_view.hpp>
[heading Example]
BOOST_MPL_ASSERT_NOT(( traits::is_view<std::vector<int> > ));
BOOST_MPL_ASSERT_NOT(( traits::is_view<int> ));
using boost::mpl::_
using boost::is_pointer;
typedef __vector__<int*, char, long*, bool, double> vector_type;
typedef __filter_view__<vector_type, is_pointer<_> > filter_view_type;
BOOST_MPL_ASSERT(( traits::is_view<filter_view_type> ));
[endsect]
[section tag_of]
[heading Description]
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 accommodate clients providing Fusion
conforming sequences.
[heading Synopsis]
namespace traits
{
template<typename Sequence>
struct tag_of
{
typedef __unspecified__ type;
};
}
[heading Parameters]
[table
[[Parameter] [Requirement] [Description]]
[[`T`] [Any type] [The type to query.]]
]
[heading Expression Semantics]
typedef traits::tag_of<T>::type tag;
[*Return type]: Any type.
[*Semantics]: Returns the tag type associated with `T`.
[heading Header]
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/include/tag_of.hpp>
[heading Example]
typedef traits::tag_of<__list__<> >::type tag1;
typedef traits::tag_of<__list__<int> >::type tag2;
typedef traits::tag_of<__vector__<> >::type tag3;
typedef traits::tag_of<__vector__<int> >::type tag4;
BOOST_MPL_ASSERT((boost::is_same<tag1, tag2>));
BOOST_MPL_ASSERT((boost::is_same<tag3, tag4>));
[endsect]
[section category_of]
[heading Description]
A metafunction that establishes the conceptual classification of a particular
__sequence__ or __iterator__ (see __iterator_concepts__ and
__sequence_concepts__).
[heading Synopsis]
namespace traits
{
template <typename T>
struct category_of
{
typedef __unspecified__ type;
};
}
[heading Parameters]
[table
[[Parameter] [Requirement] [Description]]
[[`T`] [Any type] [The type to query.]]
]
[heading Expression Semantics]
typedef traits::category_of<T>::type category;
[*Return type]:
The return type is derived from one of:
namespace boost { namespace fusion
{
struct incrementable_traversal_tag {};
struct single_pass_traversal_tag
: incrementable_traversal_tag {};
struct forward_traversal_tag
: single_pass_traversal_tag {};
struct bidirectional_traversal_tag
: forward_traversal_tag {};
struct random_access_traversal_tag
: bidirectional_traversal_tag {};
}}
And optionally from:
namespace boost { namespace fusion
{
struct associative_tag {};
struct unbounded_tag {};
}}
[*Semantics]: Establishes the conceptual classification of a particular
__sequence__ or __iterator__.
[heading Header]
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/include/category_of.hpp>
[heading Example]
using boost::is_base_of;
typedef traits::category_of<__list__<> >::type list_category;
typedef traits::category_of<__vector__<> >::type vector_category;
BOOST_MPL_ASSERT(( is_base_of<forward_traversal_tag, list_category> ));
BOOST_MPL_ASSERT(( is_base_of<random_access_traversal_tag, vector_category> ));
[endsect]
[section deduce]
[heading Description]
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_ref_wrappers__)[footnote Since C++11, the standard reference wrappers
are also removed.].
[heading Header]
#include <boost/fusion/support/deduce.hpp>
#include <boost/fusion/include/deduce.hpp>
[heading Synopsis]
namespace traits
{
template <typename T>
struct deduce
{
typedef __unspecified__ type;
};
}
[heading Example]
template <typename T>
struct holder
{
typename traits::deduce<T const &>::type element;
holder(T const & a)
: element(a)
{ }
};
template <typename T>
holder<T> make_holder(T const & a)
{
return holder<T>(a);
}
[heading See also]
* __deduce_sequence__
[endsect]
[section deduce_sequence]
[heading Description]
Applies __element_conversion__ to each element in a __forward_sequence__.
The resulting type is a __random_access_sequence__ that provides a converting
constructor accepting the original type as its argument.
[heading Header]
#include <boost/fusion/support/deduce_sequence.hpp>
#include <boost/fusion/include/deduce_sequence.hpp>
[heading Synopsis]
namespace traits
{
template <class Sequence>
struct deduce_sequence
{
typedef __unspecified__ type;
};
}
[heading Example]
template <class Seq>
struct holder
{
typename traits::deduce_sequence<Seq>::type element;
holder(Seq const & a)
: element(a)
{ }
};
template <typename T0, typename T1>
holder< __vector__<T0 const &, T1 const &> >
make_holder(T0 const & a0, T1 const & a1)
{
typedef __vector__<T0 const &, T1 const &> arg_vec_t;
return holder<arg_vec_t>( arg_vec_t(a0,a1) );
}
[heading See also]
* __deduce__
[endsect]
[section pair]
[heading Description]
Fusion `pair` type is a half runtime pair. A half runtime pair is similar
to a __std_pair__, but, unlike __std_pair__, the first type does not have data.
It is used as elements in __map__\ s, for example.
[heading Synopsis]
template <typename First, typename Second>
struct pair;
namespace result_of
{
template <typename Pair>
struct first;
template <typename Pair>
struct second;
template <typename First, typename Second>
struct make_pair;
}
template <typename First, typename Second>
typename result_of::make_pair<First,Second>::type
make_pair(Second const &);
[heading Template parameters]
[table
[[Parameter] [Description]]
[[First] [The first type. This is purely a type. No data is held.]]
[[Second] [The second type. This contains data.]]
]
[variablelist Notation
[[`P`] [Fusion pair type]]
[[`p`, `p2`] [Fusion pairs]]
[[`F`, `S`] [Arbitrary types]]
[[`s`] [Value of type `S`]]
[[`o`] [Output stream]]
[[`i`] [Input stream]]
]
[heading Expression Semantics]
[table
[[Expression] [Semantics]]
[[`P::first_type`] [The type of the first template parameter, `F`, equivalent to
`result_of::first<P>::type`. ]]
[[`P::second_type`] [The type of the second template parameter, `S`, equivalent to
`result_of::second<P>::type`. ]]
[[`P()`] [Default construction.]]
[[`P(s)`] [Construct a pair given value for the second type, `s`.]]
[[`P(p2)`] [Copy constructs a pair from another pair, `p2`.]]
[[`p.second`] [Get the data from `p1`.]]
[[`p = p2`] [Assigns a pair, `p1`, from another pair, `p2`.]]
[[make_pair<F>(s)] [Make a pair given the first type, `F`, and a value for
the second type, `s`. The second type assumes the type of `s`]]
[[`o << p`] [Output `p` to output stream, `o`.]]
[[`i >> p`] [Input `p` from input stream, `i`.]]
[[`p == p2`] [Tests two pairs for equality.]]
[[`p != p2`] [Tests two pairs for inequality.]]
]
[heading Header]
#include <boost/fusion/support/pair.hpp>
#include <boost/fusion/include/pair.hpp>
[heading Example]
pair<int, char> p('X');
std::cout << p << std::endl;
std::cout << make_pair<int>('X') << std::endl;
assert((p == make_pair<int>('X')));
[endsect]
[endsect]

287
doc/tuple.qbk Normal file
View File

@ -0,0 +1,287 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Tuple]
The TR1 technical report describes extensions to the C++ standard library.
Many of these extensions will be considered for the next
iteration of the C++ standard. TR1 describes a tuple type, and
support for treating `std::pair` as a type of tuple.
Fusion provides full support for the __tr1__tuple__ interface, and the extended
uses of `std::pair` described in the TR1 document.
[section Class template tuple]
Fusion's implementation of the __tr1__tuple__ is also a fusion __forward_sequence__.
As such the fusion tuple type provides a lot of functionality beyond that required by TR1.
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__,
typename T2 = __unspecified__,
...
typename TN = __unspecified__>
class tuple;
[section Construction]
[heading Description]
The __tr1__tuple__ type provides a default constructor, a constructor that takes initializers for all of its elements, a copy constructor, and a converting copy constructor. The details of the various constructors are described in this section.
[heading Specification]
[variablelist Notation
[[`T1 ... TN`, `U1 ... UN`][Tuple element types]]
[[`P1 ... PN`] [Parameter types]]
[[`Ti`, `Ui`] [The type of the `i`th element of a tuple]]
[[`Pi`] [The type of the `i`th parameter]]
]
tuple();
[*Requirements]: Each `Ti` is default-constructible.
[*Semantics]: Default initializes each element of the tuple.
tuple(P1,P2,...,PN);
[*Requirements]: Each `Pi` is `Ti` if `Ti` is a reference type, `const Ti&` otherwise.
[*Semantics]: Copy initializes each element with the corresponding parameter.
tuple(const tuple& t);
[*Requirements]: Each `Ti` should be copy-constructible.
[*Semantics]: Copy constructs each element of `*this` with the corresponding element of `t`.
template<typename U1, typename U2, ..., typename UN>
tuple(const tuple<U1, U2, ..., UN>& t);
[*Requirements]: Each `Ti` shall be constructible from the corresponding `Ui`.
[*Semantics]: Constructs each element of `*this` with the corresponding element of `t`.
[endsect]
[section Tuple creation functions]
[heading Description]
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);
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);
[*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]
[section Tuple helper classes]
[heading Description]
The __tr1__tuple__ provides 2 helper traits, for compile time access to the tuple size, and the element types.
[heading Specification]
tuple_size<T>::value
[*Requires]: `T` is any fusion sequence type, including `tuple`.
[*Type]: __mpl_integral_constant__
[*Value]: The number of elements in the sequence. Equivalent to `__result_of_size__<T>::type`.
tuple_element<I, T>::type
[*Requires]: `T` is any fusion sequence type, including `tuple`. `0 <= I < N` or the program is ill formed.
[*Value]: The type of the `I`th element of `T`. Equivalent to `__result_of_value_at__<I,T>::type`.
[endsect]
[section Element access]
[heading Description]
The __tr1__tuple__ provides the `get` function to provide access to it's elements by zero based numeric index.
[heading Specification]
template<int I, T>
RJ get(T& t);
[*Requires]: `0 < I <= N`. The program is ill formed if `I` is out of bounds.
`T` is any fusion sequence type, including `tuple`.
[*Return type]: `RJ` is equivalent to `__result_of_at_c__<I,T>::type`.
[*Returns]: A reference to the `I`th element of `T`.
template<int I, typename T>
PJ get(T const& t);
[*Requires]: `0 < I <= N`. The program is ill formed if `I` is out of bounds.
`T` is any fusion sequence type, including `tuple`.
[*Return type]: `PJ` is equivalent to `__result_of_at_c__<I,T>::type`.
[*Returns]: A const reference to the `I`th element of `T`.
[endsect]
[section Relational operators]
[heading Description]
The __tr1__tuple__ provides the standard boolean relational operators.
[heading Specification]
[variablelist Notation
[[`T1 ... TN`, `U1 ... UN`][Tuple element types]]
[[`P1 ... PN`] [Parameter types]]
[[`Ti`, `Ui`] [The type of the `i`th element of a tuple]]
[[`Pi`] [The type of the `i`th parameter]]
]
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator==(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(lhs) == __tuple_get__<i>(rhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns `true` if and only if `__tuple_get__<i>(lhs) == __tuple_get__<i>(rhs)` for all `i`.
For any 2 zero length tuples `e` and `f`, `e == f` returns `true`.
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator<(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(lhs) < __tuple_get__<i>(rhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns the lexicographical comparison of between `lhs` and `rhs`.
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator!=(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(lhs) == __tuple_get__<i>(rhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns `!(lhs == rhs)`.
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator<=(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(rhs) < __tuple_get__<i>(lhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns `!(rhs < lhs)`
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator>(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(rhs) < __tuple_get__<i>(lhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns `rhs < lhs`.
template<typename T1, typename T2, ..., typename TN,
typename U1, typename U2, ..., typename UN>
bool operator>=(
const tuple<T1, T2, ..., TN>& lhs,
const tuple<U1, U2, ..., UN>& rhs);
[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__<i>(lhs) < __tuple_get__<i>(rhs)` is a valid
expression returning a type that is convertible to `bool`.
[*Semantics]: Returns `!(lhs < rhs)`.
[endsect]
[endsect]
[section Pairs]
[heading Description]
The __tr1__tuple__ interface is specified to provide uniform access to `std::pair` as if it were a 2 element tuple.
[heading Specification]
tuple_size<std::pair<T1, T2> >::value
[*Type]: An __mpl_integral_constant__
[*Value]: Returns 2, the number of elements in a pair.
tuple_element<0, std::pair<T1, T2> >::type
[*Type]: `T1`
[*Value]: Returns the type of the first element of the pair
tuple_element<1, std::pair<T1, T2> >::type
[*Type]: `T2`
[*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);
template<int I, typename T1, typename T2>
const P& get(const std::pair<T1, T2>& pr);
[*Type]: If `I == 0` `P` is `T1`, else if `I == 1` `P` is `T2` else the program is ill-formed.
[*Returns: `pr.first` if `I == 0` else `pr.second`.
[endsect]
[endsect]

671
doc/view.qbk Normal file
View File

@ -0,0 +1,671 @@
[/==============================================================================
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section View]
Views are sequences that do not actually contain data, but instead impart
an alternative presentation over the data from one or more underlying
sequences. Views are proxies. They provide an efficient yet purely
functional way to work on potentially expensive sequence operations. Views
are inherently lazy. Their elements are only computed on demand only when
the elements of the underlying sequence(s) are actually accessed. Views'
lazy nature make them very cheap to copy and be passed around by value.
[heading Header]
#include <boost/fusion/view.hpp>
#include <boost/fusion/include/view.hpp>
[section single_view]
`single_view` is a view into a value as a single element sequence.
[heading Header]
#include <boost/fusion/view/single_view.hpp>
#include <boost/fusion/include/single_view.hpp>
[heading Synopsis]
template <typename T>
struct single_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`T`] [Any type] []]
]
[heading Model of]
* __random_access_sequence__
[variablelist Notation
[[`S`] [A `single_view` type]]
[[`s`, `s2`] [Instances of `single_view`]]
[[`x`] [An instance of `T`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in __random_access_sequence__.
[table
[[Expression] [Semantics]]
[[`S(x)`] [Creates a `single_view` from `x`.]]
[[`S(s)`] [Copy constructs a `single_view` from another `single_view`, `s`.]]
[[`s = s2`] [Assigns to a `single_view`, `s`, from another `single_view`, `s2`.]]
]
[heading Example]
single_view<int> view(3);
std::cout << view << std::endl;
[endsect]
[section filter_view]
[heading Description]
`filter_view` is a view into a subset of its underlying sequence's elements
satisfying a given predicate (an __mpl__ metafunction). The `filter_view`
presents only those elements for which its predicate evaluates to
`mpl::true_`.
[heading Header]
#include <boost/fusion/view/filter_view.hpp>
#include <boost/fusion/include/filter_view.hpp>
[heading Synopsis]
template <typename Sequence, typename Pred>
struct filter_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence`] [A __forward_sequence__] []]
[[`Pred`] [Unary Metafunction
returning an `mpl::bool_`] []]
]
[heading Model of]
* __forward_sequence__
* __associative_sequence__ if `Sequence` implements the __associative_sequence__ model.
[variablelist Notation
[[`F`] [A `filter_view` type]]
[[`f`, `f2`] [Instances of `filter_view`]]
[[`s`] [A __forward_sequence__]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in the implemented models.
[table
[[Expression] [Semantics]]
[[`F(s)`] [Creates a `filter_view` given a sequence, `s`.]]
[[`F(f)`] [Copy constructs a `filter_view` from another `filter_view`, `f`.]]
[[`f = f2`] [Assigns to a `filter_view`, `f`, from another `filter_view`, `f2`.]]
]
[heading Example]
using boost::mpl::_;
using boost::mpl::not_;
using boost::is_class;
typedef __vector__<std::string, char, long, bool, double> vector_type;
vector_type v("a-string", '@', 987654, true, 6.6);
filter_view<vector_type const, not_<is_class<_> > > view(v);
std::cout << view << std::endl;
[endsect]
[section iterator_range]
[heading Description]
`iterator_range` presents a sub-range of its underlying sequence delimited
by a pair of iterators.
[heading Header]
#include <boost/fusion/view/iterator_range.hpp>
#include <boost/fusion/include/iterator_range.hpp>
[heading Synopsis]
template <typename First, typename Last>
struct iterator_range;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`First`] [A fusion __iterator__] []]
[[`Last`] [A fusion __iterator__] []]
]
[heading Model of]
* __forward_sequence__, __bidirectional_sequence__ or
__random_access_sequence__ depending on the traversal characteristics (see
__traversal_concept__) of its underlying sequence.
* __associative_sequence__ if `First` and `Last` implement the __associative_iterator__ model.
[variablelist Notation
[[`IR`] [An `iterator_range` type]]
[[`f`] [An instance of `First`]]
[[`l`] [An instance of `Last`]]
[[`ir`, `ir2`] [Instances of `iterator_range`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in the implemented models.
[table
[[Expression] [Semantics]]
[[`IR(f, l)`] [Creates an `iterator_range` given iterators, `f` and `l`.]]
[[`IR(ir)`] [Copy constructs an `iterator_range` from another `iterator_range`, `ir`.]]
[[`ir = ir2`] [Assigns to a `iterator_range`, `ir`, from another `iterator_range`, `ir2`.]]
]
[heading Example]
char const* s = "Ruby";
typedef __vector__<int, char, double, char const*> vector_type;
vector_type vec(1, 'x', 3.3, s);
typedef __result_of_begin__<vector_type>::type A;
typedef __result_of_end__<vector_type>::type B;
typedef __result_of_next__<A>::type C;
typedef __result_of_prior__<B>::type D;
C c(vec);
D d(vec);
iterator_range<C, D> range(c, d);
std::cout << range << std::endl;
[endsect]
[section joint_view]
[heading Description]
`joint_view` presents a view which is a concatenation of two sequences.
[heading Header]
#include <boost/fusion/view/joint_view.hpp>
#include <boost/fusion/include/joint_view.hpp>
[heading Synopsis]
template <typename Sequence1, typename Sequence2>
struct joint_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence1`] [A __forward_sequence__] []]
[[`Sequence2`] [A __forward_sequence__] []]
]
[heading Model of]
* __forward_sequence__
* __associative_sequence__ if `Sequence1` and `Sequence2` implement the __associative_sequence__ model.
[variablelist Notation
[[`JV`] [A `joint_view` type]]
[[`s1`] [An instance of `Sequence1`]]
[[`s2`] [An instance of `Sequence2`]]
[[`jv`, `jv2`] [Instances of `joint_view`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in the implemented models.
[table
[[Expression] [Semantics]]
[[`JV(s1, s2)`] [Creates a `joint_view` given sequences, `s1` and `s2`.]]
[[`JV(jv)`] [Copy constructs a `joint_view` from another `joint_view`, `jv`.]]
[[`jv = jv2`] [Assigns to a `joint_view`, `jv`, from another `joint_view`, `jv2`.]]
]
[heading Example]
__vector__<int, char> v1(3, 'x');
__vector__<std::string, int> v2("hello", 123);
joint_view<
__vector__<int, char>
, __vector__<std::string, int>
> view(v1, v2);
std::cout << view << std::endl;
[endsect]
[section zip_view]
[heading Description]
`zip_view` presents a view which iterates over a collection of __sequence__(s) in parallel. A `zip_view`
is constructed from a __sequence__ of references to the component __sequence__s.
[heading Header]
#include <boost/fusion/view/zip_view.hpp>
#include <boost/fusion/include/zip_view.hpp>
[heading Synopsis]
template <typename Sequences>
struct zip_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequences`] [A __forward_sequence__ of references to other Fusion __sequence__s] []]
]
[heading Model of]
* __forward_sequence__, __bidirectional_sequence__ or
__random_access_sequence__ depending on the traversal characteristics (see
__traversal_concept__) of its underlying sequence.
[variablelist Notation
[[`ZV`] [A `zip_view` type]]
[[`s`] [An instance of `Sequences`]]
[[`zv1`, `zv2`] [Instances of `ZV`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in __forward_sequence__.
[table
[[Expression] [Semantics]]
[[`ZV(s)`] [Creates a `zip_view` given a sequence of references to the component __sequence__s.]]
[[`ZV(zv1)`] [Copy constructs a `zip_view` from another `zip_view`, `zv`.]]
[[`zv1 = zv2`] [Assigns to a `zip_view`, `zv`, from another `zip_view`, `zv2`.]]
]
[heading Example]
typedef __vector__<int,int> vec1;
typedef __vector__<char,char> vec2;
vec1 v1(1,2);
vec2 v2('a','b');
typedef __vector__<vec1&, vec2&> sequences;
std::cout << zip_view<sequences>(sequences(v1, v2)) << std::endl; // ((1 a) (2 b))
[endsect]
[section transform_view]
The unary version of `transform_view` presents a view of its underlying
sequence given a unary function object or function pointer. The binary
version of `transform_view` presents a view of 2 underlying sequences,
given a binary function object or function pointer. The `transform_view`
inherits the traversal characteristics (see __traversal_concept__) of
its underlying sequence or sequences.
[heading Header]
#include <boost/fusion/view/transform_view.hpp>
#include <boost/fusion/include/transform_view.hpp>
[heading Synopsis]
[*Unary Version]
template <typename Sequence, typename F1>
struct transform_view;
[*Binary Version]
template <typename Sequence1, typename Sequence2, typename F2>
struct transform_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence`] [A __forward_sequence__] []]
[[`Sequence1`] [A __forward_sequence__] []]
[[`Sequence2`] [A __forward_sequence__] []]
[[`F1`] [A unary function object or function pointer. `__boost_result_of_call__<F1(E)>::type` is the return type of an instance of `F1` when called with a value of each element type `E` in the input sequence.] []]
[[`F2`] [A binary function object or function pointer. `__boost_result_of_call__<F2(E1, E2)>::type` is the return type of an instance of `F2` when called with a value of each corresponding pair of element type `E1` and `E2` in the input sequences.] []]
]
[heading Model of]
* __forward_sequence__, __bidirectional_sequence__ or
__random_access_sequence__ depending on the traversal characteristics (see
__traversal_concept__) of its underlying sequence.
[variablelist Notation
[[`TV`] [A `transform_view` type]]
[[`BTV`] [A binary `transform_view` type]]
[[`UTV`] [A unary `transform_view` type]]
[[`f1`] [An instance of `F1`]]
[[`f2`] [An instance of `F2`]]
[[`s`] [An instance of `Sequence`]]
[[`s1`] [An instance of `Sequence1`]]
[[`s2`] [An instance of `Sequence2`]]
[[`tv`, `tv2`] [Instances of `transform_view`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in __forward_sequence__, __bidirectional_sequence__ or
__random_access_sequence__ depending on the traversal characteristics (see
__traversal_concept__) of its underlying sequence or sequences.
[table
[[Expression] [Semantics]]
[[`UTV(s, f1)`] [Creates a unary `transform_view` given sequence,
`s` and unary function object or function pointer, `f1`.]]
[[`BTV(s1, s2, f2)`] [Creates a binary `transform_view` given sequences, `s1` and `s2`
and binary function object or function pointer, `f2`.]]
[[`TV(tv)`] [Copy constructs a `transform_view` from another `transform_view`, `tv`.]]
[[`tv = tv2`] [Assigns to a `transform_view`, `tv`, from another `transform_view`, `tv2`.]]
]
[heading Example]
struct square
{
template<typename Sig>
struct result;
template<typename U>
struct result<square(U)>
: remove_reference<U>
{};
template <typename T>
T operator()(T x) const
{
return x * x;
}
};
typedef __vector__<int, short, double> vector_type;
vector_type vec(2, 5, 3.3);
transform_view<vector_type, square> transform(vec, square());
std::cout << transform << std::endl;
[endsect]
[section reverse_view]
`reverse_view` presents a reversed view of underlying sequence. The first
element will be its last and the last element will be its first.
[heading Header]
#include <boost/fusion/view/reverse_view.hpp>
#include <boost/fusion/include/reverse_view.hpp>
[heading Synopsis]
template <typename Sequence>
struct reverse_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence`] [A __bidirectional_sequence__] []]
]
[heading Model of]
* A model of __bidirectional_sequence__ if `Sequence` is a __bidirectional_sequence__
else, __random_access_sequence__ if `Sequence` is a __random_access_sequence__.
* __associative_sequence__ if `Sequence` implements the __associative_sequence__ model.
[variablelist Notation
[[`RV`] [A `reverse_view` type]]
[[`s`] [An instance of `Sequence`]]
[[`rv`, `rv2`] [Instances of `reverse_view`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in the implemented models.
[table
[[Expression] [Semantics]]
[[`RV(s)`] [Creates a unary `reverse_view` given sequence, `s`.]]
[[`RV(rv)`] [Copy constructs a `reverse_view` from another `reverse_view`, `rv`.]]
[[`rv = rv2`] [Assigns to a `reverse_view`, `rv`, from another `reverse_view`, `rv2`.]]
]
[heading Example]
typedef __vector__<int, short, double> vector_type;
vector_type vec(2, 5, 3.3);
reverse_view<vector_type> reverse(vec);
std::cout << reverse << std::endl;
[endsect]
[section nview]
[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 indices specifying
the elements to iterate over.
[heading Header]
#include <boost/fusion/view/nview.hpp>
#include <boost/fusion/include/nview.hpp>
[heading Synopsis]
template <typename Sequence, typename Indices>
struct nview;
template <typename Sequence, int I1, int I2 = -1, ...>
typename result_of::nview<Sequence, I1, I2, ...>::type
as_nview(Sequence& s);
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence`] [An arbitrary Fusion __forward_sequence__]
[]]
[[`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`...]]
]
[heading Model of]
* __random_access_sequence__ (see __traversal_concept__)
[variablelist Notation
[[`NV`] [A `nview` type]]
[[`s`] [An instance of `Sequences`]]
[[`nv1`, `nv2`] [Instances of `NV`]]
]
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in __random_access_sequence__.
[table
[[Expression] [Semantics]]
[[`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`.]]
]
The `nview` internally stores a Fusion __vector__ of references to the elements
of the original Fusion __sequence__
[heading Example]
typedef __vector__<int, char, double> vec;
typedef mpl::vector_c<int, 2, 1, 0, 2, 0> indices;
vec v1(1, 'c', 2.0);
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]
`repetitive_view` presents a view which iterates over a given
__sequence__ repeatedly. Because a `repetitive_view`
has infinite length, it can only be used when some external
condition determines the end. Thus, initializing a fixed
length sequence with a `repetitive_view` is okay, but
printing a `repetitive_view` to `std::cout` is not.
[heading Header]
#include <boost/fusion/view/repetitive_view.hpp>
#include <boost/fusion/include/repetitive_view.hpp>
[heading Synopsis]
template <typename Sequence>
struct repetitive_view;
[heading Template parameters]
[table
[[Parameter] [Description] [Default]]
[[`Sequence`] [An arbitrary Fusion __forward_sequence__]
[]]
]
[variablelist Notation
[[`RV`] [A `repetitive_view` type]]
[[`s`] [An instance of `Sequences`]]
[[`rv`, `rv1`, `rv2`] [Instances of `RV`]]
]
[heading Expression Semantics]
[table
[[Expression] [Return Type] [Semantics]]
[[`RV(s)`] [] [Creates an `repetitive_view` given the underlying sequence.]]
[[`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 sequence is infinite)]]
]
[heading Result Type Expressions]
[table
[[Expression]]
[[`__result_of_begin__<RV>::type`]]
[[`__result_of_end__<RV>::type`]]
]
[heading Example]
typedef __vector__<int, char, double> vec1;
typedef __vector__<int, char, double, int, char> vec2;
vec1 v1(1, 'c', 2.0);
vec2 v2(repetitive_view<vec1>(v1));
std::cout << v2 << std::endl; // 1, 'c', 2.0, 1, 'c'
[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]

View File

@ -0,0 +1,268 @@
/*=============================================================================
Copyright (c) 2006-2007 Tobias Schwinger
Use modification and distribution are subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
Problem:
How to "do the Bind?"
This recipe shows how to implement a function binder, similar to
Boost.Bind based on the Functional module of Fusion.
It works as follows:
'bind' is a global, stateless function object. It is implemented in
fused form (fused_binder) and transformed into a variadic function
object. When called, 'bind' returns another function object, which
holds the arguments of the call to 'bind'. It is, again, implemented
in fused form (fused_bound_function) and transformed into unfused
form.
==============================================================================*/
#include <boost/fusion/functional/invocation/invoke.hpp>
#include <boost/fusion/functional/adapter/unfused.hpp>
#include <boost/fusion/support/deduce_sequence.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/sequence/intrinsic/front.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/algorithm/transformation/transform.hpp>
#include <boost/fusion/algorithm/transformation/pop_front.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
#include <boost/fusion/view/filter_view.hpp>
#include <boost/functional/forward_adapter.hpp>
#include <boost/functional/lightweight_forward_adapter.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/max.hpp>
#include <boost/mpl/next.hpp>
#include <boost/ref.hpp>
#include <iostream>
#include <typeinfo>
namespace impl
{
namespace fusion = boost::fusion;
namespace traits = boost::fusion::traits;
namespace result_of = boost::fusion::result_of;
namespace mpl = boost::mpl;
using mpl::placeholders::_;
// Placeholders (we inherit from mpl::int_, so we can use placeholders
// as indices for fusion::at, later)
template <int I> struct placeholder : mpl::int_<I> { };
// A traits class to find out whether T is a placeholeder
template <typename T> struct is_placeholder : mpl::false_ { };
template <int I> struct is_placeholder< placeholder<I> > : mpl::true_ { };
template <int I> struct is_placeholder< placeholder<I> & > : mpl::true_ { };
template <int I> struct is_placeholder< placeholder<I> const > : mpl::true_ { };
template <int I> struct is_placeholder< placeholder<I> const & > : mpl::true_ { };
// This class template provides a Polymorphic Function Object to be used
// with fusion::transform. It is applied to the sequence of arguments that
// describes the binding and holds a reference to the sequence of arguments
// from the final call.
template<class FinalArgs> struct argument_transform
{
FinalArgs const & ref_final_args;
public:
explicit argument_transform(FinalArgs const & final_args)
: ref_final_args(final_args)
{ }
// A placeholder? Replace it with an argument from the final call...
template <int Index>
inline typename result_of::at_c<FinalArgs const, Index>::type
operator()(placeholder<Index> const &) const
{
return fusion::at_c<Index>(this->ref_final_args);
}
// ...just return the bound argument, otherwise.
template <typename T> inline T & operator()(T & bound) const
{
return bound;
}
template <typename Signature>
struct result;
template <class Self, typename T>
struct result< Self (T) >
: mpl::eval_if< is_placeholder<T>,
result_of::at<FinalArgs,typename boost::remove_reference<T>::type>,
mpl::identity<T>
>
{ };
};
// Fused implementation of the bound function, the function object
// returned by bind
template <class BindArgs> class fused_bound_function
{
// Transform arguments to be held by value
typedef typename traits::deduce_sequence<BindArgs>::type bound_args;
bound_args fsq_bind_args;
public:
fused_bound_function(BindArgs const & bind_args)
: fsq_bind_args(bind_args)
{ }
template <typename Signature>
struct result;
template <class FinalArgs>
struct result_impl
: result_of::invoke< typename result_of::front<bound_args>::type,
typename result_of::transform<
typename result_of::pop_front<bound_args>::type,
argument_transform<FinalArgs> const
>::type
>
{ };
template <class Self, class FinalArgs>
struct result< Self (FinalArgs) >
: result_impl< typename boost::remove_reference<FinalArgs>::type >
{ };
template <class FinalArgs>
inline typename result_impl<FinalArgs>::type
operator()(FinalArgs const & final_args) const
{
return fusion::invoke( fusion::front(this->fsq_bind_args),
fusion::transform( fusion::pop_front(this->fsq_bind_args),
argument_transform<FinalArgs>(final_args) ) );
}
// Could add a non-const variant - omitted for readability
};
// Find the number of placeholders in use
struct n_placeholders
{
struct fold_op
{
template <typename Sig> struct result;
template <class S, class A, class B> struct result< S(A &,B &) >
: mpl::max<A,B> { };
};
struct filter_pred
{
template <class X> struct apply : is_placeholder<X> { };
};
template <typename Seq>
struct apply
: mpl::next< typename result_of::fold<
fusion::filter_view<Seq,filter_pred>, mpl::int_<-1>, fold_op
>::type>::type
{ };
};
// Fused implementation of the 'bind' function
struct fused_binder
{
template <class Signature>
struct result;
template <class BindArgs,
int Placeholders = n_placeholders::apply<BindArgs>::value>
struct result_impl
{
typedef boost::forward_adapter<fusion::unfused<
fused_bound_function<BindArgs>,!Placeholders>,Placeholders> type;
};
template <class Self, class BindArgs>
struct result< Self (BindArgs) >
: result_impl< typename boost::remove_reference<BindArgs>::type >
{ };
template <class BindArgs>
inline typename result_impl< BindArgs >::type
operator()(BindArgs & bind_args) const
{
return typename result< void(BindArgs) >::type(
fusion::unfused< fused_bound_function<BindArgs>,
! n_placeholders::apply<BindArgs>::value >(bind_args) );
}
};
// The binder's unfused type. We use lightweght_forward_adapter to make
// that thing more similar to Boost.Bind. Because of that we have to use
// Boost.Ref (below in the sample code)
typedef boost::lightweight_forward_adapter< fusion::unfused<fused_binder> > binder;
}
// Placeholder globals
impl::placeholder<0> const _1_ = impl::placeholder<0>();
impl::placeholder<1> const _2_ = impl::placeholder<1>();
impl::placeholder<2> const _3_ = impl::placeholder<2>();
impl::placeholder<3> const _4_ = impl::placeholder<3>();
// The bind function is a global, too
impl::binder const bind = impl::binder();
// OK, let's try it out:
struct func
{
typedef int result_type;
inline int operator()() const
{
std::cout << "operator()" << std::endl;
return 0;
}
template <typename A>
inline int operator()(A const & a) const
{
std::cout << "operator()(A const & a)" << std::endl;
std::cout << " a = " << a << " A = " << typeid(A).name() << std::endl;
return 1;
}
template <typename A, typename B>
inline int operator()(A const & a, B & b) const
{
std::cout << "operator()(A const & a, B & b)" << std::endl;
std::cout << " a = " << a << " A = " << typeid(A).name() << std::endl;
std::cout << " b = " << b << " B = " << typeid(B).name() << std::endl;
return 2;
}
};
int main()
{
func f;
int value = 42;
using boost::ref;
int errors = 0;
errors += !( bind(f)() == 0);
errors += !( bind(f,"Hi")() == 1);
errors += !( bind(f,_1_)("there.") == 1);
errors += !( bind(f,"The answer is",_1_)(12) == 2);
errors += !( bind(f,_1_,ref(value))("Really?") == 2);
errors += !( bind(f,_1_,_2_)("Dunno. If there is an answer, it's",value) == 2);
return !! errors;
}

View File

@ -0,0 +1,105 @@
/*=============================================================================
Copyright (c) 2011 Joel de Guzman
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)
Problem:
So... you have an input sequence I and a target vector R. You want to
copy I into R. But, I may have less elements than the result vector R.
For those elements not in R, you want them to be default constructed.
Here's a case:
I: list<double, std::string>
R: vector<double, std::string, int, short>
You want the elements at the right of I not in R (i.e. int, short)
default constructed. Those at the left, found in both I and R, you want
to simply copy from I.
Of course you want to be able to handle any type of I and R.
==============================================================================*/
// We'll use these containers as examples
#include <boost/fusion/container/list.hpp>
#include <boost/fusion/container/vector.hpp>
// For doing I/O
#include <boost/fusion/sequence/io.hpp>
// We'll use join and advance for processing
#include <boost/fusion/algorithm/transformation/join.hpp>
#include <boost/fusion/iterator/advance.hpp>
// The fusion <--> MPL link header
#include <boost/fusion/mpl.hpp>
// Same-o same-o
#include <iostream>
#include <string>
int
main()
{
using namespace boost::fusion;
using namespace boost;
// Let's specify our own tuple delimeters for nicer printing
std::cout << tuple_open('[');
std::cout << tuple_close(']');
std::cout << tuple_delimiter(", ");
// Here's your input sequence
typedef list<double, std::string> I;
I i(123.456, "Hello");
// Here's your output sequence. For now, it is just a typedef
typedef vector<double, std::string, int, short> R;
// Let's get the sizes of the sequences. Yeah, you already know that.
// But with templates, you are simply given, say, R and I, corresponding
// to the types of the sequences. You'll have to deal with it generically.
static int const r_size = result_of::size<R>::value;
static int const i_size = result_of::size<I>::value;
// Make sure that I has no more elements than R
// Be nice and catch obvious errors earlier rather than later.
// Without this assert, the mistake will still be caught by Fusion,
// but the error will point to somewhere really obscure.
BOOST_STATIC_ASSERT(i_size <= r_size);
// Let's get the begin and end iterator types of the output sequence
// There's no actual vector yet. We just want to know the types.
typedef result_of::begin<R>::type r_begin;
typedef result_of::end<R>::type r_end;
// Let's skip i_size elements from r_begin. Again, we just want to know the type.
typedef result_of::advance_c<r_begin, i_size>::type r_advance;
// Now, make MPL iterators from r_advance and r_end. Ditto, just types.
typedef mpl::fusion_iterator<r_advance> mpl_r_advance;
typedef mpl::fusion_iterator<r_end> mpl_r_end;
// Make an mpl::iterator_range from the MPL iterators we just created
// You guessed it! --just a type.
typedef mpl::iterator_range<mpl_r_advance, mpl_r_end> tail;
// Use join to join the input sequence and our mpl::iterator_range
// Our mpl::iterator_range is 'tail'. Here, we'll actually instantiate
// 'tail'. Notice that this is a flyweight object, typically just 1 byte
// in size -- it doesn't really hold any data, but is a fully conforming
// sequence nonetheless. When asked to return its elements, 'tail' returns
// each element default constructed. Breeds like a rabbit!
// Construct R from the joined sequences:
R r(join(i, tail()));
// Then finally, print the result:
std::cout << r << std::endl;
return 0;
}

20
example/extension/Jamfile Normal file
View File

@ -0,0 +1,20 @@
#==============================================================================
# Copyright (c) 2003-2006 Joel de Guzman
# Copyright (c) 2006 Dan Marsden
#
# Use, modification and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#==============================================================================
# bring in rules for testing
import testing ;
{
test-suite example :
[ run test_example.cpp : : : : ]
[ run triple.cpp : : : : ]
;
}

View File

@ -0,0 +1,47 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_ADVANCE_IMPL_20060222_2150)
#define BOOST_FUSION_ADVANCE_IMPL_20060222_2150
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct advance_impl;
template<>
struct advance_impl<example::example_struct_iterator_tag>
{
template<typename Iterator, typename N>
struct apply
{
typedef typename Iterator::struct_type struct_type;
typedef typename Iterator::index index;
typedef example::example_struct_iterator<
struct_type, index::value + N::value> type;
static type
call(Iterator const& it)
{
return type(it.struct_);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,67 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_AT_IMPL_20060223_2017)
#define BOOST_FUSION_AT_IMPL_20060223_2017
#include <string>
#include <boost/mpl/if.hpp>
#include <boost/mpl/int.hpp>
#include <boost/type_traits/is_const.hpp>
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct at_impl;
template<>
struct at_impl<example::example_sequence_tag>
{
template<typename Sequence, typename Key>
struct apply;
template<typename Sequence>
struct apply<Sequence, mpl::int_<0> >
{
typedef typename mpl::if_<
is_const<Sequence>,
std::string const&,
std::string&>::type type;
static type
call(Sequence& seq)
{
return seq.name;
};
};
template<typename Sequence>
struct apply<Sequence, mpl::int_<1> >
{
typedef typename mpl::if_<
is_const<Sequence>,
int const&,
int&>::type type;
static type
call(Sequence& seq)
{
return seq.age;
};
};
};
}
}}
#endif

View File

@ -0,0 +1,72 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_AT_KEY_IMPL_20060223_2017)
#define BOOST_FUSION_AT_KEY_IMPL_20060223_2017
#include <string>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_const.hpp>
namespace fields
{
struct name;
struct age;
}
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct at_key_impl;
template<>
struct at_key_impl<example::example_sequence_tag>
{
template<typename Sequence, typename Key>
struct apply;
template<typename Sequence>
struct apply<Sequence, fields::name>
{
typedef typename mpl::if_<
is_const<Sequence>,
std::string const&,
std::string&>::type type;
static type
call(Sequence& seq)
{
return seq.name;
};
};
template<typename Sequence>
struct apply<Sequence, fields::age>
{
typedef typename mpl::if_<
is_const<Sequence>,
int const&,
int&>::type type;
static type
call(Sequence& seq)
{
return seq.age;
};
};
};
}
}}
#endif

View File

@ -0,0 +1,43 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_BEGIN_IMPL_20060222_2042)
#define BOOST_FUSION_BEGIN_IMPL_20060222_2042
#include "../example_struct_iterator.hpp"
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct begin_impl;
template<>
struct begin_impl<example::example_sequence_tag>
{
template<typename Sequence>
struct apply
{
typedef example::example_struct_iterator<Sequence, 0> type;
static type
call(Sequence& seq)
{
return type(seq);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,34 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_20060223_2037)
#define BOOST_FUSION_CATEGORY_OF_IMPL_20060223_2037
#include <boost/fusion/support/category_of.hpp>
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<>
struct category_of_impl<example::example_sequence_tag>
{
template<typename Sequence>
struct apply
{
struct type : random_access_traversal_tag, associative_tag {};
};
};
}
}}
#endif

View File

@ -0,0 +1,30 @@
/*=============================================================================
Copyright (c) 2009 Christopher Schmidt
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_EXAMPLE_EXTENSION_DETAIL_DEREF_DATA_IMPL_HPP
#define BOOST_FUSION_EXAMPLE_EXTENSION_DETAIL_DEREF_DATA_IMPL_HPP
namespace example
{
struct example_struct_iterator_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct deref_data_impl;
template<>
struct deref_data_impl<example::example_struct_iterator_tag>
: deref_impl<example::example_struct_iterator_tag>
{};
}
}}
#endif

View File

@ -0,0 +1,67 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_DEREF_IMPL_20060222_1952)
#define BOOST_FUSION_DEREF_IMPL_20060222_1952
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/if.hpp>
#include <string>
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct deref_impl;
template<>
struct deref_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply;
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 0> >
{
typedef typename mpl::if_<
is_const<Struct>, std::string const&, std::string&>::type type;
static type
call(example::example_struct_iterator<Struct, 0> const& it)
{
return it.struct_.name;
}
};
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 1> >
{
typedef typename mpl::if_<
is_const<Struct>, int const&, int&>::type type;
static type
call(example::example_struct_iterator<Struct, 1> const& it)
{
return it.struct_.age;
}
};
};
}
}}
#endif

View File

@ -0,0 +1,44 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_DISTANCE_IMPL_20060223_0814)
#define BOOST_FUSION_DISTANCE_IMPL_20060223_0814
#include <boost/mpl/minus.hpp>
namespace example
{
struct example_struct_iterator_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct distance_impl;
template<>
struct distance_impl<example::example_struct_iterator_tag>
{
template<typename First, typename Last>
struct apply
: mpl::minus<typename Last::index, typename First::index>
{
typedef apply<First, Last> self;
static typename self::type
call(First const& first, Last const& last)
{
return typename self::type();
}
};
};
}
}}
#endif

View File

@ -0,0 +1,43 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_END_IMPL_20060222_2042)
#define BOOST_FUSION_END_IMPL_20060222_2042
#include "../example_struct_iterator.hpp"
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct end_impl;
template<>
struct end_impl<example::example_sequence_tag>
{
template<typename Sequence>
struct apply
{
typedef example::example_struct_iterator<Sequence, 2> type;
static type
call(Sequence& seq)
{
return type(seq);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,38 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_EQUAL_TO_IMPL_20060223_1941)
#define BOOST_FUSION_EQUAL_TO_IMPL_20060223_1941
#include <boost/mpl/equal_to.hpp>
namespace example
{
struct example_struct_iterator_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct equal_to_impl;
template<>
struct equal_to_impl<example::example_struct_iterator_tag>
{
template<typename It1, typename It2>
struct apply
: mpl::equal_to<
typename It1::index,
typename It2::index>
{};
};
}
}}
#endif

View File

@ -0,0 +1,45 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_HAS_KEY_IMPL_20060223_2156)
#define BOOST_FUSION_HAS_KEY_IMPL_20060223_2156
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/or.hpp>
namespace fields
{
struct name;
struct age;
}
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct has_key_impl;
template<>
struct has_key_impl<example::example_sequence_tag>
{
template<typename Sequence, typename Key>
struct apply
: mpl::or_<
is_same<Key, fields::name>,
is_same<Key, fields::age> >
{};
};
}
}}
#endif

View File

@ -0,0 +1,34 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_IS_SEQUENCE_IMPL_20060228_1946)
#define BOOST_FUSION_IS_SEQUENCE_IMPL_20060228_1946
#include <boost/mpl/bool.hpp>
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion
{
namespace extension
{
template<typename Tag>
struct is_sequence_impl;
template<>
struct is_sequence_impl<example::example_sequence_tag>
{
template<typename T>
struct apply : mpl::true_ {};
};
}
}}
#endif

View File

@ -0,0 +1,32 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_IS_VIEW_IMPL_200604227_2150)
#define BOOST_FUSION_IS_VIEW_IMPL_200604227_2150
#include <boost/mpl/bool.hpp>
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion
{
namespace extension
{
template<typename Tag>
struct is_view_impl;
template<>
struct is_view_impl<example::example_sequence_tag>
: boost::mpl::false_
{};
}
}}
#endif

View File

@ -0,0 +1,42 @@
/*=============================================================================
Copyright (c) 2009 Christopher Schmidt
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_EXAMPLE_EXTENSION_DETAIL_KEY_OF_IMPL_HPP
#define BOOST_FUSION_EXAMPLE_EXTENSION_DETAIL_KEY_OF_IMPL_HPP
#include <boost/mpl/if.hpp>
namespace fields
{
struct name;
struct age;
}
namespace example
{
struct example_struct_iterator_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct key_of_impl;
template<>
struct key_of_impl<example::example_struct_iterator_tag>
{
template<typename It>
struct apply
: mpl::if_c<!It::index::value, fields::name, fields::age>
{};
};
}
}}
#endif

View File

@ -0,0 +1,46 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_NEXT_IMPL_20060222_1859)
#define BOOST_FUSION_NEXT_IMPL_20060222_1859
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct next_impl;
template<>
struct next_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply
{
typedef typename Iterator::struct_type struct_type;
typedef typename Iterator::index index;
typedef example::example_struct_iterator<struct_type, index::value + 1> type;
static type
call(Iterator const& i)
{
return type(i.struct_);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,46 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_PRIOR_IMPL_20060222_1944)
#define BOOST_FUSION_PRIOR_IMPL_20060222_1944
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct prior_impl;
template<>
struct prior_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply
{
typedef typename Iterator::struct_type struct_type;
typedef typename Iterator::index index;
typedef example::example_struct_iterator<struct_type, index::value - 1> type;
static type
call(Iterator const& i)
{
return type(i.struct_);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,36 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_SIZE_IMPL_20060223_2033)
#define BOOST_FUSION_SIZE_IMPL_20060223_2033
#include <boost/mpl/int.hpp>
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct size_impl;
template<>
struct size_impl<example::example_sequence_tag>
{
template<typename Sequence>
struct apply
: mpl::int_<2>
{};
};
}
}}
#endif

View File

@ -0,0 +1,44 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_VALUE_AT_IMPL_20060223_2025)
#define BOOST_FUSION_VALUE_AT_IMPL_20060223_2025
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct value_at_impl;
template<>
struct value_at_impl<example::example_sequence_tag>
{
template<typename Sequence, typename N>
struct apply;
template<typename Sequence>
struct apply<Sequence, mpl::int_<0> >
{
typedef std::string type;
};
template<typename Sequence>
struct apply<Sequence, mpl::int_<1> >
{
typedef int type;
};
};
}
}}
#endif

View File

@ -0,0 +1,50 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_VALUE_AT_KEY_IMPL_20060223_2025)
#define BOOST_FUSION_VALUE_AT_KEY_IMPL_20060223_2025
namespace fields
{
struct name;
struct age;
}
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct value_at_key_impl;
template<>
struct value_at_key_impl<example::example_sequence_tag>
{
template<typename Sequence, typename N>
struct apply;
template<typename Sequence>
struct apply<Sequence, fields::name>
{
typedef std::string type;
};
template<typename Sequence>
struct apply<Sequence, fields::age>
{
typedef int type;
};
};
}
}}
#endif

View File

@ -0,0 +1,30 @@
/*=============================================================================
Copyright (c) 2009 Christopher Schmidt
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_EXAMPLE_EXTENSION_DETAIL_VALUE_OF_DATA_IMPL_HPP
#define BOOST_FUSION_EXAMPLE_EXTENSION_DETAIL_VALUE_OF_DATA_IMPL_HPP
namespace example
{
struct example_struct_iterator_tag;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct value_of_data_impl;
template<>
struct value_of_data_impl<example::example_struct_iterator_tag>
: value_of_impl<example::example_struct_iterator_tag>
{};
}
}}
#endif

View File

@ -0,0 +1,49 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_VALUE_OF_IMPL_20060223_1905)
#define BOOST_FUSION_VALUE_OF_IMPL_20060223_1905
#include <string>
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace extension
{
template<typename Tag>
struct value_of_impl;
template<>
struct value_of_impl<example::example_struct_iterator_tag>
{
template<typename Iterator>
struct apply;
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 0> >
{
typedef std::string type;
};
template<typename Struct>
struct apply<example::example_struct_iterator<Struct, 1> >
{
typedef int type;
};
};
}
}}
#endif

View File

@ -0,0 +1,25 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_EXAMPLE_STRUCT)
#define BOOST_FUSION_EXAMPLE_STRUCT
#include "./tag_of.hpp"
#include "./example_struct_iterator.hpp"
#include "./detail/begin_impl.hpp"
#include "./detail/end_impl.hpp"
#include "./detail/at_impl.hpp"
#include "./detail/value_at_impl.hpp"
#include "./detail/size_impl.hpp"
#include "./detail/category_of_impl.hpp"
#include "./detail/at_key_impl.hpp"
#include "./detail/value_at_key_impl.hpp"
#include "./detail/has_key_impl.hpp"
#include "./detail/is_sequence_impl.hpp"
#include "./detail/is_view_impl.hpp"
#endif

View File

@ -0,0 +1,70 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_EXAMPLE_STRUCT_ITERATOR)
#define BOOST_FUSION_EXAMPLE_STRUCT_ITERATOR
#include <boost/fusion/support/iterator_base.hpp>
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/tag_of_fwd.hpp>
#include <boost/mpl/int.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/static_assert.hpp>
#include "./detail/next_impl.hpp"
#include "./detail/prior_impl.hpp"
#include "./detail/deref_impl.hpp"
#include "./detail/advance_impl.hpp"
#include "./detail/distance_impl.hpp"
#include "./detail/value_of_impl.hpp"
#include "./detail/equal_to_impl.hpp"
#include "./detail/key_of_impl.hpp"
#include "./detail/value_of_data_impl.hpp"
#include "./detail/deref_data_impl.hpp"
namespace example
{
struct example_struct_iterator_tag;
template<typename Struct, int Pos>
struct example_struct_iterator;
}
namespace boost { namespace fusion {
namespace traits
{
template<typename Struct, int Pos>
struct tag_of<example::example_struct_iterator<Struct, Pos> >
{
typedef example::example_struct_iterator_tag type;
};
}
}}
namespace example {
template<typename Struct, int Pos>
struct example_struct_iterator
: boost::fusion::iterator_base<example_struct_iterator<Struct, Pos> >
{
BOOST_STATIC_ASSERT(Pos >=0 && Pos < 3);
typedef Struct struct_type;
typedef boost::mpl::int_<Pos> index;
struct category
: boost::fusion::random_access_traversal_tag
, boost::fusion::associative_tag
{};
example_struct_iterator(Struct& str)
: struct_(str) {}
Struct& struct_;
};
}
#endif

View File

@ -0,0 +1,27 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
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_EXAMPLE_STRUCT_TYPE)
#define BOOST_FUSION_EXAMPLE_STRUCT_TYPE
#include <string>
namespace example
{
struct example_struct
{
std::string name;
int age;
example_struct(
const std::string& n,
int a)
: name(n), age(a)
{}
};
}
#endif

View File

@ -0,0 +1,30 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_TAG_OF_20060222_2052)
#define BOOST_FUSION_TAG_OF_20060222_2052
#include <boost/fusion/support/tag_of_fwd.hpp>
#include "./example_struct_type.hpp"
namespace example
{
struct example_sequence_tag;
}
namespace boost { namespace fusion {
namespace traits {
template<>
struct tag_of<example::example_struct>
{
typedef example::example_sequence_tag type;
};
}}}
#endif

View File

@ -0,0 +1,65 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include "./example_struct.hpp"
#include "./example_struct_type.hpp"
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/sequence/intrinsic.hpp>
#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/iterator.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/assert.hpp>
int main()
{
example::example_struct bert("bert", 99);
using namespace boost::fusion;
BOOST_MPL_ASSERT((traits::is_associative<example::example_struct>));
BOOST_MPL_ASSERT((traits::is_random_access<example::example_struct>));
BOOST_MPL_ASSERT((traits::is_sequence<example::example_struct>));
BOOST_TEST(deref(begin(bert)) == "bert");
BOOST_TEST(*next(begin(bert)) == 99);
BOOST_TEST(*prior(end(bert)) == 99);
BOOST_TEST(*advance_c<1>(begin(bert)) == 99);
BOOST_TEST(*advance_c<-1>(end(bert)) == 99);
BOOST_TEST(distance(begin(bert), end(bert)) == 2);
typedef result_of::begin<example::example_struct>::type first;
typedef result_of::next<first>::type second;
BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<first>::type, std::string>));
BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<second>::type, int>));
BOOST_TEST(begin(bert) != end(bert));
BOOST_TEST(advance_c<2>(begin(bert)) == end(const_cast<const example::example_struct&>(bert)));
BOOST_TEST(at_c<0>(bert) == "bert");
BOOST_TEST(at_c<1>(bert) == 99);
BOOST_TEST(at_key<fields::name>(bert) == "bert");
BOOST_TEST(at_key<fields::age>(bert) == 99);
BOOST_TEST(has_key<fields::name>(bert));
BOOST_TEST(has_key<fields::age>(bert));
BOOST_TEST(!has_key<int>(bert));
BOOST_MPL_ASSERT((boost::is_same<result_of::value_at_c<example::example_struct, 0>::type, std::string>));
BOOST_MPL_ASSERT((boost::is_same<result_of::value_at_c<example::example_struct, 1>::type, int>));
BOOST_MPL_ASSERT((boost::is_same<result_of::value_at_key<example::example_struct, fields::name>::type, std::string>));
BOOST_MPL_ASSERT((boost::is_same<result_of::value_at_key<example::example_struct, fields::age>::type, int>));
BOOST_TEST(deref_data(begin(bert)) == "bert");
BOOST_TEST(deref_data(next(begin(bert))) == 99);
BOOST_TEST(size(bert) == 2);
return boost::report_errors();
}

View File

@ -0,0 +1,377 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2011 Nathan Ridge
Copyright (c) 2006 Dan Marsden
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)
==============================================================================*/
/*=============================================================================
An implementation of a std::pair like triple<T0, T1, T2>
We use fusion::sequence_facade and fusion::iterator_facade
to make our triple a fully conforming Boost.Fusion random
traversal sequence.
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/sequence/sequence_facade.hpp>
#include <boost/fusion/iterator/iterator_facade.hpp>
#include <boost/fusion/sequence/intrinsic.hpp>
#include <boost/fusion/iterator.hpp>
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/minus.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_same.hpp>
#include <string>
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
namespace demo
{
template<typename Seq, int N>
struct triple_iterator
: fusion::iterator_facade<triple_iterator<Seq, N>,
fusion::random_access_traversal_tag>
{
typedef mpl::int_<N> index;
typedef Seq sequence_type;
triple_iterator(Seq& seq)
: seq_(seq) {}
Seq& seq_;
template<typename T>
struct value_of;
template<typename Sq>
struct value_of<triple_iterator<Sq, 0> >
: mpl::identity<typename Sq::t0_type>
{};
template<typename Sq>
struct value_of<triple_iterator<Sq, 1> >
: mpl::identity<typename Sq::t1_type>
{};
template<typename Sq>
struct value_of<triple_iterator<Sq, 2> >
: mpl::identity<typename Sq::t2_type>
{};
template<typename T>
struct deref;
template <typename Sq>
struct deref<triple_iterator<Sq, 0> >
{
typedef typename Sq::t0_type& type;
static type
call(triple_iterator<Sq, 0> const& iter)
{
return iter.seq_.t0;
}
};
template <typename Sq>
struct deref<triple_iterator<Sq, 0> const>
{
typedef typename Sq::t0_type const& type;
static type
call(triple_iterator<Sq, 0> const& iter)
{
return iter.seq_.t0;
}
};
template <typename Sq>
struct deref<triple_iterator<Sq, 1> >
{
typedef typename Sq::t1_type& type;
static type
call(triple_iterator<Sq, 1> const& iter)
{
return iter.seq_.t1;
}
};
template <typename Sq>
struct deref<triple_iterator<Sq, 1> const>
{
typedef typename Sq::t1_type const& type;
static type
call(triple_iterator<Sq, 1> const& iter)
{
return iter.seq_.t1;
}
};
template <typename Sq>
struct deref<triple_iterator<Sq, 2> >
{
typedef typename Sq::t2_type& type;
static type
call(triple_iterator<Sq, 2> const& iter)
{
return iter.seq_.t2;
}
};
template <typename Sq>
struct deref<triple_iterator<Sq, 2> const>
{
typedef typename Sq::t2_type const& type;
static type
call(triple_iterator<Sq, 2> const& iter)
{
return iter.seq_.t2;
}
};
template<typename It>
struct next
{
typedef triple_iterator<
typename It::sequence_type, It::index::value + 1>
type;
static type call(It const& it)
{
return type(it.seq_);
}
};
template<typename It>
struct prior
{
typedef triple_iterator<
typename It::sequence_type, It::index::value - 1>
type;
static type call(It const& it)
{
return type(it.seq_);
}
};
template<typename It1, typename It2>
struct distance
{
typedef typename mpl::minus<
typename It2::index, typename It1::index>::type
type;
static type call(It1 const& it1, It2 const& it2)
{
return type();
}
};
template<typename It, typename M>
struct advance
{
typedef triple_iterator<
typename It::sequence_type,
It::index::value + M::value>
type;
static type call(It const& it)
{
return type(it.seq_);
}
};
};
template<typename T0, typename T1, typename T2>
struct triple
: fusion::sequence_facade<triple<T0, T1, T2>,
fusion::random_access_traversal_tag>
{
triple(T0 const& t0, T1 const& t1, T2 const& t2)
: t0(t0), t1(t1), t2(t2)
{}
template<typename Sq>
struct begin
{
typedef demo::triple_iterator<Sq, 0> type;
static type call(Sq& sq)
{
return type(sq);
}
};
template<typename Sq>
struct end
{
typedef demo::triple_iterator<Sq, 3> type;
static type call(Sq& sq)
{
return type(sq);
}
};
template<typename Sq>
struct size
: mpl::int_<3>
{};
template<typename Sq, typename N>
struct value_at
: value_at<Sq, mpl::int_<N::value> >
{};
template<typename Sq>
struct value_at<Sq, mpl::int_<0> >
{
typedef typename Sq::t0_type type;
};
template<typename Sq>
struct value_at<Sq, mpl::int_<1> >
{
typedef typename Sq::t1_type type;
};
template<typename Sq>
struct value_at<Sq, mpl::int_<2> >
{
typedef typename Sq::t2_type type;
};
template<typename Sq, typename N>
struct at
: at<Sq, mpl::int_<N::value> >
{};
template<typename Sq>
struct at<Sq, mpl::int_<0> >
{
typedef typename
mpl::if_<
boost::is_const<Sq>
, typename Sq::t0_type const&
, typename Sq::t0_type&
>::type
type;
static type call(Sq& sq)
{
return sq.t0;
}
};
template<typename Sq>
struct at<Sq, mpl::int_<1> >
{
typedef typename
mpl::if_<
boost::is_const<Sq>
, typename Sq::t1_type const&
, typename Sq::t1_type&
>::type
type;
static type call(Sq& sq)
{
return sq.t1;
}
};
template<typename Sq>
struct at<Sq, mpl::int_<2> >
{
typedef typename
mpl::if_<
boost::is_const<Sq>
, typename Sq::t2_type const&
, typename Sq::t2_type&
>::type
type;
static type call(Sq& sq)
{
return sq.t2;
}
};
typedef T0 t0_type;
typedef T1 t1_type;
typedef T2 t2_type;
T0 t0;
T1 t1;
T2 t2;
};
}
struct modifying_fold_functor
{
template <typename T>
struct result
{
typedef bool type;
};
template <typename T>
bool operator()(bool b, T&)
{
return b;
}
};
struct nonmodifying_fold_functor
{
template <typename T>
struct result
{
typedef bool type;
};
template <typename T>
bool operator()(bool b, const T&)
{
return b;
}
};
int main()
{
typedef demo::triple<int, char, std::string> my_triple;
my_triple t(101, 'a', "hello");
BOOST_TEST(*fusion::begin(t) == 101);
BOOST_TEST(*fusion::next(fusion::begin(t)) == 'a');
BOOST_TEST(*fusion::prior(fusion::end(t)) == "hello");
BOOST_TEST(fusion::distance(fusion::begin(t), fusion::end(t)) == 3);
BOOST_TEST(fusion::size(t) == 3);
BOOST_MPL_ASSERT((boost::is_same<
int, fusion::result_of::value_at_c<my_triple, 0>::type>));
BOOST_MPL_ASSERT((boost::is_same<
char, fusion::result_of::value_at_c<my_triple, 1>::type>));
BOOST_MPL_ASSERT((boost::is_same<
std::string, fusion::result_of::value_at_c<my_triple, 2>::type>));
BOOST_TEST(fusion::at_c<0>(t) == 101);
BOOST_TEST(fusion::at_c<1>(t) == 'a');
BOOST_TEST(fusion::at_c<2>(t) == "hello");
BOOST_TEST(fusion::fold(t, true, modifying_fold_functor()) == true);
BOOST_TEST(fusion::fold(t, true, nonmodifying_fold_functor()) == true);
return boost::report_errors();
}

View File

@ -0,0 +1,20 @@
#==============================================================================
# Copyright (c) 2003-2006 Joel de Guzman
# Copyright (c) 2006 Dan Marsden
#
# Use, modification and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#==============================================================================
project fusion-performance ;
exe accumulate : accumulate.cpp ;
exe inner_product : inner_product.cpp ;
exe inner_product2 : inner_product2.cpp ;
exe sequence_efficiency : sequence_efficiency.cpp ;
exe functional : functional.cpp ;

View File

@ -0,0 +1,357 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include <boost/array.hpp>
#include <boost/timer.hpp>
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
#include <boost/fusion/algorithm/transformation/transform.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/transformation/zip.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/adapted/array.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <algorithm>
#include <numeric>
#include <functional>
#include <iostream>
#include <cmath>
#include <limits>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
int const REPEAT_COUNT = 10;
double const duration = 0.5;
namespace
{
template<int N>
double time_for_std_accumulate(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr;
std::generate(arr.begin(), arr.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::accumulate(arr.begin(), arr.end(), 0);
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::accumulate(arr.begin(), arr.end(), 0);
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
struct poly_add
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_add(Lhs,Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + rhs;
}
};
struct poly_mult
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_mult(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs * rhs;
}
};
template<int N>
double time_for_fusion_accumulate(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr;
std::generate(arr.begin(), arr.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(arr, 0, poly_add());
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
std::cout << iter << " iterations" << std::endl;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(arr, 0, poly_add());
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
std::cout << ".";
std::cout.flush();
}
std::cout << i << std::endl;
return result / iter;
}
#if 0
template<int N>
double time_for_std_inner_product(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
template<int N>
double time_for_fusion_inner_product(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::transform(arr1, arr2, poly_mult()), 0, poly_add());
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::transform(arr1, arr2, poly_mult()), 0, poly_add());
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
struct poly_combine
{
template<typename Lhs, typename Rhs>
struct result
{
typedef Lhs type;
};
template<typename Lhs, typename Rhs>
typename result<Lhs,Rhs>::type
operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + boost::fusion::at_c<0>(rhs) * boost::fusion::at_c<1>(rhs);
}
};
template<int N>
double time_for_fusion_inner_product2(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::zip(arr1, arr2), 0, poly_combine());
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
std::cout << iter << " iterations" << std::endl;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::zip(arr1, arr2), 0, poly_combine());
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
#endif
}
int main()
{
int total = 0;
int res;
std::cout << "short accumulate std test " << time_for_std_accumulate<8>(res) << std::endl;
total += res;
std::cout << "short accumulate fusion test " << time_for_fusion_accumulate<8>(res) << std::endl;
total += res;
std::cout << "medium accumulate std test " << time_for_std_accumulate<64>(res) << std::endl;
total += res;
std::cout << "medium accumulate fusion test " << time_for_fusion_accumulate<64>(res) << std::endl;
total += res;
std::cout << "long accumulate std test " << time_for_std_accumulate<128>(res) << std::endl;
total += res;
std::cout << "long accumulate fusion test " << time_for_fusion_accumulate<128>(res) << std::endl;
total += res;
#if 0
std::cout << "short inner_product std test " << time_for_std_inner_product<8>(res) << std::endl;
total += res;
std::cout << "short inner_product fusion test " << time_for_fusion_inner_product<8>(res) << std::endl;
total += res;
std::cout << "short inner_product fusion 2 test " << time_for_fusion_inner_product2<8>(res) << std::endl;
total += res;
std::cout << "medium inner_product std test " << time_for_std_inner_product<64>(res) << std::endl;
total += res;
std::cout << "medium inner_product fusion test " << time_for_fusion_inner_product<64>(res) << std::endl;
total += res;
std::cout << "medium inner_product fusion 2 test " << time_for_fusion_inner_product2<64>(res) << std::endl;
total += res;
std::cout << "long inner_product std test " << time_for_std_inner_product<128>(res) << std::endl;
total += res;
std::cout << "long inner_product fusion test " << time_for_fusion_inner_product<128>(res) << std::endl;
total += res;
std::cout << "long inner_product fusion 2 test " << time_for_fusion_inner_product2<128>(res) << std::endl;
total += res;
#endif
return total;
}

View File

@ -0,0 +1,307 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006-2007 Tobias Schwinger
Use modification and distribution are subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
==============================================================================*/
#include <boost/fusion/container/list.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
#include <boost/fusion/functional/adapter/unfused.hpp>
#include <boost/fusion/functional/adapter/fused_function_object.hpp>
#include <boost/functional/forward_adapter.hpp>
#include <boost/functional/lightweight_forward_adapter.hpp>
#include <boost/utility/result_of.hpp>
#include <boost/config.hpp>
#include <boost/timer.hpp>
#include <algorithm>
#include <iostream>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
int const REPEAT_COUNT = 3;
double const duration = 0.125;
namespace
{
struct fused_sum
{
template <typename Seq>
int operator()(Seq const & seq) const
{
int state = 0;
return boost::fusion::fold(seq, state, sum_op());
}
typedef int result_type;
private:
struct sum_op
{
template <typename T>
int operator()(T const & elem, int value) const
{
return value + sizeof(T) * elem;
}
template <typename T>
int operator()(T & elem, int value) const
{
elem += sizeof(T);
return value;
}
typedef int result_type;
};
};
struct unfused_sum
{
inline int operator()() const
{
return 0;
}
template<typename T0>
inline int operator()(T0 const & a0) const
{
return a0;
}
template<typename T0, typename T1>
inline int operator()(T0 const & a0, T1 const & a1) const
{
return a0 + a1;
}
template<typename T0, typename T1, typename T2>
inline int operator()(T0 const & a0, T1 const & a1, T2 a2) const
{
return a0 + a1 + a2;
}
template<typename T0, typename T1, typename T2, typename T3>
inline int operator()(T0 const & a0, T1 const & a1, T2 const & a2, T3 const & a3) const
{
return a0 + a1 + a2 + a3;
}
typedef int result_type;
};
template<typename F>
double call_unfused(F const & func, int & j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i += func();
i += func(0);
i += func(0,1);
i += func(0,1,2);
i += func(0,1,2,3);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = func(); j += i;
i = func(0); j += i;
i = func(0,1); j += i;
i = func(0,1,2); j += i;
i = func(0,1,2,3); j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
return result / iter;
}
template<typename F>
double call_fused_ra(F const & func, int & j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
do
{
boost::fusion::vector<> v0;
boost::fusion::vector<int> v1(0);
boost::fusion::vector<int,int> v2(0,1);
boost::fusion::vector<int,int,int> v3(0,1,2);
boost::fusion::vector<int,int,int,int> v4(0,1,2,3);
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i += func(v0);
i += func(v1);
i += func(v2);
i += func(v3);
i += func(v4);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
boost::fusion::vector<> v0;
boost::fusion::vector<int> v1(0);
boost::fusion::vector<int,int> v2(0,1);
boost::fusion::vector<int,int,int> v3(0,1,2);
boost::fusion::vector<int,int,int,int> v4(0,1,2,3);
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = func(v0); j += i;
i = func(v1); j += i;
i = func(v2); j += i;
i = func(v3); j += i;
i = func(v4); j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
return result / iter;
}
template<typename F>
double call_fused(F const & func, int & j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
do
{
boost::fusion::list<> l0;
boost::fusion::list<int> l1(0);
boost::fusion::list<int,int> l2(0,1);
boost::fusion::list<int,int,int> l3(0,1,2);
boost::fusion::list<int,int,int,int> l4(0,1,2,3);
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i += func(l0);
i += func(l1);
i += func(l2);
i += func(l3);
i += func(l4);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
boost::fusion::list<> l0;
boost::fusion::list<int> l1(0);
boost::fusion::list<int,int> l2(0,1);
boost::fusion::list<int,int,int> l3(0,1,2);
boost::fusion::list<int,int,int,int> l4(0,1,2,3);
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = func(l0); j += i;
i = func(l1); j += i;
i = func(l2); j += i;
i = func(l3); j += i;
i = func(l4); j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
return result / iter;
}
}
int main()
{
int total = 0;
int res;
typedef fused_sum F;
typedef unfused_sum U;
std::cout << "Compiler: " << BOOST_COMPILER << std::endl;
std::cout << std::endl << "Unfused adapters:" << std::endl;
{
F f;
std::cout << "F /* a fused function object */ " << call_fused_ra(f,res) << std::endl;
total += res;
}
{
F f;
std::cout << "without random access " << call_fused(f,res) << std::endl;
total += res;
}
{
boost::lightweight_forward_adapter< boost::fusion::unfused<F> > f;
std::cout << "lightweight_forward_adapter< unfused<F> > " << call_unfused(f,res) << std::endl;
total += res;
}
{
boost::forward_adapter< boost::fusion::unfused<F> > f;
std::cout << "forward_adapter< unfused<F> > " << call_unfused(f,res) << std::endl;
total += res;
}
std::cout << std::endl << "Fused adapters:" << std::endl;
{
unfused_sum f;
std::cout << "U /* an unfused function object */ " << call_unfused(f,res) << std::endl;
total += res;
}
{
boost::fusion::fused_function_object<U> f;
std::cout << "fused_function_object<U> " << call_fused_ra(f,res) << std::endl;
total += res;
}
{
boost::fusion::fused_function_object<U> f;
std::cout << "without random access " << call_fused(f,res) << std::endl;
total += res;
}
{
boost::lightweight_forward_adapter< boost::fusion::unfused< boost::fusion::fused_function_object<U> > > f;
std::cout << "lightweight_forward_adapter< unfused<fused_function_object<U> > >" << call_unfused(f,res) << std::endl;
total += res;
}
{
boost::forward_adapter< boost::fusion::unfused< boost::fusion::fused_function_object<U> > > f;
std::cout << "forward_adapter< unfused<fused_function_object<U> > > " << call_unfused(f,res) << std::endl;
total += res;
}
return total;
}

View File

@ -0,0 +1,184 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include <boost/array.hpp>
#include <boost/timer.hpp>
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
#include <boost/fusion/algorithm/transformation/transform.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/transformation/zip.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/adapted/array.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <algorithm>
#include <numeric>
#include <functional>
#include <iostream>
#include <cmath>
#include <limits>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
int const REPEAT_COUNT = 10;
double const duration = 0.5;
namespace
{
struct poly_add
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_add(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + rhs;
}
};
struct poly_mult
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_mult(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs * rhs;
}
};
template<int N>
double time_for_std_inner_product(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
template<int N>
double time_for_fusion_inner_product(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::transform(arr1, arr2, poly_mult()), 0, poly_add());
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::transform(arr1, arr2, poly_mult()), 0, poly_add());
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
}
int main()
{
int total = 0;
int res;
std::cout << "short inner_product std test " << time_for_std_inner_product<8>(res) << std::endl;
total += res;
std::cout << "short inner_product fusion test " << time_for_fusion_inner_product<8>(res) << std::endl;
total += res;
std::cout << "medium inner_product std test " << time_for_std_inner_product<64>(res) << std::endl;
total += res;
std::cout << "medium inner_product fusion test " << time_for_fusion_inner_product<64>(res) << std::endl;
total += res;
std::cout << "long inner_product std test " << time_for_std_inner_product<128>(res) << std::endl;
total += res;
std::cout << "long inner_product fusion test " << time_for_fusion_inner_product<128>(res) << std::endl;
total += res;
return total;
}

View File

@ -0,0 +1,206 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include <boost/array.hpp>
#include <boost/timer.hpp>
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
#include <boost/fusion/algorithm/transformation/transform.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/transformation/zip.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/adapted/array.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <algorithm>
#include <numeric>
#include <functional>
#include <iostream>
#include <cmath>
#include <limits>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
int const REPEAT_COUNT = 10;
double const duration = 0.5;
namespace
{
struct poly_add
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_add(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + rhs;
}
};
struct poly_mult
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_mult(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs * rhs;
}
};
template<int N>
double time_for_std_inner_product(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = std::inner_product(arr1.begin(), arr1.end(), arr2.begin(), 0);
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
struct poly_combine
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_combine(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
typename result<poly_combine(Lhs,Rhs)>::type
operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + boost::fusion::at_c<0>(rhs) * boost::fusion::at_c<1>(rhs);
}
};
template<int N>
double time_for_fusion_inner_product2(int& j)
{
boost::timer tim;
int i = 0;
long long iter = 65536;
long long counter, repeats;
double result = (std::numeric_limits<double>::max)();
double runtime = 0;
double run;
boost::array<int, N> arr1;
boost::array<int, N> arr2;
std::generate(arr1.begin(), arr1.end(), rand);
std::generate(arr2.begin(), arr2.end(), rand);
do
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::zip(arr1, arr2), 0, poly_combine());
static_cast<void>(i);
}
runtime = tim.elapsed();
iter *= 2;
} while(runtime < duration);
iter /= 2;
std::cout << iter << " iterations" << std::endl;
// repeat test and report least value for consistency:
for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
{
tim.restart();
for(counter = 0; counter < iter; ++counter)
{
i = boost::fusion::accumulate(
boost::fusion::zip(arr1, arr2), 0, poly_combine());
j += i;
}
run = tim.elapsed();
result = (std::min)(run, result);
}
std::cout << i << std::endl;
return result / iter;
}
}
int main()
{
int total = 0;
int res;
std::cout << "short inner_product std test " << time_for_std_inner_product<8>(res) << std::endl;
total += res;
std::cout << "short inner_product fusion 2 test " << time_for_fusion_inner_product2<8>(res) << std::endl;
total += res;
std::cout << "medium inner_product std test " << time_for_std_inner_product<64>(res) << std::endl;
total += res;
std::cout << "medium inner_product fusion 2 test " << time_for_fusion_inner_product2<64>(res) << std::endl;
total += res;
#if 0 // Leads to ICE with MSVC 8.0
std::cout << "long inner_product std test " << time_for_std_inner_product<128>(res) << std::endl;
total += res;
std::cout << "long inner_product fusion 2 test " << time_for_fusion_inner_product2<128>(res) << std::endl;
total += res;
#endif
return total;
}

View File

@ -0,0 +1,85 @@
// Copyright David Abrahams, Matthias Troyer, Michael Gauckler
// 2005. 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(LIVE_CODE_TYPE)
# define LIVE_CODE_TYPE int
#endif
#include <boost/timer.hpp>
namespace test
{
// This value is required to ensure that a smart compiler's dead
// code elimination doesn't optimize away anything we're testing.
// We'll use it to compute the return code of the executable to make
// sure it's needed.
LIVE_CODE_TYPE live_code;
// Call objects of the given Accumulator type repeatedly with x as
// an argument.
template <class Accumulator, class Arg>
void hammer(Arg const& x, long const repeats)
{
// Strategy: because the sum in an accumulator after each call
// depends on the previous value of the sum, the CPU's pipeline
// might be stalled while waiting for the previous addition to
// complete. Therefore, we allocate an array of accumulators,
// and update them in sequence, so that there's no dependency
// between adjacent addition operations.
//
// Additionally, if there were only one accumulator, the
// compiler or CPU might decide to update the value in a
// register rather that writing it back to memory. we want each
// operation to at least update the L1 cache. *** Note: This
// concern is specific to the particular application at which
// we're targeting the test. ***
// This has to be at least as large as the number of
// simultaneous accumulations that can be executing in the
// compiler pipeline. A safe number here is larger than the
// machine's maximum pipeline depth. If you want to test the L2
// or L3 cache, or main memory, you can increase the size of
// this array. 1024 is an upper limit on the pipeline depth of
// current vector machines.
const std::size_t number_of_accumulators = 1024;
live_code = 0; // reset to zero
Accumulator a[number_of_accumulators];
for (long iteration = 0; iteration < repeats; ++iteration)
{
for (Accumulator* ap = a; ap < a + number_of_accumulators; ++ap)
{
(*ap)(x);
}
}
// Accumulate all the partial sums to avoid dead code
// elimination.
for (Accumulator* ap = a; ap < a + number_of_accumulators; ++ap)
{
live_code += ap->sum;
}
}
// Measure the time required to hammer accumulators of the given
// type with the argument x.
template <class Accumulator, class T>
double measure(T const& x, long const repeats)
{
// Hammer accumulators a couple of times to ensure the
// instruction cache is full of our test code, and that we don't
// measure the cost of a page fault for accessing the data page
// containing the memory where the accumulators will be
// allocated
hammer<Accumulator>(x, repeats);
hammer<Accumulator>(x, repeats);
// Now start a timer
boost::timer time;
hammer<Accumulator>(x, repeats); // This time, we'll measure
return time.elapsed() / repeats; // return the time of one iteration
}
}

View File

@ -0,0 +1,248 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include "measure.hpp"
#define FUSION_MAX_LIST_SIZE 30
#define FUSION_MAX_VECTOR_SIZE 30
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/container/list.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/enum.hpp>
#include <iostream>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
// About the tests:
//
// The tests below compare various fusion sequences to see how abstraction
// affects prformance.
//
// We have 3 sequence sizes for each fusion sequence we're going to test.
//
// small = 3 elements
// medium = 10 elements
// big = 30 elements
//
// The sequences are initialized with values 0..N-1 from numeric strings
// parsed by boost::lexical_cast to make sure that the compiler is not
// optimizing by replacing the computation with constant results computed
// at compile time.
//
// These sequences will be subjected to our accumulator which calls
// fusion::accumulate:
//
// this->sum += boost::fusion::accumulate(seq, 0, poly_add());
//
// where poly_add simply sums the current value with the content of
// the sequence element. This accumulator will be called many times
// through the "hammer" test (see measure.hpp).
//
// The tests are compared against a base using a plain_accumulator
// which does a simple addition:
//
// this->sum += x;
namespace
{
struct poly_add
{
template<typename Sig>
struct result;
template<typename Lhs, typename Rhs>
struct result<poly_add(Lhs, Rhs)>
: boost::remove_reference<Lhs>
{};
template<typename Lhs, typename Rhs>
Lhs operator()(const Lhs& lhs, const Rhs& rhs) const
{
return lhs + rhs;
}
};
// Our Accumulator function
template <typename T>
struct accumulator
{
accumulator()
: sum()
{}
template <typename Sequence>
void operator()(Sequence const& seq)
{
this->sum += boost::fusion::accumulate(seq, 0, poly_add());
}
T sum;
};
// Plain Accumulator function
template <typename T>
struct plain_accumulator
{
plain_accumulator()
: sum()
{}
template <typename X>
void operator()(X const& x)
{
this->sum += x;
}
T sum;
};
template <typename T>
void check(T const& seq, char const* info)
{
test::measure<accumulator<int> >(seq, 1);
std::cout << info << test::live_code << std::endl;
}
template <typename T>
void measure(T const& seq, char const* info, long const repeats, double base)
{
double t = test::measure<accumulator<int> >(seq, repeats);
std::cout
<< info
<< t
<< " (" << int((t/base)*100) << "%)"
<< std::endl;
}
template <typename T>
void test_assembler(T const& seq)
{
test::live_code = boost::fusion::accumulate(seq, 0, poly_add());
}
}
// We'll initialize the sequences from numeric strings that
// pass through boost::lexical_cast to make sure that the
// compiler is not optimizing by replacing the computation
// with constant results computed at compile time.
#define INIT(z, n, text) boost::lexical_cast<int>(BOOST_PP_STRINGIZE(n))
int main()
{
using namespace boost::fusion;
std::cout.setf(std::ios::scientific);
vector<
int, int, int
>
vsmall(BOOST_PP_ENUM(3, INIT, _));
list<
int, int, int
>
lsmall(BOOST_PP_ENUM(3, INIT, _));
vector<
int, int, int, int, int, int, int, int, int, int
>
vmedium(BOOST_PP_ENUM(10, INIT, _));
list<
int, int, int, int, int, int, int, int, int, int
>
lmedium(BOOST_PP_ENUM(10, INIT, _));
vector<
int, int, int, int, int, int, int, int, int, int
, int, int, int, int, int, int, int, int, int, int
, int, int, int, int, int, int, int, int, int, int
>
vbig(BOOST_PP_ENUM(30, INIT, _));
list<
int, int, int, int, int, int, int, int, int, int
, int, int, int, int, int, int, int, int, int, int
, int, int, int, int, int, int, int, int, int, int
>
lbig(BOOST_PP_ENUM(30, INIT, _));
// first decide how many repetitions to measure
long repeats = 100;
double measured = 0;
while (measured < 2.0 && repeats <= 10000000)
{
repeats *= 10;
boost::timer time;
test::hammer<plain_accumulator<int> >(0, repeats);
test::hammer<accumulator<int> >(vsmall, repeats);
test::hammer<accumulator<int> >(lsmall, repeats);
test::hammer<accumulator<int> >(vmedium, repeats);
test::hammer<accumulator<int> >(lmedium, repeats);
test::hammer<accumulator<int> >(vbig, repeats);
test::hammer<accumulator<int> >(lbig, repeats);
measured = time.elapsed();
}
test::measure<plain_accumulator<int> >(1, 1);
std::cout
<< "base accumulated result: "
<< test::live_code
<< std::endl;
double base_time = test::measure<plain_accumulator<int> >(1, repeats);
std::cout
<< "base time: "
<< base_time;
std::cout
<< std::endl
<< "-------------------------------------------------------------------"
<< std::endl;
check(vsmall, "small vector accumulated result: ");
check(lsmall, "small list accumulated result: ");
check(vmedium, "medium vector accumulated result: ");
check(lmedium, "medium list accumulated result: ");
check(vbig, "big vector accumulated result: ");
check(lbig, "big list accumulated result: ");
std::cout
<< "-------------------------------------------------------------------"
<< std::endl;
measure(vsmall, "small vector time: ", repeats, base_time);
measure(lsmall, "small list time: ", repeats, base_time);
measure(vmedium, "medium vector time: ", repeats, base_time);
measure(lmedium, "medium list time: ", repeats, base_time);
measure(vbig, "big vector time: ", repeats, base_time);
measure(lbig, "big list time: ", repeats, base_time);
std::cout
<< "-------------------------------------------------------------------"
<< std::endl;
// Let's see how this looks in assembler
test_assembler(vmedium);
// This is ultimately responsible for preventing all the test code
// from being optimized away. Change this to return 0 and you
// unplug the whole test's life support system.
return test::live_code != 0;
}

View File

@ -0,0 +1,57 @@
===============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
===============================================================================
Timing result for sequence_efficiency.cpp comparing the speed of various
fusion sequences. The test involves accumulating the elements of the
sequence which is primed to have values 0..N (N=size of sequence). Small,
medium and big sequences are tested where:
small = 3 elements
medium = 10 elements
big = 30 elements
Tester: Joel de Guzman. WinXP, P4-3.0GHZ, 2GB RAM
VC7.1 (flags = /MD /O2 /EHsc /GS)
small vector time: 1.870000e-006
small list time: 1.870000e-006
medium vector time: 1.880000e-006
medium list time: 3.600000e-006
big vector time: 2.030000e-006
big list time: 8.910000e-006
VC8.0 (flags = /MD /O2 /EHsc /GS)
small vector time: 2.500000e-05
small list time: 2.500000e-05
medium vector time: 7.810000e-05
medium list time: 7.810000e-05
big vector time: 2.469000e-04
big list time: 2.453000e-04
G++ 3.4 (flags = -ftemplate-depth-128 -funroll-loops -O3 -finline-functions -Wno-inline -Wall)
small vector time: 2.500000e-05
small list time: 2.500000e-05
medium vector time: 7.970000e-05
medium list time: 7.970000e-05
big vector time: 2.516000e-04
big list time: 2.485000e-04
Intel 9.1 (flags = /MD /O2 /EHsc /GS)
small vector time: 1.125000e-006
small list time: 1.125000e-006
medium vector time: 1.125000e-006
medium list time: 1.141000e-006
big vector time: 1.140000e-006
big list time: 1.141000e-006

View File

@ -0,0 +1,155 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include "measure.hpp"
//~ #define FUSION_MAX_VECTOR_SIZE 30
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
#include <boost/fusion/algorithm/transformation/zip.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/sequence/intrinsic/value_at.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <iostream>
#ifdef _MSC_VER
// inline aggressively
# pragma inline_recursion(on) // turn on inline recursion
# pragma inline_depth(255) // max inline depth
#endif
namespace
{
struct zip_add
{
template<typename Lhs, typename Rhs>
struct result
{
typedef typename
boost::remove_reference<
typename boost::fusion::result_of::value_at_c<Lhs, 0>::type
>::type
type;
};
template<typename Lhs, typename Rhs>
typename result<Lhs, Rhs>::type
operator()(const Lhs& lhs, const Rhs& rhs) const
{
return boost::fusion::at_c<0>(lhs) + boost::fusion::at_c<1>(lhs) + rhs;
}
};
// Our Accumulator function
template <typename T>
struct zip_accumulator
{
zip_accumulator()
: sum()
{}
template <typename Sequence>
void operator()(Sequence const& seq)
{
this->sum += boost::fusion::accumulate(seq, 0, zip_add());
}
T sum;
};
template <typename T>
void check(T const& seq, char const* info)
{
test::measure<zip_accumulator<int> >(seq, 1);
std::cout << info << test::live_code << std::endl;
}
template <typename T>
void measure(T const& seq, char const* info, long const repeats)
{
std::cout
<< info
<< test::measure<zip_accumulator<int> >(seq, repeats)
<< std::endl;
}
}
int main()
{
using namespace boost::fusion;
std::cout.setf(std::ios::scientific);
vector<
int, int, int
>
vsmall_1(BOOST_PP_ENUM_PARAMS(3,));
vector<
int, int, int
>
vsmall_2(BOOST_PP_ENUM_PARAMS(3,));
vector<
int, int, int, int, int, int, int, int, int, int
>
vmedium_1(BOOST_PP_ENUM_PARAMS(10,));
vector<
int, int, int, int, int, int, int, int, int, int
>
vmedium_2(BOOST_PP_ENUM_PARAMS(10,));
//~ vector<
//~ int, int, int, int, int, int, int, int, int, int
//~ , int, int, int, int, int, int, int, int, int, int
//~ , int, int, int, int, int, int, int, int, int, int
//~ >
//~ vbig_1(BOOST_PP_ENUM_PARAMS(30,));
//~ vector<
//~ int, int, int, int, int, int, int, int, int, int
//~ , int, int, int, int, int, int, int, int, int, int
//~ , int, int, int, int, int, int, int, int, int, int
//~ >
//~ vbig_2(BOOST_PP_ENUM_PARAMS(30,));
// first decide how many repetitions to measure
long repeats = 100;
double measured = 0;
while (measured < 2.0 && repeats <= 10000000)
{
repeats *= 10;
boost::timer time;
test::hammer<zip_accumulator<int> >(zip(vsmall_1, vsmall_2), repeats);
test::hammer<zip_accumulator<int> >(zip(vmedium_1, vmedium_2), repeats);
//~ test::hammer<zip_accumulator<int> >(zip(vbig_1, vbig_2), repeats);
measured = time.elapsed();
}
check(zip(vsmall_1, vsmall_2),
"small zip accumulated result: ");
check(zip(vmedium_1, vmedium_2),
"medium zip accumulated result: ");
//~ check(zip(vbig_1, vbig_2),
//~ "big zip accumulated result: ");
measure(zip(vsmall_1, vsmall_2),
"small zip time: ", repeats);
measure(zip(vmedium_1, vmedium_2),
"medium zip time: ", repeats);
//~ measure(zip(vbig_1, vbig_2),
//~ "big zip time: ", repeats);
// This is ultimately responsible for preventing all the test code
// from being optimized away. Change this to return 0 and you
// unplug the whole test's life support system.
return test::live_code != 0;
}

View File

@ -0,0 +1,26 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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>
#include <boost/fusion/adapted/boost_tuple.hpp>
#include <boost/fusion/adapted/mpl.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/fusion/adapted/struct.hpp>
// The std_tuple_iterator adaptor only supports implementations
// using variadic templates
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/fusion/adapted/std_tuple.hpp>
#endif
#endif

View File

@ -0,0 +1,19 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Copyright (c) 2010 Christopher Schmidt
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_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>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#endif

View File

@ -0,0 +1,80 @@
/*=============================================================================
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)
==============================================================================*/
#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/less.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/fusion/adapted/struct/detail/extension.hpp>
#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>
#include <boost/fusion/adapted/struct/detail/size_impl.hpp>
#include <boost/fusion/adapted/struct/detail/begin_impl.hpp>
#include <boost/fusion/adapted/struct/detail/end_impl.hpp>
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
#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_C( \
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
BOOST_FUSION_ADAPT_ADT_C_BASE( \
TEMPLATE_PARAMS_SEQ, \
NAME_SEQ, \
I, \
BOOST_PP_IIF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE), \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
BOOST_PP_LESS( \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 4)) \
#define BOOST_FUSION_ADAPT_TPL_ADT(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_ADT_FILLER_0(0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ADT_C)
#define BOOST_FUSION_ADAPT_ADT(NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_STRUCT_BASE( \
(0), \
(0)(NAME), \
struct_tag, \
0, \
BOOST_PP_CAT(BOOST_FUSION_ADAPT_ADT_FILLER_0(0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ADT_C)
#define BOOST_FUSION_ADAPT_ADT_AS_VIEW(NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_STRUCT_BASE( \
(0), \
(0)(NAME), \
struct_tag, \
1, \
BOOST_PP_CAT(BOOST_FUSION_ADAPT_ADT_FILLER_0(0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ADT_C)
#endif

View File

@ -0,0 +1,31 @@
/*=============================================================================
Copyright (c) 2001-2009 Joel de Guzman
Copyright (c) 2009-2010 Hartmut Kaiser
Copyright (c) 2010 Christopher Schmidt
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_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>
#define BOOST_FUSION_ADAPT_ADT_NAMED_NS( \
WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \
\
BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \
WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \
\
BOOST_FUSION_ADAPT_ADT_AS_VIEW( \
BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \
ATTRIBUTES)
#define BOOST_FUSION_ADAPT_ADT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_ADT_NAMED_NS( \
WRAPPED_TYPE,(boost)(fusion)(adapted),NAME,ATTRIBUTES)
#endif

View File

@ -0,0 +1,95 @@
/*=============================================================================
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)
==============================================================================*/
#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/control/if.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/fusion/adapted/struct/detail/extension.hpp>
#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>
#include <boost/fusion/adapted/struct/detail/size_impl.hpp>
#include <boost/fusion/adapted/struct/detail/begin_impl.hpp>
#include <boost/fusion/adapted/struct/detail/end_impl.hpp>
#include <boost/fusion/adapted/struct/detail/value_of_impl.hpp>
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
#include <boost/fusion/adapted/struct/detail/deref_data_impl.hpp>
#include <boost/fusion/adapted/struct/detail/key_of_impl.hpp>
#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>
#include <boost/fusion/adapted/adt/detail/adapt_base_assoc_attr_filler.hpp>
#define BOOST_FUSION_ADAPT_ASSOC_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_IIF(IS_VIEW, BOOST_FUSION_PROXY_PREFIX, BOOST_PP_EMPTY), \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE), \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
BOOST_PP_LESS( \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 5)) \
\
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_FUSION_ADAPT_ASSOC_ADT_WRAPPEDATTR_GET_KEY(ATTRIBUTE) type;\
};
#define BOOST_FUSION_ADAPT_ASSOC_TPL_ADT( \
TEMPLATE_PARAMS_SEQ, NAME_SEQ, ATTRIBUTES) \
\
BOOST_FUSION_ADAPT_STRUCT_BASE( \
(1)TEMPLATE_PARAMS_SEQ, \
(1)NAME_SEQ, \
assoc_struct_tag, \
0, \
BOOST_PP_CAT( \
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(0,0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ASSOC_ADT_C)
#define BOOST_FUSION_ADAPT_ASSOC_ADT(NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_STRUCT_BASE( \
(0), \
(0)(NAME), \
assoc_struct_tag, \
0, \
BOOST_PP_CAT( \
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(0,0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ASSOC_ADT_C)
#define BOOST_FUSION_ADAPT_ASSOC_ADT_AS_VIEW(NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_STRUCT_BASE( \
(0), \
(0)(NAME), \
assoc_struct_tag, \
1, \
BOOST_PP_CAT( \
BOOST_FUSION_ADAPT_ASSOC_ADT_FILLER_0(0,0,0,0,0)ATTRIBUTES,_END), \
BOOST_FUSION_ADAPT_ASSOC_ADT_C)
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
#define BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED_NS( \
WRAPPED_TYPE, NAMESPACE_SEQ, NAME, ATTRIBUTES) \
\
BOOST_FUSION_ADAPT_STRUCT_DEFINE_PROXY_TYPE_IMPL( \
WRAPPED_TYPE,(0)NAMESPACE_SEQ,NAME) \
\
BOOST_FUSION_ADAPT_ASSOC_ADT_AS_VIEW( \
BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DECLARATION((0)NAMESPACE_SEQ)NAME, \
ATTRIBUTES)
#define BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED(WRAPPED_TYPE, NAME, ATTRIBUTES) \
BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED_NS( \
WRAPPED_TYPE,(boost)(fusion)(adapted),NAME,ATTRIBUTES)
#endif

View File

@ -0,0 +1,301 @@
/*=============================================================================
Copyright (c) 2001-2009 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Copyright (c) 2010 Christopher Schmidt
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_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/control/expr_if.hpp>
#include <boost/preprocessor/seq/seq.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/tuple/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< \
lvalue \
, BOOST_PP_SEQ_ELEM(1,TEMPLATE_PARAMS_SEQ) \
>::type
#define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL( \
TEMPLATE_PARAMS_SEQ) \
\
boost::remove_const<boost::remove_reference<lvalue>::type>::type
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE) \
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE, \
BOOST_PP_IF(DEDUCE_TYPE, 0, 2), ATTRIBUTE)
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE) \
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE, \
BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE)
#ifdef BOOST_MSVC
# define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
ATTRIBUTE_TUPLE_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_EXPR_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), \
typename) \
BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
ATTRIBUTE, ATTRIBUTE_TUPLE_SIZE, 1)) type; \
};
#else
# define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
ATTRIBUTE_TUPLE_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_TUPLE_SIZE, 1)) type; \
};
#endif
#define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPLE_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
\
BOOST_FUSION_DEDUCED_ATTR_TYPE( \
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPLE_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
\
typedef \
BOOST_PP_EXPR_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), \
typename) \
boost::remove_const< \
BOOST_PP_EXPR_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), \
typename) \
deduced_attr_type::type \
>::type type; \
\
typedef \
BOOST_PP_EXPR_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ), \
typename) \
boost::add_const< \
BOOST_PP_EXPR_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_TUPLE_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
\
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE, 0, ATTRIBUTE) type; \
typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPLE_SIZE, 1, ATTRIBUTE) const_type;
#define BOOST_FUSION_ADAPT_ADT_C_BASE( \
TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX, \
ATTRIBUTE,ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE) \
\
template< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
> \
struct access::adt_attribute_access< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
> \
{ \
\
BOOST_PP_IF(DEDUCE_TYPE, \
BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE)( \
NAME_SEQ, \
ATTRIBUTE, \
ATTRIBUTE_TUPLE_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) \
{ \
PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE); \
} \
\
BOOST_FUSION_GPU_ENABLED \
static type \
boost_fusion_adapt_adt_impl_get( \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
{ \
return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE); \
} \
\
BOOST_FUSION_GPU_ENABLED \
static const_type \
boost_fusion_adapt_adt_impl_get( \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
{ \
return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
ATTRIBUTE_TUPLE_SIZE, DEDUCE_TYPE); \
} \
}; \
\
template< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
> \
struct adt_attribute_proxy< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
, true \
> \
{ \
typedef \
BOOST_PP_EXPR_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< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
>::boost_fusion_adapt_adt_impl_get(*obj); \
} \
\
BOOST_FUSION_GPU_ENABLED \
operator type() const \
{ \
return get(); \
} \
\
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const* obj; \
}; \
\
template< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
> \
struct adt_attribute_proxy< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
, false \
> \
{ \
typedef \
BOOST_PP_EXPR_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) \
: obj(&o) \
{} \
\
template<class Val> \
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
adt_attribute_proxy& \
operator=(Val const& val) \
{ \
access::adt_attribute_access< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
>::boost_fusion_adapt_adt_impl_set(*obj, val); \
return *this; \
} \
\
BOOST_FUSION_GPU_ENABLED \
type get() const \
{ \
return access::adt_attribute_access< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
>::boost_fusion_adapt_adt_impl_get(*obj); \
} \
\
BOOST_FUSION_GPU_ENABLED \
operator type() const \
{ \
return get(); \
} \
\
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)* obj; \
}; \
\
template< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
> \
struct access::struct_member< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
> \
{ \
typedef BOOST_PP_EXPR_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) \
\
typedef \
BOOST_PP_IF( \
BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), \
BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL, \
BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL)( \
TEMPLATE_PARAMS_SEQ) \
type; \
\
template<typename Seq> \
struct apply \
{ \
typedef \
adt_attribute_proxy< \
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
, I \
, is_const<Seq>::value \
> \
type; \
\
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
static type \
call(Seq& obj) \
{ \
return type(obj); \
} \
}; \
};
#endif

View File

@ -0,0 +1,64 @@
/*=============================================================================
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/struct/detail/adapt_auto.hpp>
#include <boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp>
#include <boost/mpl/aux_/preprocessor/token_equal.hpp>
#include <boost/preprocessor/config/config.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/arithmetic/dec.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_IIF(BOOST_MPL_PP_TOKEN_EQUAL(auto, 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_DEC(BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE)), \
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE))
#endif

View File

@ -0,0 +1,92 @@
/*=============================================================================
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/adapt_auto.hpp>
#include <boost/fusion/adapted/struct/detail/preprocessor/is_seq.hpp>
#include <boost/mpl/aux_/preprocessor/token_equal.hpp>
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/or.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/seq/seq.hpp>
#include <boost/preprocessor/seq/rest_n.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
// MSVC don't compile when using BOOST_PP_BITOR instead of BOOST_PP_OR.
# define BOOST_FUSION_ADAPT_ADT_FILLER(...) \
BOOST_PP_IIF( \
BOOST_PP_OR( \
BOOST_MPL_PP_TOKEN_EQUAL(auto, \
BOOST_PP_VARIADIC_ELEM(0, __VA_ARGS__)), \
BOOST_MPL_PP_TOKEN_EQUAL(auto, \
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_DEC(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)), \
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_IIF(BOOST_MPL_PP_TOKEN_EQUAL(auto, A), \
((2, (C,D))), \
((4, (A,B,C,D))) \
)
#endif // BOOST_PP_VARIADICS
#endif

View File

@ -0,0 +1,41 @@
/*=============================================================================
Copyright (c) 2001-2009 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Copyright (c) 2010 Christopher Schmidt
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_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
{
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

View File

@ -0,0 +1,27 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
Copyright (c) 2010 Christopher Schmidt
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_ARRAY_27122005_1035)
#define BOOST_FUSION_ARRAY_27122005_1035
//For backwards compatibility
#include <boost/fusion/adapted/boost_array.hpp>
#include <boost/fusion/adapted/array/tag_of.hpp>
#include <boost/fusion/adapted/array/is_view_impl.hpp>
#include <boost/fusion/adapted/array/is_sequence_impl.hpp>
#include <boost/fusion/adapted/array/category_of_impl.hpp>
#include <boost/fusion/adapted/array/begin_impl.hpp>
#include <boost/fusion/adapted/array/end_impl.hpp>
#include <boost/fusion/adapted/array/size_impl.hpp>
#include <boost/fusion/adapted/array/at_impl.hpp>
#include <boost/fusion/adapted/array/value_at_impl.hpp>
#include <boost/fusion/adapted/array/deref_impl.hpp>
#include <boost/fusion/adapted/array/value_of_impl.hpp>
#endif

View File

@ -0,0 +1,40 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
namespace boost { namespace fusion { namespace extension
{
template<typename>
struct at_impl;
template<>
struct at_impl<po_array_tag>
{
template<typename Seq, typename N>
struct apply
{
typedef typename
add_reference<typename remove_extent<Seq>::type>::type
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Seq& seq)
{
return seq[N::value];
}
};
};
}}}
#endif

View File

@ -0,0 +1,44 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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
{
template<typename>
struct begin_impl;
template <>
struct begin_impl<po_array_tag>
{
template <typename Seq>
struct apply
{
typedef
basic_iterator<
po_array_iterator_tag
, random_access_traversal_tag
, Seq
, 0
>
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Seq& seq)
{
return type(seq,0);
}
};
};
}}}
#endif

View File

@ -0,0 +1,32 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_ARRAY_CATEGORY_OF_IMPL_HPP
#define BOOST_FUSION_ADAPTED_ARRAY_CATEGORY_OF_IMPL_HPP
namespace boost { namespace fusion
{
struct random_access_traversal_tag;
namespace extension
{
template<typename>
struct category_of_impl;
template<>
struct category_of_impl<po_array_tag>
{
template<typename Seq>
struct apply
{
typedef random_access_traversal_tag type;
};
};
}
}}
#endif

View File

@ -0,0 +1,42 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
namespace boost { namespace fusion { namespace extension
{
template <typename>
struct deref_impl;
template <>
struct deref_impl<po_array_iterator_tag>
{
template <typename It>
struct apply
{
typedef typename
add_reference<
typename remove_extent<typename It::seq_type>::type
>::type
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(It const& it)
{
return (*it.seq)[It::index::value];
}
};
};
}}}
#endif

View File

@ -0,0 +1,46 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
namespace boost { namespace fusion { namespace extension
{
template <typename>
struct end_impl;
template <>
struct end_impl<po_array_tag>
{
template <typename Seq>
struct apply
{
typedef
basic_iterator<
po_array_iterator_tag
, random_access_traversal_tag
, Seq
, extent<Seq,rank<Seq>::value-1>::value
>
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Seq& seq)
{
return type(seq,0);
}
};
};
}}}
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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
{
template<typename>
struct is_sequence_impl;
template<>
struct is_sequence_impl<po_array_tag>
{
template<typename Seq>
struct apply
: mpl::true_
{};
};
}}}
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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
{
template<typename>
struct is_view_impl;
template<>
struct is_view_impl<po_array_tag>
{
template<typename Seq>
struct apply
: mpl::false_
{};
};
}}}
#endif

View File

@ -0,0 +1,30 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
namespace boost { namespace fusion { namespace extension
{
template<typename>
struct size_impl;
template<>
struct size_impl<po_array_tag>
{
template<typename Seq>
struct apply
: extent<Seq,rank<Seq>::value-1>
{};
};
}}}
#endif

View File

@ -0,0 +1,73 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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>
namespace boost
{
namespace fusion
{
struct po_array_tag;
struct po_array_iterator_tag;
struct random_access_traversal_tag;
struct fusion_sequence_tag;
namespace traits
{
#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
template<typename T, std::size_t N>
struct tag_of<T[N], void>
{
typedef po_array_tag type;
};
template<typename T, std::size_t N>
struct tag_of<T const[N], void>
{
typedef po_array_tag type;
};
#else
template<typename T, std::size_t N>
struct tag_of<T[N], void>
{
typedef po_array_tag type;
};
template<typename T, std::size_t N>
struct tag_of<T const[N], void>
{
typedef po_array_tag type;
};
#endif
}
}
namespace mpl
{
template<typename>
struct sequence_tag;
template<typename T, std::size_t N>
struct sequence_tag<T[N]>
{
typedef fusion::po_array_tag type;
};
template<typename T, std::size_t N>
struct sequence_tag<T const[N] >
{
typedef fusion::po_array_tag type;
};
}
}
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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
{
template<typename>
struct value_at_impl;
template <>
struct value_at_impl<po_array_tag>
{
template <typename Seq, typename N>
struct apply
: remove_extent<Seq>
{};
};
}}}
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
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_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
{
template <typename>
struct value_of_impl;
template <>
struct value_of_impl<po_array_iterator_tag>
{
template <typename It>
struct apply
: remove_extent<typename It::seq_type>
{};
};
}}}
#endif

View File

@ -0,0 +1,23 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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>
#include <boost/fusion/adapted/boost_array/detail/is_sequence_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/category_of_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/begin_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/end_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/size_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/at_impl.hpp>
#include <boost/fusion/adapted/boost_array/detail/value_at_impl.hpp>
#endif

View File

@ -0,0 +1,121 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/minus.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/fusion/iterator/iterator_facade.hpp>
namespace boost { namespace fusion
{
struct random_access_traversal_tag;
template <typename Array, int Pos>
struct array_iterator
: iterator_facade<array_iterator<Array, Pos>, random_access_traversal_tag>
{
BOOST_MPL_ASSERT_RELATION(Pos, >=, 0);
BOOST_MPL_ASSERT_RELATION(Pos, <=, static_cast<int>(Array::static_size));
typedef mpl::int_<Pos> index;
typedef Array array_type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
array_iterator(Array& a)
: array(a) {}
Array& array;
template <typename Iterator>
struct value_of
{
typedef typename Iterator::array_type array_type;
typedef typename array_type::value_type type;
};
template <typename Iterator>
struct deref
{
typedef typename Iterator::array_type array_type;
typedef typename
mpl::if_<
is_const<array_type>
, typename array_type::const_reference
, typename array_type::reference
>::type
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Iterator const & it)
{
return it.array[Iterator::index::value];
}
};
template <typename Iterator, typename N>
struct advance
{
typedef typename Iterator::index index;
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)
{
return type(i.array);
}
};
template <typename Iterator>
struct next : advance<Iterator, mpl::int_<1> > {};
template <typename Iterator>
struct prior : advance<Iterator, mpl::int_<-1> > {};
template <typename I1, typename I2>
struct distance : mpl::minus<typename I2::index, typename I1::index>
{
typedef typename
mpl::minus<
typename I2::index, typename I1::index
>::type
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(I1 const&, I2 const&)
{
return type();
}
};
private:
array_iterator<Array, Pos>& operator=(array_iterator<Array, Pos> const&);
};
}}
#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

View File

@ -0,0 +1,47 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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
{
template<typename T>
struct at_impl;
template<>
struct at_impl<boost_array_tag>
{
template<typename Sequence, typename N>
struct apply
{
typedef typename mpl::if_<
is_const<Sequence>,
typename Sequence::const_reference,
typename Sequence::reference>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Sequence& seq)
{
return seq[N::value];
}
};
};
}
}}
#endif

View File

@ -0,0 +1,42 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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 {
struct boost_array_tag;
namespace extension
{
template<typename T>
struct begin_impl;
template <>
struct begin_impl<boost_array_tag>
{
template <typename Sequence>
struct apply
{
typedef array_iterator<Sequence, 0> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Sequence& v)
{
return type(v);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,36 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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 {
struct boost_array_tag;
struct random_access_traversal_tag;
namespace extension
{
template<typename T>
struct category_of_impl;
template<>
struct category_of_impl<boost_array_tag>
{
template<typename T>
struct apply
{
typedef random_access_traversal_tag type;
};
};
}
}}
#endif

View File

@ -0,0 +1,42 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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 {
struct boost_array_tag;
namespace extension
{
template <typename Tag>
struct end_impl;
template <>
struct end_impl<boost_array_tag>
{
template <typename Sequence>
struct apply
{
typedef array_iterator<Sequence, Sequence::static_size> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
call(Sequence& v)
{
return type(v);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,32 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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 {
struct boost_array_tag;
namespace extension
{
template<typename Tag>
struct is_sequence_impl;
template<>
struct is_sequence_impl<boost_array_tag>
{
template<typename Sequence>
struct apply : mpl::true_ {};
};
}
}}
#endif

View File

@ -0,0 +1,33 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_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
{
struct boost_array_tag;
namespace extension
{
template<typename Tag>
struct is_view_impl;
template<>
struct is_view_impl<boost_array_tag>
{
template<typename T>
struct apply : mpl::false_
{};
};
}
}}
#endif

View File

@ -0,0 +1,29 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_SIZE_IMPL_27122005_1251)
#define BOOST_FUSION_SIZE_IMPL_27122005_1251
namespace boost { namespace fusion {
struct boost_array_tag;
namespace extension
{
template<typename T>
struct size_impl;
template<>
struct size_impl<boost_array_tag>
{
template<typename Sequence>
struct apply : mpl::int_<Sequence::static_size> {};
};
}
}}
#endif

View File

@ -0,0 +1,32 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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_VALUE_AT_IMPL_27122005_1256)
#define BOOST_FUSION_VALUE_AT_IMPL_27122005_1256
namespace boost { namespace fusion {
struct boost_array_tag;
namespace extension
{
template<typename T>
struct value_at_impl;
template <>
struct value_at_impl<boost_array_tag>
{
template <typename Sequence, typename N>
struct apply
{
typedef typename Sequence::value_type type;
};
};
}
}}
#endif

View File

@ -0,0 +1,59 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
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(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>
namespace boost
{
template<typename T, std::size_t N>
class array;
}
namespace boost { namespace fusion
{
struct boost_array_tag;
struct fusion_sequence_tag;
namespace traits
{
template<typename T, std::size_t N>
#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
struct tag_of<boost::array<T,N>, void >
#else
struct tag_of<boost::array<T,N> >
#endif
{
typedef boost_array_tag type;
};
}
}}
namespace boost { namespace mpl
{
template<typename>
struct sequence_tag;
template<typename T, std::size_t N>
struct sequence_tag<array<T,N> >
{
typedef fusion::fusion_sequence_tag type;
};
template<typename T, std::size_t N>
struct sequence_tag<array<T,N> const>
{
typedef fusion::fusion_sequence_tag type;
};
}}
#endif

View File

@ -0,0 +1,23 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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_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>
#include <boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp>
#include <boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp>
#include <boost/fusion/adapted/boost_tuple/detail/end_impl.hpp>
#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

View File

@ -0,0 +1,221 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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(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>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/tuple/tuple.hpp>
namespace boost { namespace fusion
{
struct forward_traversal_tag;
namespace detail
{
template <typename T>
struct boost_tuple_is_empty : mpl::false_ {};
template <>
struct boost_tuple_is_empty<tuples::null_type> : mpl::true_ {};
template <>
struct boost_tuple_is_empty<tuples::null_type const> : mpl::true_ {};
template <>
struct boost_tuple_is_empty<tuples::tuple<> > : mpl::true_ {};
template <>
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;
template <typename Iterator>
struct value_of : mpl::identity<typename Iterator::cons_type::head_type> {};
template <typename Iterator>
struct deref
{
typedef typename value_of<Iterator>::type element;
typedef typename
mpl::if_<
is_const<typename Iterator::cons_type>
, typename tuples::access_traits<element>::const_type
, typename tuples::access_traits<element>::non_const_type
>::type
type;
BOOST_FUSION_GPU_ENABLED
static type
call(Iterator const& iter)
{
return iter.cons.get_head();
}
};
template <typename Iterator>
struct next
{
typedef typename Iterator::cons_type cons_type;
typedef typename cons_type::tail_type tail_type;
typedef boost_tuple_iterator<
typename mpl::eval_if<
is_const<cons_type>
, add_const<tail_type>
, mpl::identity<tail_type>
>::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;
// detail
template <typename I1, typename I2>
struct lazy_next_distance
{
typedef
typename mpl::plus<
mpl::int_<1>,
typename distance<
typename next<I1>::type,
I2
>::type
>::type type;
};
template <typename I1, typename I2>
struct distance
{
typedef typename mpl::eval_if<
boost::is_same<I1, I2>,
mpl::int_<0>,
lazy_next_distance<I1, I2>
>::type type;
BOOST_FUSION_GPU_ENABLED
static type
call(I1 const&, I2 const&)
{
return type();
}
};
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&);
};
template <typename Null>
struct boost_tuple_null_iterator
: iterator_facade<boost_tuple_iterator<Null>, forward_traversal_tag>
{
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_<
is_same<I1, I2>
, mpl::and_<
detail::boost_tuple_is_empty<typename I1::cons_type>
, detail::boost_tuple_is_empty<typename I2::cons_type>
>
>
{};
};
template <>
struct boost_tuple_iterator<tuples::null_type>
: boost_tuple_null_iterator<tuples::null_type>
{
template <typename Cons>
BOOST_FUSION_GPU_ENABLED
explicit boost_tuple_iterator(Cons const&) {}
};
template <>
struct boost_tuple_iterator<tuples::null_type const>
: boost_tuple_null_iterator<tuples::null_type const>
{
template <typename Cons>
BOOST_FUSION_GPU_ENABLED
explicit boost_tuple_iterator(Cons const&) {}
};
template <>
struct boost_tuple_iterator<tuples::tuple<> >
: boost_tuple_null_iterator<tuples::tuple<> >
{
template <typename Cons>
BOOST_FUSION_GPU_ENABLED
explicit boost_tuple_iterator(Cons const&) {}
};
template <>
struct boost_tuple_iterator<tuples::tuple<> const>
: 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

View File

@ -0,0 +1,52 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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_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>
namespace boost { namespace fusion
{
struct boost_tuple_tag;
namespace extension
{
template<typename T>
struct at_impl;
template <>
struct at_impl<boost_tuple_tag>
{
template <typename Sequence, typename N>
struct apply
{
typedef typename
tuples::element<N::value, Sequence>::type
element;
typedef typename
mpl::if_<
is_const<Sequence>
, typename tuples::access_traits<element>::const_type
, typename tuples::access_traits<element>::non_const_type
>::type
type;
BOOST_FUSION_GPU_ENABLED
static type
call(Sequence& seq)
{
return tuples::get<N::value>(seq);
}
};
};
}
}}
#endif

View File

@ -0,0 +1,41 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
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_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
{
struct boost_tuple_tag;
namespace extension
{
template<typename T>
struct begin_impl;
template <>
struct begin_impl<boost_tuple_tag>
{
template <typename Sequence>
struct apply
{
typedef boost_tuple_iterator<Sequence> type;
BOOST_FUSION_GPU_ENABLED
static type
call(Sequence& v)
{
return type(v);
}
};
};
}
}}
#endif

Some files were not shown because too many files have changed in this diff Show More