diff --git a/doc/Jamfile b/doc/Jamfile index c47c6ccb..dc8fefe7 100644 --- a/doc/Jamfile +++ b/doc/Jamfile @@ -1,3 +1,10 @@ +#============================================================================== +# Copyright (c) 2003-2007 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 ; @@ -8,6 +15,7 @@ boostbook quickbook : boost.root=../../../.. boost.libraries=../../../libraries.htm + html.stylesheet=../../../../doc/html/boostbook.css chunk.section.depth=4 chunk.first.sections=1 toc.section.depth=3 diff --git a/doc/acknowledgements.qbk b/doc/acknowledgements.qbk index f0b628d4..fd66c3c5 100644 --- a/doc/acknowledgements.qbk +++ b/doc/acknowledgements.qbk @@ -1,15 +1,22 @@ +[/============================================================================== + 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) +===============================================================================/] [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 +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 +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] diff --git a/doc/adapted.qbk b/doc/adapted.qbk new file mode 100644 index 00000000..a19696fd --- /dev/null +++ b/doc/adapted.qbk @@ -0,0 +1,257 @@ +[/============================================================================== + 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) +===============================================================================/] +[section Adapted] + +Fusion provides a couple of adapters for other sequences such as +`std::pair`, __mpl__ sequences, and `boost::array`. These adapters are +written using Fusion's non-intrusive __extension__ mechanism. If you wish +to use these sequences with fusion, simply include the necessary files and +they will be regarded as first-class, fully conforming fusion sequences. + +Fusion also provides various schemes to make it easy for the user to adapt +various data structures, non-intrusively, as full fledged Fusion sequences. + +[heading Header] + + #include + #include + +Fusion sequences may also be adapted as fully conforming __mpl__ sequences (see +__intrinsics__). That way, we can have 2-way adaptation to and from __mpl__ and +Fusion. To make Fusion sequences fully conforming __mpl__ sequences, include: + + #include + +If you want bi-directional adaptation to and from __mpl__ and Fusion, simply +include: + + #include + +The header includes all the necessary headers. + +[section std::pair] + +This module provides adapters for `std::pair`. Including the module header +makes `std::pair` a fully conforming __random_access_sequence__. + +[heading Header] + + #include + #include + +[heading Model of] + +* __random_access_sequence__ + +[heading Example] + + std::pair p(123, "Hola!!!"); + std::cout << __at_c__<0>(p) << std::endl; + std::cout << __at_c__<1>(p) << std::endl; + std::cout << p << std::endl; + +[heading See also] + +__std_pair_doc__, __tr1_tuple_pair__ + +[endsect] + +[section mpl sequence] + +This module provides adapters for __mpl__ sequences. Including the module +header makes all __mpl__ sequences fully conforming fusion sequences. + +[heading Header] + + #include + #include + +[heading Model of] + +* __forward_sequence__ (If the __mpl__ sequence is a forward sequence.) +* __bidirectional_sequence__ (If the __mpl__ sequence is a bidirectional sequence.) +* __random_access_sequence__ (If the __mpl__ sequence is a random access sequence.) + +[heading Example] + + mpl::vector_c vec_c; + fusion::vector2 v(vec_c); + std::cout << __at_c__<0>(v) << std::endl; + std::cout << __at_c__<1>(v) << std::endl; + + v = mpl::vector_c(); + std::cout << __at_c__<0>(v) << std::endl; + std::cout << __at_c__<1>(v) << std::endl; + +[heading See also] + +__mpl__ + +[endsect] + +[section boost::array] + +This module provides adapters for `boost::array`. Including the module +header makes `boost::array` a fully conforming __random_access_sequence__. + +[heading Header] + + #include + #include + +[heading Model of] + +* __random_access_sequence__ + +[heading Example] + + boost::array arr = {{1,2,3}}; + + std::cout << *__begin__(arr) << std::endl; + std::cout << *__next__(__begin__(arr)) << std::endl; + std::cout << *__advance_c__<2>(__begin__(arr)) << std::endl; + std::cout << *__prior__(__end__(arr)) << std::endl; + std::cout << __at_c__<2>(arr) << std::endl; + +[heading See also] + +__boost_array_library__ + +[endsect] + +[section boost::tuple] +This module provides adapters for `boost::tuple`. Including the module +header makes `boost::tuple` a fully conforming __forward_sequence__. + +[heading Header] + + #include + #include + +[heading Model of] + +* __forward_sequence__ + +[heading Example] + + boost::tuple example_tuple(101, "hello"); + std::cout << *boost::fusion::begin(example_tuple) << '\n'; + std::cout << *boost::fusion::next(boost::fusion::begin(example_tuple)) << '\n'; + +[heading See also] + +__boost_tuple_library__ + +[endsect] + +[section:adapt_struct BOOST_FUSION_ADAPT_STRUCT] + +[heading Description] +BOOST_FUSION_ADAPT_STRUCT is a macro that can be used to generate all the +necessary boilerplate to make an arbitrary struct into a __random_access_sequence__. + +[heading Synopsis] + BOOST_FUSION_ADAPT_STRUCT( + struct_name + (member_type0, member_name0) + (member_type1, member_name1) + ... + ) + +[heading Semantics] + +The above macro generates the necessary code to adapt `struct_name` +as a model of __random_access_sequence__. The sequence of `(member_typeN, member_nameN)` +pairs declare the type and names of each of the struct members that will be +part of the sequence. + +The macro should be used at global scope, and `struct_name` should be the fully +namespace qualified name of the struct to be converted. + +[heading Header] + + #include + #include + +[heading Example] + namespace demo + { + struct employee + { + std::string name; + int age; + }; + } + + // demo::employee is now a Fusion sequence + BOOST_FUSION_ADAPT_STRUCT( + demo::employee + (std::string, name) + (int, age)) + +[endsect] + +[section:adapt_assoc BOOST_FUSION_ADAPT_ASSOC_STRUCT] + +[heading Description] +BOOST_FUSION_ADAPT_ASSOC_STRUCT is a macro that can be used to generate all the +necessary boilerplate to make an arbitrary struct into a model of __random_access_sequence__ +and __associative_sequence__. + +[heading Synopsis] + BOOST_FUSION_ADAPT_ASSOC_STRUCT( + struct_name + (member_type0, member_name0, key_type0) + (member_type1, member_name1, key_type1) + ... + ) + +[heading Semantics] + +The above macro generates the necessary code to adapt `struct_name` +as a model of __random_access_sequence__ and __associative_sequence__. +The sequence of `(member_typeN, member_nameN, key_typeN)` +triples declare the type, name and key type of each of the struct members +that will be part of the sequence. + +The macro should be used at global scope, and `struct_name` should be the fully +namespace qualified name of the struct to be converted. + +[heading Header] + + #include + #include + +[heading Example] + namespace demo + { + struct employee + { + std::string name; + int age; + }; + } + + namespace keys + { + struct name; + struct age; + } + + // demo::employee is now a Fusion sequence + // It is also an associative sequence with + // keys keys::name and keys::age present. + BOOST_FUSION_ADAPT_ASSOC_STRUCT( + demo::employee + (std::string, name, keys::name) + (int, age, keys::age)) + + +[endsect] + +[endsect] diff --git a/doc/algorithm.qbk b/doc/algorithm.qbk new file mode 100644 index 00000000..cfaf92b7 --- /dev/null +++ b/doc/algorithm.qbk @@ -0,0 +1,2523 @@ +[/============================================================================== + 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) +===============================================================================/] +[section Algorithm] + +[heading Lazy Evaluation] + +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. + +[heading Sequence Extension] + +The /lazy/ evaluation scheme where __algorithms__ return __views__ also +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. That is to say that Fusion +sequences are cheaply extensible. However, an important caveat is that the +result of a sequence extending operation like __push_back__ does not retain +the properties of the original sequence such as associativity of __set__(s). +To regain the original sequence, __conversion__ functions are provided. You +may use one of the __conversion__ functions to convert back to the original +sequence type. + +[heading Header] + + #include + #include + +[section Iteration] + +The iteration algorithms provide the fundamental algorithms for traversing +a sequence repeatedly applying an operation to its elements. + +[heading Header] + + #include + #include + +[section Functions] + +[section fold] + +[heading Description] +For a sequence `Seq`, initial state, and binary function object or function pointer `f`, fold repeatedly applies binary `f` to each element of `Seq` and the previous state. + +[heading Synopsis] + template< + typename Sequence, + typename State, + typename F + > + typename __result_of_fold__::type fold( + Sequence& seq, State const& initial_state, F const& f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__,`f(e,s)` must be a valid expression for each element `e` in `seq`, and current state `s`][Operation's argument]] + [[`initial_state`][Any type][Initial state]] + [[`f`][`__boost_result_of_call__::type` is the return type of `f(e,s)` for each element `e` of type `E` in `seq`, and current state `s` of type `S`][Operation's argument]] +] + +[heading Expression Semantics] + fold(seq, initial_state, f); + +[*Return type]: Any type + +[*Semantics]: Equivalent to `f(eN ....f(e2,f(e1,initial_state)))` where `e1 ...eN` are the elements of `seq`. + +[heading Complexity] +Linear, exactly `__result_of_size__::value` applications of `f`. + +[heading Header] + + #include + #include + +[heading Example] + struct make_string + { + typedef std::string result_type; + + template + std::string operator()(const T& t, const std::string& str) const + { + return str + boost::lexical_cast(t); + } + }; + ... + const __vector__ vec(1,2); + assert(__fold__(vec,std::string(""), make_string()) == "12"); + +[endsect] + +[section accumulate] + +[heading Description] +For a sequence `Seq`, initial state, and binary function object or function pointer `f`, accumulate repeatedly applies binary `f` to each element of `Seq` and the previous state. + +[heading Synopsis] + template< + typename Sequence, + typename State, + typename F + > + typename __result_of_accumulate__::type accumulate( + Sequence& seq, State const& initial_state, F const& f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(eN ....f(e2,f(e1,initial_state)))` must be a valid expression for each element `e1` to `eN` in `seq`][Operation's argument]] + [[`initial_state`][Any type][Initial state]] + [[`f`][`__boost_result_of_call__::type` is the return type of `f(e,s)` for each element `e` of type `E` in `seq`, and current state `s` of type `S`][Operation's argument]] +] + +[heading Expression Semantics] + accumulate(seq, initial_state, f); + +[*Return type]: Any type + +[*Semantics]: Equivalent to `f(eN ....f(e2,f(e1,initial_state)))` where `e1 ...eN` are the elements of `seq`. + +[heading Complexity] +Linear, exactly `__result_of_size__::value` applications of `f`. + +[heading Header] + + #include + #include + +[heading Example] + struct make_string + { + typedef std::string result_type; + + template + std::string operator()(const T& t, const std::string& str) const + { + return str + boost::lexical_cast(t); + } + }; + ... + const __vector__ vec(1,2); + assert(__accumulate__(vec,std::string(""), make_string()) == "12"); + +[endsect] + +[section for_each] + +[heading Description] +Applies a unary function object to each element of a sequence. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_for_each__::type for_each( + Sequence& seq, F const& f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(e)` must be a valid expression for each element `e` in `seq`][Operation's argument]] + [[`f`][A unary __reg_callable_obj__][Operation's argument]] +] + +[heading Expression Semantics] + __for_each__(seq, f); + +[*Return type]: `void` + +[*Semantics]: Calls `f(e)` for each element `e` in `seq`. + +[heading Complexity] +Linear, exactly `__result_of_size__::value` applications of `f`. + +[heading Header] + + #include + #include + +[heading Example] + struct increment + { + template + void operator()(T& t) const + { + ++t; + } + }; + ... + __vector__ vec(1,2); + __for_each__(vec, increment()); + assert(vec == __make_vector__(2,3)); + +[endsect] + +[endsect] + +[section Metafunctions] + +[section fold] + +[heading Description] +Returns the result type of __fold__. + +[heading Synopsis] + template< + typename Sequence, + typename State, + typename F> + struct fold + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [The sequence to iterate]] + [[`State`] [Any type] [The initial state for the first application of `F`]] + [[`F`] [`__boost_result_of_call__::type` is the return type of `f(e,s)` for each element `e` of type `E` in `seq`, and current state `s` of type `S`] [The operation to be applied on forward traversal]] +] + +[heading Expression Semantics] + __result_of_fold__::type + +[*Return type]: Any type + +[*Semantics]: Returns the result of applying `fold` to a sequence of type `Sequence`, with an initial state of +type `State` and binary function object or function pointer of type `F`. + +[heading Complexity] +Linear, exactly `__result_of_size__::value` applications of `F`. + +[heading Header] + + #include + #include + +[endsect] + +[section accumulate] + +[heading Description] +Returns the result type of __accumulate__. + +[heading Synopsis] + template< + typename Sequence, + typename State, + typename F> + struct accumulate + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [The sequence to iterate]] + [[`State`] [Any type] [The initial state for the first application of `F`]] + [[`F`] [`__boost_result_of_call__::type` is the return type of `f(e,s)` for each element `e` of type `E` in `seq`, and current state `s` of type `S`] [The operation to be applied on forward traversal]] +] + +[heading Expression Semantics] + __result_of_accumulate__::type + +[*Return type]: Any type + +[*Semantics]: Returns the result of applying `accumulate` to a sequence of type `Sequence`, with an initial state of +type `State` and binary function object or function pointer of type `F`. + +[heading Complexity] +Linear, exactly `__result_of_size__::value` applications of `F`. + +[heading Header] + + #include + #include + +[endsect] + +[section for_each] +A metafunction returning the result type of applying __for_each__ to a sequence. The +return type of __for_each__ is always `void`. + +[heading Description] + +[heading Synopsis] + template< + typename Sequence, + typename F + > + struct for_each + { + typedef void type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`F`] [Any type] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_for_each__::type + +[*Return type]: `void`. + +[*Semantics]: Returns the return type of __for_each__ for a sequence of type `Sequence` and a unary function object `F`. +The return type is always `void`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[endsect] + +[endsect] + +[section Query] +The query algorithms provide support for searching and analyzing sequences. + +[heading Header] + + #include + #include + +[section Functions] + +[section any] + +[heading Description] +For a sequence `seq` and unary function object `f`, `any` returns true if `f` returns true for at least one element of `seq`. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_any__::type any( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(e)` must be a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]] + [[`f`][A unary function object][The search predicate]] +] + +[heading Expression semantics] + __any__(seq, f); + +[*Return type]: `bool` + +[*Semantics]: Returns true if and only if `f(e)` evaluates to `true` for some element `e` in `seq`. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + struct odd + { + template + bool operator()(T t) const + { + return t % 2; + } + }; + ... + assert(__any__(__make_vector__(1,2), odd())); + assert(!__any__(__make_vector__(2,4), odd())); + +[endsect] + +[section all] + +[heading Description] +For a sequence `seq` and unary function object `f`, `all` returns true if `f` returns true for every element of `seq`. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_all__::type all( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for every element `e` in `seq`][The sequence to search]] + [[`f`][A unary function object][The search predicate]] +] + +[heading Expression Semantics] + __all__(seq, f); + +[*Return type]: `bool` + +[*Semantics]: Returns true if and only if `f(e)` evaluates to `true` for every element `e` in `seq`. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + struct odd + { + template + bool operator()(T t) const + { + return t % 2; + } + }; + ... + assert(__all__(__make_vector__(1,3), odd())); + assert(!__all__(__make_vector__(1,2), odd())); + +[endsect] + +[section none] + +[heading Description] +For a sequence `seq` and unary function object `f`, `none` returns true if `f` returns false for every element of `seq`. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_none__::type none( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for every element `e` in `seq`][The sequence to search]] + [[`f`][A unary function object][The search predicate]] +] + +[heading Expression Semantics] + __none__(seq, f); + +[*Return type]: `bool` + +[*Semantics]: Returns true if and only if `f(e)` evaluates to `false` for every element `e` in `seq`. Result equivalent to `!any(seq, f)`. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + struct odd + { + template + bool operator()(T t) const + { + return t % 2; + } + }; + ... + assert(__none__(__make_vector__(2,4), odd())); + assert(!__none__(__make_vector__(1,2), odd())); + +[endsect] + +[section find] + +[heading Description] +Finds the first element of a given type within a sequence. + +[heading Synopsis] + template< + typename T, + typename Sequence + > + __unspecified__ find(Sequence const& seq); + + template< + typename T, + typename Sequence + > + __unspecified__ find(Sequence& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][The sequence to search]] + [[`T`][Any type][The type to search for]] +] + +[heading Expression Semantics] + __find__(seq) + +[*Return type]: A model of the same iterator category as the iterators of `seq`. + +[*Semantics]: Returns an iterator to the first element of `seq` of type `T`, or `__end__(seq)` if there is no such element. +Equivalent to `__find_if__ >(seq)` + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec('a','0'); + assert(*__find__(vec) == '0'); + assert(__find__(vec) == __end__(vec)); + +[endsect] + +[section find_if] +Finds the first element within a sequence with a type for which a given __mpl_lambda_expression__ evaluates to +`boost::mpl::true_`. + +[heading Description] + +[heading Synopsis] + template< + typename F, + typename Sequence + > + __unspecified__ find_if(Sequence const& seq); + + template< + typename F, + typename Sequence + > + __unspecified__ find_if(Sequence& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][The sequence to search]] + [[`F`][A unary __mpl_lambda_expression__][The search predicate]] +] + +[heading Expression Semantics] + __find_if__(seq) + +[*Return type]: An iterator of the same iterator category as the iterators of `seq`. + +[*Semantics]: Returns the first element of `seq` for which __mpl_lambda_expression__ `F` evaluates to `boost::mpl::true_`, +or `__end__(seq)` if there is no such element. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + + +/algorithm/query/find_if.hpp> + +[heading Example] + const __vector__ vec(1.0,2); + assert(*__find_if__ >(vec) == 2); + assert(__find_if__ >(vec) == __end__(vec)); + +[endsect] + +[section count] + +[heading Description] +Returns the number of elements of a given type within a sequence. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + typename __result_of_count__::type count( + Sequence const& seq, T const& t); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `e == t` must be a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]] + [[`T`][Any type][The type to count]] +] + +[heading Expression Semantics] + __count__(seq, t); + +[*Return type]: `int` + +[*Semantics]: Returns the number of elements of type `T` and equal to `t` in `seq`. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1.0,2,3); + assert(__count__(vec,2) == 1); + +[endsect] + +[section count_if] + +[heading Description] +Returns the number of elements within a sequence with a type for which a given unary function object evaluates to +`true`. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_count_if__::type count_if( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `f(e)` is a valid expression, convertible to `bool`, for each element `e` in `seq`][The sequence to search]] + [[`f`][A unary function object][The search predicate]] +] + +[heading Expression Semantics] + __count_if__(seq, f) + +[*Return type]: `int` + +[*Semantics]: Returns the number of elements in `seq` where `f` evaluates to `true`. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2,3); + assert(__count_if__(vec,odd()) == 2); + +[endsect] + +[endsect] + +[section Metafunctions] + +[section any] + +[heading Description] +A metafunction returning the result type of __any__. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + struct any + { + typedef bool type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_any__::type + +[*Return type]: `bool`. + +[*Semantics]: Returns the return type of __any__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section all] + +[heading Description] +A metafunction returning the result type of __all__. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + struct all + { + typedef bool type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_all__::type + +[*Return type]: `bool`. + +[*Semantics]: Returns the return type of __all__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section none] + +[heading Description] +A metafunction returning the result type of __none__. + +[heading Synopsis] + template< + typename Sequence, + typename F + > + struct none + { + typedef bool type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`F`] [A model of unary __poly_func_obj__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_none__::type + +[*Return type]: `bool`. + +[*Semantics]: Returns the return type of __none__ given a sequence of type `Sequence` and a unary __poly_func_obj__ of type `F`. The return type is always `bool`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section find] + +[heading Description] +Returns the result type of `find`, given the sequence and search types. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct find + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [Model of __forward_sequence__] [Operation's argument]] + [[`T`] [Any type] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_find__::type + +[*Return type]: A model of the same iterator category as the iterators of `Sequence`. + +[*Semantics]: Returns an iterator to the first element of type `T` in `Sequence`, or `__result_of_end__::type` if there is no such element. + +[heading Complexity] +Linear, at most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[endsect] + +[section find_if] + +[heading Description] +Returns the result type of `find_if` given the sequence and predicate types. + +[heading Synopsis] + template< + typename Sequence, + typename Pred + > + struct find_if + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`Pred`] [A model of __mpl_lambda_expression__] [Operation's arguments]] +] + +[heading Expression Semantics] + __result_of_find_if__::type + +[*Return type]: A model of the same iterator category as the iterators of `Sequence`. + +[*Semantics]: Returns an iterator to the first element in `Sequence` for which `Pred` evaluates to true. Returns `__result_of_end__::type` if there is no such element. + +[heading Complexity] +Linear. At most `__result_of_size__::value` comparisons. + +[heading Header] + + #include + #include + +[endsect] + +[section count] + +[heading Description] +A metafunction that returns the result type of `count` given the sequence and search types. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct count + { + typedef int type; + }; + +[table Parameters + [[Parameter] [Requirement] [heading Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`T`] [Any type] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_count__::type + +[*Return type]: `int`. + +[*Semantics]: Returns the return type of __count__. The return type is always `int`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section count_if] + +[heading Description] +A metafunction that returns the result type of `count_if` given the sequence and predicate types. + +[heading Synopsis] + template< + typename Sequence, + typename Pred + > + struct count_if + { + typedef int type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A model of __forward_sequence__] [Operation's argument]] + [[`Pred`] [A unary function object] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_count_if__::type + +[*Return type]: `int`. + +[*Semantics]: Returns the return type of __count_if__. The return type is always `int`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[endsect] + +[endsect] + +[section Transformation] +The transformation algorithms create new sequences out of existing sequences by performing some sort of transformation. In reality the new sequences are views onto the data in the original sequences. + +[note As the transformation algorithms return views onto their input arguments, +it is important that the lifetime of the input arguments is greater than the +period during which you wish to use the results.] + +[heading Header] + + #include + #include + +[section Functions] + +[section filter] + +[heading Description] +For a given sequence, filter returns a new sequences containing only the elements of a specified type. + +[heading Synopsis] + template< + typename T, + typename Sequence + > + typename __result_of_filter__::type filter(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][The type to retain]] +] + +[heading Expression Semantics] + __filter__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing all the elements of `seq` of type `T`. +Equivalent to `__filter_if__ >(seq)`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2,3,4); + assert(__filter__(vec) == __make_vector__(1,2)); + +[endsect] + +[section filter_if] + +[heading Description] +For a given sequence, __filter_if__ returns a new sequences containing +only the elements with types for which a given __mpl_lambda_expression__ evaluates to `boost::mpl::true_`. + +[heading Synopsis] + template< + typename Pred, + typename Sequence + > + typename __result_of_filter_if__::type filter_if(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`Pred`][A unary __mpl_lambda_expression__][The predicate to filter by]] +] + +[heading Expression Semantics] + __filter_if__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing all the elements of `seq` with types for which `Pred` evaluates +to `boost::mpl::true_`. The order of the retained elements is the same as in the original sequence. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2,3.0,4.0); + assert(__filter_if__ >(vec) == __make_vector__(1,2)); + +[endsect] + +[section transform] + +[heading Description] +For a sequence `seq` and function object or function pointer `f`, `transform` returns a new sequence +with elements created by applying `f(e)` to each element of `e` of `seq`. + +[heading Unary version synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_transform__::type transform( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`f`][`f(e)` is a valid expression for each element `e` of `seq`. `__boost_result_of_call__::type` is the return type of `f` when called with a value of each element type `E`.][Transformation function]] +] + +[heading Expression Semantics] + __transform__(seq, f); + +[*Return type]: A model of __forward_sequence__ + +[*Semantics]: Returns a new sequence, containing the return values of `f(e)` for each element `e` within `seq`. + +[heading Binary version synopsis] + template< + typename Sequence1, + typename Sequence2, + typename F + > + typename __result_of_transform__::type transform( + Sequence1 const& seq1, Sequence2 const& seq2, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq1`][A model of __forward_sequence__][Operation's argument]] + [[`seq2`][A model of __forward_sequence__][Operation's argument]] + [[`f`][`f(e1,e2)` is a valid expression for each pair of elements `e1` of `seq1` and `e2` of `seq2`. `__boost_result_of_call__::type` is the return type of `f` when called with elements of type `E1` and `E2`][Transformation function]] +] + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing the return values of `f(e1, e2)` for each pair of elements `e1` and `e2` within `seq1` and `seq2` respectively. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + struct triple + { + typedef int result_type; + + int operator()(int t) const + { + return t * 3; + }; + }; + ... + assert(__transform__(__make_vector__(1,2,3), triple()) == __make_vector__(3,6,9)); + +[endsect] + +[section replace] + +[heading Description] +Replaces each value within a sequence of a given type and value with a new value. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + typename __result_of_replace__::type replace( + Sequence const& seq, T const& old_value, T const& new_value); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__, `e == old_value` is a valid expression, convertible to `bool`, for each element `e` in `seq` with type convertible to `T`][Operation's argument]] + [[`old_value`][Any type][Value to replace]] + [[`new_value`][Any type][Replacement value]] +] + +[heading Expression Semantics] + __replace__(seq, old_value, new_value); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence with all the values of `seq` with `new_value` assigned to elements with the same type and equal to `old_value`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__replace__(__make_vector__(1,2), 2, 3) == __make_vector__(1,3)); + +[endsect] + +[section replace_if] + +[heading Description] +Replaces each element of a given sequence for which an unary function object evaluates to `true` replaced with +a new value. + +[heading Synopsis] + template< + typename Sequence, + typename F, + typename T> + typename __result_of_replace_if__::type replace_if( + Sequence const& seq, F f, T const& new_value); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`f`][A function object for which `f(e)` is a valid expression, convertible to `bool`, for each element `e` in `seq`][Operation's argument]] + [[`new_value`][Any type][Replacement value]] +] + +[heading Expression Semantics] + __replace_if__(seq, f, new_value); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence with all the elements of `seq`, +with `new_value` assigned to each element for which `f` evaluates to `true`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + struct odd + { + template + bool operator()(T t) const + { + return t % 2; + } + }; + ... + assert(__replace_if__(__make_vector__(1,2), odd(), 3) == __make_vector__(3,2)); + +[endsect] + +[section remove] + +[heading Description] +Returns a new sequence, with all the elements of the original sequence, except those of a given type. + +[heading Synopsis] + template< + typename T, + typename Sequence + > + typename __result_of_remove__::type replace(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][Type to remove]] +] + +[heading Expression Semantics] + __remove__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, in their original order, except +those of type `T`. Equivalent to `__remove_if__ >(seq)`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2.0); + assert(__remove__(vec) == __make_vector__(1)); + +[endsect] + +[section remove_if] + +[heading Description] +Returns a new sequence, containing all the elements of the original except those where a given unary +function object evaluates to `true`. + +[heading Synopsis] + template< + typename Pred, + typename Sequence + > + typename __result_of_remove_if__::type remove_if(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`Pred`][A model of unary __mpl_lambda_expression__][Removal predicate]] +] + +[heading Expression Semantics] + __remove_if__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, in their original order, except +those elements with types for which `Pred` evaluates to `boost::mpl::true_`. +Equivalent to `__filter__ >(seq)`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2.0); + assert(__remove_if__ >(vec) == __make_vector__(1)); + +[endsect] + +[section reverse] + +[heading Description] +Returns a new sequence with the elements of the original in reverse order. + +[heading Synposis] + template< + typename Sequence + > + typename __result_of_reverse__::type reverse(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __bidirectional_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __reverse__(seq); + +[*Return type]: A model of __bidirectional_sequence__. + +[*Semantics]: Returns a new sequence containing all the elements of `seq` in reverse order. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__reverse__(__make_vector__(1,2,3)) == __make_vector__(3,2,1)); + +[endsect] + +[section clear] + +[heading Description] +__clear__ returns an empty sequence. + +[heading Synposis] + template< + typename Sequence + > + typename __result_of_clear__::type clear(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __clear__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Expression Semantics]: Returns a sequence with no elements. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[heading Example] + assert(__clear__(__make_vector__(1,2,3)) == __make_vector__()); + +[endsect] + +[section erase] + +[heading Description] +Returns a new sequence, containing all the elements of the original except those at a specified iterator, or +between two iterators. + +[heading Synposis] + template< + typename Sequence, + typename First + > + typename __result_of_erase__::type erase( + Sequence const& seq, First const& it1); + + template< + typename Sequence, + typename First, + typename Last + > + typename __result_of_erase__::type erase( + Sequence const& seq, First const& it1, Last const& it2); + +[table Parameters + [[Parameters][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`it1`][A model of __forward_iterator__][Iterator into `seq`]] + [[`it2`][A model of __forward_iterator__][Iterator into `seq` after `it1`]] +] + +[heading Expression Semantics] + __erase__(seq, pos); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq` except the element at `pos`. + + __erase__(seq, first, last); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, with all the elements of `seq`, in their original order, except those +in the range [`first`,`last`). + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1, 2.0, 'c'); + assert(__erase__(vec, __next__(__begin__(vec))) == __make_vector__(1, 'c')); + assert(__erase__(vec, __next__(__begin__(vec)), __end__(vec)) == __make_vector__(1)); + +[endsect] + +[section erase_key] + +[heading Description] +For an __associative_sequence__ `seq`, returns a __forward_sequence__ containing all the +elements of the original except those with a given key. + +[heading Synposis] + template< + typename Key, + typename Sequence + > + typename result_of::erase_key::type erase_key(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __associative_sequence__][Operation's argument]] + [[`Key`][Any type][Key to erase]] +] + +[heading Expression Semantics] + __erase_key__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, except those with key `Key`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__erase_key__(__make_map__('a', 'b')) == __make_map__('b')); + +[endsect] + +[section insert] + +[heading Description] +Returns a new sequence with all the elements of the original, an a new element inserted the +position described by a given iterator. + +[heading Synposis] + template< + typename Sequence, + typename Pos, + typename T + > + __unspecified__ insert(Sequence const& seq, Pos const& pos, T const& t); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`pos`][A model of __forward_iterator__][The position to insert at]] + [[`t`][Any type][The value to insert]] +] + +[heading Expression Semantics] + __insert__(seq, p, t); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, in their original order, and a new element with the +type and value of `t` inserted at iterator `pos`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2); + assert(__insert__(vec, __next__(__begin__(vec)), 3) == __make_vector__(1,3,2)); + +[endsect] + +[section insert_range] + +[heading Description] +Returns a new sequence with another sequence inserted at a specified iterator. + +[heading Synposis] + template< + typename Sequence, + typename Pos, + typename Range + > + typename __result_of_insert_range__::type insert_range( + Sequence const& seq, Pos const& pos, Range const& range); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`pos`][A model of __forward_iterator__][The position to insert at]] + [[`range`][A model of __forward_sequence__][Range to insert]] +] + +[heading Expression Semantics] + __insert__(seq, pos, range); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, and the elements of +`range` inserted at iterator `pos`. All elements retaining their ordering from the orignal sequences. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + const __vector__ vec(1,2); + assert(__insert_range__(vec, __next__(__begin__(vec)), __make_vector__(3,4)) == __make_vector__(1,3,4,2)); + +[endsect] + +[section join] + +[heading Description] +Takes 2 sequences and returns a sequence containing the elements of the first followed by the elements of the second. + +[heading Synopsis] + template< + typename LhSequence, + typename RhSequence> + typename __result_of_join__::type join(LhSequence const& lhs, RhSequence const& rhs); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`lhs`][A model of __forward_sequence__][Operation's argument]] + [[`rhs`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __join__(lhs, rhs); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing all the elements of `lhs` followed by all the elements of `rhs`. The order of th elements is preserved. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + __vector__ v1(1, 'a'); + __vector__ v2(2, 'b'); + assert(__join__(v1, v2) == __make_vector__(1,'a',2,'b')); + +[endsect] + +[section zip] + +[heading Description] +Zips sequences together to form a single sequence, whos members are tuples of the members of the component sequences. + +[heading Synopsis] + template< + typename Sequence1, + typename Sequence2, + ... + typename SequenceN + > + typename __result_of_zip__::type + zip(Sequence1 const& seq1, Sequence2 const& seq2, ... SequenceN const& seqN); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq1` to `seqN`][Each sequence is a model of __forward_sequence__.][Operation's argument]] +] + +[heading Expression Semantics] + __zip__(seq1, seq2, ... seqN); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing tuples of elements from sequences `seq1` to `seqN`. For example, applying zip to tuples `(1, 2, 3)` and `('a', 'b', 'c')` would return `((1, 'a'),(2, 'b'),(3, 'c'))` + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + __vector__ v1(1, 'a'); + __vector__ v2(2, 'b'); + assert(__zip__(v1, v2) == __make_vector__(__make_vector__(1, 2),__make_vector__('a', 'b')); + +[endsect] + +[section pop_back] + +[heading Description] +Returns a new sequence, with the last element of the original removed. + +[heading Synopsis] + template< + typename Sequence + > + typename __result_of_pop_back__::type pop_back(Sequence const& seq); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __pop_back__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence containing all the elements of `seq`, except the last element. The elements in the new sequence are in the same order as they were in `seq`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(___pop_back__(__make_vector__(1,2,3)) == __make_vector__(1,2)); + +[endsect] + +[section pop_front] + +[heading Description] +Returns a new sequence, with the first element of the original removed. + +[heading Synopsis] + template< + typename Sequence + > + typename __result_of_pop_front__::type pop_front(Sequence const& seq); + + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __pop_front__(seq); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence containing all the elements of `seq`, except the first element. The elements in the new sequence are in the same order as they were in `seq`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__pop_front__(__make_vector__(1,2,3)) == __make_vector__(2,3)); + +[endsect] + +[section push_back] + +[heading Description] +Returns a new sequence with an element added at the end. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + typename __result_of_push_back__::type push_back( + Sequence const& seq, T const& t); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`t`][Any type][The value to add to the end]] +] + +[heading Expression Semantics] + __push_back__(seq, t); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, and new element `t` appended to the end. The elements are in the same order as they were in `seq`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__push_back__(__make_vector__(1,2,3),4) == __make_vector__(1,2,3,4)); + +[endsect] + +[section push_front] + +[heading Description] +Returns a new sequence with an element added at the beginning. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + typename __result_of_push_front__::type push_front( + Sequence const& seq, T const& t); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`t`][Any type][The value to add to the beginning]] +] + +[heading Expression Semantics] + __push_back__(seq, t); + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing all the elements of `seq`, and new element `t` appended to the beginning. The elements are in the same order as they were in `seq`. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + assert(__push_front__(__make_vector__(1,2,3),0) == __make_vector__(0,1,2,3)); + +[endsect] + +[endsect] + +[section Metafunctions] + +[section filter] + +[heading Description] +Returns the result type of __filter__ given the sequence type and type to retain. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct filter + { + typedef __unspecified__ type; + }; + +[table Parameter + [[Parameter] [Requirement] [Description]] + [[`Sequence`][A model of __forward_sequence__] [Operation's argument]] + [[`T`][Any type][Type to retain]] +] + +[heading Expression Semantics] + __result_of_filter__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing the elements of `Sequence` that are of type `T`. Equivalent to `__result_of_filter_if__ >::type`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section filter_if] + +[heading Description] +Returns the result type of __filter_if__ given the sequence and unary __mpl_lambda_expression__ predicate type. + +[heading Synopsis] + template< + typename Sequence, + typename Pred + > + struct filter_if + { + typedef __unspecified__ type; + }; + +[table Parameter + [[Parameter] [Requirement] [Description]] + [[`Sequence`][A model of __forward_sequence__] [Operation's argument]] + [[`Pred`][A unary __mpl_lambda_expression__][Type to retain]] +] + +[heading Expression Semantics] + __result_of_filter_if__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing the elements of `Sequence` for which `Pred` evaluates to `boost::mpl::true_`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section transform] + +[heading Description] +For a sequence `seq` and function object or function pointer `f`, `transform` returns a new sequence +with elements created by applying `f(e)` to each element of `e` of `seq`. + +[heading Unary version synopsis] + template< + typename Sequence, + typename F + > + typename __result_of_transform__::type transform( + Sequence const& seq, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq`][A model of __forward_sequence__][Operation's argument]] + [[`f`][`f(e)` is a valid expression for each element `e` of `seq`. `__boost_result_of_call__::type` is the return type of `f` when called with a value of each element type `E`.][Transformation function]] +] + +[heading Expression Semantics] + __transform__(seq, f); + +[*Return type]: A model of __forward_sequence__ + +[*Semantics]: Returns a new sequence, containing the return values of `f(e)` for each element `e` within `seq`. + +[heading Binary version synopsis] + template< + typename Sequence1, + typename Sequence2, + typename F + > + typename __result_of_transform__::type transform( + Sequence1 const& seq1, Sequence2 const& seq2, F f); + +[table Parameters + [[Parameter][Requirement][Description]] + [[`seq1`][A model of __forward_sequence__][Operation's argument]] + [[`seq2`][A model of __forward_sequence__][Operation's argument]] + [[`f`][`f(e1,e2)` is a valid expression for each pair of elements `e1` of `seq1` and `e2` of `seq2`. `__boost_result_of_call__::type` is the return type of `f` when called with elements of type `E1` and `E2`][Transformation function]] +] + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence, containing the return values of `f(e1, e2)` for each pair of elements `e1` and `e2` within `seq1` and `seq2` respectively. + +[heading Complexity] +Constant. Returns a view which is lazily evaluated. + +[heading Header] + + #include + #include + +[heading Example] + struct triple + { + typedef int result_type; + + int operator()(int t) const + { + return t * 3; + }; + }; + ... + assert(__transform__(__make_vector__(1,2,3), triple()) == __make_vector__(3,6,9)); + +[endsect] + +[section replace] + +[heading Description] +Returns the result type of __replace__, given the types of the input sequence and element to replace. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct replace + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][The type of the search and replacement objects]] +] + +[heading Expression Semantics] + __result_of_replace__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns the return type of __replace__. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section replace_if] + +[heading Description] +Returns the result type of __replace_if__, given the types of the sequence, __poly_func_obj__ predicate and replacement object. + +[heading Synopsis] + template< + typename Sequence, + typename F, + typename T> + struct replace_if + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`F`][A model of unary __poly_func_obj__][Replacement predicate]] + [[`T`][Any type][The type of the replacement object]] +] + +[heading Expression Semantics] + __result_of_replace_if__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns the return type of __replace_if__. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section remove] + +[heading Description] +Returns the result type of __remove__, given the sequence and removal types. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct remove + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][Remove elements of this type]] +] + +[heading Expression Semantics] + __result_of_remove__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing the elements of `Sequence` not of type `T`. Equivalent to `__result_of_replace_if__ >::type`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section remove_if] + +[heading Description] +Returns the result type of __remove_if__, given the input sequence and unary __mpl_lambda_expression__ predicate types. + +[heading Synopsis] + template< + typename Sequence, + typename Pred + > + struct remove_if + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`Pred`][A model of unary __mpl_lambda_expression__][Remove elements which evaluate to `boost::mpl::true_`]] +] + +[heading Expression Semantics] + __result_of_remove_if__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing the elements of `Sequence` for which `Pred` evaluates to `boost::mpl::false_`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section reverse] + +[heading Description] +Returns the result type of __reverse__, given the input sequence type. + +[heading Synopsis] + template< + typename Sequence + > + struct reverse + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __bidirectional_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_reverse__::type + +[*Return type]: A model of __bidirectional_sequence__. + +[*Semantics]: Returns a sequence with the elements in the reverse order to `Sequence`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section clear] + +[heading Description] +Returns the result type of __clear__, given the input sequence type. + +[heading Synopsis] + template< + typename Sequence + > + struct clear + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][Any type][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_clear__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns an empty sequence. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section erase] +Returns the result type of __erase__, given the input sequence and range delimiting iterator types. + +[heading Description] + +[heading Synopsis] + template< + typename Sequence, + typename It1, + typename It2 = __unspecified__> + struct erase + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`It1`][A model of __forward_iterator__][Operation's argument]] + [[`It2`][A model of __forward_iterator__][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_erase__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence with the element at `It1` removed. + + __result_of_erase__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a new sequence with the elements between `It1` and `It2` removed. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section erase_key] + +[heading Description] +Returns the result type of __erase_key__, given the sequence and key types. + +[heading Synopsis] + template< + typename Sequence, + typename Key + > + struct erase_key + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __associative_sequence__][Operation's argument]] + [[`Key`][Any type][Key type]] +] + +[heading Expression Semantics] + __result_of_erase_key__::type + +[*Return type]: A model of __associative_sequence__. + +[*Semantics]: Returns a sequence with the elements of `Sequence`, except those with key `Key`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section insert] + +[heading Description] +Returns the result type of __insert__, given the sequence, position iterator and insertion types. + +[heading Synopsis] + template< + typename Sequence, + typename Position, + typename T + > + struct insert + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`Position`][A model of __forward_iterator__][Operation's argument]] + [[`T`][Any type][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_insert__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with an element of type `T` inserted at position `Position` in `Sequence`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section insert_range] + +[heading Description] +Returns the result type of __insert_range__, given the input sequence, position iterator and insertion range types. + +[heading Synopsis] + template< + typename Sequence, + typename Position, + typename Range + > + struct insert_range + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`Position`][A model of __forward_iterator__][Operation's argument]] + [[`Range`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_insert_range__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with the elements of `Range` inserted at position `Position` into `Sequence`. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section join] + +[heading Description] +Returns the result of joining 2 sequences, given the sequence types. + +[heading Synopsis] + template< + typename LhSequence, + typename RhSequence + > + struct join + { + typedef __unspecified__ type; + }; + +[heading Expression Semantics] + __result_of_join__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence containing the elements of `LhSequence` followed by the elements of `RhSequence`. The order of the elements in the 2 sequences is preserved. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section zip] + +[heading Description] +Zips sequences together to form a single sequence, whos members are tuples of the members of the component sequences. + +[heading Synopsis] + template< + typename Sequence1, + typename Sequence2, + ... + typename SequenceN + > + struct zip + { + typedef __unspecified__ type; + }; + +[heading Expression Semantics] + __result_of_zip__::type + +[*Return type]: A model of the most restrictive traversal category of sequences `Sequence1` to `SequenceN`. + +[*Semantics]: Return a sequence containing tuples of elements from each sequence. For example, applying zip to tuples `(1, 2, 3)` and `('a', 'b', 'c')` would return `((1, 'a'),(2, 'b'),(3, 'c'))` + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section pop_back] + +[heading Description] +Returns the result type of __pop_back__, given the input sequence type. + +[heading Synopsis] + template< + typename Sequence + > + struct pop_back + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_pop_back__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with all the elements of `Sequence` except the last element. + +[heading Complexity] +Constant. + +[heading Header] + + #include + #include + +[endsect] + +[section pop_front] + +[heading Description] +Returns the result type of __pop_front__, given the input sequence type. + +[heading Synopsis] + template< + typename Sequence + > + struct pop_front + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_pop_front__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with all the elements of `Sequence` except the first element. + +[heading Complexity] +Constant. + +/algorithm/transformation/pop_front.hpp> + +[endsect] + +[section push_back] + +[heading Description] +Returns the result type of __push_back__, given the types of the input sequence and element to push. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct push_back + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_push_back__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with the elements of `Sequence` and an element of type `T` added to the end. + +[heading Complexity] +Constant. + +/algorithm/transformation/push_back.hpp> + +[endsect] + +[section push_front] + +[heading Description] +Returns the result type of __push_front__, given the types of the input sequence and element to push. + +[heading Synopsis] + template< + typename Sequence, + typename T + > + struct push_front + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter][Requirement][Description]] + [[`Sequence`][A model of __forward_sequence__][Operation's argument]] + [[`T`][Any type][Operation's argument]] +] + +[heading Expression Semantics] + __result_of_push_front__::type + +[*Return type]: A model of __forward_sequence__. + +[*Semantics]: Returns a sequence with the elements of `Sequence` and an element of type `T` added to the beginning. + +[heading Complexity] +Constant. + +/algorithm/transformation/push_front.hpp> + +[endsect] + +[endsect] + +[endsect] + +[endsect] diff --git a/doc/changelog.qbk b/doc/changelog.qbk index 23d17406..d3e953ce 100644 --- a/doc/changelog.qbk +++ b/doc/changelog.qbk @@ -1,9 +1,25 @@ +[/============================================================================== + 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) +===============================================================================/] [section Change log] This section summarizes significant changes to the Fusion library. -* Sep 27, 2006: Added `boost::tuple` support. -* Nov 17, 2006: Added `boost::variant` support. -* Feb 15, 2007: Added functional module. +* 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) [endsect] diff --git a/doc/container.qbk b/doc/container.qbk new file mode 100644 index 00000000..62baca68 --- /dev/null +++ b/doc/container.qbk @@ -0,0 +1,1655 @@ +[/============================================================================== + 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) +===============================================================================/] +[section Container] + +Fusion provides a few predefined sequences out of the box. These +/containers/ actually hold heterogenously typed data; unlike +__views__. These containers are more or less counterparts of those in __stl__. + +[heading Header] + + #include + #include + +[section vector] + +[heading Description] + +`vector` is a __random_access_sequence__ of heterogenous typed +data structured as a simple `struct` where each element is held +as a member variable. `vector` is the simplest of the Fusion +sequence container, and in many cases the most efficient. + +[heading Header] + + #include + #include + #include + #include + + // numbered forms + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + +[heading Synopsis] + +[*Numbered forms] + + template <> + struct vector0; + + template + struct vector1; + + template + struct vector2; + + template + struct vector3; + + ... + + template + struct vectorN; + +[*Variadic form] + + template < + typename T0 = __unspecified__ + , typename T1 = __unspecified__ + , typename T2 = __unspecified__ + ... + , typename TN = __unspecified__ + > + struct vector; + +The numbered form accepts the exact number of elements. Example: + + vector3 + +The variadic form accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, where +`FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that +defaults to `10`. Example: + + vector + +You may define the preprocessor constant `FUSION_MAX_VECTOR_SIZE` before +including any Fusion header to change the default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`T0`...`TN`] [Element types] [['unspecified]]] +] + +[heading Model of] + +* __random_access_sequence__ + +[variablelist Notation + [[`v`] [Instance of `vector`]] + [[`V`] [A `vector` type]] + [[`e0`...`en`] [Heterogeneous values]] + [[`s`] [A __forward_sequence__]] +] + +[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]] + [[`V()`] [Creates a vector with default constructed elements.]] + [[`V(e0, e1,... en)`] [Creates a vector with elements `e0`...`en`.]] + [[`V(s)`] [Copy constructs a vector from a __forward_sequence__, `s`.]] + [[`v = s`] [Assigns to a vector, `v`, from a __forward_sequence__, `s`.]] +] + +[heading Example] + + vector v(12, 5.5f); + std::cout << __at_c__<0>(v) << std::endl; + std::cout << __at_c__<1>(v) << std::endl; + +[endsect] + +[section cons] + +[heading Description] + +`cons` is a simple __forward_sequence__. It is a lisp style recursive list +structure where `car` is the /head/ and `cdr` is the /tail/: usually +another cons structure or `nil`: the empty list. Fusion's __list__ is built +on top of this more primitive data structure. It is more efficient than +__vector__ when the target sequence is constructed piecemeal (a data at a +time). The runtime cost of access to each element is peculiarly constant +(see __recursive_inline__). + +[heading Header] + + #include + #include + +[heading Synopsis] + + template + struct cons; + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`Car`] [Head type] []] + [[`Cdr`] [Tail type] [`nil`]] +] + +[heading Model of] + +* __forward_sequence__ + +[variablelist Notation + [[`nil`] [An empty `cons`]] + [[`C`] [A `cons` type]] + [[`l`, `l2`] [Instances of `cons`]] + [[`car`] [An arbitrary data]] + [[`cdr`] [Another `cons` list]] + [[`s`] [A __forward_sequence__]] + [[`N`] [An __mpl_integral_constant__]] +] + +[heading Expression Semantics] + +Semantics of an expression is defined only where it differs from, or is not +defined in __forward_sequence__. + +[table + [[Expression] [Semantics]] + [[`nil()`] [Creates an empty list.]] + [[`C()`] [Creates a cons with default constructed elements.]] + [[`C(car)`] [Creates a cons with `car` head and default constructed tail.]] + [[`C(car, cdr)`] [Creates a cons with `car` head and `cdr` tail.]] + [[`C(s)`] [Copy constructs a cons from a __forward_sequence__, `s`.]] + [[`l = s`] [Assigns to a cons, `l`, from a __forward_sequence__, `s`.]] + [[`__at__(l)`] [The Nth element from the beginning of the sequence; see __at__.]] +] + +[blurb __note__ `__at__(l)` is provided for convenience and compatibility +with the original __tuple__ library, despite `cons` being a +__forward_sequence__ only (`at` is supposed to be a +__random_access_sequence__ requirement). The runtime complexity of __at__ is +constant (see __recursive_inline__).] + +[heading Example] + + cons > l(12, cons(5.5f)); + std::cout << __at_c__<0>(l) << std::endl; + std::cout << __at_c__<1>(l) << std::endl; + +[endsect] + +[section list] + +[heading Description] + +`list` is a __forward_sequence__ of heterogenous typed data built on top of +__cons__. It is more efficient than __vector__ when the target sequence is +constructed piecemeal (a data at a time). The runtime cost of access to +each element is peculiarly constant (see __recursive_inline__). + +[heading Header] + + #include + #include + #include + #include + +[heading Synopsis] + + template < + typename T0 = __unspecified__ + , typename T1 = __unspecified__ + , typename T2 = __unspecified__ + ... + , typename TN = __unspecified__ + > + struct list; + +The variadic class interface accepts `0` to `FUSION_MAX_LIST_SIZE` +elements, where `FUSION_MAX_LIST_SIZE` is a user definable predefined +maximum that defaults to `10`. Example: + + list + +You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` before +including any Fusion header to change the default. Example: + + #define FUSION_MAX_LIST_SIZE 20 + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`T0`...`TN`] [Element types] [['unspecified-type]]] +] + +[heading Model of] + +* __forward_sequence__ + +[variablelist Notation + [[`L`] [A `list` type]] + [[`l`] [An instance of `list`]] + [[`e0`...`en`] [Heterogeneous values]] + [[`s`] [A __forward_sequence__]] + [[`N`] [An __mpl_integral_constant__]] +] + +[heading Expression Semantics] + +Semantics of an expression is defined only where it differs from, or is not +defined in __forward_sequence__. + +[table + [[Expression] [Semantics]] + [[`L()`] [Creates a list with default constructed elements.]] + [[`L(e0, e1,... en)`] [Creates a list with elements `e0`...`en`.]] + [[`L(s)`] [Copy constructs a list from a __forward_sequence__, `s`.]] + [[`l = s`] [Assigns to a list, `l`, from a __forward_sequence__, `s`.]] + [[`__at__(l)`] [The Nth element from the beginning of the sequence; see __at__.]] +] + +[blurb __note__ `__at__(l)` is provided for convenience and compatibility +with the original __tuple__ library, despite `list` being a +__forward_sequence__ only (__at__ is supposed to be a +__random_access_sequence__ requirement). The runtime complexity of __at__ is +constant (see __recursive_inline__).] + +[heading Example] + + list l(12, 5.5f); + std::cout << __at_c__<0>(l) << std::endl; + std::cout << __at_c__<1>(l) << std::endl; + +[endsect] + +[section set] + +[heading Description] + +set is an __associative_sequence__ of heteregenous typed data elements. +Type identity is used to impose an equivalence relation on keys. The +element's type is its key. A set may contain at most one element for each +key. Membership testing and element key lookup has constant runtime +complexity (see __overloaded_functions__). + +[heading Header] + + #include + #include + #include + #include + +[heading Synopsis] + + template < + typename T0 = __unspecified__ + , typename T1 = __unspecified__ + , typename T2 = __unspecified__ + ... + , typename TN = __unspecified__ + > + struct set; + +The variadic class interface accepts `0` to `FUSION_MAX_SET_SIZE` elements, +where `FUSION_MAX_SET_SIZE` is a user definable predefined maximum that +defaults to `10`. Example: + + set + +You may define the preprocessor constant `FUSION_MAX_SET_SIZE` before +including any Fusion header to change the default. Example: + + #define FUSION_MAX_SET_SIZE 20 + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`T0`...`TN`] [Element types] [['unspecified-type]]] +] + +[heading Model of] + +* __associative_sequence__ +* __forward_sequence__ + +[variablelist Notation + [[`S`] [A `set` type]] + [[`s`] [An instance of `set`]] + [[`e0`...`en`] [Heterogeneous values]] + [[`fs`] [A __forward_sequence__]] +] + +[heading Expression Semantics] + +Semantics of an expression is defined only where it differs from, or is not +defined in __random_access_sequence__ and __associative_sequence__. + +[table + [[Expression] [Semantics]] + [[`S()`] [Creates a set with default constructed elements.]] + [[`S(e0, e1,... en)`] [Creates a set with elements `e0`...`en`.]] + [[`S(fs)`] [Copy constructs a set from a __forward_sequence__ `fs`.]] + [[`s = fs`] [Assigns to a set, `s`, from a __forward_sequence__ `fs`.]] +] + +[heading Example] + + typedef set S; + S s(12, 5.5f); + std::cout << __at_key__(s) << std::endl; + std::cout << __at_key__(s) << std::endl; + std::cout << __result_of_has_key__::value << std::endl; + +[endsect] + +[section map] + +[heading Description] + +map is an __associative_sequence__ of heteregenous typed data elements. +Each element is a key/data pair (see __fusion_pair__) where the key has no +data (type only). Type identity is used to impose an equivalence relation +on keys. A map may contain at most one element for each key. Membership +testing and element key lookup has constant runtime complexity (see +__overloaded_functions__). + +[heading Header] + + #include + #include + #include + #include + +[heading Synopsis] + + template < + typename T0 = __unspecified__ + , typename T1 = __unspecified__ + , typename T2 = __unspecified__ + ... + , typename TN = __unspecified__ + > + struct map; + +The variadic class interface accepts `0` to `FUSION_MAX_MAP_SIZE` elements, +where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that +defaults to `10`. Example: + + map<__pair__, __pair__, __pair__ > + +You may define the preprocessor constant `FUSION_MAX_MAP_SIZE` before +including any Fusion header to change the default. Example: + + #define FUSION_MAX_MAP_SIZE 20 + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`T0`...`TN`] [Element types] [['unspecified-type]]] +] + +[heading Model of] + +* __associative_sequence__ +* __forward_sequence__ + +[variablelist Notation + [[`M`] [A `map` type]] + [[`m`] [An instance of `map`]] + [[`e0`...`en`] [Heterogeneous key/value pairs (see __fusion_pair__)]] + [[`s`] [A __forward_sequence__]] +] + +[heading Expression Semantics] + +Semantics of an expression is defined only where it differs from, or is not +defined in __random_access_sequence__ and __associative_sequence__. + +[table + [[Expression] [Semantics]] + [[`M()`] [Creates a map with default constructed elements.]] + [[`M(e0, e1,... en)`] [Creates a map with element pairs `e0`...`en`.]] + [[`M(s)`] [Copy constructs a map from a __forward_sequence__ `s`.]] + [[`m = s`] [Assigns to a map, `m`, from a __forward_sequence__ `s`.]] +] + +[heading Example] + + typedef map< + __pair__ + , __pair__ > + map_type; + + map_type m( + __fusion_make_pair__('X') + , __fusion_make_pair__("Men")); + + std::cout << __at_key__(m) << std::endl; + std::cout << __at_key__(m) << std::endl; + +[endsect] + +[section Generation] + +These are the functions that you can use to generate various forms of +__containers__ from elemental values. + +[heading Header] + + #include + #include + +[section Functions] + +[section make_list] + +[heading Description] + +Create a __list__ from one or more values. + +[heading Synopsis] + + template + typename __result_of_make_list__::type + make_list(T0 const& x0, T1 const& x1... TN const& xN); + +The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where +`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults +to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` +before including any Fusion header to change the default. Example: + + #define FUSION_MAX_LIST_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_list`]] +] + +[heading Expression Semantics] + + make_list(x0, x1,... xN); + +[*Return type]: __result_of_make_list__`::type` + +[*Semantics]: Create a __list__ from `x0, x1,... xN`. + +[heading Header] + + #include + #include + +[heading Example] + + make_list(123, "hello", 12.5) + +[heading See also] + +__note_boost_ref__ + +[endsect] + +[section make_cons] + +[heading Description] + +Create a __cons__ from `car` (/head/) and optional `cdr` (/tail/). + +[heading Synopsis] + + template + typename __result_of_make_cons__::type + make_cons(Car const& car); + + template + typename __result_of_make_cons__::type + make_cons(Car const& car, Cdr const& cdr); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`car`] [Instance of `Car`] [The list's head]] + [[`cdr`] [Instance of `Cdr`] [The list's tail (optional)]] +] + +[heading Expression Semantics] + + make_cons(car, cdr); + +[*Return type]: __result_of_make_cons__`::type` or +__result_of_make_cons__`::type` + +[*Semantics]: Create a __cons__ from `car` (/head/) and optional `cdr` (/tail/). + +[heading Header] + + #include + #include + +[heading Example] + + make_cons('x', make_cons(123)) + +[heading See also] + +__note_boost_ref__ + +[endsect] + +[section make_vector] + +[heading Description] + +Create a __vector__ from one or more values. + +[heading Synopsis] + + template + typename __result_of_make_vector__::type + make_vector(T0 const& x0, T1 const& x1... TN const& xN); + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, +where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that +defaults to `10`. You may define the preprocessor constant +`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the +default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_vector`]] +] + +[heading Expression Semantics] + + make_vector(x0, x1,... xN); + +[*Return type]: __result_of_make_vector__`::type` + +[*Semantics]: Create a __vector__ from `x0, x1,... xN`. + +[heading Header] + + #include + #include + +[heading Example] + + make_vector(123, "hello", 12.5) + +[heading See also] + +__note_boost_ref__ + +[endsect] + +[section make_set] + +[heading Description] + +Create a __set__ from one or more values. + +[heading Synopsis] + + template + typename __result_of_make_set__::type + make_set(T0 const& x0, T1 const& x1... TN const& xN); + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE`[footnote +`set` is implemented in terms of the vector. That is why we reuse +`FUSION_MAX_VECTOR_SIZE`] elements, where `FUSION_MAX_VECTOR_SIZE` is a user +definable predefined maximum that defaults to `10`. You may define the +preprocessor constant `FUSION_MAX_VECTOR_SIZE` before including any Fusion +header to change the default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_set`]] +] + +[heading Expression Semantics] + + make_set(x0, x1,... xN); + +[*Return type]: __result_of_make_set__`::type` + +[*Semantics]: Create a __set__ from `x0, x1,... xN`. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + make_set(123, "hello", 12.5) + +[heading See also] + +__note_boost_ref__ + +[endsect] + +[section make_map] + +[heading Description] + +Create a __map__ from one or more key/data pairs. + +[heading Synopsis] + + template < + typename K0, typename K1,... typename KN + , typename T0, typename T1,... typename TN> + typename __result_of_make_map__::type + make_map(T0 const& x0, T1 const& x1... TN const& xN); + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE`[footnote +`map` is implemented in terms of the vector. That is why we reuse +`FUSION_MAX_VECTOR_SIZE`] elements, where `FUSION_MAX_VECTOR_SIZE` is a user +definable predefined maximum that defaults to `10`. You may define the +preprocessor constant `FUSION_MAX_VECTOR_SIZE` before including any Fusion +header to change the default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`K0, K1,... KN`] [The key types] [Keys associated with `x0, x1,... xN`]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `make_map`]] +] + +[heading Expression Semantics] + + make_map(x0, x1,... xN); + +[*Return type]: __result_of_make_map__`::type` + +[*Semantics]: Create a __map__ from `K0, K1,... KN` keys and +`x0, x1,... xN` data. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + make_map( + __fusion_make_pair__('X') + , __fusion_make_pair__("Men")) + +[heading See also] + +__note_boost_ref__, __fusion_pair__ + +[endsect] + +[section Tiers] + +Tiers are sequences, where all elements are non-const reference types. They +are constructed with a call to a couple of /tie/ function templates. The +succeeding sections document the various /tier/ flavors. + +* __list_tie__ +* __vector_tie__ +* __map_tie__ + +Example: + + int i; char c; double d; + ... + __vector_tie__(i, c, a); + +The __vector_tie__ function creates a __vector__ of type +`__vector__`. The same result could be achieved with the call +__make_vector__(__boost_ref_call__(i), __boost_ref_call__(c), __boost_ref_call__(a)) +[footnote see __boost_ref__ for details about `ref`]. + +A /tie/ can be used to 'unpack' another tuple into variables. E.g.: + + int i; char c; double d; + __vector_tie__(i, c, d) = __make_vector__(1,'a', 5.5); + std::cout << i << " " << c << " " << d; + +This code prints 1 a 5.5 to the standard output stream. A sequence +unpacking operation like this is found for example in ML and Python. It is +convenient when calling functions which return sequences. + +[heading Ignore] + +There is also an object called /ignore/ which allows you to ignore an +element assigned by a sequence. The idea is that a function may return a +sequence, only part of which you are interested in. For example: + + char c; + __vector_tie__(ignore, c) = __make_vector__(1, 'a'); + +[endsect] + +[section list_tie] + +[heading Description] + +Constructs a tie using a __list__ sequence. + +[heading Synopsis] + + template + __list__ + list_tie(T0& x0, T1& x1... TN& xN); + +The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where +`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults +to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` +before including any Fusion header to change the default. Example: + + #define FUSION_MAX_LIST_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `list_tie`]] +] + +[heading Expression Semantics] + + list_tie(x0, x1,... xN); + +[*Return type]: __list__ + +[*Semantics]: Create a __list__ of references from `x0, x1,... xN`. + +[heading Header] + + #include + #include + +[heading Example] + + int i = 123; + double d = 123.456; + list_tie(i, d) + +[endsect] + +[section vector_tie] + +[heading Description] + +Constructs a tie using a __vector__ sequence. + +[heading Synopsis] + + template + __vector__ + vector_tie(T0& x0, T1& x1... TN& xN); + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, +where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that +defaults to `10`. You may define the preprocessor constant +`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the +default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `vector_tie`]] +] + +[heading Expression Semantics] + + vector_tie(x0, x1,... xN); + +[*Return type]: __vector__ + +[*Semantics]: Create a __vector__ of references from `x0, x1,... xN`. + +[heading Header] + + #include + #include + +[heading Example] + + int i = 123; + double d = 123.456; + vector_tie(i, d) + +[endsect] + +[section map_tie] + +[heading Description] + +Constructs a tie using a __map__ sequence. + +[heading Synopsis] + + template + __map__<__pair__, __pair__,... __pair__ > + map_tie(D0& d0, D1& d1... DN& dN); + +The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements, +where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that +defaults to `10`, and a corresponding number of key types. +You may define the preprocessor constant `FUSION_MAX_MAP_SIZE` before +including any Fusion header to change the default. Example: + + #define FUSION_MAX_MAP_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`K0, K1,... KN`] [Any type][The key types associated with each of the `x1,x2,...,xN` values]] + [[`x0, x1,... xN`] [Instances of `T0, T1,... TN`] [The arguments to `map_tie`]] +] + +[heading Expression Semantics] + + map_tie(x0, x1,... xN); + +[*Return type]: __map__<__pair__, __pair__,... __pair__ > + +[*Semantics]: Create a __map__ of references from `x0, x1,... xN` with keys `K0, K1,... KN` + +[heading Header] + + #include + #include + +[heading Example] + + struct int_key; + struct double_key; + ... + int i = 123; + double d = 123.456; + map_tie(i, d) + +[endsect] + +[endsect] + +[section MetaFunctions] + +[section make_list] + +[heading Description] + +Returns the result type of __make_list__. + +[heading Synopsis] + + template + struct make_list; + +The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where +`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults +to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` +before including any Fusion header to change the default. Example: + + #define FUSION_MAX_LIST_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`T0, T1,... TN`] [Any type] [Template arguments to `make_list`]] +] + +[heading Expression Semantics] + + result_of::make_list::type + +[*Return type]: A __list__ with elements of types converted following the +rules for __element_conversion__. + +[*Semantics]: Create a __list__ from `T0, T1,... TN`. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::make_list::type + +[endsect] + +[section make_cons] + +[heading Description] + +Returns the result type of __make_cons__. + +[heading Synopsis] + + template + struct make_cons; + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`Car`] [Any type] [The list's head type]] + [[`Cdr`] [A `cons`] [The list's tail type (optional)]] +] + +[heading Expression Semantics] + + result_of::make_cons::type + +[*Return type]: A __cons__ with head element, `Car`, of type converted +following the rules for __element_conversion__, and tail, `Cdr`. + +[*Semantics]: Create a __cons__ from `Car` (/head/) and optional `Cdr` (/tail/). + +[heading Header] + + #include + #include + +[heading Example] + + result_of::make_cons::type>::type + +[endsect] + +[section make_vector] + +[heading Description] + +Returns the result type of __make_vector__. + +[heading Synopsis] + + template + struct make_vector; + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, +where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that +defaults to `10`. You may define the preprocessor constant +`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the +default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`T0, T1,... TN`] [Any type] [Template arguments to `make_vector`]] +] + +[heading Expression Semantics] + + result_of::make_vector::type + +[*Return type]: A __vector__ with elements of types converted following the +rules for __element_conversion__. + +[*Semantics]: Create a __vector__ from `T0, T1,... TN`. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::make_vector::type + +[endsect] + +[section make_set] + +[heading Description] + +Returns the result type of __make_set__. + +[heading Synopsis] + + template + struct make_set; + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE`[footnote +`set` is implemented in terms of the vector. That is why we reuse +`FUSION_MAX_VECTOR_SIZE`] elements, where `FUSION_MAX_VECTOR_SIZE` is a user +definable predefined maximum that defaults to `10`. You may define the +preprocessor constant `FUSION_MAX_VECTOR_SIZE` before including any Fusion +header to change the default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`T0, T1,... TN`] [Any type] [The arguments to `make_set`]] +] + +[heading Expression Semantics] + + result_of::make_set::type + +[*Return type]: A __set__ with elements of types converted following the +rules for __element_conversion__. + +[*Semantics]: Create a __set__ from `T0, T1,... TN`. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::make_set::type + +[endsect] + +[section make_map] + +[heading Description] + +Returns the result type of __make_map__. + +[heading Synopsis] + + template < + typename K0, typename K1,... typename KN + , typename T0, typename T1,... typename TN> + struct make_map; + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE`[footnote +`map` is implemented in terms of the vector. That is why we reuse +`FUSION_MAX_VECTOR_SIZE`] elements, where `FUSION_MAX_VECTOR_SIZE` is a user +definable predefined maximum that defaults to `10`. You may define the +preprocessor constant `FUSION_MAX_VECTOR_SIZE` before including any Fusion +header to change the default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`K0, K1,... KN`] [Any type] [Keys associated with `T0, T1,... TN`]] + [[`T0, T1,... TN`] [Any type] [Data associated with keys `K0, K1,... KN`]] +] + +[heading Expression Semantics] + + resulf_of::make_map::type; + +[*Return type]: __result_of_make_map__`::type` + +[*Semantics]: A __map__ with __fusion_pair__ elements where the +`second_type` is converted following the rules for __element_conversion__. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::make_map::type + +[heading See also] + +__fusion_pair__ + +[endsect] + +[section list_tie] + +[heading Description] + +Returns the result type of __list_tie__. + +[heading Synopsis] + + template + struct list_tie; + +The variadic function accepts `0` to `FUSION_MAX_LIST_SIZE` elements, where +`FUSION_MAX_LIST_SIZE` is a user definable predefined maximum that defaults +to `10`. You may define the preprocessor constant `FUSION_MAX_LIST_SIZE` +before including any Fusion header to change the default. Example: + + #define FUSION_MAX_LIST_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`T0, T1,... TN`] [Any type] [The arguments to `list_tie`]] +] + +[heading Expression Semantics] + + result_of::list_tie::type; + +[*Return type]: __list__ + +[*Semantics]: Create a __list__ of references from `T0, T1,... TN`. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::list_tie::type + +[endsect] + +[section vector_tie] + +[heading Description] + +Returns the result type of __vector_tie__. + +[heading Synopsis] + + template + struct vector_tie; + +The variadic function accepts `0` to `FUSION_MAX_VECTOR_SIZE` elements, +where `FUSION_MAX_VECTOR_SIZE` is a user definable predefined maximum that +defaults to `10`. You may define the preprocessor constant +`FUSION_MAX_VECTOR_SIZE` before including any Fusion header to change the +default. Example: + + #define FUSION_MAX_VECTOR_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`T0, T1,... TN`] [Any type] [The arguments to `vector_tie`]] +] + +[heading Expression Semantics] + + result_of::vector_tie::type; + +[*Return type]: __vector__ + +[*Semantics]: Create a __vector__ of references from `T0, T1,... TN`. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::vector_tie::type + +[endsect] + +[section map_tie] + +[heading Description] + +Returns the result type of __map_tie__. + +[heading Synopsis] + + template + struct map_tie; + +The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements, +where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that +defaults to `10`. You may define the preprocessor constant +`FUSION_MAX_MAP_SIZE` before including any Fusion header to change the +default. Example: + + #define FUSION_MAX_MAP_SIZE 20 + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`K0, K1,... KN`] [Any type] [The key types for `map_tie`]] + [[`D0, D1,... DN`] [Any type] [The arguments types for `map_tie`]] +] + +[heading Expression Semantics] + + result_of::map_tie::type; + +[*Return type]: __map__<__pair__, __pair__,... __pair__ > + +[*Semantics]: Create a __map__ of references from `D0, D1,... DN` with keys `K0, K1,... KN` + +[heading Header] + + #include + #include + +[heading Example] + + struct int_key; + struct double_key; + ... + result_of::map_tie::type + +[endsect] + +[endsect] + +[endsect] + +[section Conversion] + +All fusion sequences can be converted to one of the __containers__ types +using one of these conversion functions. + +[heading Header] + + #include + +[section Functions] + +[section as_list] + +[heading Description] + +Convert a fusion sequence to a __list__. + +[heading Synopsis] + + template + typename result_of::as_list::type + as_list(Sequence& seq); + + template + typename result_of::as_list::type + as_list(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [An instance of Sequence] [The sequence to convert.]] +] + +[heading Expression Semantics] + + as_list(seq); + +[*Return type]: __result_of_as_list__`::type` + +[*Semantics]: Convert a fusion sequence, `seq`, to a __list__. + +[heading Header] + + #include + #include + +[heading Example] + + as_list(__make_vector__('x', 123, "hello")) + +[endsect] + +[section as_vector] + +[heading Description] + +Convert a fusion sequence to a __vector__. + +[heading Synopsis] + + template + typename result_of::as_vector::type + as_vector(Sequence& seq); + + template + typename result_of::as_vector::type + as_vector(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [An instance of Sequence] [The sequence to convert.]] +] + +[heading Expression Semantics] + + as_vector(seq); + +[*Return type]: __result_of_as_vector__`::type` + +[*Semantics]: Convert a fusion sequence, `seq`, to a __vector__. + +[heading Header] + + #include + #include + +[heading Example] + + as_vector(__make_list__('x', 123, "hello")) + +[endsect] + +[section as_set] + +[heading Description] + +Convert a fusion sequence to a __set__. + +[heading Synopsis] + + template + typename result_of::as_set::type + as_set(Sequence& seq); + + template + typename result_of::as_set::type + as_set(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [An instance of Sequence] [The sequence to convert.]] +] + +[heading Expression Semantics] + + as_set(seq); + +[*Return type]: __result_of_as_set__`::type` + +[*Semantics]: Convert a fusion sequence, `seq`, to a __set__. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + as_set(__make_vector__('x', 123, "hello")) + +[endsect] + +[section as_map] + +[heading Description] + +Convert a fusion sequence to a __map__. + +[heading Synopsis] + + template + typename result_of::as_map::type + as_map(Sequence& seq); + + template + typename result_of::as_map::type + as_map(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [An instance of Sequence] [The sequence to convert.]] +] + +[heading Expression Semantics] + + as_map(seq); + +[*Return type]: __result_of_as_map__`::type` + +[*Semantics]: Convert a fusion sequence, `seq`, to a __map__. + +[*Precondition]: The elements of the sequence are assumed to be +__fusion_pair__s. There may be no duplicate __fusion_pair__ key types. + +[heading Header] + + #include + #include + +[heading Example] + + as_map(__make_vector__( + __fusion_make_pair__('X') + , __fusion_make_pair__("Men"))) + +[endsect] + +[endsect] + +[section Metafunctions] + +[section as_list] + +[heading Description] + +Returns the result type of __as_list__. + +[heading Synopsis] + + template + struct as_list; + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A fusion __sequence__] [The sequence type to convert.]] +] + +[heading Expression Semantics] + + result_of::as_list::type; + +[*Return type]: A __list__ with same elements as the input sequence, +`Sequence`. + +[*Semantics]: Convert a fusion sequence, `Sequence`, to a __list__. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::as_list<__vector__ >::type + +[endsect] + +[section as_vector] + +[heading Description] + +Returns the result type of __as_vector__. + +[heading Synopsis] + + template + struct as_vector; + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A fusion __sequence__] [The sequence to convert.]] +] + +[heading Expression Semantics] + + result_of::as_vector::type; + +[*Return type]: A __vector__ with same elements as the input sequence, +`Sequence`. + +[*Semantics]: Convert a fusion sequence, `Sequence`, to a __vector__. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::as_vector<__list__ >::type + +[endsect] + +[section as_set] + +[heading Description] + +Returns the result type of __as_set__. + +[heading Synopsis] + + template + struct as_set; + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A fusion __sequence__] [The sequence to convert.]] +] + +[heading Expression Semantics] + + result_of::as_set::type; + +[*Return type]: A __set__ with same elements as the input sequence, +`Sequence`. + +[*Semantics]: Convert a fusion sequence, `Sequence`, to a __set__. + +[*Precondition]: There may be no duplicate key types. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::as_set<__vector__ >::type + +[endsect] + +[section as_map] + +[heading Description] + +Returns the result type of __as_map__. + +[heading Synopsis] + + template + struct as_map; + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`Sequence`] [A fusion __sequence__] [The sequence to convert.]] +] + +[heading Expression Semantics] + + result_of::as_map::type; + +[*Return type]: A __map__ with same elements as the input sequence, +`Sequence`. + +[*Semantics]: Convert a fusion sequence, `Sequence`, to a __map__. + +[*Precondition]: The elements of the sequence are assumed to be +__fusion_pair__s. There may be no duplicate __fusion_pair__ key types. + +[heading Header] + + #include + #include + +[heading Example] + + result_of::as_map<__vector__< + __fusion_pair__ + , __fusion_pair__ > >::type + +[endsect] + +[endsect] + +[endsect] + +[endsect] diff --git a/doc/extension.qbk b/doc/extension.qbk index de6d183c..b840259f 100644 --- a/doc/extension.qbk +++ b/doc/extension.qbk @@ -1,7 +1,16 @@ +[/============================================================================== + 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) +===============================================================================/] [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__ +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: @@ -28,7 +37,7 @@ are going to use the type: {} }; } - + 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__ @@ -50,8 +59,9 @@ tag type for operations involving our sequence. This is done by specializing `traits::tag_of` for our sequence type. #include + #include - namespace boost { namespace fusion { namespace traits { + namespace boost { namespace fusion { namespace traits { template<> struct tag_of { @@ -59,12 +69,13 @@ tag type for operations involving our sequence. This is done by specializing }; }}} -`traits::tag_of` also has a second template argument, -that can be used in conjuction with `boost::enable_if` to provide tag +`traits::tag_of` also has a second template argument, +that can be used in conjuction 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 + #include + #include [heading Designing a suitable iterator] @@ -96,7 +107,7 @@ 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 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. @@ -109,7 +120,7 @@ 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 +do this, we provide a specialization of the `boost::fusion::extension::value_of_impl` template for our iterator's tag type. template<> @@ -184,7 +195,7 @@ specialization of `deref_impl`. } 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. +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 @@ -209,7 +220,7 @@ same way as the __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`. +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 @@ -257,7 +268,7 @@ __random_access_iterator__ `distance_impl` and `advance_impl` also need to be pr 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 +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] @@ -275,7 +286,7 @@ an `impl` type specialized for our sequence tag: 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 +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 @@ -300,7 +311,7 @@ our sequence. 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 +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`, @@ -308,10 +319,10 @@ For our __random_access_sequence__ we will also need to implement `size_impl`, [heading Enabling our type as an associative container] -In order for `example_struct` to serve as an associative container, +In order for `example_struct` to serve as an associative container, we need to enable 3 lookup features, __at_key__, __value_at_key__ and __has_key__. We also need to provide an implementation of the `is_associative` trait -so that our sequence can be correctly identified as an associative container. +so that our sequence can be correctly identified as an associative container. To implement `at_key_impl` we need to associate the `fields::age` and `fields::age` types described in the __quick_start__ guide with the appropriate members of `example_struct`. @@ -375,3 +386,98 @@ for a variety of types. [endsect] +[section Sequence Facade] + +[heading Description] +The __sequence_facade__ template provides an intrusive mechanism for +producing a conforming Fusion iterator. + +[heading Synopsis] + template + 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 the 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::type`][The type of an iterator to the beginning of a sequence of type `Seq`]] +[[`sequence::template begin::call(seq)`][An iterator to the beginning of sequence `seq`]] +[[`sequence::template end::type`][The type of an iterator to the end of a sequence of type `Seq`]] +[[`sequence::template end::call(seq)`][An iterator to the end of sequence `seq`]] +[[`sequence::template size::type`][The size of a sequence of type `Seq` as an __mpl_integral_constant__]] +[[`sequence::template size::call(seq)`][The size of sequence `seq`]] +[[`sequence::template at::type`][The type of element `N` in a sequence of type `Seq`]] +[[`sequence::template at::call(seq)`][Element `N` in sequence `seq`]] +[[`sequence::template value_at::type`][The type of the `N`th element in a sequence of type `Seq`]] +] + +[heading Include] + + #include + #include + +[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 + 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 the 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::type`][The element stored at iterator position `It`][None]] +[[`iterator::template deref::type`][The type returned when dereferencing an iterator of type `It`][None]] +[[`iterator::template deref::call(it)`][Dereferences iterator `it`][None]] +[[`iterator::template next::type`][The type of the next element from `It`][None]] +[[`iterator::template next::call(it)`][The next iterator after `it`][None]] +[[`iterator::template prior::type`][The type of the next element from `It`][None]] +[[`iterator::template prior::call(it)`][The next iterator after `it`][None]] +[[`iterator::template advance::type`][The type of an iterator advanced `N` elements from `It`][Implemented in terms of `next` and `prior`]] +[[`iterator::template advance::call(it)`][An iterator advanced `N` elements from `it`][Implemented in terms of `next` and `prior`]] +[[`iterator::template distance::type`][The distance between iterators of type `It1` and `It2` as an __mpl_integral_constant__][None]] +[[`iterator::template distance::call(it1, it2)`][The distance between iterator `it1` and `it2`][None]] +[[`iterator::template equal_to::type`][The distance between iterators of type `It1` and `It2`][`boost::same_type::type`]] +[[`iterator::template equal_to::call(it1, it2)`][The distance between iterators `it1` and `it2`][`boost::same_type::type()`]] +] + +[heading Header] + + #include + #include + +[heading Example] +A full working example using __iterator_facade__ is provided in triple.cpp in the extension examples. + +[endsect] + +[endsect] + diff --git a/doc/functional.qbk b/doc/functional.qbk index afacde35..6b83c554 100644 --- a/doc/functional.qbk +++ b/doc/functional.qbk @@ -1,10 +1,16 @@ +[/============================================================================== + 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) +===============================================================================/] [section Functional] Components to call functions and function objects and to make Fusion code callable through a function object interface. -[heading Header] - #include +/functional.hpp> [heading Fused and unfused forms] @@ -12,7 +18,7 @@ What is a function call? f (a,b,c) -It is a name and a tuple written next to each other, left-to-right. +It is a name and a tuple written next to each other, left-to-right. Although the C++ syntax does not allow to replace [^(a,b,c)] with some Fusion __sequence__, introducing yet another function provides a solution: @@ -24,27 +30,27 @@ to achieve the same effect: f tuple <=> ``f'`` (tuple) -Now, [^f'] is an unary function that takes the arguments to `f` as a tuple; +Now, [^f'] is an unary function that takes the arguments to `f` as a tuple; [^f'] is the /fused/ form of `f`. -Reading the above equivalence right-to-left to get the inverse transformation, +Reading the above equivalence right-to-left to get the inverse transformation, `f` is the /unfused/ form of [^f']. [heading Calling functions and function objects] Having generic C++ code call back arbitrary functions provided by the client -used to be a heavily repetitive task, as different functions can differ in +used to be a heavily repetitive task, as different functions can differ in arity, invocation syntax and other properties that might be part of the type. Transporting arguments as Fusion sequences and factoring out the invocation -makes Fusion algorithms applicable to function arguments and also reduces +makes Fusion algorithms applicable to function arguments and also reduces the problem to one invocation syntax and a fixed arity (instead of an arbitrary number of arbitrary arguments times several syntactic variants times additional properties). Transforming an unfused function into its fused counterpart allows n-ary calls from an algorithm that invokes an unary __poly_func_obj__ with -__sequence__ arguments. +__sequence__ arguments. -The library provides several function templates to invoke different kinds of +The library provides several function templates to invoke different kinds of functions and adapters to transform them into fused form, respectively. Every variant has a corresponding generator function template that returns an adapter instance for the given argument. @@ -53,13 +59,13 @@ an adapter instance for the given argument. Transforming a fused function into its unfused counterpart allows to create function objects to accept arbitrary calls. In other words, an unary function -object can be implemented instead of (maybe heavily overloaded) function +object can be implemented instead of (maybe heavily overloaded) function templates or function call operators. -The library provides several adapter variants that implement this -transformation, ranging from strictly typed to fully generic. The latter +The library provides several adapter variants that implement this +transformation, ranging from strictly typed to fully generic. The latter provides a reusable, approximate solution to __the_forwarding_problem__. -Every generic variant has a corresponding generator function template that +Every generic variant has a corresponding generator function template that returns an adapter instance for the given argument. [/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ] @@ -71,7 +77,7 @@ returns an adapter instance for the given argument. [heading Description] -A pointer to a function, a pointer to member function, a pointer to member +A pointer to a function, a pointer to member function, a pointer to member data, or a class type whose objects can appear immediately to the left of a function call operator. @@ -91,7 +97,7 @@ function call operator. bind(std::less(), _1, 5) lambda::_1 += lambda::_2; fusion::__make_fused_function_object__(std::less()) - + [endsect] @@ -100,8 +106,8 @@ function call operator. [heading Description] -A non-member-pointer __callable_obj__ type: A pointer to a function or a class -type whose objects can appear immediately to the left of a function call operator. +A non-member-pointer __callable_obj__ type: A pointer to a function or a class +type whose objects can appear immediately to the left of a function call operator. [heading Refinement of] * __callable_obj__ @@ -133,7 +139,7 @@ type whose objects can appear immediately to the left of a function call operato bind(std::less(), _1, 5) lambda::_1 += lambda::_2; fusion::__make_fused_function_object__(std::less()) - + [endsect] @@ -141,15 +147,15 @@ type whose objects can appear immediately to the left of a function call operato [heading Description] -__callable_obj__ types that work with __boost_result_of__ to determine the +__callable_obj__ types that work with __boost_result_of__ to determine the result of a call. [heading Refinement of] * __callable_obj__ -[blurb note Once C++ supports the [^decltype] keyword, all models of -__callable_obj__ will also be models of __def_callable_obj__, because -function objects won't need client-side support for `result_of`. +[blurb note Once C++ supports the [^decltype] keyword, all models of +__callable_obj__ will also be models of __def_callable_obj__, because +function objects won't need client-side support for `result_of`. ] [variablelist Notation @@ -187,13 +193,13 @@ function objects won't need client-side support for `result_of`. [section:poly Polymorphic Function Object] -[heading Description] +[heading Description] A non-member-pointer __def_callable_obj__ type. [heading Refinement of] * __reg_callable_obj__ -* __def_callable_obj__ +* __def_callable_obj__ [variablelist Notation [[`F`][A possibly const-qualified Polymorphic Function Object type]] @@ -246,24 +252,24 @@ The first template parameter can be specialized explicitly to avoid copying and/or to control the const qualification of a function object. If the target function is a pointer to a class members, the corresponding -object can be specified as a reference, pointer, or smart pointer. -In case of the latter, a freestanding [^get_pointer] function must be -defined (Boost provides this function for [^std::auto_ptr] and +object can be specified as a reference, pointer, or smart pointer. +In case of the latter, a freestanding [^get_pointer] function must be +defined (Boost provides this function for [^std::auto_ptr] and __boost_shared_ptr_call__). [heading Synopsis] template< - typename Function, + typename Function, class Sequence > typename __result_of_invoke__::type invoke(Function f, Sequence & s); template< - typename Function, + typename Function, class Sequence > - typename __result_of_invoke__::type + typename __result_of_invoke__::type invoke(Function f, Sequence const & s); [heading Parameters] @@ -280,11 +286,10 @@ __boost_shared_ptr_call__). [*Return type]: Return type of `f` when invoked with the elements in `s` as its arguments. -[*Semantics]: Invokes `f` with the elements in `s` as arguments and returns +[*Semantics]: Invokes `f` with the elements in `s` as arguments and returns the result of the call expression. -[heading Header] - #include +/functional/invocation/invoke.hpp> [heading Example] __std_plus_doc__ add; @@ -310,7 +315,7 @@ and/or to control the const qualification of a function object. For pointers to class members corresponding object can be specified as a reference, pointer, or smart pointer. In case of the latter, a freestanding -[^get_pointer] function must be defined (Boost provides this function for +[^get_pointer] function must be defined (Boost provides this function for [^std::auto_ptr] and __boost_shared_ptr_call__). The target function must not be a pointer to a member object (dereferencing @@ -319,14 +324,14 @@ implemented). [heading Synopsis] template< - typename Function, + typename Function, class Sequence > typename __result_of_invoke_procedure__::type invoke_procedure(Function f, Sequence & s); template< - typename Function, + typename Function, class Sequence > typename __result_of_invoke_procedure__::type @@ -347,8 +352,7 @@ implemented). [*Semantics]: Invokes `f` with the elements in `s` as arguments. -[heading Header] - #include +/functional/invocation/invoke_procedure.hpp> [heading Example] __vector__ v(1,2); @@ -375,14 +379,14 @@ and/or to control the const qualification of a function object. [heading Synopsis] template< - typename Function, + typename Function, class Sequence > typename __result_of_invoke_function_object__::type invoke_function_object(Function f, Sequence & s); template< - typename Function, + typename Function, class Sequence > typename __result_of_invoke_function_object__::type @@ -405,8 +409,7 @@ arguments. [*Semantics]: Invokes `f` with the elements in `s` as arguments and returns the result of the call expression. -[heading Header] - #include +/functional/invocation/invoke_function_object.hpp> [heading Example] struct sub @@ -415,7 +418,7 @@ result of the call expression. struct result; template - struct result< Self(T,T) > + struct result< Self(T,T) > { typedef typename remove_reference::type type; }; template @@ -452,9 +455,9 @@ Returns the result type of __invoke__. namespace result_of { template< - typename Function, + typename Function, class Sequence - > + > struct invoke { typedef __unspecified__ type; @@ -476,9 +479,9 @@ Returns the result type of __invoke_procedure__. namespace result_of { template< - typename Function, + typename Function, class Sequence - > + > struct invoke_procedure { typedef __unspecified__ type; @@ -500,9 +503,9 @@ Returns the result type of __invoke_function_object__. namespace result_of { template< - class Function, + class Function, class Sequence - > + > struct invoke_function_object { typedef __unspecified__ type; @@ -531,11 +534,11 @@ Function object templates to transform a particular target function. An unary __poly_func_obj__ adapter template for __def_callable_obj__ target functions. It takes a __forward_sequence__ that contains the arguments for the -target function. +target function. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used for a +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used for a target function object that is const or, if the target function object is held by value, the adapter is const - these semantics have nothing to do with the const qualification of a member function, which is referring @@ -543,13 +546,12 @@ to the type of object pointed to by [^this] which is specified with the first element in the sequence passed to the adapter). If the target function is a pointer to a class members, the corresponding -object can be specified as a reference, pointer, or smart pointer. -In case of the latter, a freestanding [^get_pointer] function must be -defined (Boost provides this function for [^std::auto_ptr] and +object can be specified as a reference, pointer, or smart pointer. +In case of the latter, a freestanding [^get_pointer] function must be +defined (Boost provides this function for [^std::auto_ptr] and __boost_shared_ptr_call__). -[heading Header] - #include +/functional/adapter/fused.hpp> [heading Synopsis] template @@ -564,13 +566,13 @@ __boost_shared_ptr_call__). [heading Model of] -* __poly_func_obj__ +* __poly_func_obj__ * __def_callable_obj__ [variablelist Notation [[`R`] [A possibly const qualified __def_callable_obj__ type or reference type thereof]] - [[`r`] [An object convertible to `R`]] - [[`s`] [A __sequence__ of arguments that are accepted by `r`]] + [[`r`] [An object convertible to `R`]] + [[`s`] [A __sequence__ of arguments that are accepted by `r`]] [[`f`] [An instance of `fused`]] ] @@ -601,13 +603,13 @@ __boost_shared_ptr_call__). [heading Description] An unary __poly_func_obj__ adapter template for __callable_obj__ target -functions. It takes a __forward_sequence__ that contains the arguments for +functions. It takes a __forward_sequence__ that contains the arguments for the target function. The result is discared and the adapter's return type is `void`. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately (in other words, only const versions of [^operator()] can be used for a target function object that is const or, if the target function object is held by value, the adapter is const - these semantics have nothing to @@ -616,17 +618,16 @@ to the type of object pointed to by [^this] which is specified with the first element in the sequence passed to the adapter). If the target function is a pointer to a members function, the corresponding -object can be specified as a reference, pointer, or smart pointer. -In case of the latter, a freestanding [^get_pointer] function must be -defined (Boost provides this function for [^std::auto_ptr] and +object can be specified as a reference, pointer, or smart pointer. +In case of the latter, a freestanding [^get_pointer] function must be +defined (Boost provides this function for [^std::auto_ptr] and __boost_shared_ptr_call__). The target function must not be a pointer to a member object (dereferencing such a pointer without returning anything does not make sense, so this case is not implemented). -[heading Header] - #include +/functional/adapter/fused_procedure.hpp> [heading Synopsis] template @@ -641,13 +642,13 @@ is not implemented). [heading Model of] -* __poly_func_obj__ -* __def_callable_obj__ +* __poly_func_obj__ +* __def_callable_obj__ [variablelist Notation [[`R`] [A possibly const qualified __callable_obj__ type or reference type thereof]] - [[`r`] [An object convertible to `R`]] - [[`s`] [A __sequence__ of arguments that are accepted by `r`]] + [[`r`] [An object convertible to `R`]] + [[`s`] [A __sequence__ of arguments that are accepted by `r`]] [[`f`] [An instance of `fused`]] ] @@ -664,9 +665,9 @@ is not implemented). template void n_ary_for_each(SequenceOfSequences const & s, Func const & f) { - __for_each__(__zip_view__(s), + __for_each__(__zip_view__(s), fused_procedure(f)); - } + } void try_it() { @@ -690,17 +691,16 @@ is not implemented). [heading Description] An unary __poly_func_obj__ adapter template for a __poly_func_obj__ target -function. It takes a __forward_sequence__ that contains the arguments for the +function. It takes a __forward_sequence__ that contains the arguments for the target function. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used for an +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used for an target function object that is const or, if the target function object is held by value, the adapter is const). -[heading Header] - #include +/functional/adapter/fused_function_object.hpp> [heading Synopsis] template @@ -715,13 +715,13 @@ is held by value, the adapter is const). [heading Model of] -* __poly_func_obj__ -* __def_callable_obj__ +* __poly_func_obj__ +* __def_callable_obj__ [variablelist Notation [[`R`] [A possibly const qualified __poly_func_obj__ type or reference type thereof]] - [[`r`] [An object convertible to `R`]] - [[`s`] [A __sequence__ of arguments that are accepted by `r`]] + [[`r`] [An object convertible to `R`]] + [[`s`] [A __sequence__ of arguments that are accepted by `r`]] [[`f`] [An instance of `fused`]] ] @@ -740,9 +740,9 @@ is held by value, the adapter is const). fused_function_object >::type n_ary_transform(SeqOfSeqs const & s, Func const & f) { - return __transform__(zip_view(s), + return __transform__(zip_view(s), fused_function_object(f)); - } + } struct sub { @@ -750,7 +750,7 @@ is held by value, the adapter is const). struct result; template - struct result< Self(T,T) > + struct result< Self(T,T) > { typedef typename remove_reference::type type; }; template @@ -783,29 +783,28 @@ is held by value, the adapter is const). [heading Description] An n-ary __poly_func_obj__ adapter template for an unary __poly_func_obj__ -target function. When called, its arguments are bundled to a +target function. When called, its arguments are bundled to a __random_access_sequence__ of references that is passed to the target function. -Non-const __lvalue__ arguments are transported as references to non-const, otherwise -references to const are used. +Non-const __lvalue__ arguments are transported as references to non-const, otherwise +references to const are used. -[blurb __tip__ Detecting mutable LValues on a per-argument basis is currently a -compile time expensive operation (see __the_forwarding_problem__ for -details). Therefore, there are two, lightweight and more restricted variants +[blurb __tip__ Detecting mutable LValues on a per-argument basis is currently a +compile time expensive operation (see __the_forwarding_problem__ for +details). Therefore, there are two, lightweight and more restricted variants of this class template, __unfused_lvalue_args__ and __unfused_rvalue_args__.] -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used if -the target function object is const - or, in case the target function +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used if +the target function object is const - or, in case the target function object is held by value, the adapter is const). -[heading Header] - #include +/functional/adapter/unfused_generic.hpp> [heading Synopsis] template class unfused_generic; - + [heading Template parameters] [table @@ -816,14 +815,14 @@ object is held by value, the adapter is const). [heading Model of] * __poly_func_obj__ -* __def_callable_obj__ +* __def_callable_obj__ [variablelist Notation [[`F`] [A possibly const qualified, unary __poly_func_obj__ type or reference type thereof]] - [[`f`] [An object convertible to `F`]] + [[`f`] [An object convertible to `F`]] [[`UG`] [The type `unfused_generic`]] [[`ug`] [An instance of `UG`, initialized with `f`]] - [[`a0`...`aN`] [Arguments to `ug`]] + [[`a0`...`aN`] [Arguments to `ug`]] ] [heading Expression Semantics] @@ -864,11 +863,11 @@ object is held by value, the adapter is const). }; template - unfused_generic< fused_bound_1st > + unfused_generic< fused_bound_1st > bind_1st(Function f, T const & x) { return unfused_generic< fused_bound_1st >( - fused_bound_1st(f,x) ); + fused_bound_1st(f,x) ); } int test_func(int a, int b, int c) @@ -897,23 +896,22 @@ object is held by value, the adapter is const). [heading Description] An n-ary __poly_func_obj__ adapter template for an unary __poly_func_obj__ -target function. When called, its arguments are bundled to a +target function. When called, its arguments are bundled to a __random_access_sequence__ of references that is passed to the target function -object. Only __lvalue__ arguments are accepted. +object. Only __lvalue__ arguments are accepted. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used if -the target function object is const - or, in case the target function +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used if +the target function object is const - or, in case the target function object is held by value, the adapter is const). -[heading Header] - #include +/functional/adapter/unfused_lvalue_args.hpp> [heading Synopsis] template class unfused_lvalue_args; - + [heading Template parameters] [table @@ -928,10 +926,10 @@ object is held by value, the adapter is const). [variablelist Notation [[`F`] [A possibly const qualified, unary __poly_func_obj__ type or reference type thereof]] - [[`f`] [An object convertible to `F`]] + [[`f`] [An object convertible to `F`]] [[`UL`] [The type `unfused_lvalue_args`]] [[`ul`] [An instance of `UL`, initialized with `f`]] - [[`a0`...`aN`] [Arguments to `ul`]] + [[`a0`...`aN`] [Arguments to `ul`]] ] [heading Expression Semantics] @@ -946,9 +944,9 @@ object is held by value, the adapter is const). [heading Example] struct fused_incrementer { - template - struct result - { + template + struct result + { typedef void type; }; @@ -979,23 +977,22 @@ object is held by value, the adapter is const). [heading Description] An n-ary __poly_func_obj__ adapter template for an unary __poly_func_obj__ -target function. When called, its arguments are bundled to a +target function. When called, its arguments are bundled to a __random_access_sequence__ of references that is passed to the target function object. All referenced objects in the sequence are const qualified. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used if +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used if the target function object is const - or, in case the target function object is held by value, the adapter is const). -[heading Header] - #include +/functional/adapter/unfused_rvalue_args.hpp> [heading Synopsis] template class unfused_rvalue_args; - + [heading Template parameters] [table @@ -1010,10 +1007,10 @@ is held by value, the adapter is const). [variablelist Notation [[`F`] [A possibly const qualified, unary __poly_func_obj__ type or reference type thereof]] - [[`f`] [An object convertible to `F`]] + [[`f`] [An object convertible to `F`]] [[`UR`] [The type `unfused_rvalue_args`]] [[`ur`] [An instance of `UR`, initialized with `f`]] - [[`a0`...`aN`] [Arguments to `ur`]] + [[`a0`...`aN`] [Arguments to `ur`]] ] [heading Expression Semantics] @@ -1028,9 +1025,9 @@ is held by value, the adapter is const). [heading Example] struct sequence_printer { - template - struct result - { + template + struct result + { typedef void type; }; @@ -1061,33 +1058,32 @@ is held by value, the adapter is const). [heading Description] An n-ary __poly_func_obj__ adapter template for an unary __poly_func_obj__ -target function. When called, its arguments are bundled to a +target function. When called, its arguments are bundled to a __random_access_sequence__ that is passed to the target function object. The call operators of esulting function objects are strictly typed (in other words, non-templatized) with the types from a __sequence__. -The type of the target function is allowed to be const qualified or a -reference. Const qualification is preserved and propagated appropriately -(in other words, only const versions of [^operator()] can be used if +The type of the target function is allowed to be const qualified or a +reference. Const qualification is preserved and propagated appropriately +(in other words, only const versions of [^operator()] can be used if the target function object is const - or, in case the target function object is held by value, the adapter is const). [blurb __note__ For Microsoft Visual C++ 7.1 (Visual Studio 2003) the detection of the Function Object's const qualification easily causes an internal error. -Therefore the adapter is always treated as if it was const. ] +Therefore the adapter is always treated as if it was const. ] -[blurb __tip__ If the type sequence passed to this template contains -non-reference elements, the element is copied only once - the call operator's +[blurb __tip__ If the type sequence passed to this template contains +non-reference elements, the element is copied only once - the call operator's signature is optimized automatically to avoid by-value parameters.] -[heading Header] - #include +/functional/adapter/unfused_typed.hpp> [heading Synopsis] template class unfused_typed; - + [heading Template parameters] [table @@ -1104,10 +1100,10 @@ signature is optimized automatically to avoid by-value parameters.] [variablelist Notation [[`F`] [A possibly const qualified, unary __poly_func_obj__ type or reference type thereof]] [[`f`] [An object convertible to `F`]] - [[`S`] [A __sequence__ of parameter types]] + [[`S`] [A __sequence__ of parameter types]] [[`UT`] [The type `unfused_typed`]] [[`ut`] [An instance of `UT`, initialized with `f`]] - [[`a0`...`aN`] [Arguments to `ut`, convertible to the types in `S`]] + [[`a0`...`aN`] [Arguments to `ut`, convertible to the types in `S`]] ] [heading Expression Semantics] @@ -1117,7 +1113,7 @@ signature is optimized automatically to avoid by-value parameters.] [[`UT(f)`] [Creates a fused function as described above, initializes the target function with `f`.]] [[`UT()`] [Creates a fused function as described above, attempts to use `F`'s default constructor.]] [[`ut(a0`...`aN)`] [Calls `f` with an instance of `S` (or a subsequence of `S` starting at the first element, - if fewer arguments are given and the overload hasn't been disabled) initialized with + if fewer arguments are given and the overload hasn't been disabled) initialized with `a0`...`aN`.]] ] @@ -1162,7 +1158,7 @@ signature is optimized automatically to avoid by-value parameters.] { typedef typename remove_reference::type seq; - typedef unfused_typed< fused_parallel_adder, + typedef unfused_typed< fused_parallel_adder, typename mpl::transform >::type > type; }; @@ -1179,7 +1175,7 @@ signature is optimized automatically to avoid by-value parameters.] { int a = 2; char b = 'X'; // the second call is strictly typed with the types deduced from the - // first call + // first call parallel_add(a,b)(3,2); parallel_add(a,b)(3); parallel_add(a,b)(); @@ -1231,6 +1227,7 @@ __element_conversion__ is applied to the target function. [heading Header] #include + #include [heading Example] float sub(float a, float b) { return a - b; } @@ -1254,8 +1251,8 @@ __element_conversion__ is applied to the target function. [section:mk_fused_proc make_fused_procedure] [heading Description] -Creates a __fused_procedure__ adapter for a given __def_callable_obj__. -The usual __element_conversion__ applied to the target function. +Creates a __fused_procedure__ adapter for a given __def_callable_obj__. +The usual __element_conversion__ applied to the target function. [heading Synopsis] template @@ -1279,6 +1276,7 @@ The usual __element_conversion__ applied to the target function. [heading Header] #include + #include [heading Example] __vector__ v(1,2,3); @@ -1296,8 +1294,8 @@ The usual __element_conversion__ applied to the target function. [section:mk_fused_fobj make_fused_function_object] [heading Description] -Creates a __fused_function_object__ adapter for a given __def_callable_obj__. -The usual __element_conversion__ is applied to the target function. +Creates a __fused_function_object__ adapter for a given __def_callable_obj__. +The usual __element_conversion__ is applied to the target function. [heading Synopsis] template @@ -1321,6 +1319,7 @@ The usual __element_conversion__ is applied to the target function. [heading Header] #include + #include [heading Example] struct sub @@ -1329,7 +1328,7 @@ The usual __element_conversion__ is applied to the target function. struct result; template - struct result< Self(T,T) > + struct result< Self(T,T) > { typedef typename remove_reference::type type; }; template @@ -1357,8 +1356,8 @@ The usual __element_conversion__ is applied to the target function. [section:mk_unfused_genrc make_unfused_generic] [heading Description] -Creates a __unfused_generic__ adapter for a given, unary __poly_func_obj__. -The usual __element_conversion__ is applied to the target function. +Creates a __unfused_generic__ adapter for a given, unary __poly_func_obj__. +The usual __element_conversion__ is applied to the target function. [heading Synopsis] template @@ -1382,27 +1381,28 @@ The usual __element_conversion__ is applied to the target function. [heading Header] #include + #include [heading Example] struct bottles_song { typedef void result_type; - template + template void operator()(Seq & s) const { typename result_of::at_c::type n = at_c<0>(s); typename result_of::at_c::type what = at_c<1>(s); - std::cout - << n << " bottles of " << what << " on the wall.\n" + std::cout + << n << " bottles of " << what << " on the wall.\n" << n << " bottles of " << what << "!\n" << "Take one down - pass it around.\n"; n -= 1; // glug glug... std::cout - << n << " bottles of " << what << " on the wall.\n" + << n << " bottles of " << what << " on the wall.\n" << std::endl; } }; @@ -1425,8 +1425,8 @@ The usual __element_conversion__ is applied to the target function. [section:mk_unfused_lvargs make_unfused_lvalue_args] [heading Description] -Creates a __unfused_lvalue_args__ adapter for a given, unary __poly_func_obj__. -The usual __element_conversion__ is applied to the target function. +Creates a __unfused_lvalue_args__ adapter for a given, unary __poly_func_obj__. +The usual __element_conversion__ is applied to the target function. [heading Synopsis] template @@ -1450,13 +1450,14 @@ The usual __element_conversion__ is applied to the target function. [heading Header] #include + #include [heading Example] struct fused_incrementer { - template - struct result - { + template + struct result + { typedef void type; }; @@ -1484,8 +1485,8 @@ The usual __element_conversion__ is applied to the target function. [section:mk_unfused_rvargs make_unfused_rvalue_args] [heading Description] -Creates a __unfused_rvalue_args__ adapter for a given, unary __poly_func_obj__. -The usual __element_conversion__ is applied to the target function. +Creates a __unfused_rvalue_args__ adapter for a given, unary __poly_func_obj__. +The usual __element_conversion__ is applied to the target function. [heading Synopsis] template @@ -1509,13 +1510,14 @@ The usual __element_conversion__ is applied to the target function. [heading Header] #include + #include [heading Example] struct sequence_printer { - template - struct result - { + template + struct result + { typedef void type; }; @@ -1551,6 +1553,7 @@ Returns the result type of __make_fused__. [heading Header] #include + #include [heading Synopsis] namespace result_of @@ -1575,6 +1578,7 @@ Returns the result type of __make_fused_procedure__. [heading Header] #include + #include [heading Synopsis] namespace result_of @@ -1599,6 +1603,7 @@ Returns the result type of __make_fused_function_object__. [heading Header] #include + #include [heading Synopsis] namespace result_of @@ -1623,6 +1628,7 @@ Returns the result type of __make_unfused_generic__. [heading Header] #include + #include [heading Synopsis] namespace result_of @@ -1647,6 +1653,7 @@ Returns the result type of __make_unfused_lvalue_args__. [heading Header] #include + #include [heading Synopsis] namespace result_of @@ -1671,6 +1678,7 @@ Returns the result type of __make_unfused_rvalue_args__. [heading Header] #include + #include [heading Synopsis] namespace result_of diff --git a/doc/fusion.qbk b/doc/fusion.qbk index b53fee73..69dd235e 100644 --- a/doc/fusion.qbk +++ b/doc/fusion.qbk @@ -1,3 +1,10 @@ +[/============================================================================== + 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) +===============================================================================/] [library Fusion [quickbook 1.3] [version 2.0] @@ -34,7 +41,7 @@ [def __boost_any__ [@http://boost.org/doc/html/any.html Boost.Any]] [def __new_iterator_concepts__ [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts]] [def __boost_array_library__ [@http://www.boost.org/doc/html/array.html Boost.Array Library]] -[def __boost_variant_library__ [@http://www.boost.org/doc/html/variant.html Boost.Variant Library]] +[def __boost_variant_library__ [@http://www.boost.org/doc/html/variant.html Boost.Variant Library]] [def __boost_tuple_library__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html Boost.Tuple Library]] [def __boost_ref__ [@http://www.boost.org/doc/html/ref.html Boost.Ref]] [def __boost_ref_call__ [@http://www.boost.org/doc/html/ref.html `ref`]] @@ -65,189 +72,189 @@ [def __pair__ [link fusion.support.pair `pair`]] [def __fusion_make_pair__ [link fusion.support.pair `make_pair`]] -[def __iterator__ [link fusion.iterators Iterator]] -[def __iterator_concepts__ [link fusion.iterators.concepts Iterator Concepts]] -[def __forward_iterator__ [link fusion.iterators.concepts.forward_iterator Forward Iterator]] -[def __bidirectional_iterator__ [link fusion.iterators.concepts.bidirectional_iterator Bidirectional Iterator]] -[def __random_access_iterator__ [link fusion.iterators.concepts.random_access_iterator Random Access Iterator]] +[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 __next__ [link fusion.iterators.functions.next `next`]] -[def __prior__ [link fusion.iterators.functions.prior `prior`]] -[def __advance__ [link fusion.iterators.functions.advance `advance`]] -[def __advance_c__ [link fusion.iterators.functions.advance_c `advance_c`]] -[def __distance__ [link fusion.iterators.functions.distance `distance`]] -[def __deref__ [link fusion.iterators.functions.deref `deref`]] +[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 __result_of_next__ [link fusion.iterators.metafunctions.next `result_of::next`]] -[def __result_of_prior__ [link fusion.iterators.metafunctions.prior `result_of::prior`]] -[def __result_of_equal_to__ [link fusion.iterators.metafunctions.equal_to `result_of::equal_to`]] -[def __result_of_advance__ [link fusion.iterators.metafunctions.advance `result_of::advance`]] -[def __result_of_advance_c__ [link fusion.iterators.metafunctions.advance_c `result_of::advance_c`]] -[def __result_of_distance__ [link fusion.iterators.metafunctions.distance `result_of::distance`]] -[def __result_of_deref__ [link fusion.iterators.metafunctions.deref `result_of::deref`]] -[def __result_of_value_of__ [link fusion.iterators.metafunctions.value_of `result_of::value_of`]] -[def __value_of__ [link fusion.iterators.metafunctions.value_of `value_of`]] +[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 __value_of__ [link fusion.iterator.metafunctions.value_of `value_of`]] -[def __sequence__ [link fusion.sequences Sequence]] -[def __sequence_concepts__ [link fusion.sequences.concepts Sequence Concepts]] -[def __traversal_concept__ [link fusion.sequences.concepts.traversal Sequence Traversal Concept]] -[def __associativity_concept__ [link fusion.sequences.concepts.associativity Sequence Associativity Concept]] -[def __forward_sequence__ [link fusion.sequences.concepts.forward_sequence Forward Sequence]] -[def __bidirectional_sequence__ [link fusion.sequences.concepts.bidirectional_sequence Bidirectional Sequence]] -[def __random_access_sequence__ [link fusion.sequences.concepts.random_access_sequence Random Access Sequence]] -[def __associative_sequence__ [link fusion.sequences.concepts.associative_sequence Associative Sequence]] +[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 __containers__ [link fusion.sequences.containers Containers]] -[def __vector__ [link fusion.sequences.containers.vector `vector`]] -[def __cons__ [link fusion.sequences.containers.cons `cons`]] -[def __list__ [link fusion.sequences.containers.list `list`]] -[def __set__ [link fusion.sequences.containers.set `set`]] -[def __map__ [link fusion.sequences.containers.map `map`]] +[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 __set__ [link fusion.container.set `set`]] +[def __map__ [link fusion.container.map `map`]] -[def __view__ [link fusion.sequences.views View]] -[def __views__ [link fusion.sequences.views Views]] -[def __single_view__ [link fusion.sequences.views.single_view `single_view`]] -[def __filter_view__ [link fusion.sequences.views.filter_view `filter_view`]] -[def __iterator_range__ [link fusion.sequences.views.iterator_range `iterator_range`]] -[def __joint_view__ [link fusion.sequences.views.joint_view `joint_view`]] -[def __transform_view__ [link fusion.sequences.views.transform_view `transform_view`]] -[def __reverse_view__ [link fusion.sequences.views.reverse_view `reverse_view`]] -[def __zip_view__ [link fusion.sequences.views.zip_view `zip_view`]] +[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 __std_pair__ [link fusion.sequences.adapted.std__pair `std::pair`]] -[def __boost_array__ [link fusion.sequences.adapted.boost__array `boost::array`]] -[def __mpl_sequence__ [link fusion.sequences.adapted.mpl_sequence mpl sequence]] +[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 __intrinsic__ [link fusion.sequences.intrinsics Intrinsic]] -[def __intrinsics__ [link fusion.sequences.intrinsics Intrinsics]] -[def __begin__ [link fusion.sequences.intrinsics.functions.begin `begin`]] -[def __result_of_begin__ [link fusion.sequences.intrinsics.metafunctions.begin `result_of::begin`]] -[def __end__ [link fusion.sequences.intrinsics.functions.end `end`]] -[def __result_of_end__ [link fusion.sequences.intrinsics.metafunctions.end `result_of::end`]] -[def __size__ [link fusion.sequences.intrinsics.functions.size `size`]] -[def __result_of_size__ [link fusion.sequences.intrinsics.metafunctions.size `result_of::size`]] -[def __empty__ [link fusion.sequences.intrinsics.functions.empty `empty`]] -[def __result_of_empty__ [link fusion.sequences.intrinsics.metafunctions.empty `result_of::empty`]] -[def __front__ [link fusion.sequences.intrinsics.functions.front `front`]] -[def __result_of_front__ [link fusion.sequences.intrinsics.metafunctions.front `result_of::front`]] -[def __back__ [link fusion.sequences.intrinsics.functions.back `back`]] -[def __result_of_back__ [link fusion.sequences.intrinsics.metafunctions.back `result_of::back`]] -[def __at__ [link fusion.sequences.intrinsics.functions.at `at`]] -[def __result_of_at__ [link fusion.sequences.intrinsics.metafunctions.at `result_of::at`]] -[def __at_c__ [link fusion.sequences.intrinsics.functions.at_c `at_c`]] -[def __result_of_at_c__ [link fusion.sequences.intrinsics.metafunctions.at_c `result_of::at_c`]] -[def __at_key__ [link fusion.sequences.intrinsics.functions.at_key `at_key`]] -[def __result_of_at_key__ [link fusion.sequences.intrinsics.metafunctions.at_key `result_of::at_key`]] -[def __has_key__ [link fusion.sequences.intrinsics.functions.has_key `has_key`]] -[def __result_of_has_key__ [link fusion.sequences.intrinsics.metafunctions.has_key `result_of::has_key`]] -[def __value_at_key__ [link fusion.sequences.intrinsics.metafunctions.value_at_key `value_at_key`]] -[def __result_of_value_at__ [link fusion.sequences.intrinsics.metafunctions.value_at `result_of::value_at`]] -[def __result_of_value_at_c__ [link fusion.sequences.intrinsics.metafunctions.value_at_c `result_of::value_at_c`]] -[def __result_of_value_at_key__ [link fusion.sequences.intrinsics.metafunctions.value_at_key `result_of::value_at_key`]] +[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 __value_at_key__ [link fusion.sequence.intrinsic.metafunctions.value_at_key `value_at_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 __conversion__ [link fusion.sequences.conversion.functions Conversion]] -[def __result_of_conversion__ [link fusion.sequences.conversion.metafunctions Conversion Metafunctions]] -[def __as_vector__ [link fusion.sequences.conversion.functions.as_vector `as_vector`]] -[def __result_of_as_vector__ [link fusion.sequences.conversion.metafunctions.as_vector `result_of::as_vector`]] -[def __as_list__ [link fusion.sequences.conversion.functions.as_list `as_list`]] -[def __result_of_as_list__ [link fusion.sequences.conversion.metafunctions.as_list `result_of::as_list`]] -[def __as_set__ [link fusion.sequences.conversion.functions.as_set `as_set`]] -[def __result_of_as_set__ [link fusion.sequences.conversion.metafunctions.as_set `result_of::as_set`]] -[def __as_map__ [link fusion.sequences.conversion.functions.as_map `as_map`]] -[def __result_of_as_map__ [link fusion.sequences.conversion.metafunctions.as_map `result_of::as_map`]] +[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.sequences.generation.functions Generation]] -[def __result_of_generation__ [link fusion.sequences.generation.metafunctions Generation Metafunctions]] -[def __make_vector__ [link fusion.sequences.generation.functions.make_vector `make_vector`]] -[def __result_of_make_vector__ [link fusion.sequences.generation.metafunctions.make_vector `result_of::make_vector`]] -[def __vector_tie__ [link fusion.sequences.generation.functions.vector_tie `vector_tie`]] -[def __map_tie__ [link fusion.sequences.generation.functions.vector_tie `map_tie`]] -[def __result_of_vector_tie__ [link fusion.sequences.generation.metafunctions.vector_tie `result_of::vector_tie`]] -[def __make_vector__ [link fusion.sequences.generation.functions.make_vector `make_vector`]] -[def __result_of_make_vector__ [link fusion.sequences.generation.metafunctions.make_vector `result_of::make_vector`]] -[def __make_cons__ [link fusion.sequences.generation.functions.make_cons `make_cons`]] -[def __result_of_make_cons__ [link fusion.sequences.generation.metafunctions.make_cons `result_of::make_cons`]] -[def __make_list__ [link fusion.sequences.generation.functions.make_list `make_list`]] -[def __result_of_make_list__ [link fusion.sequences.generation.metafunctions.make_list `result_of::make_list`]] -[def __make_set__ [link fusion.sequences.generation.functions.make_set `make_set`]] -[def __result_of_make_set__ [link fusion.sequences.generation.metafunctions.make_set `result_of::make_set`]] -[def __make_map__ [link fusion.sequences.generation.functions.make_map `make_map`]] -[def __result_of_make_map__ [link fusion.sequences.generation.metafunctions.make_map `result_of::make_map`]] -[def __list_tie__ [link fusion.sequences.generation.functions.list_tie `list_tie`]] -[def __result_of_list_tie__ [link fusion.sequences.generation.metafunctions.list_tie `result_of::list_tie`]] +[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_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 __out__ [link fusion.sequences.operators.i_o.out out]] -[def __in__ [link fusion.sequences.operators.i_o.in in]] -[def __eq__ [link fusion.sequences.operators.comparison.equal equal]] -[def __neq__ [link fusion.sequences.operators.comparison.not_equal not equal]] -[def __lt__ [link fusion.sequences.operators.comparison.less_than less than]] -[def __lte__ [link fusion.sequences.operators.comparison.less_than_equal less than equal]] -[def __gt__ [link fusion.sequences.operators.comparison.greater_than greater than]] -[def __gte__ [link fusion.sequences.operators.comparison.greater_than_equal greater than equal]] +[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.algorithms Algorithm]] -[def __algorithms__ [link fusion.algorithms Algorithms]] -[def __fold__ [link fusion.algorithms.iteration.functions.fold `fold`]] -[def __result_of_fold__ [link fusion.algorithms.iteration.metafunctions.fold `result_of::fold`]] -[def __accumulate__ [link fusion.algorithms.iteration.functions.accumulate `accumulate`]] -[def __result_of_accumulate__ [link fusion.algorithms.iteration.metafunctions.accumulate `result_of::accumulate`]] -[def __for_each__ [link fusion.algorithms.iteration.functions.for_each `for_each`]] -[def __result_of_for_each__ [link fusion.algorithms.iteration.metafunctions.for_each `result_of::for_each`]] -[def __any__ [link fusion.algorithms.query.functions.any `any`]] -[def __result_of_any__ [link fusion.algorithms.query.metafunctions.any `result_of::any`]] -[def __all__ [link fusion.algorithms.query.functions.all `all`]] -[def __result_of_all__ [link fusion.algorithms.query.metafunctions.all `result_of::all`]] -[def __none__ [link fusion.algorithms.query.functions.none `none`]] -[def __result_of_none__ [link fusion.algorithms.query.metafunctions.none `result_of::none`]] -[def __find__ [link fusion.algorithms.query.functions.find `find`]] -[def __result_of_find__ [link fusion.algorithms.query.metafunctions.find `result_of::find`]] -[def __find_if__ [link fusion.algorithms.query.functions.find_if `find_if`]] -[def __result_of_find_if__ [link fusion.algorithms.query.metafunctions.find_if `result_of::find_if`]] -[def __count__ [link fusion.algorithms.query.functions.count `count`]] -[def __result_of_count__ [link fusion.algorithms.query.metafunctions.count `result_of::count`]] -[def __count_if__ [link fusion.algorithms.query.functions.count_if `count_if`]] -[def __result_of_count_if__ [link fusion.algorithms.query.metafunctions.count_if `result_of::count_if`]] -[def __filter__ [link fusion.algorithms.transformation.functions.filter `filter`]] -[def __result_of_filter__ [link fusion.algorithms.transformation.metafunctions.filter `result_of::filter`]] -[def __filter_if__ [link fusion.algorithms.transformation.functions.filter_if `filter_if`]] -[def __result_of_filter_if__ [link fusion.algorithms.transformation.metafunctions.filter_if `result_of::filter_if`]] -[def __transform__ [link fusion.algorithms.transformation.functions.transform `transform`]] -[def __result_of_transform__ [link fusion.algorithms.transformation.metafunctions.transform `result_of::transform`]] -[def __replace__ [link fusion.algorithms.transformation.functions.replace `replace`]] -[def __result_of_replace__ [link fusion.algorithms.transformation.metafunctions.replace `result_of::replace`]] -[def __replace_if__ [link fusion.algorithms.transformation.functions.replace_if `replace_if`]] -[def __result_of_replace_if__ [link fusion.algorithms.transformation.metafunctions.replace_if `result_of::replace_if`]] -[def __remove__ [link fusion.algorithms.transformation.functions.remove `remove`]] -[def __result_of_remove__ [link fusion.algorithms.transformation.metafunctions.remove `result_of::remove`]] -[def __remove_if__ [link fusion.algorithms.transformation.functions.remove_if `remove_if`]] -[def __result_of_remove_if__ [link fusion.algorithms.transformation.metafunctions.remove_if `result_of::remove_if`]] -[def __reverse__ [link fusion.algorithms.transformation.functions.reverse `reverse`]] -[def __result_of_reverse__ [link fusion.algorithms.transformation.metafunctions.reverse `result_of::reverse`]] -[def __clear__ [link fusion.algorithms.transformation.functions.clear `clear`]] -[def __result_of_clear__ [link fusion.algorithms.transformation.metafunctions.clear `result_of::clear`]] -[def __erase__ [link fusion.algorithms.transformation.functions.erase `erase`]] -[def __result_of_erase__ [link fusion.algorithms.transformation.metafunctions.erase `result_of::erase`]] -[def __erase_key__ [link fusion.algorithms.transformation.functions.erase_key `erase_key`]] -[def __result_of_erase_key__ [link fusion.algorithms.transformation.metafunctions.erase_key `result_of::erase_key`]] -[def __insert__ [link fusion.algorithms.transformation.functions.insert `insert`]] -[def __result_of_insert__ [link fusion.algorithms.transformation.metafunctions.insert `result_of::insert`]] -[def __insert_range__ [link fusion.algorithms.transformation.functions.insert_range `insert_range`]] -[def __result_of_insert_range__ [link fusion.algorithms.transformation.metafunctions.insert_range `result_of::insert_range`]] -[def __join__ [link fusion.algorithms.transformation.functions.join `join`]] -[def __result_of_join__ [link fusion.algorithms.transformation.metafunctions.join `result_of::join`]] -[def __zip__ [link fusion.algorithms.transformation.functions.zip `zip`]] -[def __result_of_zip__ [link fusion.algorithms.transformation.metafunctions.zip `result_of::zip`]] -[def __pop_back__ [link fusion.algorithms.transformation.functions.pop_back `pop_back`]] -[def __result_of_pop_back__ [link fusion.algorithms.transformation.metafunctions.pop_back `result_of::pop_back`]] -[def __pop_front__ [link fusion.algorithms.transformation.functions.pop_front `pop_front`]] -[def __result_of_pop_front__ [link fusion.algorithms.transformation.metafunctions.pop_front `result_of::pop_front`]] -[def __push_back__ [link fusion.algorithms.transformation.functions.push_back `push_back`]] -[def __result_of_push_back__ [link fusion.algorithms.transformation.metafunctions.push_back `result_of::push_back`]] -[def __push_front__ [link fusion.algorithms.transformation.functions.push_front `push_front`]] -[def __result_of_push_front__ [link fusion.algorithms.transformation.metafunctions.push_front `result_of::push_front`]] +[def __algorithm__ [link fusion.algorithm Algorithm]] +[def __algorithms__ [link fusion.algorithm Algorithms]] +[def __fold__ [link fusion.algorithm.iteration.functions.fold `fold`]] +[def __result_of_fold__ [link fusion.algorithm.iteration.metafunctions.fold `result_of::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 __tr1_tuple_pair__ [link fusion.tuples.pairs `TR1 and std::pair`]] -[def __tuple_get__ [link fusion.tuples.class_template_tuple.element_access `get`]] +[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]] @@ -290,16 +297,21 @@ [def __quick_start__ [link fusion.quick_start Quick Start]] [def __organization__ [link fusion.organization Orgainization]] [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`]] [include preface.qbk] [include introduction.qbk] [include quick_start.qbk] [include organization.qbk] [include support.qbk] -[include iterators.qbk] -[include sequences.qbk] -[include algorithms.qbk] -[include tuples.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] diff --git a/doc/html/fusion/acknowledgements.html b/doc/html/fusion/acknowledgements.html index b889a16a..803937aa 100644 --- a/doc/html/fusion/acknowledgements.html +++ b/doc/html/fusion/acknowledgements.html @@ -2,7 +2,7 @@ Acknowledgements - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -42,8 +42,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/adapted.html b/doc/html/fusion/adapted.html new file mode 100644 index 00000000..8a1358ae --- /dev/null +++ b/doc/html/fusion/adapted.html @@ -0,0 +1,91 @@ + + + +Adapted + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Fusion provides a couple of adapters for other sequences such as std::pair, + MPL sequences, + and boost::array. These adapters are written using Fusion's + non-intrusive Extension mechanism. + If you wish to use these sequences with fusion, simply include the necessary + files and they will be regarded as first-class, fully conforming fusion sequences. +

+

+ Fusion also provides various schemes to make it easy for the user to adapt + various data structures, non-intrusively, as full fledged Fusion sequences. +

+

+ + Header +

+
+#include <boost/fusion/adapted.hpp>
+#include <boost/fusion/include/adapted.hpp>
+
+

+ Fusion sequences may also be adapted as fully conforming MPL + sequences (see Intrinsics). + That way, we can have 2-way adaptation to and from MPL + and Fusion. To make Fusion sequences fully conforming MPL + sequences, include: +

+
+#include <boost/fusion/mpl.hpp>
+
+

+ If you want bi-directional adaptation to and from MPL + and Fusion, simply include: +

+
+#include <boost/fusion/include/mpl.hpp>
+
+

+ The header includes all the necessary headers. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/adapt_assoc.html b/doc/html/fusion/adapted/adapt_assoc.html new file mode 100644 index 00000000..2232d58c --- /dev/null +++ b/doc/html/fusion/adapted/adapt_assoc.html @@ -0,0 +1,123 @@ + + + + BOOST_FUSION_ADAPT_ASSOC_STRUCT + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ BOOST_FUSION_ADAPT_ASSOC_STRUCT is a macro that can be used to generate all + the necessary boilerplate to make an arbitrary struct into a model of Random Access Sequence + and Associative + Sequence. +

+

+ + Synopsis +

+
+BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+    struct_name
+    (member_type0, member_name0, key_type0)
+    (member_type1, member_name1, key_type1)
+    ...
+    )
+
+

+ + Semantics +

+

+ The above macro generates the necessary code to adapt struct_name + as a model of Random + Access Sequence and Associative + Sequence. The sequence of (member_typeN, + member_nameN, + key_typeN) + triples declare the type, name and key type of each of the struct members + that will be part of the sequence. +

+

+ The macro should be used at global scope, and struct_name + should be the fully namespace qualified name of the struct to be converted. +

+

+ + Header +

+
+#include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
+#include <boost/fusion/include/adapt_assoc_struct.hpp>
+
+

+ + Example +

+
+namespace demo
+{
+    struct employee
+    {
+        std::string name;
+        int age;
+    };
+}
+
+namespace keys
+{
+    struct name;
+    struct age;
+}
+
+// demo::employee is now a Fusion sequence
+// It is also an associative sequence with
+// keys keys::name and keys::age present.
+BOOST_FUSION_ADAPT_ASSOC_STRUCT(
+    demo::employee
+    (std::string, name, keys::name)
+    (int, age, keys::age))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/adapt_struct.html b/doc/html/fusion/adapted/adapt_struct.html new file mode 100644 index 00000000..49146958 --- /dev/null +++ b/doc/html/fusion/adapted/adapt_struct.html @@ -0,0 +1,110 @@ + + + + BOOST_FUSION_ADAPT_STRUCT + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ BOOST_FUSION_ADAPT_STRUCT is a macro that can be used to generate all the + necessary boilerplate to make an arbitrary struct into a Random + Access Sequence. +

+

+ + Synopsis +

+
+BOOST_FUSION_ADAPT_STRUCT(
+    struct_name
+    (member_type0, member_name0)
+    (member_type1, member_name1)
+    ...
+    )
+
+

+ + Semantics +

+

+ The above macro generates the necessary code to adapt struct_name + as a model of Random + Access Sequence. The sequence of (member_typeN, + member_nameN) + pairs declare the type and names of each of the struct members that will + be part of the sequence. +

+

+ The macro should be used at global scope, and struct_name + should be the fully namespace qualified name of the struct to be converted. +

+

+ + Header +

+
+#include <boost/fusion/adapted/struct/adapt_struct.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+
+

+ + Example +

+
+namespace demo
+{
+    struct employee
+    {
+        std::string name;
+        int age;
+    };
+}
+
+// demo::employee is now a Fusion sequence
+BOOST_FUSION_ADAPT_STRUCT(
+    demo::employee
+    (std::string, name)
+    (int, age))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/boost__array.html b/doc/html/fusion/adapted/boost__array.html new file mode 100644 index 00000000..aa011b30 --- /dev/null +++ b/doc/html/fusion/adapted/boost__array.html @@ -0,0 +1,85 @@ + + + +boost::array + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ This module provides adapters for boost::array. + Including the module header makes boost::array + a fully conforming Random + Access Sequence. +

+

+ + Header +

+
+#include <boost/fusion/adapted/array.hpp>
+#include <boost/fusion/include/array.hpp>
+
+

+ + Model of +

+ +

+ + Example +

+
+boost::array<int,3> arr = {{1,2,3}};
+
+std::cout << *begin(arr) << std::endl;
+std::cout << *next(begin(arr)) << std::endl;
+std::cout << *advance_c<2>(begin(arr)) << std::endl;
+std::cout << *prior(end(arr)) << std::endl;
+std::cout << at_c<2>(arr) << std::endl;
+
+

+ + See also +

+

+ Boost.Array Library +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/boost__tuple.html b/doc/html/fusion/adapted/boost__tuple.html new file mode 100644 index 00000000..394ece3e --- /dev/null +++ b/doc/html/fusion/adapted/boost__tuple.html @@ -0,0 +1,81 @@ + + + +boost::tuple + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ This module provides adapters for boost::tuple. + Including the module header makes boost::tuple + a fully conforming Forward + Sequence. +

+

+ + Header +

+
+#include <boost/fusion/adapted/boost_tuple.hpp>
+#include <boost/fusion/include/boost_tuple.hpp>
+
+

+ + Model of +

+ +

+ + Example +

+
+boost::tuple<int,std::string> example_tuple(101, "hello");
+std::cout << *boost::fusion::begin(example_tuple) << '\n';
+std::cout << *boost::fusion::next(boost::fusion::begin(example_tuple)) << '\n';
+
+

+ + See also +

+

+ Boost.Tuple + Library +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/mpl_sequence.html b/doc/html/fusion/adapted/mpl_sequence.html new file mode 100644 index 00000000..6932d063 --- /dev/null +++ b/doc/html/fusion/adapted/mpl_sequence.html @@ -0,0 +1,101 @@ + + + +mpl sequence + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ This module provides adapters for MPL + sequences. Including the module header makes all MPL + sequences fully conforming fusion sequences. +

+

+ + Header +

+
+#include <boost/fusion/adapted/mpl.hpp>
+#include <boost/fusion/include/mpl.hpp>
+
+

+ + Model of +

+
+

+ + Example +

+
+mpl::vector_c<int, 123, 456> vec_c;
+fusion::vector2<int, long> v(vec_c);
+std::cout << at_c<0>(v) << std::endl;
+std::cout << at_c<1>(v) << std::endl;
+
+v = mpl::vector_c<int, 456, 789>();
+std::cout << at_c<0>(v) << std::endl;
+std::cout << at_c<1>(v) << std::endl;
+
+

+ + See also +

+

+ MPL +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/adapted/std__pair.html b/doc/html/fusion/adapted/std__pair.html new file mode 100644 index 00000000..53e5cbd6 --- /dev/null +++ b/doc/html/fusion/adapted/std__pair.html @@ -0,0 +1,84 @@ + + + +std::pair + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ This module provides adapters for std::pair. + Including the module header makes std::pair + a fully conforming Random + Access Sequence. +

+

+ + Header +

+
+#include <boost/fusion/adapted/std_pair.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+

+ + Model of +

+ +

+ + Example +

+
+std::pair<int, std::string> p(123, "Hola!!!");
+std::cout << at_c<0>(p) << std::endl;
+std::cout << at_c<1>(p) << std::endl;
+std::cout << p << std::endl;
+
+

+ + See also +

+

+ std::pair, + TR1 + and std::pair +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm.html b/doc/html/fusion/algorithm.html new file mode 100644 index 00000000..cf44e1d8 --- /dev/null +++ b/doc/html/fusion/algorithm.html @@ -0,0 +1,114 @@ + + + +Algorithm + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ + Lazy Evaluation +

+

+ 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. +

+

+ + Sequence Extension +

+

+ The lazy evaluation scheme where Algorithms + return Views also 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. That is to say that Fusion + sequences are cheaply extensible. However, an important caveat is that the + result of a sequence extending operation like push_back does not retain the properties + of the original sequence such as associativity of set(s). To regain the original sequence, + Conversion functions + are provided. You may use one of the Conversion + functions to convert back to the original sequence type. +

+

+ + Header +

+
+#include <boost/fusion/algorithm.hpp>
+#include <boost/fusion/include/algorithm.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration.html b/doc/html/fusion/algorithm/iteration.html new file mode 100644 index 00000000..5dc0a880 --- /dev/null +++ b/doc/html/fusion/algorithm/iteration.html @@ -0,0 +1,59 @@ + + + +Iteration + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ The iteration algorithms provide the fundamental algorithms for traversing + a sequence repeatedly applying an operation to its elements. +

+

+ + Header +

+
+#include <boost/fusion/algorithm/iteration.hpp>
+#include <boost/fusion/include/iteration.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/functions.html b/doc/html/fusion/algorithm/iteration/functions.html new file mode 100644 index 00000000..49c28323 --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/functions.html @@ -0,0 +1,48 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/functions/accumulate.html b/doc/html/fusion/algorithm/iteration/functions/accumulate.html new file mode 100644 index 00000000..afa5797f --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/functions/accumulate.html @@ -0,0 +1,203 @@ + + + +accumulate + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a sequence Seq, initial + state, and binary function object or function pointer f, + accumulate repeatedly applies binary f + to each element of Seq + and the previous state. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename State,
+    typename F
+    >
+typename result_of::accumulate<Sequence, State, F>::type accumulate(
+    Sequence& seq, State const& initial_state, F const& f);
+
+
+

Table 1.34. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(eN + ....f(e2,f(e1,initial_state))) must be a valid expression for + each element e1 + to eN in seq +

+
+

+ Operation's argument +

+
+

+ initial_state +

+
+

+ Any type +

+
+

+ Initial state +

+
+

+ f +

+
+

+ boost::result_of<F(E,S)>::type is the return type of f(e,s) + for each element e + of type E in seq, and current state s of type S +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+accumulate(seq, initial_state, f);
+
+

+ Return type: Any type +

+

+ Semantics: Equivalent to f(eN ....f(e2,f(e1,initial_state))) + where e1 ...eN are the elements of seq. +

+
+ + Complexity +
+

+ Linear, exactly result_of::size<Sequence>::value applications of f. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/accumulate.hpp>
+#include <boost/fusion/include/accumulate.hpp>
+
+
+ + Example +
+
+struct make_string
+{
+    typedef std::string result_type;
+
+    template<typename T>
+    std::string operator()(const T& t, const std::string& str) const
+    {
+        return str + boost::lexical_cast<std::string>(t);
+    }
+};
+...
+const vector<int,int> vec(1,2);
+assert(accumulate(vec,std::string(""), make_string()) == "12");
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/functions/fold.html b/doc/html/fusion/algorithm/iteration/functions/fold.html new file mode 100644 index 00000000..5602ce26 --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/functions/fold.html @@ -0,0 +1,203 @@ + + + +fold + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a sequence Seq, initial + state, and binary function object or function pointer f, + fold repeatedly applies binary f + to each element of Seq + and the previous state. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename State,
+    typename F
+    >
+typename result_of::fold<Sequence, State, F>::type fold(
+    Sequence& seq, State const& initial_state, F const& f);
+
+
+

Table 1.33. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence,f(e,s) must be a valid expression for + each element e + in seq, and current + state s +

+
+

+ Operation's argument +

+
+

+ initial_state +

+
+

+ Any type +

+
+

+ Initial state +

+
+

+ f +

+
+

+ boost::result_of<F(E,S)>::type is the return type of f(e,s) + for each element e + of type E in seq, and current state s of type S +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+fold(seq, initial_state, f);
+
+

+ Return type: Any type +

+

+ Semantics: Equivalent to f(eN ....f(e2,f(e1,initial_state))) + where e1 ...eN are the elements of seq. +

+
+ + Complexity +
+

+ Linear, exactly result_of::size<Sequence>::value applications of f. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/fold.hpp>
+#include <boost/fusion/include/fold.hpp>
+
+
+ + Example +
+
+struct make_string
+{
+    typedef std::string result_type;
+
+    template<typename T>
+    std::string operator()(const T& t, const std::string& str) const
+    {
+        return str + boost::lexical_cast<std::string>(t);
+    }
+};
+...
+const vector<int,int> vec(1,2);
+assert(fold(vec,std::string(""), make_string()) == "12");
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/functions/for_each.html b/doc/html/fusion/algorithm/iteration/functions/for_each.html new file mode 100644 index 00000000..6e1f5acb --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/functions/for_each.html @@ -0,0 +1,179 @@ + + + +for_each + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Applies a unary function object to each element of a sequence. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::for_each<Sequence, F>::type for_each(
+    Sequence& seq, F const& f);
+
+
+

Table 1.35. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(e) must be a valid expression for + each element e + in seq +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ A unary Regular + Callable Object +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+for_each(seq, f);
+
+

+ Return type: void +

+

+ Semantics: Calls f(e) for each element e + in seq. +

+
+ + Complexity +
+

+ Linear, exactly result_of::size<Sequence>::value applications of f. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/for_each.hpp>
+#include <boost/fusion/include/for_each.hpp>
+
+
+ + Example +
+
+struct increment
+{
+    template<typename T>
+    void operator()(T& t) const
+    {
+        ++t;
+    }
+};
+...
+vector<int,int> vec(1,2);
+for_each(vec, increment());
+assert(vec == make_vector(2,3));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/metafunctions.html b/doc/html/fusion/algorithm/iteration/metafunctions.html new file mode 100644 index 00000000..6e338e90 --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/metafunctions.html @@ -0,0 +1,48 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/metafunctions/accumulate.html b/doc/html/fusion/algorithm/iteration/metafunctions/accumulate.html new file mode 100644 index 00000000..10544a1a --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/metafunctions/accumulate.html @@ -0,0 +1,181 @@ + + + +accumulate + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of accumulate. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename State,
+    typename F>
+struct accumulate
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.37. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ The sequence to iterate +

+
+

+ State +

+
+

+ Any type +

+
+

+ The initial state for the first application of F +

+
+

+ F +

+
+

+ boost::result_of<F(E,S)>::type is the return type of f(e,s) + for each element e + of type E in seq, and current state s of type S +

+
+

+ The operation to be applied on forward traversal +

+
+
+
+ + Expression + Semantics +
+
+result_of::accumulate<Sequence, State, F>::type
+
+

+ Return type: Any type +

+

+ Semantics: Returns the result of applying + accumulate to a sequence + of type Sequence, with + an initial state of type State + and binary function object or function pointer of type F. +

+
+ + Complexity +
+

+ Linear, exactly result_of::size<Sequence>::value applications of F. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/accumulate.hpp>
+#include <boost/fusion/include/accumulate.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/metafunctions/fold.html b/doc/html/fusion/algorithm/iteration/metafunctions/fold.html new file mode 100644 index 00000000..52f2f29f --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/metafunctions/fold.html @@ -0,0 +1,181 @@ + + + +fold + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of fold. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename State,
+    typename F>
+struct fold
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.36. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ The sequence to iterate +

+
+

+ State +

+
+

+ Any type +

+
+

+ The initial state for the first application of F +

+
+

+ F +

+
+

+ boost::result_of<F(E,S)>::type is the return type of f(e,s) + for each element e + of type E in seq, and current state s of type S +

+
+

+ The operation to be applied on forward traversal +

+
+
+
+ + Expression + Semantics +
+
+result_of::fold<Sequence, State, F>::type
+
+

+ Return type: Any type +

+

+ Semantics: Returns the result of applying + fold to a sequence of + type Sequence, with an + initial state of type State + and binary function object or function pointer of type F. +

+
+ + Complexity +
+

+ Linear, exactly result_of::size<Sequence>::value applications of F. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/fold.hpp>
+#include <boost/fusion/include/fold.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/iteration/metafunctions/for_each.html b/doc/html/fusion/algorithm/iteration/metafunctions/for_each.html new file mode 100644 index 00000000..f20f2608 --- /dev/null +++ b/doc/html/fusion/algorithm/iteration/metafunctions/for_each.html @@ -0,0 +1,163 @@ + + + +for_each + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ A metafunction returning the result type of applying for_each to a sequence. The + return type of for_each is always void. +

+
+ + Description +
+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+>
+struct for_each
+{
+    typedef void type;
+};
+
+
+

Table 1.38. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ F +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::for_each<Sequence, F>::type
+
+

+ Return type: void. +

+

+ Semantics: Returns the return type of + for_each for a sequence of type + Sequence and a unary + function object F. The + return type is always void. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/iteration/for_each.hpp>
+#include <boost/fusion/include/for_each.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query.html b/doc/html/fusion/algorithm/query.html new file mode 100644 index 00000000..ce86f7dc --- /dev/null +++ b/doc/html/fusion/algorithm/query.html @@ -0,0 +1,58 @@ + + + +Query + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ The query algorithms provide support for searching and analyzing sequences. +

+

+ + Header +

+
+#include <boost/fusion/algorithm/query.hpp>
+#include <boost/fusion/include/query.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions.html b/doc/html/fusion/algorithm/query/functions.html new file mode 100644 index 00000000..95f520ea --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions.html @@ -0,0 +1,52 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/all.html b/doc/html/fusion/algorithm/query/functions/all.html new file mode 100644 index 00000000..f390c520 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/all.html @@ -0,0 +1,182 @@ + + + +all + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+all
+
+ + Description +
+

+ For a sequence seq and + unary function object f, + all returns true if + f returns true for every + element of seq. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::all<Sequence,F>::type all(
+    Sequence const& seq, F f);
+
+
+

Table 1.40. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(e) is a valid expression, convertible + to bool, for every + element e in seq +

+
+

+ The sequence to search +

+
+

+ f +

+
+

+ A unary function object +

+
+

+ The search predicate +

+
+
+
+ + Expression + Semantics +
+
+all(seq, f);
+
+

+ Return type: bool +

+

+ Semantics: Returns true if and only + if f(e) + evaluates to true for every + element e in seq. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/all.hpp>
+#include <boost/fusion/include/all.hpp>
+
+
+ + Example +
+
+struct odd
+{
+    template<typename T>
+    bool operator()(T t) const
+    {
+        return t % 2;
+    }
+};
+...
+assert(all(make_vector(1,3), odd()));
+assert(!all(make_vector(1,2), odd()));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/any.html b/doc/html/fusion/algorithm/query/functions/any.html new file mode 100644 index 00000000..6fa8e22e --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/any.html @@ -0,0 +1,182 @@ + + + +any + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+any
+
+ + Description +
+

+ For a sequence seq and + unary function object f, + any returns true if + f returns true for at + least one element of seq. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::any<Sequence,F>::type any(
+    Sequence const& seq, F f);
+
+
+

Table 1.39. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(e) must be a valid expression, convertible + to bool, for each + element e in seq +

+
+

+ The sequence to search +

+
+

+ f +

+
+

+ A unary function object +

+
+

+ The search predicate +

+
+
+
+ + Expression + semantics +
+
+any(seq, f);
+
+

+ Return type: bool +

+

+ Semantics: Returns true if and only + if f(e) + evaluates to true for some + element e in seq. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/any.hpp>
+#include <boost/fusion/include/any.hpp>
+
+
+ + Example +
+
+struct odd
+{
+    template<typename T>
+    bool operator()(T t) const
+    {
+        return t % 2;
+    }
+};
+...
+assert(any(make_vector(1,2), odd()));
+assert(!any(make_vector(2,4), odd()));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/count.html b/doc/html/fusion/algorithm/query/functions/count.html new file mode 100644 index 00000000..768ad2c9 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/count.html @@ -0,0 +1,169 @@ + + + +count + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the number of elements of a given type within a sequence. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+typename result_of::count<Sequence, T>::type count(
+    Sequence const& seq, T const& t);
+
+
+

Table 1.44. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, e == t + must be a valid expression, convertible to bool, + for each element e + in seq +

+
+

+ The sequence to search +

+
+

+ T +

+
+

+ Any type +

+
+

+ The type to count +

+
+
+
+ + Expression + Semantics +
+
+count(seq, t);
+
+

+ Return type: int +

+

+ Semantics: Returns the number of elements + of type T and equal to + t in seq. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/count.hpp>
+#include <boost/fusion/include/count.hpp>
+
+
+ + Example +
+
+const vector<double,int,int> vec(1.0,2,3);
+assert(count(vec,2) == 1);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/count_if.html b/doc/html/fusion/algorithm/query/functions/count_if.html new file mode 100644 index 00000000..9324da53 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/count_if.html @@ -0,0 +1,168 @@ + + + +count_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the number of elements within a sequence with a type for which + a given unary function object evaluates to true. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::count_if<Sequence, F>::type count_if(
+    Sequence const& seq, F f);
+
+
+

Table 1.45. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(e) is a valid expression, convertible + to bool, for each + element e in seq +

+
+

+ The sequence to search +

+
+

+ f +

+
+

+ A unary function object +

+
+

+ The search predicate +

+
+
+
+ + Expression + Semantics +
+
+count_if(seq, f)
+
+

+ Return type: int +

+

+ Semantics: Returns the number of elements + in seq where f evaluates to true. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/count_if.hpp>
+#include <boost/fusion/include/count_if.hpp>
+
+
+ + Example +
+
+const vector<int,int,int> vec(1,2,3);
+assert(count_if(vec,odd()) == 2);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/find.html b/doc/html/fusion/algorithm/query/functions/find.html new file mode 100644 index 00000000..61426ca5 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/find.html @@ -0,0 +1,174 @@ + + + +find + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Finds the first element of a given type within a sequence. +

+
+ + Synopsis +
+
+template<
+    typename T,
+    typename Sequence
+    >
+unspecified find(Sequence const& seq);
+
+template<
+    typename T,
+    typename Sequence
+    >
+unspecified find(Sequence& seq);
+
+
+

Table 1.42. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ The sequence to search +

+
+

+ T +

+
+

+ Any type +

+
+

+ The type to search for +

+
+
+
+ + Expression + Semantics +
+
+find<T>(seq)
+
+

+ Return type: A model of the same iterator + category as the iterators of seq. +

+

+ Semantics: Returns an iterator to the + first element of seq + of type T, or end(seq) if there is no such element. Equivalent + to find_if<boost::is_same<_, T> >(seq) +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/find.hpp>
+#include <boost/fusion/include/find.hpp>
+
+
+ + Example +
+
+const vector<char,int> vec('a','0');
+assert(*find<int>(vec) == '0');
+assert(find<double>(vec) == end(vec));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/find_if.html b/doc/html/fusion/algorithm/query/functions/find_if.html new file mode 100644 index 00000000..373bdb84 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/find_if.html @@ -0,0 +1,173 @@ + + + +find_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ Finds the first element within a sequence with a type for which a given + MPL + Lambda Expression evaluates to boost::mpl::true_. +

+
+ + Description +
+
+ + Synopsis +
+
+template<
+    typename F,
+    typename Sequence
+    >
+unspecified find_if(Sequence const& seq);
+
+template<
+    typename F,
+    typename Sequence
+    >
+unspecified find_if(Sequence& seq);
+
+
+

Table 1.43. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ The sequence to search +

+
+

+ F +

+
+

+ A unary MPL + Lambda Expression +

+
+

+ The search predicate +

+
+
+
+ + Expression + Semantics +
+
+find_if<F>(seq)
+
+

+ Return type: An iterator of the same + iterator category as the iterators of seq. +

+

+ Semantics: Returns the first element + of seq for which MPL + Lambda Expression F + evaluates to boost::mpl::true_, or end(seq) + if there is no such element. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+

+ /algorithm/query/find_if.hpp> +

+
+ + Example +
+
+const vector<double,int> vec(1.0,2);
+assert(*find_if<is_integral<mpl::_> >(vec) == 2);
+assert(find_if<is_class<mpl::_> >(vec) == end(vec));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/functions/none.html b/doc/html/fusion/algorithm/query/functions/none.html new file mode 100644 index 00000000..b27f3216 --- /dev/null +++ b/doc/html/fusion/algorithm/query/functions/none.html @@ -0,0 +1,182 @@ + + + +none + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a sequence seq and + unary function object f, + none returns true if + f returns false for every + element of seq. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::none<Sequence,F>::type none(
+    Sequence const& seq, F f);
+
+
+

Table 1.41. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, f(e) is a valid expression, convertible + to bool, for every + element e in seq +

+
+

+ The sequence to search +

+
+

+ f +

+
+

+ A unary function object +

+
+

+ The search predicate +

+
+
+
+ + Expression + Semantics +
+
+none(seq, f);
+
+

+ Return type: bool +

+

+ Semantics: Returns true if and only + if f(e) + evaluates to false for every + element e in seq. Result equivalent to !any(seq, f). +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/none.hpp>
+#include <boost/fusion/include/none.hpp>
+
+
+ + Example +
+
+struct odd
+{
+    template<typename T>
+    bool operator()(T t) const
+    {
+        return t % 2;
+    }
+};
+...
+assert(none(make_vector(2,4), odd()));
+assert(!none(make_vector(1,2), odd()));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions.html b/doc/html/fusion/algorithm/query/metafunctions.html new file mode 100644 index 00000000..51fd7502 --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions.html @@ -0,0 +1,52 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/all.html b/doc/html/fusion/algorithm/query/metafunctions/all.html new file mode 100644 index 00000000..38f893ae --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/all.html @@ -0,0 +1,166 @@ + + + +all + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+all
+
+ + Description +
+

+ A metafunction returning the result type of all. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+struct all
+{
+    typedef bool type;
+};
+
+
+

Table 1.47. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ F +

+
+

+ A model of unary Polymorphic + Function Object +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::all<Sequence, F>::type
+
+

+ Return type: bool. +

+

+ Semantics: Returns the return type of + all + given a sequence of type Sequence + and a unary Polymorphic + Function Object of type F. + The return type is always bool. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/all.hpp>
+#include <boost/fusion/include/all.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/any.html b/doc/html/fusion/algorithm/query/metafunctions/any.html new file mode 100644 index 00000000..7f1f5dfb --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/any.html @@ -0,0 +1,166 @@ + + + +any + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+any
+
+ + Description +
+

+ A metafunction returning the result type of any. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+struct any
+{
+    typedef bool type;
+};
+
+
+

Table 1.46. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ F +

+
+

+ A model of unary Polymorphic + Function Object +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::any<Sequence, F>::type
+
+

+ Return type: bool. +

+

+ Semantics: Returns the return type of + any + given a sequence of type Sequence + and a unary Polymorphic + Function Object of type F. + The return type is always bool. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/any.hpp>
+#include <boost/fusion/include/any.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/count.html b/doc/html/fusion/algorithm/query/metafunctions/count.html new file mode 100644 index 00000000..ba0a6c9d --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/count.html @@ -0,0 +1,161 @@ + + + +count + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A metafunction that returns the result type of count + given the sequence and search types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct count
+{
+    typedef int type;
+};
+
+
+

Table 1.51. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ heading Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::count<T>::type
+
+

+ Return type: int. +

+

+ Semantics: Returns the return type of + count. The return type is always + int. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/count.hpp>
+#include <boost/fusion/include/count.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/count_if.html b/doc/html/fusion/algorithm/query/metafunctions/count_if.html new file mode 100644 index 00000000..ac63d902 --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/count_if.html @@ -0,0 +1,161 @@ + + + +count_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A metafunction that returns the result type of count_if + given the sequence and predicate types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Pred
+    >
+struct count_if
+{
+    typedef int type;
+};
+
+
+

Table 1.52. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A unary function object +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::count_if<Sequence, Pred>::type
+
+

+ Return type: int. +

+

+ Semantics: Returns the return type of + count_if. The return type is + always int. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/count_if.hpp>
+#include <boost/fusion/include/count_if.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/find.html b/doc/html/fusion/algorithm/query/metafunctions/find.html new file mode 100644 index 00000000..9292780b --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/find.html @@ -0,0 +1,163 @@ + + + +find + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of find, + given the sequence and search types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct find
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.49. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ Model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::find<Sequence, T>::type
+
+

+ Return type: A model of the same iterator + category as the iterators of Sequence. +

+

+ Semantics: Returns an iterator to the + first element of type T + in Sequence, or result_of::end<Sequence>::type + if there is no such element. +

+
+ + Complexity +
+

+ Linear, at most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/find.hpp>
+#include <boost/fusion/include/find.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/find_if.html b/doc/html/fusion/algorithm/query/metafunctions/find_if.html new file mode 100644 index 00000000..d5b827c6 --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/find_if.html @@ -0,0 +1,164 @@ + + + +find_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of find_if + given the sequence and predicate types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Pred
+    >
+struct find_if
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.50. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A model of MPL + Lambda Expression +

+
+

+ Operation's arguments +

+
+
+
+ + Expression + Semantics +
+
+result_of::find_if<Sequence, Pred>::type
+
+

+ Return type: A model of the same iterator + category as the iterators of Sequence. +

+

+ Semantics: Returns an iterator to the + first element in Sequence + for which Pred evaluates + to true. Returns result_of::end<Sequence>::type if there is no such element. +

+
+ + Complexity +
+

+ Linear. At most result_of::size<Sequence>::value comparisons. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/find_if.hpp>
+#include <boost/fusion/include/find_if.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/query/metafunctions/none.html b/doc/html/fusion/algorithm/query/metafunctions/none.html new file mode 100644 index 00000000..e4550802 --- /dev/null +++ b/doc/html/fusion/algorithm/query/metafunctions/none.html @@ -0,0 +1,166 @@ + + + +none + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A metafunction returning the result type of none. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+struct none
+{
+    typedef bool type;
+};
+
+
+

Table 1.48. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ F +

+
+

+ A model of unary Polymorphic + Function Object +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::none<Sequence, F>::type
+
+

+ Return type: bool. +

+

+ Semantics: Returns the return type of + none + given a sequence of type Sequence + and a unary Polymorphic + Function Object of type F. + The return type is always bool. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/query/none.hpp>
+#include <boost/fusion/include/none.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation.html b/doc/html/fusion/algorithm/transformation.html new file mode 100644 index 00000000..7bc9e08f --- /dev/null +++ b/doc/html/fusion/algorithm/transformation.html @@ -0,0 +1,71 @@ + + + +Transformation + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ The transformation algorithms create new sequences out of existing sequences + by performing some sort of transformation. In reality the new sequences are + views onto the data in the original sequences. +

+
+ + + + + +
[Note]Note

+ As the transformation algorithms return views onto their input arguments, + it is important that the lifetime of the input arguments is greater than + the period during which you wish to use the results. +

+

+ + Header +

+
+#include <boost/fusion/algorithm/transformation.hpp>
+#include <boost/fusion/include/transformation.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions.html b/doc/html/fusion/algorithm/transformation/functions.html new file mode 100644 index 00000000..c6a3c502 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions.html @@ -0,0 +1,64 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/clear.html b/doc/html/fusion/algorithm/transformation/functions/clear.html new file mode 100644 index 00000000..756245e2 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/clear.html @@ -0,0 +1,145 @@ + + + +clear + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ clear returns an empty sequence. +

+
+ + Synposis +
+
+template<
+    typename Sequence
+    >
+typename result_of::clear<Sequence const>::type clear(Sequence const& seq);
+
+
+

Table 1.62. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+clear(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Expression Semantics: Returns a sequence + with no elements. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/clear.hpp>
+#include <boost/fusion/include/clear.hpp>
+
+
+ + Example +
+
+assert(clear(make_vector(1,2,3)) == make_vector());
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/erase.html b/doc/html/fusion/algorithm/transformation/functions/erase.html new file mode 100644 index 00000000..c20a213c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/erase.html @@ -0,0 +1,213 @@ + + + +erase + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence, containing all the elements of the original except + those at a specified iterator, or between two iterators. +

+
+ + Synposis +
+
+template<
+    typename Sequence,
+    typename First
+    >
+typename result_of::erase<Sequence const, First>::type erase(
+    Sequence const& seq, First const& it1);
+
+template<
+    typename Sequence,
+    typename First,
+    typename Last
+    >
+typename result_of::erase<Sequence const, First, Last>::type erase(
+    Sequence const& seq, First const& it1, Last const& it2);
+
+
+

Table 1.63. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameters +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ it1 +

+
+

+ A model of Forward + Iterator +

+
+

+ Iterator into seq +

+
+

+ it2 +

+
+

+ A model of Forward + Iterator +

+
+

+ Iterator into seq + after it1 +

+
+
+
+ + Expression + Semantics +
+
+erase(seq, pos);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq + except the element at pos. +

+
+erase(seq, first, last);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, with + all the elements of seq, + in their original order, except those in the range [first,last). +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/erase.hpp>
+#include <boost/fusion/include/erase.hpp>
+
+
+ + Example +
+
+const vector<int, double, char> vec(1, 2.0, 'c');
+assert(erase(vec, next(begin(vec))) == make_vector(1, 'c'));
+assert(erase(vec, next(begin(vec)), end(vec)) == make_vector(1));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/erase_key.html b/doc/html/fusion/algorithm/transformation/functions/erase_key.html new file mode 100644 index 00000000..6ff008a2 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/erase_key.html @@ -0,0 +1,172 @@ + + + +erase_key + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For an Associative + Sequence seq, + returns a Forward + Sequence containing all the elements of the original except those + with a given key. +

+
+ + Synposis +
+
+template<
+    typename Key,
+    typename Sequence
+    >
+typename result_of::erase_key<Sequence const, Key>::type erase_key(Sequence const& seq);
+
+
+

Table 1.64. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Associative + Sequence +

+
+

+ Operation's argument +

+
+

+ Key +

+
+

+ Any type +

+
+

+ Key to erase +

+
+
+
+ + Expression + Semantics +
+
+erase_key<Key>(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + except those with key Key. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/erase_key.hpp>
+#include <boost/fusion/include/erase_key.hpp>
+
+
+ + Example +
+
+assert(erase_key<int>(make_map<int, long>('a', 'b')) == make_map<long>('b'));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/filter.html b/doc/html/fusion/algorithm/transformation/functions/filter.html new file mode 100644 index 00000000..dd4aed39 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/filter.html @@ -0,0 +1,169 @@ + + + +filter + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a given sequence, filter returns a new sequences containing only + the elements of a specified type. +

+
+ + Synopsis +
+
+template<
+    typename T,
+    typename Sequence
+    >
+typename result_of::filter<Sequence const, T>::type filter(Sequence const& seq);
+
+
+

Table 1.53. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ The type to retain +

+
+
+
+ + Expression + Semantics +
+
+filter<T>(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + all the elements of seq + of type T. Equivalent + to filter_if<boost::same_type<_, T> >(seq). +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/filter.hpp>
+#include <boost/fusion/include/filter.hpp>
+
+
+ + Example +
+
+const vector<int,int,long,long> vec(1,2,3,4);
+assert(filter<int>(vec) == make_vector(1,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/filter_if.html b/doc/html/fusion/algorithm/transformation/functions/filter_if.html new file mode 100644 index 00000000..65de295c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/filter_if.html @@ -0,0 +1,172 @@ + + + +filter_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a given sequence, filter_if returns a new sequences + containing only the elements with types for which a given MPL + Lambda Expression evaluates to boost::mpl::true_. +

+
+ + Synopsis +
+
+template<
+    typename Pred,
+    typename Sequence
+    >
+typename result_of::filter_if<Sequence const, Pred>::type filter_if(Sequence const& seq);
+
+
+

Table 1.54. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A unary MPL + Lambda Expression +

+
+

+ The predicate to filter by +

+
+
+
+ + Expression + Semantics +
+
+filter_if<Pred>(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + all the elements of seq + with types for which Pred + evaluates to boost::mpl::true_. The order of the retained elements + is the same as in the original sequence. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/filter_if.hpp>
+#include <boost/fusion/include/filter_if.hpp>
+
+
+ + Example +
+
+const vector<int,int,double,double> vec(1,2,3.0,4.0);
+assert(filter_if<is_integral<mpl::_> >(vec) == make_vector(1,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/insert.html b/doc/html/fusion/algorithm/transformation/functions/insert.html new file mode 100644 index 00000000..8dcfb8e9 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/insert.html @@ -0,0 +1,190 @@ + + + +insert + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence with all the elements of the original, an a new + element inserted the position described by a given iterator. +

+
+ + Synposis +
+
+template<
+    typename Sequence,
+    typename Pos,
+    typename T
+    >
+unspecified insert(Sequence const& seq, Pos const& pos, T const& t);
+
+
+

Table 1.65. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ pos +

+
+

+ A model of Forward + Iterator +

+
+

+ The position to insert at +

+
+

+ t +

+
+

+ Any type +

+
+

+ The value to insert +

+
+
+
+ + Expression + Semantics +
+
+insert(seq, p, t);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + in their original order, and a new element with the type and value of + t inserted at iterator + pos. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/insert.hpp>
+#include <boost/fusion/include/insert.hpp>
+
+
+ + Example +
+
+const vector<int,int> vec(1,2);
+assert(insert(vec, next(begin(vec)), 3) == make_vector(1,3,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/insert_range.html b/doc/html/fusion/algorithm/transformation/functions/insert_range.html new file mode 100644 index 00000000..3b36d880 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/insert_range.html @@ -0,0 +1,193 @@ + + + +insert_range + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence with another sequence inserted at a specified + iterator. +

+
+ + Synposis +
+
+template<
+    typename Sequence,
+    typename Pos,
+    typename Range
+    >
+typename result_of::insert_range<Sequence const, Pos, Range>::type insert_range(
+    Sequence const& seq, Pos const& pos, Range const& range);
+
+
+

Table 1.66. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ pos +

+
+

+ A model of Forward + Iterator +

+
+

+ The position to insert at +

+
+

+ range +

+
+

+ A model of Forward + Sequence +

+
+

+ Range to insert +

+
+
+
+ + Expression + Semantics +
+
+insert(seq, pos, range);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + and the elements of range + inserted at iterator pos. + All elements retaining their ordering from the orignal sequences. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/insert_range.hpp>
+#include <boost/fusion/include/insert_range.hpp>
+
+
+ + Example +
+
+const vector<int,int> vec(1,2);
+assert(insert_range(vec, next(begin(vec)), make_vector(3,4)) == make_vector(1,3,4,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/join.html b/doc/html/fusion/algorithm/transformation/functions/join.html new file mode 100644 index 00000000..9bcb5c97 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/join.html @@ -0,0 +1,171 @@ + + + +join + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Takes 2 sequences and returns a sequence containing the elements of the + first followed by the elements of the second. +

+
+ + Synopsis +
+
+template<
+    typename LhSequence,
+    typename RhSequence>
+typename result_of::join<LhSequence, RhSequence>::type join(LhSequence const& lhs, RhSequence const& rhs);
+
+
+

Table 1.67. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ lhs +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ rhs +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+join(lhs, rhs);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + all the elements of lhs + followed by all the elements of rhs. + The order of th elements is preserved. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/join.hpp>
+#include <boost/fusion/include/join.hpp>
+
+
+ + Example +
+
+vector<int,char> v1(1, 'a');
+vector<int,char> v2(2, 'b');
+assert(join(v1, v2) == make_vector(1,'a',2,'b'));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/pop_back.html b/doc/html/fusion/algorithm/transformation/functions/pop_back.html new file mode 100644 index 00000000..91dcfc3c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/pop_back.html @@ -0,0 +1,147 @@ + + + +pop_back + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence, with the last element of the original removed. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+typename result_of::pop_back<Sequence const>::type pop_back(Sequence const& seq);
+
+
+

Table 1.69. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+pop_back(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence containing + all the elements of seq, + except the last element. The elements in the new sequence are in the + same order as they were in seq. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/pop_back.hpp>
+#include <boost/fusion/include/pop_back.hpp>
+
+
+ + Example +
+
+assert(___pop_back__(make_vector(1,2,3)) == make_vector(1,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/pop_front.html b/doc/html/fusion/algorithm/transformation/functions/pop_front.html new file mode 100644 index 00000000..70cc977c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/pop_front.html @@ -0,0 +1,147 @@ + + + +pop_front + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence, with the first element of the original removed. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+typename result_of::pop_front<Sequence const>::type pop_front(Sequence const& seq);
+
+
+

Table 1.70. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+pop_front(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence containing + all the elements of seq, + except the first element. The elements in the new sequence are in the + same order as they were in seq. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/pop_front.hpp>
+#include <boost/fusion/include/pop_front.hpp>
+
+
+ + Example +
+
+assert(pop_front(make_vector(1,2,3)) == make_vector(2,3));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/push_back.html b/doc/html/fusion/algorithm/transformation/functions/push_back.html new file mode 100644 index 00000000..01209484 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/push_back.html @@ -0,0 +1,168 @@ + + + +push_back + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence with an element added at the end. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+typename result_of::push_back<Sequence, T>::type push_back(
+    Sequence const& seq, T const& t);
+
+
+

Table 1.71. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ t +

+
+

+ Any type +

+
+

+ The value to add to the end +

+
+
+
+ + Expression + Semantics +
+
+push_back(seq, t);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + and new element t appended + to the end. The elements are in the same order as they were in seq. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/push_back.hpp>
+#include <boost/fusion/include/push_back.hpp>
+
+
+ + Example +
+
+assert(push_back(make_vector(1,2,3),4) == make_vector(1,2,3,4));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/push_front.html b/doc/html/fusion/algorithm/transformation/functions/push_front.html new file mode 100644 index 00000000..e152ca6c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/push_front.html @@ -0,0 +1,169 @@ + + + +push_front + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence with an element added at the beginning. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+typename result_of::push_front<Sequence, T>::type push_front(
+    Sequence const& seq, T const& t);
+
+
+

Table 1.72. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ t +

+
+

+ Any type +

+
+

+ The value to add to the beginning +

+
+
+
+ + Expression + Semantics +
+
+push_back(seq, t);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + and new element t appended + to the beginning. The elements are in the same order as they were in + seq. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/push_front.hpp>
+#include <boost/fusion/include/push_front.hpp>
+
+
+ + Example +
+
+assert(push_front(make_vector(1,2,3),0) == make_vector(0,1,2,3));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/remove.html b/doc/html/fusion/algorithm/transformation/functions/remove.html new file mode 100644 index 00000000..5e60dd9b --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/remove.html @@ -0,0 +1,169 @@ + + + +remove + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence, with all the elements of the original sequence, + except those of a given type. +

+
+ + Synopsis +
+
+template<
+    typename T,
+    typename Sequence
+    >
+typename result_of::remove<Sequence const, T>::type replace(Sequence const& seq);
+
+
+

Table 1.59. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Type to remove +

+
+
+
+ + Expression + Semantics +
+
+remove<T>(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + in their original order, except those of type T. + Equivalent to remove_if<boost::is_same<_,T> >(seq). +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/remove.hpp>
+#include <boost/fusion/include/remove.hpp>
+
+
+ + Example +
+
+const vector<int,double> vec(1,2.0);
+assert(remove<double>(vec) == make_vector(1));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/remove_if.html b/doc/html/fusion/algorithm/transformation/functions/remove_if.html new file mode 100644 index 00000000..de7c3010 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/remove_if.html @@ -0,0 +1,171 @@ + + + +remove_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence, containing all the elements of the original except + those where a given unary function object evaluates to true. +

+
+ + Synopsis +
+
+template<
+    typename Pred,
+    typename Sequence
+    >
+typename result_of::remove_if<Sequence const, Pred>::type remove_if(Sequence const& seq);
+
+
+

Table 1.60. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A model of unary MPL + Lambda Expression +

+
+

+ Removal predicate +

+
+
+
+ + Expression + Semantics +
+
+remove_if<Pred>(seq);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + all the elements of seq, + in their original order, except those elements with types for which + Pred evaluates to boost::mpl::true_. Equivalent to filter<boost::mpl::not_<Pred> + >(seq). +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/remove_if.hpp>
+#include <boost/fusion/include/remove_if.hpp>
+
+
+ + Example +
+
+const vector<int,double> vec(1,2.0);
+assert(remove_if<is_floating_point<mpl::_> >(vec) == make_vector(1));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/replace.html b/doc/html/fusion/algorithm/transformation/functions/replace.html new file mode 100644 index 00000000..23001b52 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/replace.html @@ -0,0 +1,190 @@ + + + +replace + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Replaces each value within a sequence of a given type and value with + a new value. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+typename result_of::replace<Sequence const, T>::type replace(
+    Sequence const& seq, T const& old_value, T const& new_value);
+
+
+

Table 1.57. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence, e == old_value + is a valid expression, convertible to bool, + for each element e + in seq with type + convertible to T +

+
+

+ Operation's argument +

+
+

+ old_value +

+
+

+ Any type +

+
+

+ Value to replace +

+
+

+ new_value +

+
+

+ Any type +

+
+

+ Replacement value +

+
+
+
+ + Expression + Semantics +
+
+replace(seq, old_value, new_value);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence with + all the values of seq + with new_value assigned + to elements with the same type and equal to old_value. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/replace.hpp>
+#include <boost/fusion/include/replace.hpp>
+
+
+ + Example +
+
+assert(replace(make_vector(1,2), 2, 3) == make_vector(1,3));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/replace_if.html b/doc/html/fusion/algorithm/transformation/functions/replace_if.html new file mode 100644 index 00000000..45044eab --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/replace_if.html @@ -0,0 +1,199 @@ + + + +replace_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Replaces each element of a given sequence for which an unary function + object evaluates to true + replaced with a new value. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F,
+    typename T>
+typename result_of::replace_if<Sequence const, F, T>::type replace_if(
+    Sequence const& seq, F f, T const& new_value);
+
+
+

Table 1.58. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ A function object for which f(e) is a valid expression, convertible + to bool, for each + element e in seq +

+
+

+ Operation's argument +

+
+

+ new_value +

+
+

+ Any type +

+
+

+ Replacement value +

+
+
+
+ + Expression + Semantics +
+
+replace_if(seq, f, new_value);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence with + all the elements of seq, + with new_value assigned + to each element for which f + evaluates to true. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/replace_if.hpp>
+#include <boost/fusion/include/replace_if.hpp>
+
+
+ + Example +
+
+struct odd
+{
+    template<typename T>
+    bool operator()(T t) const
+    {
+        return t % 2;
+    }
+};
+...
+assert(replace_if(make_vector(1,2), odd(), 3) == make_vector(3,2));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/reverse.html b/doc/html/fusion/algorithm/transformation/functions/reverse.html new file mode 100644 index 00000000..11bf809c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/reverse.html @@ -0,0 +1,146 @@ + + + +reverse + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a new sequence with the elements of the original in reverse order. +

+
+ + Synposis +
+
+template<
+    typename Sequence
+    >
+typename result_of::reverse<Sequence const>::type reverse(Sequence const& seq);
+
+
+

Table 1.61. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Bidirectional + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+reverse(seq);
+
+

+ Return type: A model of Bidirectional + Sequence. +

+

+ Semantics: Returns a new sequence containing + all the elements of seq + in reverse order. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/reverse.hpp>
+#include <boost/fusion/include/reverse.hpp>
+
+
+ + Example +
+
+assert(reverse(make_vector(1,2,3)) == make_vector(3,2,1));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/transform.html b/doc/html/fusion/algorithm/transformation/functions/transform.html new file mode 100644 index 00000000..135e5489 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/transform.html @@ -0,0 +1,297 @@ + + + +transform + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a sequence seq and + function object or function pointer f, + transform returns a new + sequence with elements created by applying f(e) to each element of e + of seq. +

+
+ + Unary + version synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::transform<Sequence const, F>::type transform(
+    Sequence const& seq, F f);
+
+
+

Table 1.55. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ f(e) + is a valid expression for each element e + of seq. boost::result_of<F(E)>::type is the return type of f when called with a value of + each element type E. +

+
+

+ Transformation function +

+
+
+
+ + Expression + Semantics +
+
+transform(seq, f);
+
+

+ Return type: A model of Forward + Sequence +

+

+ Semantics: Returns a new sequence, containing + the return values of f(e) for each element e + within seq. +

+
+ + Binary + version synopsis +
+
+template<
+    typename Sequence1,
+    typename Sequence2,
+    typename F
+    >
+typename result_of::transform<Sequence1 const, Sequence2 const, F>::type transform(
+    Sequence1 const& seq1, Sequence2 const& seq2, F f);
+
+
+

Table 1.56. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq1 +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ seq2 +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ f(e1,e2) + is a valid expression for each pair of elements e1 + of seq1 and e2 of seq2. + boost::result_of<F(E1,E2)>::type is the return type of f when called with elements of + type E1 and E2 +

+
+

+ Transformation function +

+
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + the return values of f(e1, e2) for each pair of elements e1 and e2 + within seq1 and seq2 respectively. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/transform.hpp>
+#include <boost/fusion/include/transform.hpp>
+
+
+ + Example +
+
+struct triple
+{
+    typedef int result_type;
+
+    int operator()(int t) const
+    {
+        return t * 3;
+    };
+};
+...
+assert(transform(make_vector(1,2,3), triple()) == make_vector(3,6,9));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/functions/zip.html b/doc/html/fusion/algorithm/transformation/functions/zip.html new file mode 100644 index 00000000..199ab464 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/functions/zip.html @@ -0,0 +1,158 @@ + + + +zip + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+zip
+
+ + Description +
+

+ Zips sequences together to form a single sequence, whos members are tuples + of the members of the component sequences. +

+
+ + Synopsis +
+
+template<
+    typename Sequence1,
+    typename Sequence2,
+    ...
+    typename SequenceN
+    >
+typename result_of::zip<Sequence1, Sequence2, ... SequenceN>::type
+zip(Sequence1 const& seq1, Sequence2 const& seq2, ... SequenceN const& seqN);
+
+
+

Table 1.68. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq1 to seqN +

+
+

+ Each sequence is a model of Forward + Sequence. +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+zip(seq1, seq2, ... seqN);
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + tuples of elements from sequences seq1 + to seqN. For example, + applying zip to tuples (1, 2, 3) + and ('a', 'b', + 'c') + would return ((1, 'a'),(2, 'b'),(3, + 'c')) +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/zip.hpp>
+#include <boost/fusion/include/zip.hpp>
+
+
+ + Example +
+
+vector<int,char> v1(1, 'a');
+vector<int,char> v2(2, 'b');
+assert(zip(v1, v2) == make_vector(make_vector(1, 2),make_vector('a', 'b'));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions.html b/doc/html/fusion/algorithm/transformation/metafunctions.html new file mode 100644 index 00000000..9ffc7d57 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions.html @@ -0,0 +1,64 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/clear.html b/doc/html/fusion/algorithm/transformation/metafunctions/clear.html new file mode 100644 index 00000000..8fb27b3c --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/clear.html @@ -0,0 +1,139 @@ + + + +clear + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of clear, given the input sequence + type. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+struct clear
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.82. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::clear<Sequence>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns an empty sequence. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/clear.hpp>
+#include <boost/fusion/include/clear.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/erase.html b/doc/html/fusion/algorithm/transformation/metafunctions/erase.html new file mode 100644 index 00000000..c32a4b43 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/erase.html @@ -0,0 +1,196 @@ + + + +erase + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ Returns the result type of erase, given the input sequence + and range delimiting iterator types. +

+
+ + Description +
+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename It1,
+    typename It2 = unspecified>
+struct erase
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.83. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ It1 +

+
+

+ A model of Forward + Iterator +

+
+

+ Operation's argument +

+
+

+ It2 +

+
+

+ A model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::erase<Sequence, It1>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence with + the element at It1 removed. +

+
+result_of::erase<Sequence, It1, It2>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence with + the elements between It1 + and It2 removed. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/erase.hpp>
+#include <boost/fusion/include/erase.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/erase_key.html b/doc/html/fusion/algorithm/transformation/metafunctions/erase_key.html new file mode 100644 index 00000000..85a718b6 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/erase_key.html @@ -0,0 +1,163 @@ + + + +erase_key + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of erase_key, given the sequence + and key types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Key
+    >
+struct erase_key
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.84. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Associative + Sequence +

+
+

+ Operation's argument +

+
+

+ Key +

+
+

+ Any type +

+
+

+ Key type +

+
+
+
+ + Expression + Semantics +
+
+result_of::erase_key<Sequence, Key>::type
+
+

+ Return type: A model of Associative + Sequence. +

+

+ Semantics: Returns a sequence with the + elements of Sequence, + except those with key Key. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/erase_key.hpp>
+#include <boost/fusion/include/erase_key.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/filter.html b/doc/html/fusion/algorithm/transformation/metafunctions/filter.html new file mode 100644 index 00000000..ba16d426 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/filter.html @@ -0,0 +1,165 @@ + + + +filter + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of filter given the sequence type + and type to retain. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct filter
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.73. Parameter

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Type to retain +

+
+
+
+ + Expression + Semantics +
+
+result_of::filter<Sequence, T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + the elements of Sequence + that are of type T. Equivalent + to result_of::filter_if<Sequence, + boost::is_same<mpl::_, T> >::type. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/filter.hpp>
+#include <boost/fusion/include/filter.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/filter_if.html b/doc/html/fusion/algorithm/transformation/metafunctions/filter_if.html new file mode 100644 index 00000000..602f8fa4 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/filter_if.html @@ -0,0 +1,166 @@ + + + +filter_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of filter_if given the sequence + and unary MPL + Lambda Expression predicate type. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Pred
+    >
+struct filter_if
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.74. Parameter

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A unary MPL + Lambda Expression +

+
+

+ Type to retain +

+
+
+
+ + Expression + Semantics +
+
+result_of::filter_if<Sequence, Pred>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + the elements of Sequence + for which Pred evaluates + to boost::mpl::true_. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/filter_if.hpp>
+#include <boost/fusion/include/filter_if.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/insert.html b/doc/html/fusion/algorithm/transformation/metafunctions/insert.html new file mode 100644 index 00000000..5bce505a --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/insert.html @@ -0,0 +1,184 @@ + + + +insert + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of insert, given the sequence, + position iterator and insertion types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Position,
+    typename T
+    >
+struct insert
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.85. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Position +

+
+

+ A model of Forward + Iterator +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::insert<Sequence, Position, T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with an + element of type T inserted + at position Position + in Sequence. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/insert.hpp>
+#include <boost/fusion/include/insert.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/insert_range.html b/doc/html/fusion/algorithm/transformation/metafunctions/insert_range.html new file mode 100644 index 00000000..236e8355 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/insert_range.html @@ -0,0 +1,186 @@ + + + +insert_range + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of insert_range, given the input + sequence, position iterator and insertion range types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Position,
+    typename Range
+    >
+struct insert_range
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.86. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Position +

+
+

+ A model of Forward + Iterator +

+
+

+ Operation's argument +

+
+

+ Range +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::insert_range<Sequence, Position, Range>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with the + elements of Range inserted + at position Position + into Sequence. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/insert_range.hpp>
+#include <boost/fusion/include/insert_range.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/join.html b/doc/html/fusion/algorithm/transformation/metafunctions/join.html new file mode 100644 index 00000000..0c8f3fb3 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/join.html @@ -0,0 +1,98 @@ + + + +join + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result of joining 2 sequences, given the sequence types. +

+
+ + Synopsis +
+
+template<
+    typename LhSequence,
+    typename RhSequence
+    >
+struct join
+{
+    typedef unspecified type;
+};
+
+
+ + Expression + Semantics +
+
+result_of::join<LhSequence, RhSequence>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + the elements of LhSequence + followed by the elements of RhSequence. + The order of the elements in the 2 sequences is preserved. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/join.hpp>
+#include <boost/fusion/include/join.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/pop_back.html b/doc/html/fusion/algorithm/transformation/metafunctions/pop_back.html new file mode 100644 index 00000000..48bc70d6 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/pop_back.html @@ -0,0 +1,143 @@ + + + +pop_back + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of pop_back, given the input sequence + type. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+struct pop_back
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.87. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::pop_back<Sequence>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with all + the elements of Sequence + except the last element. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/tranformation/pop_back.hpp>
+#include <boost/fusion/include/pop_back.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/pop_front.html b/doc/html/fusion/algorithm/transformation/metafunctions/pop_front.html new file mode 100644 index 00000000..a6d0a6ce --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/pop_front.html @@ -0,0 +1,138 @@ + + + +pop_front + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of pop_front, given the input sequence + type. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+struct pop_front
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.88. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::pop_front<Sequence>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with all + the elements of Sequence + except the first element. +

+
+ + Complexity +
+

+ Constant. +

+

+ /algorithm/transformation/pop_front.hpp> +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/push_back.html b/doc/html/fusion/algorithm/transformation/metafunctions/push_back.html new file mode 100644 index 00000000..0f6c814d --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/push_back.html @@ -0,0 +1,159 @@ + + + +push_back + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of push_back, given the types of + the input sequence and element to push. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct push_back
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.89. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::push_back<Sequence, T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with the + elements of Sequence + and an element of type T + added to the end. +

+
+ + Complexity +
+

+ Constant. +

+

+ /algorithm/transformation/push_back.hpp> +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/push_front.html b/doc/html/fusion/algorithm/transformation/metafunctions/push_front.html new file mode 100644 index 00000000..1809423b --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/push_front.html @@ -0,0 +1,159 @@ + + + +push_front + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of push_front, given the types + of the input sequence and element to push. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct push_front
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.90. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::push_front<Sequence, T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence with the + elements of Sequence + and an element of type T + added to the beginning. +

+
+ + Complexity +
+

+ Constant. +

+

+ /algorithm/transformation/push_front.hpp> +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/remove.html b/doc/html/fusion/algorithm/transformation/metafunctions/remove.html new file mode 100644 index 00000000..667c78ce --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/remove.html @@ -0,0 +1,165 @@ + + + +remove + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of remove, given the sequence and + removal types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct remove
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.79. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ Remove elements of this type +

+
+
+
+ + Expression + Semantics +
+
+result_of::remove<Sequence, T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + the elements of Sequence + not of type T. Equivalent + to result_of::replace_if<Sequence, + boost::is_same<mpl::_, T> >::type. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/remove.hpp>
+#include <boost/fusion/include/remove.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/remove_if.html b/doc/html/fusion/algorithm/transformation/metafunctions/remove_if.html new file mode 100644 index 00000000..d5959258 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/remove_if.html @@ -0,0 +1,166 @@ + + + +remove_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of remove_if, given the input sequence + and unary MPL + Lambda Expression predicate types. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename Pred
+    >
+struct remove_if
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.80. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ Pred +

+
+

+ A model of unary MPL + Lambda Expression +

+
+

+ Remove elements which evaluate to boost::mpl::true_ +

+
+
+
+ + Expression + Semantics +
+
+result_of::remove_if<Sequence, Pred>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a sequence containing + the elements of Sequence + for which Pred evaluates + to boost::mpl::false_. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/remove_if.hpp>
+#include <boost/fusion/include/remove_if.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/replace.html b/doc/html/fusion/algorithm/transformation/metafunctions/replace.html new file mode 100644 index 00000000..e30d64c8 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/replace.html @@ -0,0 +1,162 @@ + + + +replace + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of replace, given the types of + the input sequence and element to replace. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename T
+    >
+struct replace
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.77. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ T +

+
+

+ Any type +

+
+

+ The type of the search and replacement objects +

+
+
+
+ + Expression + Semantics +
+
+result_of::replace<Sequence,T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns the return type of + replace. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/replace.hpp>
+#include <boost/fusion/include/replace.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/replace_if.html b/doc/html/fusion/algorithm/transformation/metafunctions/replace_if.html new file mode 100644 index 00000000..5f1d7401 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/replace_if.html @@ -0,0 +1,183 @@ + + + +replace_if + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of replace_if, given the types + of the sequence, Polymorphic + Function Object predicate and replacement object. +

+
+ + Synopsis +
+
+template<
+    typename Sequence,
+    typename F,
+    typename T>
+struct replace_if
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.78. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ F +

+
+

+ A model of unary Polymorphic + Function Object +

+
+

+ Replacement predicate +

+
+

+ T +

+
+

+ Any type +

+
+

+ The type of the replacement object +

+
+
+
+ + Expression + Semantics +
+
+result_of::replace_if<Sequence,F,T>::type
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns the return type of + replace_if. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/replace_if.hpp>
+#include <boost/fusion/include/replace_if.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/reverse.html b/doc/html/fusion/algorithm/transformation/metafunctions/reverse.html new file mode 100644 index 00000000..6937de0e --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/reverse.html @@ -0,0 +1,142 @@ + + + +reverse + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of reverse, given the input sequence + type. +

+
+ + Synopsis +
+
+template<
+    typename Sequence
+    >
+struct reverse
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.81. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A model of Bidirectional + Sequence +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::reverse<Sequence>::type
+
+

+ Return type: A model of Bidirectional + Sequence. +

+

+ Semantics: Returns a sequence with the + elements in the reverse order to Sequence. +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/reverse.hpp>
+#include <boost/fusion/include/reverse.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/transform.html b/doc/html/fusion/algorithm/transformation/metafunctions/transform.html new file mode 100644 index 00000000..04477d12 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/transform.html @@ -0,0 +1,297 @@ + + + +transform + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ For a sequence seq and + function object or function pointer f, + transform returns a new + sequence with elements created by applying f(e) to each element of e + of seq. +

+
+ + Unary + version synopsis +
+
+template<
+    typename Sequence,
+    typename F
+    >
+typename result_of::transform<Sequence const, F>::type transform(
+    Sequence const& seq, F f);
+
+
+

Table 1.75. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ f(e) + is a valid expression for each element e + of seq. boost::result_of<F(E)>::type is the return type of f when called with a value of + each element type E. +

+
+

+ Transformation function +

+
+
+
+ + Expression + Semantics +
+
+transform(seq, f);
+
+

+ Return type: A model of Forward + Sequence +

+

+ Semantics: Returns a new sequence, containing + the return values of f(e) for each element e + within seq. +

+
+ + Binary + version synopsis +
+
+template<
+    typename Sequence1,
+    typename Sequence2,
+    typename F
+    >
+typename result_of::transform<Sequence1 const, Sequence2 const, F>::type transform(
+    Sequence1 const& seq1, Sequence2 const& seq2, F f);
+
+
+

Table 1.76. Parameters

+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq1 +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ seq2 +

+
+

+ A model of Forward + Sequence +

+
+

+ Operation's argument +

+
+

+ f +

+
+

+ f(e1,e2) + is a valid expression for each pair of elements e1 + of seq1 and e2 of seq2. + boost::result_of<F(E1,E2)>::type is the return type of f when called with elements of + type E1 and E2 +

+
+

+ Transformation function +

+
+
+

+ Return type: A model of Forward + Sequence. +

+

+ Semantics: Returns a new sequence, containing + the return values of f(e1, e2) for each pair of elements e1 and e2 + within seq1 and seq2 respectively. +

+
+ + Complexity +
+

+ Constant. Returns a view which is lazily evaluated. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/transform.hpp>
+#include <boost/fusion/include/transform.hpp>
+
+
+ + Example +
+
+struct triple
+{
+    typedef int result_type;
+
+    int operator()(int t) const
+    {
+        return t * 3;
+    };
+};
+...
+assert(transform(make_vector(1,2,3), triple()) == make_vector(3,6,9));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/algorithm/transformation/metafunctions/zip.html b/doc/html/fusion/algorithm/transformation/metafunctions/zip.html new file mode 100644 index 00000000..840c9039 --- /dev/null +++ b/doc/html/fusion/algorithm/transformation/metafunctions/zip.html @@ -0,0 +1,105 @@ + + + +zip + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+
+zip
+
+ + Description +
+

+ Zips sequences together to form a single sequence, whos members are tuples + of the members of the component sequences. +

+
+ + Synopsis +
+
+template<
+    typename Sequence1,
+    typename Sequence2,
+    ...
+    typename SequenceN
+    >
+struct zip
+{
+    typedef unspecified type;
+};
+
+
+ + Expression + Semantics +
+
+result_of::zip<Sequence1, Sequence2, ... SequenceN>::type
+
+

+ Return type: A model of the most restrictive + traversal category of sequences Sequence1 + to SequenceN. +

+

+ Semantics: Return a sequence containing + tuples of elements from each sequence. For example, applying zip to tuples + (1, 2, + 3) + and ('a', 'b', + 'c') + would return ((1, 'a'),(2, 'b'),(3, + 'c')) +

+
+ + Complexity +
+

+ Constant. +

+
+ + Header +
+
+#include <boost/fusion/algorithm/transformation/zip.hpp>
+#include <boost/fusion/include/zip.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/change_log.html b/doc/html/fusion/change_log.html index b21a629f..0964a7a2 100644 --- a/doc/html/fusion/change_log.html +++ b/doc/html/fusion/change_log.html @@ -2,7 +2,7 @@ Change log - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,21 +31,40 @@
  • Sep 27, 2006: Added boost::tuple - support. + support. (Joel de Guzman)
  • Nov 17, 2006: Added boost::variant - support. + support. (Joel de Guzman)
  • - Feb 15, 2007: Added functional module. + 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)
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/container.html b/doc/html/fusion/container.html new file mode 100644 index 00000000..ad50b704 --- /dev/null +++ b/doc/html/fusion/container.html @@ -0,0 +1,74 @@ + + + +Container + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Fusion provides a few predefined sequences out of the box. These containers + actually hold heterogenously typed data; unlike Views. + These containers are more or less counterparts of those in STL. +

+

+ + Header +

+
+#include <boost/fusion/container.hpp>
+#include <boost/fusion/include/container.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/cons.html b/doc/html/fusion/container/cons.html new file mode 100644 index 00000000..d257fb55 --- /dev/null +++ b/doc/html/fusion/container/cons.html @@ -0,0 +1,324 @@ + + + +cons + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ cons is a simple Forward + Sequence. It is a lisp style recursive list structure where car is the head and + cdr is the tail: + usually another cons structure or nil: + the empty list. Fusion's list is built on top of this more + primitive data structure. It is more efficient than vector when the target sequence + is constructed piecemeal (a data at a time). The runtime cost of access to + each element is peculiarly constant (see Recursive + Inlined Functions). +

+

+ + Header +

+
+#include <boost/fusion/container/list/cons.hpp>
+#include <boost/fusion/include/cons.hpp>
+
+

+ + Synopsis +

+
+template <typename Car, typename Cdr = nil>
+struct cons;
+
+

+ + Template parameters +

+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Description +

+
+

+ Default +

+
+

+ Car +

+
+

+ Head type +

+
+

+

+
+

+ Cdr +

+
+

+ Tail type +

+
+

+ nil +

+
+

+ + Model of +

+ +
+

Notation

+
+
nil
+

+ An empty cons +

+
C
+

+ A cons type +

+
l, + l2
+

+ Instances of cons +

+
car
+

+ An arbitrary data +

+
cdr
+

+ Another cons list +

+
s
+

+ A Forward Sequence +

+
N
+

+ An MPL + Integral Constant +

+
+
+

+ + Expression Semantics +

+

+ Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ nil() +

+
+

+ Creates an empty list. +

+
+

+ C() +

+
+

+ Creates a cons with default constructed elements. +

+
+

+ C(car) +

+
+

+ Creates a cons with car + head and default constructed tail. +

+
+

+ C(car, + cdr) +

+
+

+ Creates a cons with car + head and cdr tail. +

+
+

+ C(s) +

+
+

+ Copy constructs a cons from a Forward + Sequence, s. +

+
+

+ l = + s +

+
+

+ Assigns to a cons, l, + from a Forward + Sequence, s. +

+
+

+ at<N>(l) +

+
+

+ The Nth element from the beginning of the sequence; see at. +

+
+ +

+ + Example +

+
+cons<int, cons<float> > l(12, cons<float>(5.5f));
+std::cout << at_c<0>(l) << std::endl;
+std::cout << at_c<1>(l) << std::endl;
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion.html b/doc/html/fusion/container/conversion.html new file mode 100644 index 00000000..31f53102 --- /dev/null +++ b/doc/html/fusion/container/conversion.html @@ -0,0 +1,58 @@ + + + +Conversion + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ All fusion sequences can be converted to one of the Container + types using one of these conversion functions. +

+

+ + Header +

+
+#include <boost/fusion/include/convert.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/functions.html b/doc/html/fusion/container/conversion/functions.html new file mode 100644 index 00000000..63cc387c --- /dev/null +++ b/doc/html/fusion/container/conversion/functions.html @@ -0,0 +1,49 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/functions/as_list.html b/doc/html/fusion/container/conversion/functions/as_list.html new file mode 100644 index 00000000..0c763d69 --- /dev/null +++ b/doc/html/fusion/container/conversion/functions/as_list.html @@ -0,0 +1,138 @@ + + + +as_list + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Convert a fusion sequence to a list. +

+
+ + Synopsis +
+
+template <typename Sequence>
+typename result_of::as_list<Sequence>::type
+as_list(Sequence& seq);
+
+template <typename Sequence>
+typename result_of::as_list<Sequence const>::type
+as_list(Sequence const& seq);
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ An instance of Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+as_list(seq);
+
+

+ Return type: result_of::as_list<Sequence>::type +

+

+ Semantics: Convert a fusion sequence, + seq, to a list. +

+
+ + Header +
+
+#include <boost/fusion/container/list/convert.hpp>
+#include <boost/fusion/include/as_list.hpp>
+
+
+ + Example +
+
+as_list(make_vector('x', 123, "hello"))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/functions/as_map.html b/doc/html/fusion/container/conversion/functions/as_map.html new file mode 100644 index 00000000..3748d16e --- /dev/null +++ b/doc/html/fusion/container/conversion/functions/as_map.html @@ -0,0 +1,145 @@ + + + +as_map + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Convert a fusion sequence to a map. +

+
+ + Synopsis +
+
+template <typename Sequence>
+typename result_of::as_map<Sequence>::type
+as_map(Sequence& seq);
+
+template <typename Sequence>
+typename result_of::as_map<Sequence const>::type
+as_map(Sequence const& seq);
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ An instance of Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+as_map(seq);
+
+

+ Return type: result_of::as_map<Sequence>::type +

+

+ Semantics: Convert a fusion sequence, + seq, to a map. +

+

+ Precondition: The elements of the sequence + are assumed to be __fusionpair_s. + There may be no duplicate fusion::pair key types. +

+
+ + Header +
+
+#include <boost/fusion/container/map/convert.hpp>
+#include <boost/fusion/include/as_map.hpp>
+
+
+ + Example +
+
+as_map(make_vector(
+    make_pair<int>('X')
+  , make_pair<double>("Men")))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/functions/as_set.html b/doc/html/fusion/container/conversion/functions/as_set.html new file mode 100644 index 00000000..5df2befb --- /dev/null +++ b/doc/html/fusion/container/conversion/functions/as_set.html @@ -0,0 +1,142 @@ + + + +as_set + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Convert a fusion sequence to a set. +

+
+ + Synopsis +
+
+template <typename Sequence>
+typename result_of::as_set<Sequence>::type
+as_set(Sequence& seq);
+
+template <typename Sequence>
+typename result_of::as_set<Sequence const>::type
+as_set(Sequence const& seq);
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ An instance of Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+as_set(seq);
+
+

+ Return type: result_of::as_set<Sequence>::type +

+

+ Semantics: Convert a fusion sequence, + seq, to a set. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/set/convert.hpp>
+#include <boost/fusion/include/as_set.hpp>
+
+
+ + Example +
+
+as_set(make_vector('x', 123, "hello"))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/functions/as_vector.html b/doc/html/fusion/container/conversion/functions/as_vector.html new file mode 100644 index 00000000..38c553a9 --- /dev/null +++ b/doc/html/fusion/container/conversion/functions/as_vector.html @@ -0,0 +1,138 @@ + + + +as_vector + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Convert a fusion sequence to a vector. +

+
+ + Synopsis +
+
+template <typename Sequence>
+typename result_of::as_vector<Sequence>::type
+as_vector(Sequence& seq);
+
+template <typename Sequence>
+typename result_of::as_vector<Sequence const>::type
+as_vector(Sequence const& seq);
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ seq +

+
+

+ An instance of Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+as_vector(seq);
+
+

+ Return type: result_of::as_vector<Sequence>::type +

+

+ Semantics: Convert a fusion sequence, + seq, to a vector. +

+
+ + Header +
+
+#include <boost/fusion/container/vector/convert.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+
+ + Example +
+
+as_vector(make_list('x', 123, "hello"))
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/metafunctions.html b/doc/html/fusion/container/conversion/metafunctions.html new file mode 100644 index 00000000..fc5e7fc0 --- /dev/null +++ b/doc/html/fusion/container/conversion/metafunctions.html @@ -0,0 +1,49 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/metafunctions/as_list.html b/doc/html/fusion/container/conversion/metafunctions/as_list.html new file mode 100644 index 00000000..da828883 --- /dev/null +++ b/doc/html/fusion/container/conversion/metafunctions/as_list.html @@ -0,0 +1,134 @@ + + + +as_list + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of as_list. +

+
+ + Synopsis +
+
+template <typename Sequence>
+struct as_list;
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A fusion Sequence +

+
+

+ The sequence type to convert. +

+
+
+ + Expression + Semantics +
+
+result_of::as_list<Sequence>::type;
+
+

+ Return type: A list with same elements as the + input sequence, Sequence. +

+

+ Semantics: Convert a fusion sequence, + Sequence, to a list. +

+
+ + Header +
+
+#include <boost/fusion/container/list/convert.hpp>
+#include <boost/fusion/include/as_list.hpp>
+
+
+ + Example +
+
+result_of::as_list<vector<char, int> >::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/metafunctions/as_map.html b/doc/html/fusion/container/conversion/metafunctions/as_map.html new file mode 100644 index 00000000..b109321d --- /dev/null +++ b/doc/html/fusion/container/conversion/metafunctions/as_map.html @@ -0,0 +1,141 @@ + + + +as_map + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of as_map. +

+
+ + Synopsis +
+
+template <typename Sequence>
+struct as_map;
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A fusion Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+result_of::as_map<Sequence>::type;
+
+

+ Return type: A map with same elements as the + input sequence, Sequence. +

+

+ Semantics: Convert a fusion sequence, + Sequence, to a map. +

+

+ Precondition: The elements of the sequence + are assumed to be __fusionpair_s. + There may be no duplicate fusion::pair key types. +

+
+ + Header +
+
+#include <boost/fusion/container/map/convert.hpp>
+#include <boost/fusion/include/as_map.hpp>
+
+
+ + Example +
+
+result_of::as_map<vector<
+    fusion::pair<int, char>
+  , fusion::pair<double, std::string> > >::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/metafunctions/as_set.html b/doc/html/fusion/container/conversion/metafunctions/as_set.html new file mode 100644 index 00000000..b0813dc8 --- /dev/null +++ b/doc/html/fusion/container/conversion/metafunctions/as_set.html @@ -0,0 +1,138 @@ + + + +as_set + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of as_set. +

+
+ + Synopsis +
+
+template <typename Sequence>
+struct as_set;
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A fusion Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+result_of::as_set<Sequence>::type;
+
+

+ Return type: A set with same elements as the + input sequence, Sequence. +

+

+ Semantics: Convert a fusion sequence, + Sequence, to a set. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/set/convert.hpp>
+#include <boost/fusion/include/as_set.hpp>
+
+
+ + Example +
+
+result_of::as_set<vector<char, int> >::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/conversion/metafunctions/as_vector.html b/doc/html/fusion/container/conversion/metafunctions/as_vector.html new file mode 100644 index 00000000..54eb2fa9 --- /dev/null +++ b/doc/html/fusion/container/conversion/metafunctions/as_vector.html @@ -0,0 +1,134 @@ + + + +as_vector + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of as_vector. +

+
+ + Synopsis +
+
+template <typename Sequence>
+struct as_vector;
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Sequence +

+
+

+ A fusion Sequence +

+
+

+ The sequence to convert. +

+
+
+ + Expression + Semantics +
+
+result_of::as_vector<Sequence>::type;
+
+

+ Return type: A vector with same elements as + the input sequence, Sequence. +

+

+ Semantics: Convert a fusion sequence, + Sequence, to a vector. +

+
+ + Header +
+
+#include <boost/fusion/container/vector/convert.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+
+
+ + Example +
+
+result_of::as_vector<list<char, int> >::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation.html b/doc/html/fusion/container/generation.html new file mode 100644 index 00000000..81cf6840 --- /dev/null +++ b/doc/html/fusion/container/generation.html @@ -0,0 +1,58 @@ + + + +Generation + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ These are the functions that you can use to generate various forms of Container from elemental values. +

+

+ + Header +

+
+#include <boost/fusion/container/generation.hpp>
+#include <boost/fusion/include/generation.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions.html b/doc/html/fusion/container/generation/functions.html new file mode 100644 index 00000000..da076b46 --- /dev/null +++ b/doc/html/fusion/container/generation/functions.html @@ -0,0 +1,54 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/list_tie.html b/doc/html/fusion/container/generation/functions/list_tie.html new file mode 100644 index 00000000..cb73d6ce --- /dev/null +++ b/doc/html/fusion/container/generation/functions/list_tie.html @@ -0,0 +1,149 @@ + + + +list_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Constructs a tie using a list sequence. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+list<T0&, T1&,... TN&>
+list_tie(T0& x0, T1& x1... TN& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_LIST_SIZE + elements, where FUSION_MAX_LIST_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_LIST_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_LIST_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to list_tie +

+
+
+ + Expression + Semantics +
+
+list_tie(x0, x1,... xN);
+
+

+ Return type: list<T0&, T1&,... + TN&> +

+

+ Semantics: Create a list of references from x0, x1,... xN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/list_tie.hpp>
+#include <boost/fusion/include/list_tie.hpp>
+
+
+ + Example +
+
+int i = 123;
+double d = 123.456;
+list_tie(i, d)
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/make_cons.html b/doc/html/fusion/container/generation/functions/make_cons.html new file mode 100644 index 00000000..2462133c --- /dev/null +++ b/doc/html/fusion/container/generation/functions/make_cons.html @@ -0,0 +1,168 @@ + + + +make_cons + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Create a cons + from car (head) + and optional cdr (tail). +

+
+ + Synopsis +
+
+template <typename Car>
+typename result_of::make_cons<Car>::type
+make_cons(Car const& car);
+
+template <typename Car, typename Cdr>
+typename result_of::make_cons<Car, Cdr>::type
+make_cons(Car const& car, Cdr const& cdr);
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ car +

+
+

+ Instance of Car +

+
+

+ The list's head +

+
+

+ cdr +

+
+

+ Instance of Cdr +

+
+

+ The list's tail (optional) +

+
+
+ + Expression + Semantics +
+
+make_cons(car, cdr);
+
+

+ Return type: result_of::make_cons<Car, Cdr>::type or result_of::make_cons<Car>::type +

+

+ Semantics: Create a cons from car + (head) and optional cdr + (tail). +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_cons.hpp>
+#include <boost/fusion/include/make_cons.hpp>
+
+
+ + Example +
+
+make_cons('x', make_cons(123))
+
+
+ + See + also +
+

+ boost::ref +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/make_list.html b/doc/html/fusion/container/generation/functions/make_list.html new file mode 100644 index 00000000..49ca486d --- /dev/null +++ b/doc/html/fusion/container/generation/functions/make_list.html @@ -0,0 +1,155 @@ + + + +make_list + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Create a list + from one or more values. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+typename result_of::make_list<T0, T1,... TN>::type
+make_list(T0 const& x0, T1 const& x1... TN const& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_LIST_SIZE + elements, where FUSION_MAX_LIST_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_LIST_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_LIST_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to make_list +

+
+
+ + Expression + Semantics +
+
+make_list(x0, x1,... xN);
+
+

+ Return type: result_of::make_list<T0, T1,... TN>::type +

+

+ Semantics: Create a list from x0, x1,... xN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_list.hpp>
+#include <boost/fusion/include/make_list.hpp>
+
+
+ + Example +
+
+make_list(123, "hello", 12.5)
+
+
+ + See + also +
+

+ boost::ref +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/make_map.html b/doc/html/fusion/container/generation/functions/make_map.html new file mode 100644 index 00000000..8b202e40 --- /dev/null +++ b/doc/html/fusion/container/generation/functions/make_map.html @@ -0,0 +1,196 @@ + + + +make_map + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Create a map + from one or more key/data pairs. +

+
+ + Synopsis +
+
+template <
+    typename K0, typename K1,... typename KN
+  , typename T0, typename T1,... typename TN>
+typename result_of::make_map<K0, K0,... KN, T0, T1,... TN>::type
+make_map(T0 const& x0, T1 const& x1... TN const& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + [10] + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ K0, + K1,... + KN +

+
+

+ The key types +

+
+

+ Keys associated with x0, x1,... xN +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to make_map +

+
+
+ + Expression + Semantics +
+
+make_map<K0, K1,... KN>(x0, x1,... xN);
+
+

+ Return type: result_of::make_map<K0, K0,... KN, T0, T1,... TN>::type +

+

+ Semantics: Create a map from K0, K1,... KN + keys and x0, + x1,... + xN data. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_map.hpp>
+#include <boost/fusion/include/make_map.hpp>
+
+
+ + Example +
+
+make_map(
+    make_pair<int>('X')
+  , make_pair<double>("Men"))
+
+
+ + See + also +
+

+ boost::ref, + fusion::pair +

+
+

+

[10] + map is implemented + in terms of the vector. That is why we reuse FUSION_MAX_VECTOR_SIZE +

+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/make_set.html b/doc/html/fusion/container/generation/functions/make_set.html new file mode 100644 index 00000000..833359b4 --- /dev/null +++ b/doc/html/fusion/container/generation/functions/make_set.html @@ -0,0 +1,167 @@ + + + +make_set + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Create a set + from one or more values. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+typename result_of::make_set<T0, T1,... TN>::type
+make_set(T0 const& x0, T1 const& x1... TN const& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + [9] + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to make_set +

+
+
+ + Expression + Semantics +
+
+make_set(x0, x1,... xN);
+
+

+ Return type: result_of::make_set<T0, T1,... TN>::type +

+

+ Semantics: Create a set from x0, x1,... xN. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_set.hpp>
+#include <boost/fusion/include/make_set.hpp>
+
+
+ + Example +
+
+make_set(123, "hello", 12.5)
+
+
+ + See + also +
+

+ boost::ref +

+
+

+

[9] + set is implemented + in terms of the vector. That is why we reuse FUSION_MAX_VECTOR_SIZE +

+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/make_vector.html b/doc/html/fusion/container/generation/functions/make_vector.html new file mode 100644 index 00000000..c51e7fa5 --- /dev/null +++ b/doc/html/fusion/container/generation/functions/make_vector.html @@ -0,0 +1,155 @@ + + + +make_vector + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Create a vector + from one or more values. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+typename result_of::make_vector<T0, T1,... TN>::type
+make_vector(T0 const& x0, T1 const& x1... TN const& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to make_vector +

+
+
+ + Expression + Semantics +
+
+make_vector(x0, x1,... xN);
+
+

+ Return type: result_of::make_vector<T0, T1,... TN>::type +

+

+ Semantics: Create a vector from x0, x1,... xN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_vector.hpp>
+#include <boost/fusion/include/make_vector.hpp>
+
+
+ + Example +
+
+make_vector(123, "hello", 12.5)
+
+
+ + See + also +
+

+ boost::ref +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/map_tie.html b/doc/html/fusion/container/generation/functions/map_tie.html new file mode 100644 index 00000000..87173dfa --- /dev/null +++ b/doc/html/fusion/container/generation/functions/map_tie.html @@ -0,0 +1,175 @@ + + + +map_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Constructs a tie using a map sequence. +

+
+ + Synopsis +
+
+template <typename K0, typename K1,... typename KN, typename D0, typename D1,... typename DN>
+map<pair<K0, D0&>, pair<K1, D1&>,... pair<KN, DN&> >
+map_tie(D0& d0, D1& d1... DN& dN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_MAP_SIZE + elements, where FUSION_MAX_MAP_SIZE + is a user definable predefined maximum that defaults to 10, and a corresponding number of key types. + You may define the preprocessor constant FUSION_MAX_MAP_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_MAP_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ K0, + K1,... + KN +

+
+

+ Any type +

+
+

+ The key types associated with each of the x1,x2,...,xN + values +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to map_tie +

+
+
+ + Expression + Semantics +
+
+map_tie<K0, K1,... KN>(x0, x1,... xN);
+
+

+ Return type: map<pair<K0, D0&>, pair<K1, + D1&>,... pair<KN, + DN&> > +

+

+ Semantics: Create a map of references from x0, x1,... xN with keys K0, K1,... KN +

+
+ + Header +
+
+#include <boost/fusion/container/generation/map_tie.hpp>
+#include <boost/fusion/include/map_tie.hpp>
+
+
+ + Example +
+
+struct int_key;
+struct double_key;
+...
+int i = 123;
+double d = 123.456;
+map_tie<int_key, double_key>(i, d)
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/tiers.html b/doc/html/fusion/container/generation/functions/tiers.html new file mode 100644 index 00000000..548bb727 --- /dev/null +++ b/doc/html/fusion/container/generation/functions/tiers.html @@ -0,0 +1,105 @@ + + + +Tiers + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ Tiers are sequences, where all elements are non-const reference types. + They are constructed with a call to a couple of tie + function templates. The succeeding sections document the various tier + flavors. +

+ +

+ Example: +

+
+int i; char c; double d;
+  ...
+vector_tie(i, c, a);
+
+

+ The vector_tie function creates + a vector + of type vector<int&, char&, double&>. The same result could be achieved + with the call make_vector(ref(i), ref(c), ref(a)) + [11] + . +

+

+ A tie can be used to 'unpack' another tuple into + variables. E.g.: +

+
+int i; char c; double d;
+vector_tie(i, c, d) = make_vector(1,'a', 5.5);
+std::cout << i << " " <<  c << " " << d;
+
+

+ This code prints 1 a 5.5 to the standard output stream. A sequence unpacking + operation like this is found for example in ML and Python. It is convenient + when calling functions which return sequences. +

+
+ + Ignore +
+

+ There is also an object called ignore which allows + you to ignore an element assigned by a sequence. The idea is that a function + may return a sequence, only part of which you are interested in. For + example: +

+
+char c;
+vector_tie(ignore, c) = make_vector(1, 'a');
+
+
+

+

[11] + see Boost.Ref + for details about ref +

+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/functions/vector_tie.html b/doc/html/fusion/container/generation/functions/vector_tie.html new file mode 100644 index 00000000..0bd4d472 --- /dev/null +++ b/doc/html/fusion/container/generation/functions/vector_tie.html @@ -0,0 +1,149 @@ + + + +vector_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Constructs a tie using a vector sequence. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+vector<T0&, T1&,... TN&>
+vector_tie(T0& x0, T1& x1... TN& xN);
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ x0, + x1,... + xN +

+
+

+ Instances of T0, T1,... TN +

+
+

+ The arguments to vector_tie +

+
+
+ + Expression + Semantics +
+
+vector_tie(x0, x1,... xN);
+
+

+ Return type: vector<T0&, T1&,... + TN&> +

+

+ Semantics: Create a vector of references from x0, x1,... xN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/vector_tie.hpp>
+#include <boost/fusion/include/vector_tie.hpp>
+
+
+ + Example +
+
+int i = 123;
+double d = 123.456;
+vector_tie(i, d)
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions.html b/doc/html/fusion/container/generation/metafunctions.html new file mode 100644 index 00000000..0d62c1f0 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions.html @@ -0,0 +1,53 @@ + + + +MetaFunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/list_tie.html b/doc/html/fusion/container/generation/metafunctions/list_tie.html new file mode 100644 index 00000000..9ee4acfc --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/list_tie.html @@ -0,0 +1,146 @@ + + + +list_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of list_tie. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+struct list_tie;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_LIST_SIZE + elements, where FUSION_MAX_LIST_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_LIST_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_LIST_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ The arguments to list_tie +

+
+
+ + Expression + Semantics +
+
+result_of::list_tie<T0, T1,... TN>::type;
+
+

+ Return type: list<T0&, T1&,... + TN&> +

+

+ Semantics: Create a list of references from T0, T1,... TN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/list_tie.hpp>
+#include <boost/fusion/include/list_tie.hpp>
+
+
+ + Example +
+
+result_of::list_tie<int, double>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/make_cons.html b/doc/html/fusion/container/generation/metafunctions/make_cons.html new file mode 100644 index 00000000..7865c497 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/make_cons.html @@ -0,0 +1,155 @@ + + + +make_cons + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of make_cons. +

+
+ + Synopsis +
+
+template <typename Car, typename Cdr = nil>
+struct make_cons;
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ Car +

+
+

+ Any type +

+
+

+ The list's head type +

+
+

+ Cdr +

+
+

+ A cons +

+
+

+ The list's tail type (optional) +

+
+
+ + Expression + Semantics +
+
+result_of::make_cons<Car, Cdr>::type
+
+

+ Return type: A cons with head element, Car, of type converted following the + rules for element + conversion, and tail, Cdr. +

+

+ Semantics: Create a cons from Car + (head) and optional Cdr + (tail). +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_cons.hpp>
+#include <boost/fusion/include/make_cons.hpp>
+
+
+ + Example +
+
+result_of::make_cons<char, result_of::make_cons<int>::type>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/make_list.html b/doc/html/fusion/container/generation/metafunctions/make_list.html new file mode 100644 index 00000000..43db74f4 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/make_list.html @@ -0,0 +1,147 @@ + + + +make_list + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of make_list. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+struct make_list;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_LIST_SIZE + elements, where FUSION_MAX_LIST_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_LIST_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_LIST_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ Template arguments to make_list +

+
+
+ + Expression + Semantics +
+
+result_of::make_list<T0, T1,... TN>::type
+
+

+ Return type: A list with elements of types + converted following the rules for element + conversion. +

+

+ Semantics: Create a list from T0, T1,... TN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_list.hpp>
+#include <boost/fusion/include/make_list.hpp>
+
+
+ + Example +
+
+result_of::make_list<int, const char(&)[7], double>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/make_map.html b/doc/html/fusion/container/generation/metafunctions/make_map.html new file mode 100644 index 00000000..d4d83836 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/make_map.html @@ -0,0 +1,190 @@ + + + +make_map + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of make_map. +

+
+ + Synopsis +
+
+template <
+    typename K0, typename K1,... typename KN
+  , typename T0, typename T1,... typename TN>
+struct make_map;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + [13] + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ K0, + K1,... + KN +

+
+

+ Any type +

+
+

+ Keys associated with T0, T1,... TN +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ Data associated with keys K0, K1,... KN +

+
+
+ + Expression + Semantics +
+
+resulf_of::make_map<K0, K1,... KN, T0, T1,... TN>::type;
+
+

+ Return type: result_of::make_map<K0, K0,... KN, T0, T1,... TN>::type +

+

+ Semantics: A map with fusion::pair elements where the second_type is converted following + the rules for element + conversion. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_map.hpp>
+#include <boost/fusion/include/make_map.hpp>
+
+
+ + Example +
+
+result_of::make_map<int, double, char, double>::type
+
+
+ + See + also +
+

+ fusion::pair +

+
+

+

[13] + map is implemented + in terms of the vector. That is why we reuse FUSION_MAX_VECTOR_SIZE +

+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/make_set.html b/doc/html/fusion/container/generation/metafunctions/make_set.html new file mode 100644 index 00000000..85ffe4e6 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/make_set.html @@ -0,0 +1,159 @@ + + + +make_set + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of make_set. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+struct make_set;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + [12] + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ The arguments to make_set +

+
+
+ + Expression + Semantics +
+
+result_of::make_set<T0, T1,... TN>::type
+
+

+ Return type: A set with elements of types converted + following the rules for element + conversion. +

+

+ Semantics: Create a set from T0, T1,... TN. +

+

+ Precondition: There may be no duplicate + key types. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_set.hpp>
+#include <boost/fusion/include/make_set.hpp>
+
+
+ + Example +
+
+result_of::make_set<int, char, double>::type
+
+
+

+

[12] + set is implemented + in terms of the vector. That is why we reuse FUSION_MAX_VECTOR_SIZE +

+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/make_vector.html b/doc/html/fusion/container/generation/metafunctions/make_vector.html new file mode 100644 index 00000000..a03c568b --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/make_vector.html @@ -0,0 +1,147 @@ + + + +make_vector + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of make_vector. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+struct make_vector;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ Template arguments to make_vector +

+
+
+ + Expression + Semantics +
+
+result_of::make_vector<T0, T1,... TN>::type
+
+

+ Return type: A vector with elements of types + converted following the rules for element + conversion. +

+

+ Semantics: Create a vector from T0, T1,... TN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/make_list.hpp>
+#include <boost/fusion/include/make_list.hpp>
+
+
+ + Example +
+
+result_of::make_vector<int, const char(&)[7], double>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/map_tie.html b/doc/html/fusion/container/generation/metafunctions/map_tie.html new file mode 100644 index 00000000..b41c1ba8 --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/map_tie.html @@ -0,0 +1,171 @@ + + + +map_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of map_tie. +

+
+ + Synopsis +
+
+template <typename K0, typename K1,... typename KN, typename D0, typename D1,... typename DN>
+struct map_tie;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_MAP_SIZE + elements, where FUSION_MAX_MAP_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_MAP_SIZE before + including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_MAP_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ K0, + K1,... + KN +

+
+

+ Any type +

+
+

+ The key types for map_tie +

+
+

+ D0, + D1,... + DN +

+
+

+ Any type +

+
+

+ The arguments types for map_tie +

+
+
+ + Expression + Semantics +
+
+result_of::map_tie<K0, K1,... KN, D0, D1,... DN>::type;
+
+

+ Return type: map<pair<K0, D0&>, pair<K1, + D1&>,... pair<KN, + DN&> > +

+

+ Semantics: Create a map of references from D0, D1,... DN with keys K0, K1,... KN +

+
+ + Header +
+
+#include <boost/fusion/container/generation/map_tie.hpp>
+#include <boost/fusion/include/map_tie.hpp>
+
+
+ + Example +
+
+struct int_key;
+struct double_key;
+...
+result_of::map_tie<int_key, double_key, int, double>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/generation/metafunctions/vector_tie.html b/doc/html/fusion/container/generation/metafunctions/vector_tie.html new file mode 100644 index 00000000..01797d8f --- /dev/null +++ b/doc/html/fusion/container/generation/metafunctions/vector_tie.html @@ -0,0 +1,146 @@ + + + +vector_tie + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the result type of vector_tie. +

+
+ + Synopsis +
+
+template <typename T0, typename T1,... typename TN>
+struct vector_tie;
+
+

+ The variadic function accepts 0 + to FUSION_MAX_VECTOR_SIZE + elements, where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. You may define the preprocessor constant + FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+
+ + Parameters +
+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ T0, + T1,... + TN +

+
+

+ Any type +

+
+

+ The arguments to vector_tie +

+
+
+ + Expression + Semantics +
+
+result_of::vector_tie<T0, T1,... TN>::type;
+
+

+ Return type: vector<T0&, T1&,... + TN&> +

+

+ Semantics: Create a vector of references from T0, T1,... TN. +

+
+ + Header +
+
+#include <boost/fusion/container/generation/vector_tie.hpp>
+#include <boost/fusion/include/vector_tie.hpp>
+
+
+ + Example +
+
+result_of::vector_tie<int, double>::type
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/list.html b/doc/html/fusion/container/list.html new file mode 100644 index 00000000..ec9a83e1 --- /dev/null +++ b/doc/html/fusion/container/list.html @@ -0,0 +1,291 @@ + + + +list + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ list is a Forward + Sequence of heterogenous typed data built on top of cons. It is more efficient than + vector + when the target sequence is constructed piecemeal (a data at a time). The + runtime cost of access to each element is peculiarly constant (see Recursive Inlined Functions). +

+

+ + Header +

+
+#include <boost/fusion/container/list.hpp>
+#include <boost/fusion/include/list.hpp>
+#include <boost/fusion/container/list/list_fwd.hpp>
+#include <boost/fusion/include/list_fwd.hpp>
+
+

+ + Synopsis +

+
+template <
+    typename T0 = unspecified
+  , typename T1 = unspecified
+  , typename T2 = unspecified
+    ...
+  , typename TN = unspecified
+>
+struct list;
+
+

+ The variadic class interface accepts 0 + to FUSION_MAX_LIST_SIZE elements, + where FUSION_MAX_LIST_SIZE + is a user definable predefined maximum that defaults to 10. + Example: +

+
+list<int, char, double>
+
+

+ You may define the preprocessor constant FUSION_MAX_LIST_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_LIST_SIZE 20
+
+

+ + Template parameters +

+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Description +

+
+

+ Default +

+
+

+ T0...TN +

+
+

+ Element types +

+
+

+ unspecified-type +

+
+

+ + Model of +

+ +
+

Notation

+
+
L
+

+ A list type +

+
l
+

+ An instance of list +

+
e0...en
+

+ Heterogeneous values +

+
s
+

+ A Forward Sequence +

+
N
+

+ An MPL + Integral Constant +

+
+
+

+ + Expression Semantics +

+

+ Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ L() +

+
+

+ Creates a list with default constructed elements. +

+
+

+ L(e0, e1,... + en) +

+
+

+ Creates a list with elements e0...en. +

+
+

+ L(s) +

+
+

+ Copy constructs a list from a Forward + Sequence, s. +

+
+

+ l = + s +

+
+

+ Assigns to a list, l, + from a Forward + Sequence, s. +

+
+

+ at<N>(l) +

+
+

+ The Nth element from the beginning of the sequence; see at. +

+
+ +

+ + Example +

+
+list<int, float> l(12, 5.5f);
+std::cout << at_c<0>(l) << std::endl;
+std::cout << at_c<1>(l) << std::endl;
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/map.html b/doc/html/fusion/container/map.html new file mode 100644 index 00000000..ff01a0c8 --- /dev/null +++ b/doc/html/fusion/container/map.html @@ -0,0 +1,280 @@ + + + +map + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+

+map

+

+ + Description +

+

+ map is an Associative + Sequence of heteregenous typed data elements. Each element is a key/data + pair (see fusion::pair) + where the key has no data (type only). Type identity is used to impose an + equivalence relation on keys. A map may contain at most one element for each + key. Membership testing and element key lookup has constant runtime complexity + (see Overloaded Functions). +

+

+ + Header +

+
+#include <boost/fusion/container/map.hpp>
+#include <boost/fusion/include/map.hpp>
+#include <boost/fusion/container/map_fwd.hpp>
+#include <boost/fusion/include/map_fwd.hpp>
+
+

+ + Synopsis +

+
+template <
+    typename T0 = unspecified
+  , typename T1 = unspecified
+  , typename T2 = unspecified
+    ...
+  , typename TN = unspecified
+>
+struct map;
+
+

+ The variadic class interface accepts 0 + to FUSION_MAX_MAP_SIZE elements, + where FUSION_MAX_MAP_SIZE + is a user definable predefined maximum that defaults to 10. + Example: +

+
+map<pair<int, char>, pair<char, char>, pair<double, char> >
+
+

+ You may define the preprocessor constant FUSION_MAX_MAP_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_MAP_SIZE 20
+
+

+ + Template parameters +

+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Description +

+
+

+ Default +

+
+

+ T0...TN +

+
+

+ Element types +

+
+

+ unspecified-type +

+
+

+ + Model of +

+ +
+

Notation

+
+
M
+

+ A map type +

+
m
+

+ An instance of map +

+
e0...en
+

+ Heterogeneous key/value pairs (see fusion::pair) +

+
s
+

+ A Forward Sequence +

+
+
+

+ + Expression Semantics +

+

+ Semantics of an expression is defined only where it differs from, or is not + defined in Random + Access Sequence and Associative + Sequence. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ M() +

+
+

+ Creates a map with default constructed elements. +

+
+

+ M(e0, e1,... + en) +

+
+

+ Creates a map with element pairs e0...en. +

+
+

+ M(s) +

+
+

+ Copy constructs a map from a Forward + Sequence s. +

+
+

+ m = + s +

+
+

+ Assigns to a map, m, + from a Forward + Sequence s. +

+
+

+ + Example +

+
+typedef map<
+    pair<int, char>
+  , pair<double, std::string> >
+map_type;
+
+map_type m(
+    make_pair<int>('X')
+  , make_pair<double>("Men"));
+
+std::cout << at_key<int>(m) << std::endl;
+std::cout << at_key<double>(m) << std::endl;
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/set.html b/doc/html/fusion/container/set.html new file mode 100644 index 00000000..61fba0c4 --- /dev/null +++ b/doc/html/fusion/container/set.html @@ -0,0 +1,273 @@ + + + +set + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+

+set

+

+ + Description +

+

+ set is an Associative + Sequence of heteregenous typed data elements. Type identity is used + to impose an equivalence relation on keys. The element's type is its key. + A set may contain at most one element for each key. Membership testing and + element key lookup has constant runtime complexity (see Overloaded + Functions). +

+

+ + Header +

+
+#include <boost/fusion/container/set.hpp>
+#include <boost/fusion/include/set.hpp>
+#include <boost/fusion/container/set_fwd.hpp>
+#include <boost/fusion/include/set_fwd.hpp>
+
+

+ + Synopsis +

+
+template <
+    typename T0 = unspecified
+  , typename T1 = unspecified
+  , typename T2 = unspecified
+    ...
+  , typename TN = unspecified
+>
+struct set;
+
+

+ The variadic class interface accepts 0 + to FUSION_MAX_SET_SIZE elements, + where FUSION_MAX_SET_SIZE + is a user definable predefined maximum that defaults to 10. + Example: +

+
+set<int, char, double>
+
+

+ You may define the preprocessor constant FUSION_MAX_SET_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_SET_SIZE 20
+
+

+ + Template parameters +

+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Description +

+
+

+ Default +

+
+

+ T0...TN +

+
+

+ Element types +

+
+

+ unspecified-type +

+
+

+ + Model of +

+ +
+

Notation

+
+
S
+

+ A set type +

+
s
+

+ An instance of set +

+
e0...en
+

+ Heterogeneous values +

+
fs
+

+ A Forward Sequence +

+
+
+

+ + Expression Semantics +

+

+ Semantics of an expression is defined only where it differs from, or is not + defined in Random + Access Sequence and Associative + Sequence. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ S() +

+
+

+ Creates a set with default constructed elements. +

+
+

+ S(e0, e1,... + en) +

+
+

+ Creates a set with elements e0...en. +

+
+

+ S(fs) +

+
+

+ Copy constructs a set from a Forward + Sequence fs. +

+
+

+ s = + fs +

+
+

+ Assigns to a set, s, + from a Forward + Sequence fs. +

+
+

+ + Example +

+
+typedef set<int, float> S;
+S s(12, 5.5f);
+std::cout << at_key<int>(s) << std::endl;
+std::cout << at_key<float>(s) << std::endl;
+std::cout << result_of::has_key<S, double>::value << std::endl;
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/container/vector.html b/doc/html/fusion/container/vector.html new file mode 100644 index 00000000..b4ab929d --- /dev/null +++ b/doc/html/fusion/container/vector.html @@ -0,0 +1,307 @@ + + + +vector + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ vector is a Random + Access Sequence of heterogenous typed data structured as a simple + struct where each element is + held as a member variable. vector + is the simplest of the Fusion sequence container, and in many cases the most + efficient. +

+

+ + Header +

+
+#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/include/vector_fwd.hpp>
+
+// numbered forms
+#include <boost/fusion/container/vector/vector10.hpp>
+#include <boost/fusion/include/vector10.hpp>
+#include <boost/fusion/container/vector/vector20.hpp>
+#include <boost/fusion/include/vector20.hpp>
+#include <boost/fusion/container/vector/vector30.hpp>
+#include <boost/fusion/include/vector30.hpp>
+#include <boost/fusion/container/vector/vector40.hpp>
+#include <boost/fusion/include/vector40.hpp>
+#include <boost/fusion/container/vector/vector50.hpp>
+#include <boost/fusion/include/vector50.hpp>
+
+

+ + Synopsis +

+

+ Numbered forms +

+
+template <>
+struct vector0;
+
+template <typename T0>
+struct vector1;
+
+template <typename T0, typename T1>
+struct vector2;
+
+template <typename T0, typename T1, typename T2>
+struct vector3;
+
+...
+
+template <typename T0, typename T1, typename T2..., typename TN>
+struct vectorN;
+
+

+ Variadic form +

+
+template <
+    typename T0 = unspecified
+  , typename T1 = unspecified
+  , typename T2 = unspecified
+    ...
+  , typename TN = unspecified
+>
+struct vector;
+
+

+ The numbered form accepts the exact number of elements. Example: +

+
+vector3<int, char, double>
+
+

+ The variadic form accepts 0 to + FUSION_MAX_VECTOR_SIZE elements, + where FUSION_MAX_VECTOR_SIZE + is a user definable predefined maximum that defaults to 10. + Example: +

+
+vector<int, char, double>
+
+

+ You may define the preprocessor constant FUSION_MAX_VECTOR_SIZE + before including any Fusion header to change the default. Example: +

+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+

+ + Template parameters +

+
+++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Description +

+
+

+ Default +

+
+

+ T0...TN +

+
+

+ Element types +

+
+

+ unspecified +

+
+

+ + Model of +

+ +
+

Notation

+
+
v
+

+ Instance of vector +

+
V
+

+ A vector type +

+
e0...en
+

+ Heterogeneous values +

+
s
+

+ A Forward Sequence +

+
+
+

+ + Expression Semantics +

+

+ Semantics of an expression is defined only where it differs from, or is not + defined in Random + Access Sequence. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ V() +

+
+

+ Creates a vector with default constructed elements. +

+
+

+ V(e0, e1,... + en) +

+
+

+ Creates a vector with elements e0...en. +

+
+

+ V(s) +

+
+

+ Copy constructs a vector from a Forward + Sequence, s. +

+
+

+ v = + s +

+
+

+ Assigns to a vector, v, + from a Forward + Sequence, s. +

+
+

+ + Example +

+
+vector<int, float> v(12, 5.5f);
+std::cout << at_c<0>(v) << std::endl;
+std::cout << at_c<1>(v) << std::endl;
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/extension.html b/doc/html/fusion/extension.html index 6187ce86..5c2a61b6 100644 --- a/doc/html/fusion/extension.html +++ b/doc/html/fusion/extension.html @@ -2,535 +2,47 @@ Extension - + - - + + - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

-PrevUpHomeNext +PrevUpHomeNext
-

- 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: -

-
    -
  1. - Enable the tag dispatching - mechanism used by Fusion for your sequence type -
  2. -
  3. - Design an iterator type for the sequence -
  4. -
  5. - Provide specialized behaviour for the intrinsic operations of the new Fusion - sequence -
  6. -
-

- - 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. -

-

- - 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>
-
-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 conjuction 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/sequence/adapted/mpl/tag_of.hpp>
-
-

- - 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: -

-
    -
  1. - The iterator is parameterized by the type it is iterating over, and the index - of the current element. -
  2. -
  3. - The typedefs struct_type - and index provide convenient - access to information we will need later in the implementation. -
  4. -
  5. - The typedef category allows - the traits::category_of - metafunction to establish the traversal category of the iterator. -
  6. -
  7. - The constructor stores a reference to the example_struct - being iterated over. -
  8. -
-

- 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. -

-

- - 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 value_of: -

-
-template <typename Iterator>
-struct value_of
-    : extension::value_of_impl<typename detail::tag_of<Iterator>::type>::
-        template apply<Iterator>
-{};
-
-

- So 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 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]Note

- Although there is a fair amount of left to do to produce a fully fledged - Fusion sequence, value_of and deref illustrate all the signficant - concepts required. The remainder of the process is very repetitive, simply - requiring implementation of a suitable xxxx_impl - for each feature xxxx. -

-

- - Implementing - the remaining iterator functionality -

-

- Ok, now we have seen the way 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. -

-

- - 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. -

-

- - Enabling - our type as an associative container -

-

- In order for example_struct - to serve as an associative container, we need to enable 3 lookup features, - at_key, value_at_key and has_key. We also need to provide an - implementation of the is_associative - trait so that our sequence can be correctly identified as an associative container. -

-

- To implement at_key_impl we - need to associate the fields::age 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 value_at_key_impl - and has_key_impl are equally - straightforward, and are provided in the example code, along with an implementation - of is_associative_impl. -

-

- - 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 container. - The implementation was slightly longwinded, 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. -

+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

-PrevUpHomeNext +PrevUpHomeNext
diff --git a/doc/html/fusion/extension/ext_full.html b/doc/html/fusion/extension/ext_full.html new file mode 100644 index 00000000..879138c3 --- /dev/null +++ b/doc/html/fusion/extension/ext_full.html @@ -0,0 +1,545 @@ + + + + The Full Extension Mechanism + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ 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: +

+
    +
  1. + Enable the tag dispatching + mechanism used by Fusion for your sequence type +
  2. +
  3. + Design an iterator type for the sequence +
  4. +
  5. + Provide specialized behaviour for the intrinsic operations of the new Fusion + sequence +
  6. +
+

+ + 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. +

+

+ + 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 conjuction 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>
+
+

+ + 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: +

+
    +
  1. + The iterator is parameterized by the type it is iterating over, and the + index of the current element. +
  2. +
  3. + The typedefs struct_type + and index provide convenient + access to information we will need later in the implementation. +
  4. +
  5. + The typedef category allows + the traits::category_of + metafunction to establish the traversal category of the iterator. +
  6. +
  7. + The constructor stores a reference to the example_struct + being iterated over. +
  8. +
+

+ 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. +

+

+ + 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 value_of: +

+
+template <typename Iterator>
+struct value_of
+    : extension::value_of_impl<typename detail::tag_of<Iterator>::type>::
+        template apply<Iterator>
+{};
+
+

+ So 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 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]Note

+ Although there is a fair amount of left to do to produce a fully fledged + Fusion sequence, value_of and deref illustrate all the signficant + concepts required. The remainder of the process is very repetitive, simply + requiring implementation of a suitable xxxx_impl + for each feature xxxx. +

+

+ + Implementing + the remaining iterator functionality +

+

+ Ok, now we have seen the way 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. +

+

+ + 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. +

+

+ + Enabling + our type as an associative container +

+

+ In order for example_struct + to serve as an associative container, we need to enable 3 lookup features, + at_key, value_at_key and has_key. We also need to provide + an implementation of the is_associative + trait so that our sequence can be correctly identified as an associative + container. +

+

+ To implement at_key_impl + we need to associate the fields::age 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 value_at_key_impl + and has_key_impl are equally + straightforward, and are provided in the example code, along with an implementation + of is_associative_impl. +

+

+ + 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 container. + The implementation was slightly longwinded, 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. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/extension/iterator_facade.html b/doc/html/fusion/extension/iterator_facade.html new file mode 100644 index 00000000..ce1c74f7 --- /dev/null +++ b/doc/html/fusion/extension/iterator_facade.html @@ -0,0 +1,398 @@ + + + +Iterator Facade + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ The iterator_facade + template provides an intrusive mechanism for producing a conforming Fusion + iterator. +

+

+ + Synopsis +

+
+template<typename Derived, typename TravesalTag>
+struct iterator_facade;
+
+

+ + 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 the implement the key expressions required by their iterator + type. +

+
+

Table 1.93. Parameters

+ ++++ + + + + + + + + + + + + + + +
+

+ Name +

+
+

+ Description +

+
+

+ iterator, It, It1, + It2 +

+
+

+ A type derived from iterator_facade +

+
+

+ N +

+
+

+ An MPL + Integral Constant +

+
+
+
+

Table 1.94. 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 +

+
+

+ The distance between iterators of type It1 + and It2 +

+
+

+ boost::same_type<It1, It2>::type +

+
+

+ iterator::template equal_to<It1, It2>::call(it1, it2) +

+
+

+ The distance between iterators it1 + and it2 +

+
+

+ boost::same_type<It1, It2>::type() +

+
+
+

+ + Header +

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

+ + Example +

+

+ A full working example using iterator_facade is provided in triple.cpp + in the extension examples. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/extension/sequence_facade.html b/doc/html/fusion/extension/sequence_facade.html new file mode 100644 index 00000000..23a08090 --- /dev/null +++ b/doc/html/fusion/extension/sequence_facade.html @@ -0,0 +1,276 @@ + + + +Sequence Facade + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +

+ + Description +

+

+ The sequence_facade + template provides an intrusive mechanism for producing a conforming Fusion + iterator. +

+

+ + Synopsis +

+
+template<typename Derived, typename TravesalTag, typename IsView = mpl::false_>
+struct sequence_facade;
+
+

+ + 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 the implement the key expressions required by their sequence + type. +

+
+

Table 1.91. Parameters

+ ++++ + + + + + + + + + + + + + + +
+

+ Name +

+
+

+ Description +

+
+

+ sequence, Seq +

+
+

+ A type derived from sequence_facade +

+
+

+ N +

+
+

+ An MPL + Integral Constant +

+
+
+
+

Table 1.92. 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 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 Nth + element in a sequence of type Seq +

+
+
+

+ + Include +

+
+#include <boost/fusion/sequence/sequence_facade.hpp>
+#include <boost/fusion/include/sequence_facade.hpp>
+
+

+ + Example +

+

+ A full working example using sequence_facade is provided in triple.cpp + in the extension examples. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/functional.html b/doc/html/fusion/functional.html index be17d634..d5ad9ee6 100644 --- a/doc/html/fusion/functional.html +++ b/doc/html/fusion/functional.html @@ -2,25 +2,25 @@ Functional - + - + - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

-PrevUpHomeNext +PrevUpHomeNext

@@ -61,15 +61,11 @@ Components to call functions and function objects and to make Fusion code callable through a function object interface.

-

- - Header -

-
-#include <boost/fusion/functional.hpp>
-
+

+ /functional.hpp> +

- + Fused and unfused forms

@@ -84,7 +80,7 @@

Although the C++ syntax does not allow to replace (a,b,c) - with some Fusion Sequence, introducing + with some Fusion Sequence, introducing yet another function provides a solution:

@@ -106,7 +102,7 @@
       form of f'.
     

- + Calling functions and function objects

@@ -124,7 +120,7 @@ Transforming an unfused function into its fused counterpart allows n-ary calls from an algorithm that invokes an unary Polymorphic - Function Object with Sequence + Function Object with Sequence arguments.

@@ -134,7 +130,7 @@ instance for the given argument.

- + Making Fusion code callable through a function object interface

@@ -154,12 +150,16 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

-PrevUpHomeNext +PrevUpHomeNext
diff --git a/doc/html/fusion/functional/adapters.html b/doc/html/fusion/functional/adapters.html index ae619462..6b152eb6 100644 --- a/doc/html/fusion/functional/adapters.html +++ b/doc/html/fusion/functional/adapters.html @@ -2,7 +2,7 @@ Adapters - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -41,8 +41,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/fused.html b/doc/html/fusion/functional/adapters/fused.html index 11971f4b..53e548d3 100644 --- a/doc/html/fusion/functional/adapters/fused.html +++ b/doc/html/fusion/functional/adapters/fused.html @@ -2,7 +2,7 @@ fused - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -34,7 +34,7 @@ Object">Polymorphic Function Object adapter template for Deferred - Callable Object target functions. It takes a Forward Sequence that contains the arguments for the target function.

@@ -55,15 +55,11 @@ be defined (Boost provides this function for std::auto_ptr and boost::shared_ptr).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/fused.hpp>
-
+

+ /functional/adapter/fused.hpp> +

- + Synopsis
@@ -71,7 +67,7 @@
 class fused;
 
- + Template parameters
@@ -118,7 +114,7 @@
- + Model of
    @@ -144,7 +140,7 @@

    s

    - A Sequence of arguments that + A Sequence of arguments that are accepted by r

    f
    @@ -154,7 +150,7 @@
- + Expression Semantics
@@ -218,15 +214,15 @@
- + Example
 fused< std::plus<long> > f;
-assert(f(make_vector(1,2l)) == 3l);
+assert(f(make_vector(1,2l)) == 3l);
 
- + See also
    @@ -238,8 +234,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/fused_function_object.html b/doc/html/fusion/functional/adapters/fused_function_object.html index 29f32254..40b73855 100644 --- a/doc/html/fusion/functional/adapters/fused_function_object.html +++ b/doc/html/fusion/functional/adapters/fused_function_object.html @@ -2,7 +2,7 @@ fused_function_object - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -34,7 +34,7 @@ Object">Polymorphic Function Object adapter template for a Polymorphic - Function Object target function. It takes a Forward Sequence that contains the arguments for the target function.

@@ -45,15 +45,11 @@ for an target function object that is const or, if the target function object is held by value, the adapter is const).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/fused_function_object.hpp>
-
+

+ /functional/adapter/fused_function_object.hpp> +

- + Synopsis
@@ -61,7 +57,7 @@
 class fused_function_object;
 
- + Template parameters
@@ -108,7 +104,7 @@
- + Model of
@@ -135,7 +131,7 @@

s

- A Sequence of arguments that + A Sequence of arguments that are accepted by r

f
@@ -145,7 +141,7 @@
- + Expression Semantics
@@ -209,18 +205,18 @@
- + Example
 template<class SeqOfSeqs, class Func>
-typename result_of::transform< zip_view<SeqOfSeqs> const,
+typename result_of::transform< zip_view<SeqOfSeqs> const,
     fused_function_object<Func const &> >::type
 n_ary_transform(SeqOfSeqs const & s, Func const & f)
 {
-    return transform(zip_view<SeqOfSeqs>(s), 
+    return transform(zip_view<SeqOfSeqs>(s),
         fused_function_object<Func const &>(f));
-} 
+}
 
 struct sub
 {
@@ -228,7 +224,7 @@
     struct result;
 
     template <class Self, typename T>
-    struct result< Self(T,T) > 
+    struct result< Self(T,T) >
     { typedef typename remove_reference<T>::type type; };
 
     template<typename T>
@@ -240,14 +236,14 @@
 
 void try_it()
 {
-    vector<int,float> a(2,2.0f);
-    vector<int,float> b(1,1.5f);
-    vector<int,float> c(1,0.5f);
-    assert(c == n_ary_transform(vector_tie(a,b), sub()));
+    vector<int,float> a(2,2.0f);
+    vector<int,float> b(1,1.5f);
+    vector<int,float> c(1,0.5f);
+    assert(c == n_ary_transform(vector_tie(a,b), sub()));
 }
 
- + See also
@@ -261,8 +257,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/fused_procedure.html b/doc/html/fusion/functional/adapters/fused_procedure.html index d8a83368..11f3c6d9 100644 --- a/doc/html/fusion/functional/adapters/fused_procedure.html +++ b/doc/html/fusion/functional/adapters/fused_procedure.html @@ -2,7 +2,7 @@ fused_procedure - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,14 +26,14 @@
- + Description

An unary Polymorphic Function Object adapter template for Callable - Object target functions. It takes a Forward Sequence that contains the arguments for the target function.

@@ -62,15 +62,11 @@ such a pointer without returning anything does not make sense, so this case is not implemented).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/fused_procedure.hpp>
-
+

+ /functional/adapter/fused_procedure.hpp> +

- + Synopsis
@@ -78,7 +74,7 @@
 class fused_procedure;
 
- + Template parameters
@@ -124,7 +120,7 @@
- + Model of
@@ -150,7 +146,7 @@

s

- A Sequence of arguments that + A Sequence of arguments that are accepted by r

f
@@ -160,7 +156,7 @@
- + Expression Semantics
@@ -224,28 +220,28 @@
- + Example
 template<class SequenceOfSequences, class Func>
 void n_ary_for_each(SequenceOfSequences const & s, Func const & f)
 {
-    for_each(zip_view<SequenceOfSequences>(s), 
+    for_each(zip_view<SequenceOfSequences>(s),
         fused_procedure<Func const &>(f));
-} 
+}
 
 void try_it()
 {
-    vector<int,float> a(2,2.0f);
-    vector<int,float> b(1,1.5f);
+    vector<int,float> a(2,2.0f);
+    vector<int,float> b(1,1.5f);
     using namespace boost::lambda;
-    n_ary_for_each(vector_tie(a,b), _1 -= _2);
-    assert(a == make_vector(1,0.5f));
+    n_ary_for_each(vector_tie(a,b), _1 -= _2);
+    assert(a == make_vector(1,0.5f));
 }
 
- + See also
@@ -258,8 +254,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/unfused_generic.html b/doc/html/fusion/functional/adapters/unfused_generic.html index cb2e3738..b632d7b1 100644 --- a/doc/html/fusion/functional/adapters/unfused_generic.html +++ b/doc/html/fusion/functional/adapters/unfused_generic.html @@ -2,7 +2,7 @@ unfused_generic - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -35,7 +35,7 @@ Object adapter template for an unary Polymorphic Function Object target function. When called, its arguments are - bundled to a Random Access Sequence of references that is passed to the target function. Non-const LValue arguments are transported as references to non-const, @@ -54,15 +54,11 @@ if the target function object is const - or, in case the target function object is held by value, the adapter is const).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/unfused_generic.hpp>
-
+

+ /functional/adapter/unfused_generic.hpp> +

- + Synopsis
@@ -70,7 +66,7 @@
 class unfused_generic;
 
- + Template parameters
@@ -117,7 +113,7 @@
- + Model of
@@ -158,7 +154,7 @@
- + Expression Semantics
@@ -214,15 +210,15 @@

Calls f with a - Sequence that contains - references to the arguments a0...aN. + Sequence that contains references + to the arguments a0...aN.

- + Example
@@ -254,11 +250,11 @@
 };
 
 template <typename Function, typename T>
-unfused_generic< fused_bound_1st<Function,T> > 
+unfused_generic< fused_bound_1st<Function,T> >
 bind_1st(Function f, T const & x)
 {
     return unfused_generic< fused_bound_1st<Function,T> >(
-        fused_bound_1st<Function,T>(f,x) ); 
+        fused_bound_1st<Function,T>(f,x) );
 }
 
 int test_func(int a, int b, int c)
@@ -273,7 +269,7 @@
 }
 
- + See also
@@ -287,8 +283,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/unfused_lvalue_args.html b/doc/html/fusion/functional/adapters/unfused_lvalue_args.html index af36414c..05e7deec 100644 --- a/doc/html/fusion/functional/adapters/unfused_lvalue_args.html +++ b/doc/html/fusion/functional/adapters/unfused_lvalue_args.html @@ -2,7 +2,7 @@ unfused_lvalue_args - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -35,7 +35,7 @@ Object adapter template for an unary Polymorphic Function Object target function. When called, its arguments are - bundled to a Random Access Sequence of references that is passed to the target function object. Only LValue arguments are accepted. @@ -47,15 +47,11 @@ if the target function object is const - or, in case the target function object is held by value, the adapter is const).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/unfused_lvalue_args.hpp>
-
+

+ /functional/adapter/unfused_lvalue_args.hpp> +

- + Synopsis
@@ -63,7 +59,7 @@
 class unfused_lvalue_args;
 
- + Template parameters
@@ -110,7 +106,7 @@
- + Model of
@@ -151,7 +147,7 @@
- + Expression Semantics
@@ -207,30 +203,30 @@

Calls f with a - Sequence that contains - references to the arguments a0...aN. + Sequence that contains references + to the arguments a0...aN.

- + Example
 struct fused_incrementer
 {
-    template <class Seq> 
-    struct result 
-    { 
+    template <class Seq>
+    struct result
+    {
         typedef void type;
     };
 
     template <class Seq>
     void operator()(Seq const & s) const
     {
-        for_each(s,++boost::lambda::_1);
+        for_each(s,++boost::lambda::_1);
     }
 };
 
@@ -243,7 +239,7 @@
 }
 
- + See also
@@ -255,8 +251,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/unfused_rvalue_args.html b/doc/html/fusion/functional/adapters/unfused_rvalue_args.html index c7a3dedc..19d9a1d1 100644 --- a/doc/html/fusion/functional/adapters/unfused_rvalue_args.html +++ b/doc/html/fusion/functional/adapters/unfused_rvalue_args.html @@ -2,7 +2,7 @@ unfused_rvalue_args - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -35,7 +35,7 @@ Object adapter template for an unary Polymorphic Function Object target function. When called, its arguments are - bundled to a Random Access Sequence of references that is passed to the target function object. All referenced objects in the sequence are const qualified. @@ -47,15 +47,11 @@ if the target function object is const - or, in case the target function object is held by value, the adapter is const).

-
- - Header -
-
-#include <boost/fusion/functional/adapter/unfused_rvalue_args.hpp>
-
+

+ /functional/adapter/unfused_rvalue_args.hpp> +

- + Synopsis
@@ -63,7 +59,7 @@
 class unfused_rvalue_args;
 
- + Template parameters
@@ -110,7 +106,7 @@
- + Model of
@@ -151,7 +147,7 @@
- + Expression Semantics
@@ -207,23 +203,23 @@

Calls f with a - Sequence that contains - references to the arguments a0...aN. + Sequence that contains references + to the arguments a0...aN.

- + Example
 struct sequence_printer
 {
-    template <class Seq> 
-    struct result 
-    { 
+    template <class Seq>
+    struct result
+    {
         typedef void type;
     };
 
@@ -241,7 +237,7 @@
 }
 
- + See also
@@ -255,8 +251,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/adapters/unfused_typed.html b/doc/html/fusion/functional/adapters/unfused_typed.html index 22c18ac2..41608679 100644 --- a/doc/html/fusion/functional/adapters/unfused_typed.html +++ b/doc/html/fusion/functional/adapters/unfused_typed.html @@ -2,7 +2,7 @@ unfused_typed - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -26,7 +26,7 @@
- + Description

@@ -35,13 +35,13 @@ Object adapter template for an unary Polymorphic Function Object target function. When called, its arguments are - bundled to a Random Access Sequence that is passed to the target function object.

The call operators of esulting function objects are strictly typed (in - other words, non-templatized) with the types from a Sequence. + other words, non-templatized) with the types from a Sequence.

The type of the target function is allowed to be const qualified or a reference. @@ -61,15 +61,11 @@ non-reference elements, the element is copied only once - the call operator's signature is optimized automatically to avoid by-value parameters.

-
- - Header -
-
-#include <boost/fusion/functional/adapter/unfused_typed.hpp>
-
+

+ /functional/adapter/unfused_typed.hpp> +

- + Synopsis
@@ -77,7 +73,7 @@
 class unfused_typed;
 
- + Template parameters
@@ -131,7 +127,7 @@

- A Sequence + A Sequence

@@ -142,7 +138,7 @@
- + Model of
@@ -169,7 +165,7 @@

S

- A Sequence of parameter types + A Sequence of parameter types

UT

@@ -188,7 +184,7 @@

- + Expression Semantics
@@ -254,7 +250,7 @@
- + Example
@@ -298,7 +294,7 @@
     {
         typedef typename remove_reference<Seq>::type seq;
 
-        typedef unfused_typed< fused_parallel_adder<seq>, 
+        typedef unfused_typed< fused_parallel_adder<seq>,
             typename mpl::transform<seq, remove_reference<_> >::type > type;
     };
 
@@ -315,7 +311,7 @@
 {
     int a = 2; char b = 'X';
     // the second call is strictly typed with the types deduced from the
-    // first call 
+    // first call
     parallel_add(a,b)(3,2);
     parallel_add(a,b)(3);
     parallel_add(a,b)();
@@ -323,7 +319,7 @@
 }
 
- + See also
    @@ -336,8 +332,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/concepts.html b/doc/html/fusion/functional/concepts.html index 57f2d4ec..b6ddb1b3 100644 --- a/doc/html/fusion/functional/concepts.html +++ b/doc/html/fusion/functional/concepts.html @@ -2,7 +2,7 @@ Concepts - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -37,8 +37,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/concepts/callable.html b/doc/html/fusion/functional/concepts/callable.html index 7173fa39..3126568c 100644 --- a/doc/html/fusion/functional/concepts/callable.html +++ b/doc/html/fusion/functional/concepts/callable.html @@ -2,7 +2,7 @@ Callable Object - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -27,7 +27,7 @@
- + Description

@@ -36,7 +36,7 @@ of a function call operator.

- + Models
    @@ -50,11 +50,31 @@ all kinds of function objects
+
+ + Examples +
+
+& a_free_function
+& a_class::a_static_member_function
+& a_class::a_nonstatic_data_member
+& a_class::a_nonstatic_member_function
+std::less<int>()
+// using namespace boost;
+bind(std::less<int>(), _1, 5)
+lambda::_1 += lambda::_2;
+fusion::make_fused_function_object(std::less<int>())
+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/concepts/def_callable.html b/doc/html/fusion/functional/concepts/def_callable.html index 3b1dcfea..47e13671 100644 --- a/doc/html/fusion/functional/concepts/def_callable.html +++ b/doc/html/fusion/functional/concepts/def_callable.html @@ -3,7 +3,7 @@ Deferred Callable Object - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ Callable Object"> Deferred Callable Object
- + Description

@@ -40,7 +40,7 @@ to determine the result of a call.

- + Refinement of
@@ -81,7 +81,7 @@
- + Expression requirements
@@ -119,7 +119,7 @@
- + Models
    @@ -132,11 +132,31 @@ member (function or data) pointer types
+
+ + Examples +
+
+& a_free_function
+& a_class::a_static_member_function
+& a_class::a_nonstatic_data_member
+& a_class::a_nonstatic_member_function
+std::less<int>()
+// using namespace boost;
+bind(std::less<int>(), _1, 5)
+// Note: Boost.Lambda expressions don't work with __boost_result_of__
+fusion::make_fused_function_object(std::less<int>())
+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/concepts/poly.html b/doc/html/fusion/functional/concepts/poly.html index 51d40c94..e8329338 100644 --- a/doc/html/fusion/functional/concepts/poly.html +++ b/doc/html/fusion/functional/concepts/poly.html @@ -3,7 +3,7 @@ Polymorphic Function Object - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ Object"> Polymorphic Function Object
- + Description

@@ -39,7 +39,7 @@ Callable Object type.

- + Refinement of
@@ -83,7 +83,7 @@
- + Expression requirements
@@ -132,7 +132,7 @@
- + Models
+
+ + Examples +
+
+& a_free_function
+& a_class::a_static_member_function
+std::less<int>()
+// using namespace boost;
+bind(std::less<int>(), _1, 5)
+// Note: Boost.Lambda expressions don't work with __boost_result_of__
+fusion::make_fused_function_object(std::less<int>())
+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/concepts/reg_callable.html b/doc/html/fusion/functional/concepts/reg_callable.html index 9c77799e..2728c32d 100644 --- a/doc/html/fusion/functional/concepts/reg_callable.html +++ b/doc/html/fusion/functional/concepts/reg_callable.html @@ -3,7 +3,7 @@ Regular Callable Object - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ Object"> Regular Callable Object
- + Description

@@ -39,7 +39,7 @@ can appear immediately to the left of a function call operator.

- + Refinement of
@@ -69,7 +69,7 @@
- + Expression requirements
@@ -116,7 +116,7 @@
- + Models
    @@ -127,11 +127,29 @@ all kinds of function objects
+
+ + Examples +
+
+& a_free_function
+& a_class::a_static_member_function
+std::less<int>()
+// using namespace boost;
+bind(std::less<int>(), _1, 5)
+lambda::_1 += lambda::_2;
+fusion::make_fused_function_object(std::less<int>())
+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation.html b/doc/html/fusion/functional/generation.html index e1357a8f..4620cf2c 100644 --- a/doc/html/fusion/functional/generation.html +++ b/doc/html/fusion/functional/generation.html @@ -2,7 +2,7 @@ Generation - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -32,8 +32,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions.html b/doc/html/fusion/functional/generation/functions.html index 34884793..c9603fba 100644 --- a/doc/html/fusion/functional/generation/functions.html +++ b/doc/html/fusion/functional/generation/functions.html @@ -2,7 +2,7 @@ Functions - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -43,8 +43,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_fused.html b/doc/html/fusion/functional/generation/functions/mk_fused.html index 90d094bd..c210e657 100644 --- a/doc/html/fusion/functional/generation/functions/mk_fused.html +++ b/doc/html/fusion/functional/generation/functions/mk_fused.html @@ -3,7 +3,7 @@ make_fused - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ make_fused"> make_fused
- + Description

@@ -40,7 +40,7 @@ conversion is applied to the target function.

- + Synopsis
@@ -50,7 +50,7 @@
 make_fused(F const & f);
 
- + Parameters
@@ -97,7 +97,7 @@
- + Expression Semantics
@@ -111,14 +111,15 @@ Semantics: Returns a fused adapter for f.

- + Header
 #include <boost/fusion/functional/generation/make_fused.hpp>
+#include <boost/fusion/include/make_fused.hpp>
 
- + Example
@@ -126,15 +127,15 @@
 
 void try_it()
 {
-    vector<int,float> a(2,2.0f);
-    vector<int,float> b(1,1.5f);
-    vector<float,float> c(1.0f,0.5f);
-    assert(c == transform(zip(a,b), make_fused(& sub)));
-    assert(c == transform(zip(a,b), make_fused(std::minus<float>())));
+    vector<int,float> a(2,2.0f);
+    vector<int,float> b(1,1.5f);
+    vector<float,float> c(1.0f,0.5f);
+    assert(c == transform(zip(a,b), make_fused(& sub)));
+    assert(c == transform(zip(a,b), make_fused(std::minus<float>())));
 }
 
- + See also
@@ -147,8 +148,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html b/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html index ce3e0273..04de9c87 100644 --- a/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html +++ b/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html @@ -3,7 +3,7 @@ make_fused_function_object - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_fused_function_object"> make_fused_function_object
- + Description

@@ -42,7 +42,7 @@ conversion is applied to the target function.

- + Synopsis
@@ -52,7 +52,7 @@
 make_fused_function_object(F const & f);
 
- + Parameters
@@ -99,7 +99,7 @@
- + Expression Semantics
@@ -114,14 +114,15 @@ for f.

- + Header
 #include <boost/fusion/functional/generation/make_fused_function_object.hpp>
+#include <boost/fusion/include/make_fused_function_object.hpp>
 
- + Example
@@ -131,7 +132,7 @@
     struct result;
 
     template <class Self, typename T>
-    struct result< Self(T,T) > 
+    struct result< Self(T,T) >
     { typedef typename remove_reference<T>::type type; };
 
     template<typename T>
@@ -143,14 +144,14 @@
 
 void try_it()
 {
-    vector<int,float> a(2,2.0f);
-    vector<int,float> b(1,1.5f);
-    vector<int,float> c(1,0.5f);
-    assert(c == transform(zip(a,b), make_fused_function_object(sub())));
+    vector<int,float> a(2,2.0f);
+    vector<int,float> b(1,1.5f);
+    vector<int,float> c(1,0.5f);
+    assert(c == transform(zip(a,b), make_fused_function_object(sub())));
 }
 
- + See also
@@ -163,8 +164,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_fused_proc.html b/doc/html/fusion/functional/generation/functions/mk_fused_proc.html index 595d4989..9d554eb0 100644 --- a/doc/html/fusion/functional/generation/functions/mk_fused_proc.html +++ b/doc/html/fusion/functional/generation/functions/mk_fused_proc.html @@ -3,7 +3,7 @@ make_fused_procedure - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_fused_procedure"> make_fused_procedure
- + Description

@@ -42,7 +42,7 @@ conversion applied to the target function.

- + Synopsis
@@ -52,7 +52,7 @@
 make_fused_procedure(F const & f);
 
- + Parameters
@@ -98,7 +98,7 @@
- + Expression Semantics
@@ -113,24 +113,25 @@ f.

- + Header
 #include <boost/fusion/functional/generation/make_fused_procedure.hpp>
+#include <boost/fusion/include/make_fused_procedure.hpp>
 
- + Example
-vector<int,int,int> v(1,2,3);
+vector<int,int,int> v(1,2,3);
 using namespace boost::lambda;
 make_fused_procedure(_1 += _2 - _3)(v);
-assert(front(v) == 0);
+assert(front(v) == 0);
 
- + See also
@@ -143,8 +144,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_unfused_genrc.html b/doc/html/fusion/functional/generation/functions/mk_unfused_genrc.html index 80bbc223..9ad4aa02 100644 --- a/doc/html/fusion/functional/generation/functions/mk_unfused_genrc.html +++ b/doc/html/fusion/functional/generation/functions/mk_unfused_genrc.html @@ -3,7 +3,7 @@ make_unfused_generic - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_unfused_generic"> make_unfused_generic
- + Description

@@ -42,7 +42,7 @@ conversion is applied to the target function.

- + Synopsis
@@ -52,7 +52,7 @@
 make_unfused_generic(F const & f);
 
- + Parameters
@@ -99,7 +99,7 @@
- + Expression Semantics
@@ -114,14 +114,15 @@ f.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_generic.hpp>
+#include <boost/fusion/include/make_unfused_generic.hpp>
 
- + Example
@@ -129,21 +130,21 @@
 {
     typedef void result_type;
 
-    template<class Seq> 
+    template<class Seq>
     void operator()(Seq & s) const
     {
         typename result_of::at_c<Seq,0>::type n = at_c<0>(s);
         typename result_of::at_c<Seq,1>::type what = at_c<1>(s);
 
-        std::cout 
-            << n << " bottles of " << what << " on the wall.\n" 
+        std::cout
+            << n << " bottles of " << what << " on the wall.\n"
             << n << " bottles of " << what << "!\n"
             << "Take one down - pass it around.\n";
 
         n -= 1; // glug glug...
 
         std::cout
-            << n << " bottles of " << what << " on the wall.\n" 
+            << n << " bottles of " << what << " on the wall.\n"
             << std::endl;
     }
 };
@@ -157,7 +158,7 @@
 }
 
- + See also
@@ -170,8 +171,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_unfused_lvargs.html b/doc/html/fusion/functional/generation/functions/mk_unfused_lvargs.html index 52a2e9ab..4f96799e 100644 --- a/doc/html/fusion/functional/generation/functions/mk_unfused_lvargs.html +++ b/doc/html/fusion/functional/generation/functions/mk_unfused_lvargs.html @@ -3,7 +3,7 @@ make_unfused_lvalue_args - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_unfused_lvalue_args"> make_unfused_lvalue_args
- + Description

@@ -42,7 +42,7 @@ conversion is applied to the target function.

- + Synopsis
@@ -52,7 +52,7 @@
 make_unfused_lvalue_args(F const & f);
 
- + Parameters
@@ -99,7 +99,7 @@
- + Expression Semantics
@@ -114,29 +114,30 @@ for f.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_lvalue_args.hpp>
+#include <boost/fusion/include/make_unfused_lvalue_args.hpp>
 
- + Example
 struct fused_incrementer
 {
-    template <class Seq> 
-    struct result 
-    { 
+    template <class Seq>
+    struct result
+    {
         typedef void type;
     };
 
     template <class Seq>
     void operator()(Seq const & s) const
     {
-        for_each(s,++boost::lambda::_1);
+        for_each(s,++boost::lambda::_1);
     }
 };
 
@@ -148,7 +149,7 @@
 }
 
- + See also
@@ -161,8 +162,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/functions/mk_unfused_rvargs.html b/doc/html/fusion/functional/generation/functions/mk_unfused_rvargs.html index 81f544ec..632a5f71 100644 --- a/doc/html/fusion/functional/generation/functions/mk_unfused_rvargs.html +++ b/doc/html/fusion/functional/generation/functions/mk_unfused_rvargs.html @@ -3,7 +3,7 @@ make_unfused_rvalue_args - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ make_unfused_rvalue_args"> make_unfused_rvalue_args
- + Description

@@ -41,7 +41,7 @@ conversion is applied to the target function.

- + Synopsis
@@ -51,7 +51,7 @@
 make_unfused_rvalue_args(F const & f);
 
- + Parameters
@@ -98,7 +98,7 @@
- + Expression Semantics
@@ -113,22 +113,23 @@ for f.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_rvalue_args.hpp>
+#include <boost/fusion/include/make_unfused_rvalue_args.hpp>
 
- + Example
 struct sequence_printer
 {
-    template <class Seq> 
-    struct result 
-    { 
+    template <class Seq>
+    struct result
+    {
         typedef void type;
     };
 
@@ -146,7 +147,7 @@
 }
 
- + See also
@@ -159,8 +160,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions.html b/doc/html/fusion/functional/generation/metafunctions.html index affc3033..5d165479 100644 --- a/doc/html/fusion/functional/generation/metafunctions.html +++ b/doc/html/fusion/functional/generation/metafunctions.html @@ -2,7 +2,7 @@ Metafunctions - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -44,8 +44,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_fused.html b/doc/html/fusion/functional/generation/metafunctions/mk_fused.html index 783bf3f4..34b602b1 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_fused.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_fused.html @@ -3,7 +3,7 @@ make_fused - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ make_fused"> make_fused
- + Description

@@ -38,14 +38,15 @@ make_fused">make_fused.

- + Header
 #include <boost/fusion/functional/generation/make_fused.hpp>
+#include <boost/fusion/include/make_fused.hpp>
 
- + Synopsis
@@ -59,7 +60,7 @@
 }
 
- + See also
@@ -68,8 +69,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html b/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html index dc086afa..cc35e263 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html @@ -3,7 +3,7 @@ make_fused_function_object - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_fused_function_object"> make_fused_function_object
- + Description

@@ -39,14 +39,15 @@ make_fused_function_object">make_fused_function_object.

- + Header
 #include <boost/fusion/functional/generation/make_fused_function_object.hpp>
+#include <boost/fusion/include/make_fused_function_object.hpp>
 
- + Synopsis
@@ -60,7 +61,7 @@
 }
 
- + See also
@@ -69,8 +70,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html b/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html index 311b2e53..6a29a24e 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html @@ -3,7 +3,7 @@ make_fused_procedure - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_fused_procedure"> make_fused_procedure
- + Description

@@ -39,14 +39,15 @@ make_fused_procedure">make_fused_procedure.

- + Header
 #include <boost/fusion/functional/generation/make_fused_procedure.hpp>
+#include <boost/fusion/include/make_fused_procedure.hpp>
 
- + Synopsis
@@ -60,7 +61,7 @@
 }
 
- + See also
@@ -69,8 +70,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_genrc.html b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_genrc.html index 22902a51..0dc1670f 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_genrc.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_genrc.html @@ -3,7 +3,7 @@ make_unfused_generic - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_unfused_generic"> make_unfused_generic
- + Description

@@ -39,14 +39,15 @@ make_unfused_generic">make_unfused_generic.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_generic.hpp>
+#include <boost/fusion/include/make_unfused_generic.hpp>
 
- + Synopsis
@@ -60,7 +61,7 @@
 }
 
- + See also
@@ -69,8 +70,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_lvargs.html b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_lvargs.html index e4f19295..cfede75a 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_lvargs.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_lvargs.html @@ -3,7 +3,7 @@ make_unfused_lvalue_args - + @@ -15,10 +15,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -31,7 +31,7 @@ make_unfused_lvalue_args"> make_unfused_lvalue_args
- + Description

@@ -39,14 +39,15 @@ make_unfused_lvalue_args">make_unfused_lvalue_args.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_lvalue_args.hpp>
+#include <boost/fusion/include/make_unfused_lvalue_args.hpp>
 
- + Synopsis
@@ -60,7 +61,7 @@
 }
 
- + See also
@@ -69,8 +70,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_rvargs.html b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_rvargs.html index ea4497e6..5fd2b9d8 100644 --- a/doc/html/fusion/functional/generation/metafunctions/mk_unfused_rvargs.html +++ b/doc/html/fusion/functional/generation/metafunctions/mk_unfused_rvargs.html @@ -3,7 +3,7 @@ make_unfused_rvalue_args - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ make_unfused_rvalue_args"> make_unfused_rvalue_args
- + Description

@@ -38,14 +38,15 @@ make_unfused_rvalue_args">make_unfused_rvalue_args.

- + Header
 #include <boost/fusion/functional/generation/make_unfused_rvalue_args.hpp>
+#include <boost/fusion/include/make_unfused_rvalue_args.hpp>
 
- + Synopsis
@@ -59,7 +60,7 @@
 }
 
- + See also
@@ -68,8 +69,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation.html b/doc/html/fusion/functional/invocation.html index 8c6f38ef..d1a29b0a 100644 --- a/doc/html/fusion/functional/invocation.html +++ b/doc/html/fusion/functional/invocation.html @@ -2,7 +2,7 @@ Invocation - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -33,8 +33,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/functions.html b/doc/html/fusion/functional/invocation/functions.html index c7abfbba..abcc99ac 100644 --- a/doc/html/fusion/functional/invocation/functions.html +++ b/doc/html/fusion/functional/invocation/functions.html @@ -2,7 +2,7 @@ Functions - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -35,8 +35,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/functions/invoke.html b/doc/html/fusion/functional/invocation/functions/invoke.html index 8c5f16a7..b8b6c449 100644 --- a/doc/html/fusion/functional/invocation/functions/invoke.html +++ b/doc/html/fusion/functional/invocation/functions/invoke.html @@ -2,7 +2,7 @@ invoke - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -27,13 +27,13 @@
- + Description

Calls a Deferred - Callable Object with the arguments from a Sequence. + Callable Object with the arguments from a Sequence.

The first template parameter can be specialized explicitly to avoid copying @@ -47,26 +47,26 @@ and boost::shared_ptr).

- + Synopsis
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
 typename result_of::invoke<Function, Sequence>::type
 invoke(Function f, Sequence & s);
 
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
-typename result_of::invoke<Function, Sequence const>::type 
+typename result_of::invoke<Function, Sequence const>::type
 invoke(Function f, Sequence const & s);
 
- + Parameters
@@ -120,7 +120,7 @@

- A Forward Sequence

@@ -134,7 +134,7 @@
- + Expression Semantics
@@ -150,23 +150,19 @@ with the elements in s as arguments and returns the result of the call expression.

-
- - Header -
-
-#include <boost/fusion/functional/invocation/invoke.hpp>
-
+

+ /functional/invocation/invoke.hpp> +

- + Example
 std::plus<int> add;
-assert(invoke(add,make_vector(1,1)) == 2);
+assert(invoke(add,make_vector(1,1)) == 2);
 
- + See also
@@ -181,8 +177,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/functions/invoke_fobj.html b/doc/html/fusion/functional/invocation/functions/invoke_fobj.html index 6df89ed8..a509ae35 100644 --- a/doc/html/fusion/functional/invocation/functions/invoke_fobj.html +++ b/doc/html/fusion/functional/invocation/functions/invoke_fobj.html @@ -3,7 +3,7 @@ invoke_function_object - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,25 +30,25 @@ invoke_function_object"> invoke_function_object
- + Description

Calls a Polymorphic Function - Object with the arguments from a Sequence. + Object with the arguments from a Sequence.

The first template parameter can be specialized explicitly to avoid copying and/or to control the const qualification of a function object.

- + Synopsis
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
 typename invoke_function_object(Function f, Sequence & s);
 
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
 typename invoke_function_object(Function f, Sequence const & s);
 
- + Parameters
@@ -118,7 +118,7 @@

- Model of Forward Sequence

@@ -132,7 +132,7 @@
- + Expression Semantics
@@ -148,15 +148,11 @@ with the elements in s as arguments and returns the result of the call expression.

-
- - Header -
-
-#include <boost/fusion/functional/invocation/invoke_function_object.hpp>
-
+

+ /functional/invocation/invoke_function_object.hpp> +

- + Example
@@ -166,7 +162,7 @@
     struct result;
 
     template <class Self, typename T>
-    struct result< Self(T,T) > 
+    struct result< Self(T,T) >
     { typedef typename remove_reference<T>::type type; };
 
     template<typename T>
@@ -179,11 +175,11 @@
 void try_it()
 {
     sub f;
-    assert(f(2,1) == invoke_function_object(f,make_vector(2,1)));
+    assert(f(2,1) == invoke_function_object(f,make_vector(2,1)));
 }
 
- + See also
@@ -198,8 +194,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/functions/invoke_proc.html b/doc/html/fusion/functional/invocation/functions/invoke_proc.html index aa841307..f969edf9 100644 --- a/doc/html/fusion/functional/invocation/functions/invoke_proc.html +++ b/doc/html/fusion/functional/invocation/functions/invoke_proc.html @@ -3,7 +3,7 @@ invoke_procedure - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,12 +30,12 @@ invoke_procedure"> invoke_procedure
- + Description

Calls a Callable - Object with the arguments from a Sequence. + Object with the arguments from a Sequence. The result of the call is ignored.

@@ -54,12 +54,12 @@ isn't implemented).

- + Synopsis
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
 typename invoke_procedure(Function f, Sequence & s);
 
 template<
-    typename Function, 
+    typename Function,
     class Sequence
     >
 typename invoke_procedure(Function f, Sequence const & s);
 
- + Parameters
@@ -128,7 +128,7 @@

- Model of Forward Sequence

@@ -142,7 +142,7 @@
- + Expression Semantics
@@ -157,25 +157,21 @@ with the elements in s as arguments.

-
- - Header -
-
-#include <boost/fusion/functional/invocation/invoke_procedure.hpp>
-
+

+ /functional/invocation/invoke_procedure.hpp> +

- + Example
-vector<int,int> v(1,2);
+vector<int,int> v(1,2);
 using namespace boost::lambda;
 invoke_procedure(_1 += _2, v);
-assert(front(v) == 3);
+assert(front(v) == 3);
 
- + See also
@@ -190,8 +186,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/metafunctions.html b/doc/html/fusion/functional/invocation/metafunctions.html index e9df0740..93aafaf4 100644 --- a/doc/html/fusion/functional/invocation/metafunctions.html +++ b/doc/html/fusion/functional/invocation/metafunctions.html @@ -2,7 +2,7 @@ Metafunctions - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -36,8 +36,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/metafunctions/invoke.html b/doc/html/fusion/functional/invocation/metafunctions/invoke.html index b50b8089..06407c14 100644 --- a/doc/html/fusion/functional/invocation/metafunctions/invoke.html +++ b/doc/html/fusion/functional/invocation/metafunctions/invoke.html @@ -2,7 +2,7 @@ invoke - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -27,23 +27,23 @@
- + Description

Returns the result type of invoke.

- + Synopsis
 namespace result_of
 {
     template<
-        typename Function, 
+        typename Function,
         class Sequence
-        > 
+        >
     struct invoke
     {
         typedef unspecified type;
@@ -51,7 +51,7 @@
 }
 
- + See also
@@ -62,8 +62,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html b/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html index e1e7a2a4..f8b3b9bc 100644 --- a/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html +++ b/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html @@ -3,7 +3,7 @@ invoke_function_object - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ invoke_function_object"> invoke_function_object
- + Description

@@ -38,16 +38,16 @@ invoke_function_object">invoke_function_object.

- + Synopsis
 namespace result_of
 {
     template<
-        class Function, 
+        class Function,
         class Sequence
-        > 
+        >
     struct invoke_function_object
     {
         typedef unspecified type;
@@ -55,7 +55,7 @@
 }
 
- + See also
@@ -67,8 +67,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html b/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html index cf9a65ef..454969e5 100644 --- a/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html +++ b/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html @@ -3,7 +3,7 @@ invoke_procedure - + @@ -14,10 +14,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -30,7 +30,7 @@ invoke_procedure"> invoke_procedure
- + Description

@@ -38,16 +38,16 @@ invoke_procedure">invoke_procedure.

- + Synopsis
 namespace result_of
 {
     template<
-        typename Function, 
+        typename Function,
         class Sequence
-        > 
+        >
     struct invoke_procedure
     {
         typedef unspecified type;
@@ -55,7 +55,7 @@
 }
 
- + See also
@@ -67,8 +67,12 @@ - +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/introduction.html b/doc/html/fusion/introduction.html index ec7fdb70..6587ef11 100644 --- a/doc/html/fusion/introduction.html +++ b/doc/html/fusion/introduction.html @@ -2,7 +2,7 @@ Introduction - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -89,21 +89,21 @@ 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 + 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 + 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 + 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: + 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 @@ -115,8 +115,10 @@ 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. In MPL, - Fusion sequences follow MPL's + wish to work solely on types + [1] + . 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 @@ -127,11 +129,24 @@ instantiation of real runtime objects with data. You have the best of both worlds.

+
+

+

[1] + 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. +

+
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/iterator.html b/doc/html/fusion/iterator.html new file mode 100644 index 00000000..5aac9cbb --- /dev/null +++ b/doc/html/fusion/iterator.html @@ -0,0 +1,99 @@ + + + +Iterator + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Like MPL and + STL, + iterators are a fundamental concept in Fusion. As with MPL + and STL + iterators describe positions, and provide access to data within an underlying + Sequence. +

+

+ + Header +

+
+#include <boost/fusion/iterator.hpp>
+#include <boost/fusion/include/iterator.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/concepts.html b/doc/html/fusion/iterator/concepts.html new file mode 100644 index 00000000..62b3bb31 --- /dev/null +++ b/doc/html/fusion/iterator/concepts.html @@ -0,0 +1,65 @@ + + + +Concepts + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Fusion iterators are divided into different traversal categories. Forward + Iterator is the most basic concept. Bidirectional + Iterator is a refinement of Forward + Iterator. Random + Access Iterator is a refinement of Bidirectional + Iterator. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/concepts/bidirectional_iterator.html b/doc/html/fusion/iterator/concepts/bidirectional_iterator.html new file mode 100644 index 00000000..88c318b3 --- /dev/null +++ b/doc/html/fusion/iterator/concepts/bidirectional_iterator.html @@ -0,0 +1,323 @@ + + + +Bidirectional + Iterator + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A Bidirectional Iterator traverses a Sequence + allowing movement in either direction one element at a time. +

+
+

Notation

+
+
i
+

+ A Bidirectional Iterator +

+
I
+

+ A Bidirectional Iterator type +

+
M
+

+ An MPL + integral constant +

+
N
+

+ An integral constant +

+
+
+
+ + Refinement + of +
+

+ Forward Iterator +

+
+ + Expression + requirements +
+

+ In addition to the requirements defined in Forward + Iterator, the following expressions must be valid: +

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Return type +

+
+

+ Runtime Complexity +

+
+

+ next(i) +

+
+

+ Bidirectional + Iterator +

+
+

+ Constant +

+
+

+ prior(i) +

+
+

+ Bidirectional + Iterator +

+
+

+ Constant +

+
+

+ advance_c<N>(i) +

+
+

+ Bidirectional + Iterator +

+
+

+ Constant +

+
+

+ advance<M>(i) +

+
+

+ Bidirectional + Iterator +

+
+

+ Constant +

+
+
+ + Meta + Expressions +
+
++++ + + + + + + + + +
+

+ Expression +

+
+

+ Compile Time Complexity +

+
+

+ result_of::prior<I>::type +

+
+

+ Amortized constant time +

+
+
+ + Expression + Semantics +
+

+ The semantics of an expression are defined only where they differ from, + or are not defined in Forward + Iterator +

+
++++ + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ prior(i) +

+
+

+ An iterator to the element preceding i +

+
+
+ + Invariants +
+

+ In addition to the invariants of Forward + Iterator, the following invariants always hold: +

+
+
+ + Models +
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/concepts/forward_iterator.html b/doc/html/fusion/iterator/concepts/forward_iterator.html new file mode 100644 index 00000000..54fa0077 --- /dev/null +++ b/doc/html/fusion/iterator/concepts/forward_iterator.html @@ -0,0 +1,580 @@ + + + +Forward + Iterator + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A Forward Iterator traverses a Sequence + allowing movement in only one direction through it's elements, one element + at a time. +

+
+

Notation

+
+
i, + j
+

+ Forward Iterators +

+
I, + J
+

+ Forward Iterator types +

+
M
+

+ An MPL + integral constant +

+
N
+

+ An integral constant +

+
+
+
+ + Expression + requirements +
+

+ A type models Forward Iterator if, in addition to being CopyConstructable, + the following expressions are valid: +

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Return type +

+
+

+ Runtime Complexity +

+
+

+ next(i) +

+
+

+ Forward + Iterator +

+
+

+ Constant +

+
+

+ i == + j +

+
+

+ Convertible to bool +

+
+

+ Constant +

+
+

+ i != + j +

+
+

+ Convertible to bool +

+
+

+ Constant +

+
+

+ advance_c<N>(i) +

+
+

+ Forward + Iterator +

+
+

+ Constant +

+
+

+ advance<M>(i) +

+
+

+ Forward + Iterator +

+
+

+ Constant +

+
+

+ distance(i, + j) +

+
+

+ result_of::distance<I, + J>::type +

+
+

+ Constant +

+
+

+ deref(i) +

+
+

+ result_of::deref<I>::type +

+
+

+ Constant +

+
+

+ *i +

+
+

+ result_of::deref<I>::type +

+
+

+ Constant +

+
+
+ + Meta + Expressions +
+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Compile Time Complexity +

+
+

+ result_of::next<I>::type +

+
+

+ Amortized constant time +

+
+

+ result_of::equal_to<I, + J>::type +

+
+

+ Amortized constant time +

+
+

+ result_of::advance_c<I, + N>::type +

+
+

+ Linear +

+
+

+ result_of::advance<I ,M>::type +

+
+

+ Linear +

+
+

+ result_of::distance<I ,J>::type +

+
+

+ Linear +

+
+

+ result_of::deref<I>::type +

+
+

+ Amortized constant time +

+
+

+ result_of::value_of<I>::type +

+
+

+ Amortized constant time +

+
+
+ + Expression + Semantics +
+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Semantics +

+
+

+ next(i) +

+
+

+ An iterator to the element following i +

+
+

+ i == + j +

+
+

+ Iterator equality comparison +

+
+

+ i != + j +

+
+

+ Iterator inequality comparison +

+
+

+ advance_c<N>(i) +

+
+

+ An iterator n elements after i + in the sequence +

+
+

+ advance<M>(i) +

+
+

+ Equivalent to advance_c<M::value>(i) +

+
+

+ distance(i, + j) +

+
+

+ The number of elements between i + and j +

+
+

+ deref(i) +

+
+

+ The element at positioni +

+
+

+ *i +

+
+

+ Equivalent to deref(i) +

+
+
+ + Invariants +
+

+ The following invariants always hold: +

+
    +
  • !(i + == j) == (i != j)
  • +
  • next(i) == advance_c<1>(i)
  • +
  • distance(i, advance_c<N>(i)) == N
  • +
  • + Using next to traverse the + sequence will never return to a previously seen position +
  • +
  • +deref(i) is equivalent to *i +
  • +
  • + If i == + j then *i is equivalent to *j +
  • +
+
+ + Models +
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/concepts/random_access_iterator.html b/doc/html/fusion/iterator/concepts/random_access_iterator.html new file mode 100644 index 00000000..6bcb5824 --- /dev/null +++ b/doc/html/fusion/iterator/concepts/random_access_iterator.html @@ -0,0 +1,301 @@ + + + +Random + Access Iterator + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ A Random Access Iterator traverses a Sequence + moving in either direction, permitting efficient arbitrary distance movements + back and forward through the sequence. +

+
+

Notation

+
+
i, + j
+

+ Random Access Iterators +

+
I, + J
+

+ Random Access Iterator types +

+
M
+

+ An MPL + integral constant +

+
N
+

+ An integral constant +

+
+
+
+ + Refinement + of +
+

+ Bidirectional + Iterator +

+
+ + Expression + requirements +
+

+ In addition to the requirements defined in Bidirectional + Iterator, the following expressions must be valid: +

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Return type +

+
+

+ Runtime Complexity +

+
+

+ next(i) +

+
+

+ Random + Access Iterator +

+
+

+ Constant +

+
+

+ prior(i) +

+
+

+ Random + Access Iterator +

+
+

+ Constant +

+
+

+ advance_c<N>(i) +

+
+

+ Random + Access Iterator +

+
+

+ Constant +

+
+

+ advance<M>(i) +

+
+

+ Random + Access Iterator +

+
+

+ Constant +

+
+
+ + Meta + Expressions +
+
++++ + + + + + + + + + + + + + + + + + + +
+

+ Expression +

+
+

+ Compile Time Complexity +

+
+

+ result_of::advance_c<I, + N>::type +

+
+

+ Amortized constant time +

+
+

+ result_of::advance<I, + M>::type +

+
+

+ Amortized constant time +

+
+

+ result_of::distance<I ,J>::type +

+
+

+ Amortized constant time +

+
+
+ + Models +
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions.html b/doc/html/fusion/iterator/functions.html new file mode 100644 index 00000000..74b52d7f --- /dev/null +++ b/doc/html/fusion/iterator/functions.html @@ -0,0 +1,57 @@ + + + +Functions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Fusion provides functions for manipulating iterators, analogous to the similar + functions from the MPL + library. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/advance.html b/doc/html/fusion/iterator/functions/advance.html new file mode 100644 index 00000000..f8beff4d --- /dev/null +++ b/doc/html/fusion/iterator/functions/advance.html @@ -0,0 +1,166 @@ + + + +advance + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator by a specified distance. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename M
+    >
+typename result_of::advance<I, M>::type advance(I const& i);
+
+
+

Table 1.6. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Forward + Iterator +

+
+

+ Iterator to move relative to +

+
+

+ N +

+
+

+ An MPL + Integral Constant +

+
+

+ Number of positions to move +

+
+
+
+ + Expression + Semantics +
+
+advance<M>(i);
+
+

+ Return type: A model of the same iterator + concept as i. +

+

+ Semantics: Returns an iterator to the + element M positions from + i. If i + is a Bidirectional + Iterator then M + may be negative. +

+
+ + Header +
+
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/include/advance.hpp>
+
+
+ + Example +
+
+typedef vector<int,int,int> vec;
+
+vec v(1,2,3);
+assert(deref(advance<mpl::int_<2> >(begin(v))) == 3);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/advance_c.html b/doc/html/fusion/iterator/functions/advance_c.html new file mode 100644 index 00000000..80782f3f --- /dev/null +++ b/doc/html/fusion/iterator/functions/advance_c.html @@ -0,0 +1,165 @@ + + + +advance_c + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator by a specified distance. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    int N
+    >
+typename result_of::advance_c<I, N>::type advance_c(I const& i);
+
+
+

Table 1.7. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Forward + Iterator +

+
+

+ Iterator to move relative to +

+
+

+ N +

+
+

+ Integer constant +

+
+

+ Number of positions to move +

+
+
+
+ + Expression + Semantics +
+
+advance_c<N>(i);
+
+

+ Return type: A model of the same iterator + concept as i. +

+

+ Semantics: Returns an iterator to the + element N positions from + i. If i + is a Bidirectional + Iterator then N + may be negative. +

+
+ + Header +
+
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/include/advance.hpp>
+
+
+ + Example +
+
+typedef vector<int,int,int> vec;
+
+vec v(1,2,3);
+assert(deref(advance_c<2>(begin(v))) == 3);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/deref.html b/doc/html/fusion/iterator/functions/deref.html new file mode 100644 index 00000000..6e980ce1 --- /dev/null +++ b/doc/html/fusion/iterator/functions/deref.html @@ -0,0 +1,142 @@ + + + +deref + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Deferences an iterator. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+typename result_of::deref<I>::type deref(I const& i);
+
+
+

Table 1.2. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+deref(i);
+
+

+ Return type: result_of::deref<I>::type +

+

+ Semantics: Dereferences the iterator + i. +

+
+ + Header +
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/include/deref.hpp>
+
+
+ + Example +
+
+typedef vector<int,int&> vec;
+
+int i(0);
+vec v(1,i);
+assert(deref(begin(v)) == 1);
+assert(deref(next(begin(v))) == 0);
+assert(&(deref(next(begin(v)))) == &i);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/distance.html b/doc/html/fusion/iterator/functions/distance.html new file mode 100644 index 00000000..eb820046 --- /dev/null +++ b/doc/html/fusion/iterator/functions/distance.html @@ -0,0 +1,140 @@ + + + +distance + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the distance between 2 iterators. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename J
+    >
+typename result_of::distance<I, J>::type distance(I const& i, J const& j);
+
+
+

Table 1.5. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i, j +

+
+

+ Models of Forward + Iterator into the same sequence +

+
+

+ The start and end points of the distance to be measured +

+
+
+
+ + Expression + Semantics +
+
+distance(i,j);
+
+

+ Return type: int +

+

+ Semantics: Returns the distance between + iterators i and j. +

+
+ + Header +
+
+#include <boost/fusion/iterator/distance.hpp>
+#include <boost/fusion/include/distance.hpp>
+
+
+ + Example +
+
+typedef vector<int,int,int> vec;
+
+vec v(1,2,3);
+assert(distance(begin(v), next(next(begin(v)))) == 2);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/next.html b/doc/html/fusion/iterator/functions/next.html new file mode 100644 index 00000000..2ff7f62f --- /dev/null +++ b/doc/html/fusion/iterator/functions/next.html @@ -0,0 +1,142 @@ + + + +next + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator 1 position forwards. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+typename result_of::next<I>::type next(I const& i);
+
+
+

Table 1.3. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+next(i);
+
+

+ Return type: A model of the same iterator + concept as i. +

+

+ Semantics: Returns an iterator to the + next element after i. +

+
+ + Header +
+
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/include/next.hpp>
+
+
+ + Example +
+
+typedef vector<int,int,int> vec;
+
+vec v(1,2,3);
+assert(deref(begin(v)) == 1);
+assert(deref(next(begin(v))) == 2);
+assert(deref(next(next(begin(v)))) == 3);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/functions/prior.html b/doc/html/fusion/iterator/functions/prior.html new file mode 100644 index 00000000..4bb04c0d --- /dev/null +++ b/doc/html/fusion/iterator/functions/prior.html @@ -0,0 +1,141 @@ + + + +prior + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator 1 position backwards. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+typename result_of::prior<I>::type prior(I const& i);
+
+
+

Table 1.4. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Bidirectional + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+prior(i);
+
+

+ Return type: A model of the same iterator + concept as i. +

+

+ Semantics: Returns an iterator to the + element prior to i. +

+
+ + Header +
+
+#include <boost/fusion/iterator/prior.hpp>
+#include <boost/fusion/include/prior.hpp>
+
+
+ + Example +
+
+typedef vector<int,int> vec;
+
+vec v(1,2);
+assert(deref(next(begin(v))) == 2);
+assert(deref(prior(next(begin(v)))) == 1);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions.html b/doc/html/fusion/iterator/metafunctions.html new file mode 100644 index 00000000..a3796084 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions.html @@ -0,0 +1,54 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+ + + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/advance.html b/doc/html/fusion/iterator/metafunctions/advance.html new file mode 100644 index 00000000..c0d2e266 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/advance.html @@ -0,0 +1,170 @@ + + + +advance + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator a specified distance. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename M
+    >
+struct advance
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.17. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Forward + Iterator +

+
+

+ Iterator to move relative to +

+
+

+ M +

+
+

+ Model of MPL + Integral Constant +

+
+

+ Number of positions to move +

+
+
+
+ + Expression + Semantics +
+
+result_of::advance<I,M>::type
+
+

+ Return type: A model of the same iterator + concept as I. +

+

+ Semantics: Returns an iterator a distance + M from I. + If I is a Bidirectional + Iterator then M + may be negative. +

+
+ + Header +
+
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/include/advance.hpp>
+
+
+ + Example +
+
+typedef vector<int,double,char> vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::next<first>::type second;
+typedef result_of::next<second>::type third;
+
+BOOST_MPL_ASSERT((result_of::equal_to<result_of::advance<first, boost::mpl::int_<2> >::type, third>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/advance_c.html b/doc/html/fusion/iterator/metafunctions/advance_c.html new file mode 100644 index 00000000..426cefda --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/advance_c.html @@ -0,0 +1,169 @@ + + + +advance_c + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Moves an iterator by a specified distance. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    int N
+    >
+struct advance_c
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.18. Parameters

+ +++++ + + + + + + + + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Forward + Iterator +

+
+

+ Iterator to move relative to +

+
+

+ N +

+
+

+ Integer constant +

+
+

+ Number of positions to move +

+
+
+
+ + Expression + Semantics +
+
+result_of::advance_c<I, N>::type
+
+

+ Return type: A model of the same iterator + concept as I. +

+

+ Semantics: Returns an iterator a distance + N from I. + If I is a Bidirectional + Iterator then N + may be negative. Equivalent to result_of::advance<I, boost::mpl::int_<N> >::type. +

+
+ + Header +
+
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/include/advance.hpp>
+
+
+ + Example +
+
+typedef vector<int,double,char> vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::next<first>::type second;
+typedef result_of::next<second>::type third;
+
+BOOST_MPL_ASSERT((result_of::equal_to<result_of::advance_c<first, 2>::type, third>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/deref.html b/doc/html/fusion/iterator/metafunctions/deref.html new file mode 100644 index 00000000..0d49a882 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/deref.html @@ -0,0 +1,148 @@ + + + +deref + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the type that will be returned by dereferencing an iterator. +

+
+ + Synposis +
+
+template<
+    typename I
+    >
+struct deref
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.12. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::deref<I>::type
+
+

+ Return type: Any type +

+

+ Semantics: Returns the result of dereferencing + an iterator of type I. +

+
+ + Header +
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/include/deref.hpp>
+
+
+ + Example +
+
+typedef vector<int,int&> vec;
+typedef const vec const_vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::next<first>::type second;
+
+typedef result_of::begin<const_vec>::type const_first;
+typedef result_of::next<const_first>::type const_second;
+
+BOOST_MPL_ASSERT((boost::is_same<result_of::deref<first>::type, int&>));
+BOOST_MPL_ASSERT((boost::is_same<result_of::deref<second>::type, int&>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/distance.html b/doc/html/fusion/iterator/metafunctions/distance.html new file mode 100644 index 00000000..7f825ef8 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/distance.html @@ -0,0 +1,148 @@ + + + +distance + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the distance between two iterators. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename J
+    >
+struct distance
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.16. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I, J +

+
+

+ Models of Forward + Iterator into the same sequence +

+
+

+ The start and end points of the distance to be measured +

+
+
+
+ + Expression + Semantics +
+
+result_of::distance<I, J>::type
+
+

+ Return type: A model of MPL + Integral Constant. +

+

+ Semantics: Returns the distance between + iterators of types I and + J. +

+
+ + Header +
+
+#include <boost/fusion/iterator/distance.hpp>
+#include <boost/fusion/include/distance.hpp>
+
+
+ + Example +
+
+typedef vector<int,double,char> vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::next<first>::type second;
+typedef result_of::next<second>::type third;
+typedef result_of::distance<first,third>::type dist;
+
+BOOST_MPL_ASSERT_RELATION(dist::value, ==, 2);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/equal_to.html b/doc/html/fusion/iterator/metafunctions/equal_to.html new file mode 100644 index 00000000..6dc3d549 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/equal_to.html @@ -0,0 +1,146 @@ + + + +equal_to + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns a true-valued MPL + Integral Constant if I + and J are equal. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename J
+    >
+struct equal_to
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.15. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I, J +

+
+

+ Any fusion iterators +

+
+

+ Operation's arguments +

+
+
+
+ + Expression + Semantics +
+
+result_of::equal_to<I, J>::type
+
+

+ Return type: A model of MPL + Integral Constant. +

+

+ Semantics: Returns boost::mpl::true_ + if I and J are iterators to the same position. + Returns boost::mpl::false_ otherwise. +

+
+ + Header +
+
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+
+
+ + Example +
+
+typedef vector<int,double> vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::end<vec>::type last;
+BOOST_MPL_ASSERT((result_of::equal_to<first, first>));
+BOOST_MPL_ASSERT_NOT((result_of::equal_to<first,last>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/next.html b/doc/html/fusion/iterator/metafunctions/next.html new file mode 100644 index 00000000..6f3f418f --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/next.html @@ -0,0 +1,143 @@ + + + +next + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the type of the next iterator in a sequence. +

+
+ + Synposis +
+
+template<
+    typename I
+    >
+struct next
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.13. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::next<I>::type
+
+

+ Return type: A model of the same iterator + concept as I. +

+

+ Semantics: Returns an iterator to the + next element in the sequence after I. +

+
+ + Header +
+
+#include <boost/fusion/iterator/next.hpp>
+#include <boost/fusion/include/next.hpp>
+
+
+ + Example +
+
+typedef vector<int,double> vec;
+typedef result_of::next<result_of::begin<vec>::type>::type second;
+
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<second>::type, double>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/prior.html b/doc/html/fusion/iterator/metafunctions/prior.html new file mode 100644 index 00000000..5a610de9 --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/prior.html @@ -0,0 +1,146 @@ + + + +prior + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the type of the previous iterator in a sequence. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+struct prior
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.14. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Bidirectional + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::prior<I>::type
+
+

+ Return type: A model of the same iterator + concept as I. +

+

+ Semantics: Returns an iterator to the + previous element in the sequence before I. +

+
+ + Header +
+
+#include <boost/fusion/iterator/prior.hpp>
+#include <boost/fusion/include/prior.hpp>
+
+
+ + Example +
+
+typedef vector<int,double> vec;
+typedef result_of::next<result_of::begin<vec>::type>::type second;
+
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<second>::type, double>));
+
+typedef result_of::prior<second>::type first;
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<first>::type, int>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/metafunctions/value_of.html b/doc/html/fusion/iterator/metafunctions/value_of.html new file mode 100644 index 00000000..2dfe4eaf --- /dev/null +++ b/doc/html/fusion/iterator/metafunctions/value_of.html @@ -0,0 +1,146 @@ + + + +value_of + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Returns the type stored at the position of an iterator. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+struct value_of
+{
+    typedef unspecified type;
+};
+
+
+

Table 1.11. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ I +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+result_of::value_of<I>::type
+
+

+ Return type: Any type +

+

+ Semantics: Returns the type stored in + a sequence at iterator position I. +

+
+ + Header +
+
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/include/value_of.hpp>
+
+
+ + Example +
+
+typedef vector<int,int&,const int&> vec;
+typedef result_of::begin<vec>::type first;
+typedef result_of::next<first>::type second;
+typedef result_of::next<second>::type third;
+
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<first>::type, int>));
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<second>::type, int&>));
+BOOST_MPL_ASSERT((boost::is_same<result_of::value_of<third>::type, const int&>));
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/operator.html b/doc/html/fusion/iterator/operator.html new file mode 100644 index 00000000..b32d3c47 --- /dev/null +++ b/doc/html/fusion/iterator/operator.html @@ -0,0 +1,56 @@ + + + +Operator + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ + +

+ Overloaded operators are provided to provide a more natural syntax for dereferencing + iterators, and comparing them for equality. +

+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/operator/operator_equality.html b/doc/html/fusion/iterator/operator/operator_equality.html new file mode 100644 index 00000000..e932b79c --- /dev/null +++ b/doc/html/fusion/iterator/operator/operator_equality.html @@ -0,0 +1,134 @@ + + + + Operator + == + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Compares 2 iterators for equality. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename J
+    >
+unspecified operator==(I const& i, J const& i);
+
+
+

Table 1.9. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i, j +

+
+

+ Any fusion iterators +

+
+

+ Operation's arguments +

+
+
+
+ + Expression + Semantics +
+
+i == j
+
+

+ Return type: Convertible to bool. +

+

+ Semantics: Equivalent to result_of::equal_to<I,J>::value + where I and J are the types of i + and j respectively. +

+
+ + Header +
+
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/operator/operator_inequality.html b/doc/html/fusion/iterator/operator/operator_inequality.html new file mode 100644 index 00000000..3c86e83f --- /dev/null +++ b/doc/html/fusion/iterator/operator/operator_inequality.html @@ -0,0 +1,130 @@ + + + + Operator + != + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Compares 2 iterators for inequality. +

+
+ + Synopsis +
+
+template<
+    typename I,
+    typename J
+    >
+unspecified operator==(I const& i, J const& i);
+
+
+

Table 1.10. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i, j +

+
+

+ Any fusion iterators +

+
+

+ Operation's arguments +

+
+
+
+ + Expression + Semantics +
+

+ Return type: Convertible to bool. +

+

+ Semantics: Equivalent to !result_of::equal_to<I,J>::value + where I and J are the types of i + and j respectively. +

+
+ + Header +
+
+#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/include/equal_to.hpp>
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/iterator/operator/operator_unary_star.html b/doc/html/fusion/iterator/operator/operator_unary_star.html new file mode 100644 index 00000000..05cda673 --- /dev/null +++ b/doc/html/fusion/iterator/operator/operator_unary_star.html @@ -0,0 +1,146 @@ + + + + Operator + * + + + + + + + + + + + + + + + +
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
+
+
+PrevUpHomeNext +
+
+ +
+ + Description +
+

+ Dereferences an iterator. +

+
+ + Synopsis +
+
+template<
+    typename I
+    >
+typename result_of::deref<I>::type operator*(unspecified<I> const& i);
+
+
+

Table 1.8. Parameters

+ +++++ + + + + + + + + + + +
+

+ Parameter +

+
+

+ Requirement +

+
+

+ Description +

+
+

+ i +

+
+

+ Model of Forward + Iterator +

+
+

+ Operation's argument +

+
+
+
+ + Expression + Semantics +
+
+*i
+
+

+ Return type: Equivalent to the return + type of deref(i). +

+

+ Semantics: Equivalent to deref(i). +

+
+ + Header +
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/include/deref.hpp>
+
+
+ + Example +
+
+typedef vector<int,int&> vec;
+
+int i(0);
+vec v(1,i);
+assert(*begin(v) == 1);
+assert(*next(begin(v)) == 0);
+assert(&(*next(begin(v))) == &i);
+
+
+ + + +
+
+
+PrevUpHomeNext +
+ + diff --git a/doc/html/fusion/notes.html b/doc/html/fusion/notes.html index cdb87296..c19a134b 100644 --- a/doc/html/fusion/notes.html +++ b/doc/html/fusion/notes.html @@ -2,7 +2,7 @@ Notes - + @@ -13,10 +13,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -27,20 +27,21 @@

- + Recursive Inlined Functions

- An interesting peculiarity of functions like at when applied to a 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. + 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.

- + Overloaded Functions

@@ -50,7 +51,7 @@ given a key, k.

- + Tag Dispatching

@@ -102,7 +103,7 @@

- + Extensibility

@@ -112,9 +113,9 @@ extensible. It is just that the manner of sequence extension in Fusion is diferent from both STL and MPL on account - of the lazy nature of fusion Algorithms. + of the lazy nature of fusion Algorithms. STL - containers extend themselves in place though member functions such as push_back and insert. MPL + 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 @@ -126,30 +127,30 @@ 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 + 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 + 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 + 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.

- + Element Conversion

- Functions that take in elemental values to form sequences (e.g. make_list) convert their arguments + 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')
+make_list(1, 'x')
 

- returns a list<int, + returns a list<int, char>.

@@ -160,18 +161,18 @@

Array arguments are deduced to reference to const types. For example - [14] + [14] :

-make_list("Donald", "Daisy")
+make_list("Donald", "Daisy")
 

- creates a list + creates a list of type

-list<const char (&)[7], const char (&)[6]>
+list<const char (&)[7], const char (&)[6]>
 

Function pointers: @@ -183,34 +184,34 @@

 void f(int i);
   ...
-make_list(&f);
+make_list(&f);
 

- creates a list + creates a list of type

-list<void (*)(int)>
+list<void (*)(int)>
 

- + boost::ref

- Fusion's generation functions (e.g. make_list) by default stores the element + 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)
+    make_list(a, b)
 

- creates a list + creates a list of type

-list<A, B>
+list<A, B>
 

Sometimes the plain non-reference type is not desired. You can use boost::ref @@ -224,11 +225,11 @@

 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&>
+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 @@ -236,9 +237,9 @@



-

[14] +

[14] 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 + 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 boost::ref).

@@ -246,8 +247,12 @@
- +
Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

diff --git a/doc/html/fusion/organization.html b/doc/html/fusion/organization.html index 71cb47b9..2b8ba58c 100644 --- a/doc/html/fusion/organization.html +++ b/doc/html/fusion/organization.html @@ -2,7 +2,7 @@ Organization - + @@ -12,10 +12,10 @@ - + - - + +
Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

@@ -34,7 +34,7 @@ The library is organized in three layers:

- + Layers

@@ -47,16 +47,25 @@

- 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. + 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.

- + Directory

    @@ -78,83 +87,95 @@
  • - sequence + adapted
    • - adapted -
        -
      • - array -
      • -
      • - mpl -
      • -
      • - std_pair -
      • -
      -
    • -
    • - comparison + array
    • - container -
        + mpl +
      • - list -
      • + boost::tuple +
      • - map -
      • + std_pair +
      • - set -
      • + struct +
      • - vector -
      • + variant +
    • - conversion + view +
        +
      • + filter_view +
      • +
      • + iterator_range +
      • +
      • + joint_view +
      • +
      • + reverse_view +
      • +
      • + single_view +
      • +
      • + transform_view +
      • +
      • + zip_view +
      • +
      +
    • +
    • + container +
        +
      • + deque +
      • +
      • + list +
      • +
      • + map +
      • +
      • + set +
      • +
      • + vector
      • generation
      • +
      +
    • +
    • + mpl +
    • +
    • + functional +
    • +
    • + sequence +
        +
      • + comparison +
      • intrinsic
      • io
      • -
      • - utility -
      • -
      • - view -
          -
        • - filter_view -
        • -
        • - iterator_range -
        • -
        • - joint_view -
        • -
        • - reverse_view -
        • -
        • - single_view -
        • -
        • - transform_view -
        • -
        • - zip_view -
        • -
        -
    • @@ -165,7 +186,7 @@

    - + Example

    @@ -174,19 +195,19 @@ of

    -#include <boost/fusion/sequence.hpp>
    -#include <boost/fusion/sequence/container.hpp>
    -#include <boost/fusion/sequence/container/list.hpp>
    +#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 sequences. The second includes all of sequence containers. - The third includes only list - [3] + The first includes all containers The second includes only list + [4] .



    -

    [3] +

    [4] Modules may contain smaller components. Header file information for each component will be provided as part of the component's documentation.

    @@ -194,8 +215,12 @@
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/preface.html b/doc/html/fusion/preface.html index 889a4b5e..5a8da91d 100644 --- a/doc/html/fusion/preface.html +++ b/doc/html/fusion/preface.html @@ -2,7 +2,7 @@ Preface - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -44,7 +44,7 @@

    - + Description

    @@ -62,7 +62,7 @@ of compile time metaprogramming with runtime programming.

    - + Motivation

    @@ -88,7 +88,7 @@ an instant AHA! moment.

    - + How to use this manual

    @@ -96,7 +96,7 @@ icons precede some text to indicate:

    -

    Table 1.1. Icons

    +

    Table 1.1. Icons

    @@ -199,7 +199,7 @@ Tools.

    - + Support

    @@ -215,8 +215,12 @@

    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/quick_start.html b/doc/html/fusion/quick_start.html index f3ca0949..7b92387d 100644 --- a/doc/html/fusion/quick_start.html +++ b/doc/html/fusion/quick_start.html @@ -2,7 +2,7 @@ Quick Start - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -29,37 +29,38 @@ I assume the reader is already familiar with tuples (Boost.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. + is more or less a synonym for fusion's vector.

    - For starters, we shall include all of Fusion's _sequence_s - [1] + For starters, we shall include all of Fusion's Sequence(s) + [2] :

     #include <boost/fusion/sequence.hpp>
    +#include <boost/fusion/include/sequence.hpp>
     

    - Let's begin with a vector - [2] + Let's begin with a vector + [3] :

    -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);
    +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 + Just replace tuple for vector + and get for at_c and this is exactly like Boost.Tuple. Actually, either names can be used interchangeably. Yet, the similarity ends - there. You can do a lot more with Fusion vector or tuple. + there. You can do a lot more with Fusion vector or tuple. Let's see some examples.

    - + Print the vector as XML

    @@ -68,6 +69,7 @@

     #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> @@ -79,7 +81,7 @@ template <typename T> void operator()(T const& x) const { - std::cout + std::cout << '<' << typeid(x).name() << '>' << x << "</" << typeid(x).name() << '>' @@ -91,10 +93,10 @@ Now, finally:

    -for_each(stuff, print_xml());
    +for_each(stuff, print_xml());
     

    - That's it! for_each is a fusion algorithm. + 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 @@ -111,12 +113,12 @@

    - for_each is generic. With + for_each is generic. With print_xml, you can use it to - print just about any Fusion Sequence. + print just about any Fusion Sequence.

    - + Print only pointers

    @@ -135,37 +137,37 @@ template <typename Sequence> void xml_print_pointers(Sequence const& seq) { - for_each(filter_if<boost::is_pointer<_> >(seq), print_xml()); + 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. + 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 + This "filtered view" is then passed to the for_each algorithm, which then prints the "filtered view" as XML.

    Easy, right?

    - + 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 + 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: + Fusion's map + associate types with elements. It can be used as a cleverer replacement of + the struct. Example:

     namespace fields
    @@ -174,13 +176,13 @@
         struct age;
     }
     
    -typedef map<
    +typedef map<
         fusion::pair<fields::name, std::string>
    -  , fusion::pair<fields::age, int> > 
    +  , fusion::pair<fields::age, int> >
     person;
     

    - map + 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 @@ -190,8 +192,8 @@

     using namespace fields;
    -std::string person_name = at_key<name>(a_person);
    -int person_age = at_key<age>(a_person);
    +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. @@ -199,7 +201,7 @@ 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 - maps. + maps. Example:

    @@ -215,7 +217,7 @@
     template <typename Stuff>
     void save(Stuff const& stuff)
     {
    -    for_each(stuff, saver());
    +    for_each(stuff, saver());
     }
     

    @@ -225,7 +227,7 @@ a dog or a whole alternate_universe.

    - + Tip of the Iceberg

    @@ -236,12 +238,12 @@



    -

    [1] +

    [2] There are finer grained header files available if you wish to have more control over which components to include (see section Orgainization for details).

    -

    [2] +

    [3] 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. @@ -250,8 +252,12 @@

    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/references.html b/doc/html/fusion/references.html index 452b9622..e5d6d26a 100644 --- a/doc/html/fusion/references.html +++ b/doc/html/fusion/references.html @@ -2,7 +2,7 @@ References - + @@ -11,10 +11,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -57,8 +57,12 @@
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/sequence.html b/doc/html/fusion/sequence.html new file mode 100644 index 00000000..0184e041 --- /dev/null +++ b/doc/html/fusion/sequence.html @@ -0,0 +1,84 @@ + + + +Sequence + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + Like MPL, the + Sequence is a fundamental concept in Fusion. A Sequence may or may not actually + store or contain data. Container are + sequences that hold data. Views, on the + other hand, are sequences that do not store any data. Instead, they are proxies + that impart an alternative presentation over another sequence. All models of + Sequence have an associated Iterator + type that can be used to iterate through the Sequence's elements. +

    +

    + + Header +

    +
    +#include <boost/fusion/sequence.hpp>
    +#include <boost/fusion/include/sequence.hpp>
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/concepts.html b/doc/html/fusion/sequence/concepts.html new file mode 100644 index 00000000..9fd3ec7e --- /dev/null +++ b/doc/html/fusion/sequence/concepts.html @@ -0,0 +1,85 @@ + + + +Concepts + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + Fusion Sequences are organized into a hierarchy of concepts. +

    +

    + + Traversal +

    +

    + Fusion's sequence traversal related concepts parallel Fusion's Iterator + Concepts. Forward + Sequence is the most basic concept. Bidirectional + Sequence is a refinement of Forward + Sequence. Random + Access Sequence is a refinement of Bidirectional + Sequence. These concepts pertain to sequence traversal. +

    +

    + + Associativity +

    +

    + The Associative + Sequence concept is orthogonal to traversal. An Associative Sequence + allows efficient retrieval of elements based on keys. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/concepts/associative_sequence.html b/doc/html/fusion/sequence/concepts/associative_sequence.html new file mode 100644 index 00000000..ee092f1f --- /dev/null +++ b/doc/html/fusion/sequence/concepts/associative_sequence.html @@ -0,0 +1,332 @@ + + + +Associative + Sequence + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + An Associative Sequence allows efficient retrieval of elements based on + keys. Like associative sequences in MPL, + and unlike associative containers in STL, + Fusion associative sequences have no implied ordering relation. Instead, + type identity is used to impose an equivalence relation on keys, and the + order in which sequence elements are traversed during iteration is left + unspecified. In addition, unlike STL, + Associative Sequences have mutable iterators. This is due to the fact that + there is no associated ordering relation and the runtime value of the keys + themselves do not have any effect on the associativity of the sequence. +

    +
    +

    Notation

    +
    +
    s
    +

    + An Associative Sequence +

    +
    S
    +

    + An Associative Sequence type +

    +
    K
    +

    + An arbitrary key type +

    +
    o
    +

    + An arbitrary object +

    +
    e
    +

    + A Sequence element +

    +
    +
    +
    + + Valid + Expressions +
    +

    + For any Associative Sequence the following expressions must be valid: +

    +
    ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Return type +

    +
    +

    + Type Requirements +

    +
    +

    + Runtime Complexity +

    +
    +

    + has_key<K>(s) +

    +
    +

    + MPL + Boolean Constant. Convertible to bool. +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + at_key<K>(s) +

    +
    +

    + Any type +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + at_key<K>(s) + = o +

    +
    +

    + Any type +

    +
    +

    + s is mutable and + e = + o, where e is the first element in the + sequence, is a valid expression. +

    +
    +

    + Constant +

    +
    +
    + + Result + Type Expressions +
    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Compile Time Complexity +

    +
    +

    + result_of::has_key<S, + K>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::at_key<S, + K>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::value_at_key<S, + K>::type +

    +
    +

    + Amortized constant time +

    +
    + +
    + + Expression + Semantics +
    +
    ++++ + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Semantics +

    +
    +

    + has_key<K>(s) +

    +
    +

    + A boolean Integral Constant c + such that c::value == + true if and only if there + is one or more elements with the key k + in s; see has_key. +

    +
    +

    + at_key<K>(s) +

    +
    +

    + The element associated with the key K + in the sequence s; + see at. +

    +
    +
    + + Models +
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/concepts/bidirectional_sequence.html b/doc/html/fusion/sequence/concepts/bidirectional_sequence.html new file mode 100644 index 00000000..3e7b0d79 --- /dev/null +++ b/doc/html/fusion/sequence/concepts/bidirectional_sequence.html @@ -0,0 +1,348 @@ + + + +Bidirectional + Sequence + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + A Bidirectional Sequence is a Forward + Sequence whose iterators model Bidirectional + Iterator. +

    +
    + + Refinement + of +
    +

    + Forward Sequence +

    +
    +

    Notation

    +
    +
    s
    +

    + A Forward Sequence +

    +
    S
    +

    + A Forward Sequence type +

    +
    o
    +

    + An arbitrary object +

    +
    e
    +

    + A Sequence element +

    +
    +
    +
    + + Valid + Expressions +
    +

    + In addition to the requirements defined in Forward + Sequence, for any Bidirectional Sequence the following must be met: +

    +
    ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Return type +

    +
    +

    + Type Requirements +

    +
    +

    + Runtime Complexity +

    +
    +

    + begin(s) +

    +
    +

    + Bidirectional + Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + end(s) +

    +
    +

    + Bidirectional + Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + back(s) +

    +
    +

    + Any type +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + back(s) + = o +

    +
    +

    + Any type +

    +
    +

    + s is mutable and + e = + o, where e is the first element in the + sequence, is a valid expression. +

    +
    +

    + Constant +

    +
    +
    + + Result + Type Expressions +
    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Compile Time Complexity +

    +
    +

    + result_of::begin<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::end<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::back<S>::type +

    +
    +

    + Amortized constant time +

    +
    +
    + + Expression + Semantics +
    +

    + The semantics of an expression are defined only where they differ from, + or are not defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + +
    +

    + Expression +

    +
    +

    + Semantics +

    +
    +

    + back(s) +

    +
    +

    + The last element in the sequence; see back. +

    +
    +
    + + Models +
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/concepts/forward_sequence.html b/doc/html/fusion/sequence/concepts/forward_sequence.html new file mode 100644 index 00000000..7d5f8719 --- /dev/null +++ b/doc/html/fusion/sequence/concepts/forward_sequence.html @@ -0,0 +1,475 @@ + + + +Forward + Sequence + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + A Forward Sequence is a Sequence whose elements are arranged in a definite + order. The ordering is guaranteed not to change from iteration to iteration. + The requirement of a definite ordering allows the definition of element-by-element + equality (if the container's element type is Equality Comparable) and of + lexicographical ordering (if the container's element type is LessThan Comparable). +

    +
    +

    Notation

    +
    +
    s
    +

    + A Forward Sequence +

    +
    S
    +

    + A Forward Sequence type +

    +
    o
    +

    + An arbitrary object +

    +
    e
    +

    + A Sequence element +

    +
    +
    +
    + + Valid + Expressions +
    +

    + For any Forward Sequence the following expressions must be valid: +

    +
    ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Return type +

    +
    +

    + Type Requirements +

    +
    +

    + Runtime Complexity +

    +
    +

    + begin(s) +

    +
    +

    + Forward + Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + end(s) +

    +
    +

    + Forward + Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + size(s) +

    +
    +

    + MPL + Integral Constant. Convertible to int. +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + empty(s) +

    +
    +

    + MPL + Boolean Constant. Convertible to bool. +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + front(s) +

    +
    +

    + Any type +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + front(s) + = o +

    +
    +

    + Any type +

    +
    +

    + s is mutable and + e = + o, where e is the first element in the + sequence, is a valid expression. +

    +
    +

    + Constant +

    +
    +
    + + Result + Type Expressions +
    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Compile Time Complexity +

    +
    +

    + result_of::begin<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::end<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::size<S>::type +

    +
    +

    + Unspecified +

    +
    +

    + result_of::empty<S>::type +

    +
    +

    + Constant time +

    +
    +

    + result_of::front<S>::type +

    +
    +

    + Amortized constant time +

    +
    +
    + + Expression + Semantics +
    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Semantics +

    +
    +

    + begin(s) +

    +
    +

    + An iterator to the first element of the sequence; see begin. +

    +
    +

    + end(s) +

    +
    +

    + A past-the-end iterator to the sequence; see end. +

    +
    +

    + size(s) +

    +
    +

    + The size of the sequence; see size. +

    +
    +

    + empty(s) +

    +
    +

    + A boolean Integral Constant c + such that c::value == + true if and only if the + sequence is empty; see empty. +

    +
    +

    + front(s) +

    +
    +

    + The first element in the sequence; see front. +

    +
    +
    + + Invariants +
    +

    + For any Forward Sequence s the following invariants always hold: +

    +
      +
    • +[begin(s), end(s)) is always a valid range. +
    • +
    • + An Algorithm that iterates through + the range [begin(s), end(s)) will pass through every element of + s exactly once. +
    • +
    • +begin(s) + is identical to end(s)) + if and only if s is empty. +
    • +
    • + Two different iterations through s + will access its elements in the same order. +
    • +
    +
    + + Models +
    + +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/concepts/random_access_sequence.html b/doc/html/fusion/sequence/concepts/random_access_sequence.html new file mode 100644 index 00000000..5de20cec --- /dev/null +++ b/doc/html/fusion/sequence/concepts/random_access_sequence.html @@ -0,0 +1,377 @@ + + + +Random + Access Sequence + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + A Random Access Sequence is a Bidirectional + Sequence whose iterators model Random + Access Iterator. It guarantees constant time access to arbitrary + sequence elements. +

    +
    + + Refinement + of +
    +

    + Bidirectional + Sequence +

    +
    +

    Notation

    +
    +
    s
    +

    + A Random Access Sequence +

    +
    S
    +

    + A Random Access Sequence type +

    +
    N
    +

    + An MPL + Integral Constant +

    +
    o
    +

    + An arbitrary object +

    +
    e
    +

    + A Sequence element +

    +
    +
    +
    + + Valid + Expressions +
    +

    + In addition to the requirements defined in Bidirectional + Sequence, for any Random Access Sequence the following must be met: +

    +
    ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Return type +

    +
    +

    + Type Requirements +

    +
    +

    + Runtime Complexity +

    +
    +

    + begin(s) +

    +
    +

    + Random + Access Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + end(s) +

    +
    +

    + Random + Access Iterator +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + at<N>(s) +

    +
    +

    + Any type +

    +
    +

    +

    +
    +

    + Constant +

    +
    +

    + at<N>(s) + = o +

    +
    +

    + Any type +

    +
    +

    + s is mutable and + e = + o, where e is the first element in the + sequence, is a valid expression. +

    +
    +

    + Constant +

    +
    +
    + + Result + Type Expressions +
    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Expression +

    +
    +

    + Compile Time Complexity +

    +
    +

    + result_of::begin<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::end<S>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::at<S, + N>::type +

    +
    +

    + Amortized constant time +

    +
    +

    + result_of::value_at<S, + N>::type +

    +
    +

    + Amortized constant time +

    +
    + +
    + + Expression + Semantics +
    +

    + The semantics of an expression are defined only where they differ from, + or are not defined in Bidirectional + Sequence. +

    +
    ++++ + + + + + + + + +
    +

    + Expression +

    +
    +

    + Semantics +

    +
    +

    + at<N>(s) +

    +
    +

    + The Nth element from the beginning of the sequence; see at. +

    +
    +
    + + Models +
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic.html b/doc/html/fusion/sequence/intrinsic.html new file mode 100644 index 00000000..7a65a0fe --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic.html @@ -0,0 +1,73 @@ + + + +Intrinsic + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + Intrinsic form the essential interface of every Fusion Sequence. + STL + counterparts of these functions are usually implemented as member functions. + Intrinsic functions, unlike Algorithms, + are not generic across the full Sequence + repertoire. They need to be implemented for each Fusion Sequence + [5] + . +

    +

    + + Header +

    +
    +#include <boost/fusion/sequence/intrinsic.hpp>
    +#include <boost/fusion/include/intrinsic.hpp>
    +
    +
    +

    +

    [5] + In practice, many of intrinsic functions have default implementations + that will work in majority of cases +

    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions.html b/doc/html/fusion/sequence/intrinsic/functions.html new file mode 100644 index 00000000..69208798 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions.html @@ -0,0 +1,56 @@ + + + +Functions + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    + + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/at.html b/doc/html/fusion/sequence/intrinsic/functions/at.html new file mode 100644 index 00000000..9c4b9d4b --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/at.html @@ -0,0 +1,174 @@ + + + +at + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +at
    +
    + + Description +
    +

    + Returns the N-th element from the beginning of the sequence. +

    +
    + + Synopsis +
    +
    +template <typename N, typename Sequence>
    +typename result_of::at<Sequence, N>::type
    +at(Sequence& seq);
    +
    +template <typename N, typename Sequence>
    +typename result_of::at<Sequence const, N>::type
    +at(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Random + Access Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +

    + N +

    +
    +

    + An MPL + Integral Constant +

    +
    +

    + An index from the beginning of the sequence. +

    +
    +
    + + Expression + Semantics +
    +
    +at<N>(seq);
    +
    +

    + Return type: Returns a reference to + the N-th element from the beginning of the sequence seq + if seq is mutable and + e = + o, where e + is the N-th element from the beginning of the sequence, is a valid expression. + Else, returns a type convertable to the N-th element from the beginning + of the sequence. +

    +

    + Precondition: 0 + <= N::value < size(s) +

    +

    + Semantics: Equivalent to +

    +
    +deref(advance<N>(begin(s)))
    +
    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/at.hpp>
    +#include <boost/fusion/include/at.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(at<mpl::int_<1> >(v) == 2);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/at_c.html b/doc/html/fusion/sequence/intrinsic/functions/at_c.html new file mode 100644 index 00000000..7cb5f0bb --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/at_c.html @@ -0,0 +1,174 @@ + + + +at_c + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the N-th element from the beginning of the sequence. +

    +
    + + Synopsis +
    +
    +template <int N, typename Sequence>
    +typename result_of::at_c<Sequence, N>::type
    +at_c(Sequence& seq);
    +
    +template <int N, typename Sequence>
    +typename result_of::at_c<Sequence const, N>::type
    +at_c(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Random + Access Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +

    + N +

    +
    +

    + An integral constant +

    +
    +

    + An index from the beginning of the sequence. +

    +
    +
    + + Expression + Semantics +
    +
    +at_c<N>(seq);
    +
    +

    + Return type: Returns a reference to + the N-th element from the beginning of the sequence seq + if seq is mutable and + e = + o, where e + is the N-th element from the beginning of the sequence, is a valid expression. + Else, returns a type convertable to the N-th element from the beginning + of the sequence. +

    +

    + Precondition: 0 + <= N + < size(s) +

    +

    + Semantics: Equivalent to +

    +
    +deref(advance<N>(begin(s)))
    +
    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/at_c.hpp>
    +#include <boost/fusion/include/at_c.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(at_c<1>(v) == 2);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/at_key.html b/doc/html/fusion/sequence/intrinsic/functions/at_key.html new file mode 100644 index 00000000..ec15a26a --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/at_key.html @@ -0,0 +1,169 @@ + + + +at_key + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the element associated with a Key from the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Key, typename Sequence>
    +typename result_of::at_key<Sequence, Key>::type
    +at_key(Sequence& seq);
    +
    +template <typename Key, typename Sequence>
    +typename result_of::at_key<Sequence const, Key>::type
    +at_key(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Associative + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +

    + Key +

    +
    +

    + Any type +

    +
    +

    + The queried key. +

    +
    +
    + + Expression + Semantics +
    +
    +at_key<Key>(seq);
    +
    +

    + Return type: Returns a reference to + the element associated with Key from the sequence seq + if seq is mutable and + e = + o, where e + is the element associated with Key, is a valid expression. Else, returns + a type convertable to the element associated with Key. +

    +

    + Precondition: has_key<Key>(seq) == true +

    +

    + Semantics: Returns the element associated + with Key. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/at_key.hpp>
    +#include <boost/fusion/include/at_key.hpp>
    +
    +
    + + Example +
    +
    +set<int, char, bool> s(1, 'x', true);
    +assert(at_key<char>(s) == 'x');
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/back.html b/doc/html/fusion/sequence/intrinsic/functions/back.html new file mode 100644 index 00000000..addace54 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/back.html @@ -0,0 +1,150 @@ + + + +back + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the last element in the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::back<Sequence>::type
    +back(Sequence& seq);
    +
    +template <typename Sequence>
    +typename result_of::back<Sequence const>::type
    +back(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Bidirectional + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +
    + + Expression + Semantics +
    +
    +back(seq);
    +
    +

    + Return type: Returns a reference to + the last element in the sequence seq + if seq is mutable and + e = + o, where e + is the last element in the sequence, is a valid expression. Else, returns + a type convertable to the last element in the sequence. +

    +

    + Precondition: empty(seq) == false +

    +

    + Semantics: Returns the last element + in the sequence. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/back.hpp>
    +#include <boost/fusion/include/back.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(back(v) == 3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/begin.html b/doc/html/fusion/sequence/intrinsic/functions/begin.html new file mode 100644 index 00000000..516eec4d --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/begin.html @@ -0,0 +1,156 @@ + + + +begin + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns an iterator pointing to the first element in the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::begin<Sequence>::type
    +begin(Sequence& seq);
    +
    +template <typename Sequence>
    +typename result_of::begin<Sequence const>::type
    +begin(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Forward + Sequence +

    +
    +

    + The sequence we wish to get an iterator from. +

    +
    +
    + + Expression + Semantics +
    +
    +begin(seq);
    +
    +

    + Return type: Forward + Iterator if seq + is a Forward + Sequence else, Bidirectional + Iterator if seq + is a Bidirectional + Sequence else, Random + Access Iterator if seq + is a Random + Access Sequence. +

    +

    + Semantics: Returns an iterator pointing + to the first element in the sequence. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/begin.hpp>
    +#include <boost/fusion/include/begin.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(deref(begin(v)) == 1);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/empty.html b/doc/html/fusion/sequence/intrinsic/functions/empty.html new file mode 100644 index 00000000..de9b5c8d --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/empty.html @@ -0,0 +1,139 @@ + + + +empty + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns a type convertible to bool + that evaluates to true if + the sequence is empty, else, evaluates to false. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::empty<Sequence>::type
    +empty(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Forward + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +
    + + Expression + Semantics +
    +
    +empty(seq);
    +
    +

    + Return type: Convertible to bool. +

    +

    + Semantics: Evaluates to true if the sequence is empty, else, evaluates + to false. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/empty.hpp>
    +#include <boost/fusion/include/empty.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(empty(v) == false);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/end.html b/doc/html/fusion/sequence/intrinsic/functions/end.html new file mode 100644 index 00000000..99039044 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/end.html @@ -0,0 +1,156 @@ + + + +end + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +end
    +
    + + Description +
    +

    + Returns an iterator pointing to one element past the end of the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::end<Sequence>::type
    +end(Sequence& seq);
    +
    +template <typename Sequence>
    +typename result_of::end<Sequence const>::type
    +end(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Forward + Sequence +

    +
    +

    + The sequence we wish to get an iterator from. +

    +
    +
    + + Expression + Semantics +
    +
    +end(seq);
    +
    +

    + Return type: Forward + Iterator if seq + is a Forward + Sequence else, Bidirectional + Iterator if seq + is a Bidirectional + Sequence else, Random + Access Iterator if seq + is a Random + Access Sequence. +

    +

    + Semantics: Returns an iterator pointing + to one element past the end of the sequence. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/end.hpp>
    +#include <boost/fusion/include/end.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(deref(prior(end(v))) == 3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/front.html b/doc/html/fusion/sequence/intrinsic/functions/front.html new file mode 100644 index 00000000..20fadc19 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/front.html @@ -0,0 +1,150 @@ + + + +front + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the first element in the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::front<Sequence>::type
    +front(Sequence& seq);
    +
    +template <typename Sequence>
    +typename result_of::front<Sequence const>::type
    +front(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Forward + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +
    + + Expression + Semantics +
    +
    +front(seq);
    +
    +

    + Return type: Returns a reference to + the first element in the sequence seq + if seq is mutable and + e = + o, where e + is the first element in the sequence, is a valid expression. Else, returns + a type convertable to the first element in the sequence. +

    +

    + Precondition: empty(seq) == false +

    +

    + Semantics: Returns the first element + in the sequence. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/front.hpp>
    +#include <boost/fusion/include/front.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(front(v) == 1);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/has_key.html b/doc/html/fusion/sequence/intrinsic/functions/has_key.html new file mode 100644 index 00000000..25811df4 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/has_key.html @@ -0,0 +1,159 @@ + + + +has_key + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns a type convertible to bool + that evaluates to true if + the sequence contains an element associated with a Key, else, evaluates + to false. +

    +
    + + Synopsis +
    +
    +template <typename Key, typename Sequence>
    +typename result_of::has_key<Sequence, Key>::type
    +has_key(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Associative + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +

    + Key +

    +
    +

    + Any type +

    +
    +

    + The queried key. +

    +
    +
    + + Expression + Semantics +
    +
    +has_key<Key>(seq);
    +
    +

    + Return type: Convertible to bool. +

    +

    + Semantics: Evaluates to true if the sequence contains an element + associated with Key, else, evaluates to false. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/has_key.hpp>
    +#include <boost/fusion/include/has_key.hpp>
    +
    +
    + + Example +
    +
    +set<int, char, bool> s(1, 'x', true);
    +assert(has_key<char>(s) == true);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/size.html b/doc/html/fusion/sequence/intrinsic/functions/size.html new file mode 100644 index 00000000..aa312a98 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/size.html @@ -0,0 +1,138 @@ + + + +size + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns a type convertible to int + that evaluates the number of elements in the sequence. +

    +
    + + Synopsis +
    +
    +template <typename Sequence>
    +typename result_of::size<Sequence>::type
    +size(Sequence const& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq +

    +
    +

    + Model of Forward + Sequence +

    +
    +

    + The sequence we wish to investigate. +

    +
    +
    + + Expression + Semantics +
    +
    +size(seq);
    +
    +

    + Return type: Convertible to int. +

    +

    + Semantics: Returns the number of elements + in the sequence. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/intrinsic/size.hpp>
    +#include <boost/fusion/include/size.hpp>
    +
    +
    + + Example +
    +
    +vector<int, int, int> v(1, 2, 3);
    +assert(size(v) == 3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/functions/swap.html b/doc/html/fusion/sequence/intrinsic/functions/swap.html new file mode 100644 index 00000000..3a573a71 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/functions/swap.html @@ -0,0 +1,135 @@ + + + +swap + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Performs an element by element swap of the elements in 2 sequences. +

    +
    + + Synopsis +
    +
    +template<typename Seq1, typename Seq2>
    +void swap(Seq1& seq1, Seq2& seq2);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameters +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + seq1, seq2 +

    +
    +

    + Models of Forward + Sequence +

    +
    +

    + The sequences whos elements we wish to swap. +

    +
    +
    + + Expression + Semantics +
    +
    +swap(seq1, seq2);
    +
    +

    + Return type: void +

    +

    + Precondition: size(seq1) == size(seq2) +

    +

    + Semantics: Calls swap(a1, b1) for corresponding elements in seq1 and seq2. +

    +

    + /sequence/intrinsic/swap.hpp> +

    +
    + + Example +
    +
    +vector<int, std::string> v1(1, "hello"), v2(2, "world");
    +swap(v1, v2);
    +assert(v1 == make_vector(2, "world"));
    +assert(v2 == make_vector(1, "hello"));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions.html b/doc/html/fusion/sequence/intrinsic/metafunctions.html new file mode 100644 index 00000000..589d575b --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions.html @@ -0,0 +1,59 @@ + + + +Metafunctions + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    + + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/at.html b/doc/html/fusion/sequence/intrinsic/metafunctions/at.html new file mode 100644 index 00000000..f627a517 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/at.html @@ -0,0 +1,166 @@ + + + +at + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +at
    +
    + + Description +
    +

    + Returns the result type of at + [6] + . +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    typename N>
    +struct at
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.25. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + N +

    +
    +

    + An MPL + Integral Constant +

    +
    +

    + Index of element +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::at<Seq, N>::type
    +
    +

    + Return type: Any type. +

    +

    + Semantics: Returns the result type of + using at to access the Nth element of Seq. +

    +

    + /sequence/intrinsic/at.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,float,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::at<vec, boost::mpl::int_<1> >::type, float&>));
    +
    +
    +

    +

    [6] + result_of::at reflects the actual return + type of the function at. Sequence(s) + typically return references to its elements via the at function. If you want + to get the actual element type, use result_of::value_at +

    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/at_c.html b/doc/html/fusion/sequence/intrinsic/metafunctions/at_c.html new file mode 100644 index 00000000..2e74d5a1 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/at_c.html @@ -0,0 +1,165 @@ + + + +at_c + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of at_c + [7] + . +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    int M>
    +struct at_c
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.26. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + M +

    +
    +

    + Positive integer index +

    +
    +

    + Index of element +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::at_c<Seq, M>::type
    +
    +

    + Return type: Any type +

    +

    + Semantics: Returns the result type of + using at_c to access the Mth element of Seq. +

    +

    + /sequence/intrinsic/at.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,float,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::at_c<vec, 1>::type, float&>));
    +
    +
    +

    +

    [7] + result_of::at_c reflects the actual + return type of the function at_c. Sequence(s) + typically return references to its elements via the at_c function. If you want + to get the actual element type, use result_of::value_at_c +

    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/at_key.html b/doc/html/fusion/sequence/intrinsic/metafunctions/at_key.html new file mode 100644 index 00000000..e6905a1a --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/at_key.html @@ -0,0 +1,167 @@ + + + +at_key + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of at_key + [8] + . +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    typename Key>
    +struct at_key
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.30. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + Key +

    +
    +

    + Any type +

    +
    +

    + Key type +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::at_key<Seq, Key>::type
    +
    +

    + Return type: Any type. +

    +

    + Semantics: Returns the result of using + at_key to access the element + with key type Key in + Seq. +

    +

    + /sequence/intrinsic/at_key.hpp> +

    +
    + + Example +
    +
    +typedef map<pair<int, char>, pair<char, char>, pair<double, char> > mymap;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::at_key<mymap, int>::type, char&>));
    +
    +
    +

    +

    [8] + result_of::at_key reflects the actual + return type of the function at_key. _sequence_s + typically return references to its elements via the at_key function. If you + want to get the actual element type, use result_of::value_at_key +

    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/back.html b/doc/html/fusion/sequence/intrinsic/metafunctions/back.html new file mode 100644 index 00000000..721782f6 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/back.html @@ -0,0 +1,133 @@ + + + +back + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of back. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct back
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.23. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::back<Seq>::type
    +
    +

    + Return type: Any type +

    +

    + Semantics: The type returned by dereferencing + an iterator to the last element in the sequence. Equivalent to result_of::deref<result_of::prior<result_of::end<Seq>::type>::type>::type. +

    +

    + /sequence/intrinsic/back.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::back<vec>::type, char&>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/begin.html b/doc/html/fusion/sequence/intrinsic/metafunctions/begin.html new file mode 100644 index 00000000..cbe37740 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/begin.html @@ -0,0 +1,135 @@ + + + +begin + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of begin. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct begin
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.19. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::begin<Seq>::type
    +
    +

    + Return type: An iterator modelling the + same traversal concept as Seq. +

    +

    + Semantics: Returns the type of an iterator + to the first element of Seq. +

    +

    + /sequence/intrinsic/begin.hpp> +

    +
    + + Example +
    +
    +typedef vector<int> vec;
    +typedef result_of::begin<vec>::type it;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::deref<it>::type, int&>))
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/empty.html b/doc/html/fusion/sequence/intrinsic/metafunctions/empty.html new file mode 100644 index 00000000..d5b777d0 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/empty.html @@ -0,0 +1,138 @@ + + + +empty + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of empty. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct empty
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.21. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::empty<Seq>::type
    +
    +

    + Return type: An MPL + Integral Constant +

    +

    + Semantics: Returns mpl::true_ + if Seq has zero elements, + mpl::false_ otherwise. +

    +

    + /sequence/intrinsic/empty.hpp> +

    +
    + + Example +
    +
    +typedef vector<> empty_vec;
    +typedef vector<int,float,char> vec;
    +
    +BOOST_MPL_ASSERT((result_of::empty<empty_vec>));
    +BOOST_MPL_ASSERT_NOT((result_of::empty<vec>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/end.html b/doc/html/fusion/sequence/intrinsic/metafunctions/end.html new file mode 100644 index 00000000..d82b3a6a --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/end.html @@ -0,0 +1,135 @@ + + + +end + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +end
    +
    + + Description +
    +

    + Returns the result type of end. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct end
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.20. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::end<Seq>::type
    +
    +

    + Return type: A model of the same traversal + concept as Seq. +

    +

    + Semantics: Returns the type of an iterator + one past the end of Seq. +

    +

    + /sequence/intrinsic/end.hpp> +

    +
    + + Example +
    +
    +typedef vector<int> vec;
    +typedef result_of::prior<result_of::end<vec>::type>::type first;
    +BOOST_MPL_ASSERT((result_of::equal_to<first, result_of::begin<vec>::type>))
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/front.html b/doc/html/fusion/sequence/intrinsic/metafunctions/front.html new file mode 100644 index 00000000..37b92308 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/front.html @@ -0,0 +1,134 @@ + + + +front + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of front. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct front
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.22. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::front<Seq>::type
    +
    +

    + Return type: Any type +

    +

    + Semantics: The type returned by dereferencing + an iterator to the first element in Seq. + Equivalent to result_of::deref<result_of::begin<Seq>::type>::type. +

    +

    + /sequence/intrinsic/front.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::front<vec>::type, int&>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/has_key.html b/doc/html/fusion/sequence/intrinsic/metafunctions/has_key.html new file mode 100644 index 00000000..851e1c03 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/has_key.html @@ -0,0 +1,158 @@ + + + +has_key + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of has_key. +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    typename Key>
    +struct has_key
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.29. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + Key +

    +
    +

    + Any type +

    +
    +

    + Key type +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::has_key<Seq, Key>::type
    +
    +

    + Return type: An MPL + Integral Constant. +

    +

    + Semantics: Returns mpl::true_ + if Seq contains an element + with key type Key, returns + mpl::false_ otherwise. +

    +

    + /sequence/intrinsic/has_key.hpp> +

    +
    + + Example +
    +
    +typedef map<pair<int, char>, pair<char, char>, pair<double, char> > mymap;
    +BOOST_MPL_ASSERT((result_of::has_key<mymap, int>));
    +BOOST_MPL_ASSERT_NOT((result_of::has_key<mymap, void*>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/size.html b/doc/html/fusion/sequence/intrinsic/metafunctions/size.html new file mode 100644 index 00000000..0a6a05c0 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/size.html @@ -0,0 +1,135 @@ + + + +size + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the result type of size. +

    +
    + + Synopsis +
    +
    +template<typename Seq>
    +struct size
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.24. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::size<Seq>::type
    +
    +

    + Return type: An MPL + Integral Constant. +

    +

    + Semantics: Returns the number of elements + in Seq. +

    +

    + /sequence/intrinsic/size.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,float,char> vec;
    +typedef result_of::size<vec>::type size_mpl_integral_constant;
    +BOOST_MPL_ASSERT_RELATION(size_mpl_integral_constant::value, ==, 3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/swap.html b/doc/html/fusion/sequence/intrinsic/metafunctions/swap.html new file mode 100644 index 00000000..e40a04ce --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/swap.html @@ -0,0 +1,124 @@ + + + +swap + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the return type of swap. +

    +
    + + Synopsis +
    +
    +template<typename Seq1, typename Seq2>
    +struct swap
    +{
    +    typedef void type;
    +};
    +
    +
    +

    Table 1.32. Parameters

    + +++++ + + + + + + + + + + +
    +

    + Parameters +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq1, Seq2 +

    +
    +

    + Models of Forward + Sequence +

    +
    +

    + The sequences being swapped +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::swap<Seq1, Seq2>::type
    +
    +

    + Return type: void. +

    +

    + Semantics: Always returns void. +

    +

    + /sequence/intrinsic/swap.hpp> +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/value_at.html b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at.html new file mode 100644 index 00000000..a47106ae --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at.html @@ -0,0 +1,155 @@ + + + +value_at + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the actual type at a given index from the Sequence. +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    typename N>
    +struct value_at
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.27. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + N +

    +
    +

    + An MPL + Integral Constant +

    +
    +

    + Index of element +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::value_at<Seq, N>::type
    +
    +

    + Return type: Any type. +

    +

    + Semantics: Returns the actual type at + the Nth element of Seq. +

    +

    + /sequence/intrinsic/value_at.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,float,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::value_at<vec, boost::mpl::int_<1> >::type, float>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_c.html b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_c.html new file mode 100644 index 00000000..7cc7efe8 --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_c.html @@ -0,0 +1,154 @@ + + + +value_at_c + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the actual type at a given index from the Sequence. +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    int M>
    +struct value_at_c
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.28. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + M +

    +
    +

    + Positive integer index +

    +
    +

    + Index of element +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::value_at_c<Seq, M>::type
    +
    +

    + Return type: Any type +

    +

    + Semantics: Returns the actual type at + the Mth element of Seq. +

    +

    + /sequence/intrinsic/value_at.hpp> +

    +
    + + Example +
    +
    +typedef vector<int,float,char> vec;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::value_at_c<vec, 1>::type, float>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_key.html b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_key.html new file mode 100644 index 00000000..fea4702b --- /dev/null +++ b/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_key.html @@ -0,0 +1,155 @@ + + + +value_at_key + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Returns the actual element type associated with a Key from the Sequence. +

    +
    + + Synopsis +
    +
    +template<
    +    typename Seq,
    +    typename Key>
    +struct value_at_key
    +{
    +    typedef unspecified type;
    +};
    +
    +
    +

    Table 1.31. Parameters

    + +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + Seq +

    +
    +

    + A model of Forward + Sequence +

    +
    +

    + Argument sequence +

    +
    +

    + Key +

    +
    +

    + Any type +

    +
    +

    + Key type +

    +
    +
    +
    + + Expression + Semantics +
    +
    +result_of::value_at_key<Seq, Key>::type
    +
    +

    + Return type: Any type. +

    +

    + Semantics: Returns the actual element + type associated with key type Key + in Seq. +

    +

    + /sequence/intrinsic/value_at_key.hpp> +

    +
    + + Example +
    +
    +typedef map<pair<int, char>, pair<char, char>, pair<double, char> > mymap;
    +BOOST_MPL_ASSERT((boost::is_same<result_of::at_key<mymap, int>::type, char>));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator.html b/doc/html/fusion/sequence/operator.html new file mode 100644 index 00000000..b60aa3bc --- /dev/null +++ b/doc/html/fusion/sequence/operator.html @@ -0,0 +1,52 @@ + + + +Operator + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + These operators, like the Algorithms, + work generically on all Fusion sequences. All conforming Fusion sequences + automatically get these operators for free. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison.html b/doc/html/fusion/sequence/operator/comparison.html new file mode 100644 index 00000000..173ded05 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison.html @@ -0,0 +1,73 @@ + + + +Comparison + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + The Comparison operators: ==, + !=, <, + <=, >= + and >= work generically + on all Fusion sequences. Comparison operators are "short- circuited": + elementary comparisons start from the first elements and are performed + only until the result is clear. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison.hpp>
    +#include <boost/fusion/include/comparison.hpp>
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/equal.html b/doc/html/fusion/sequence/operator/comparison/equal.html new file mode 100644 index 00000000..c76ddb57 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/equal.html @@ -0,0 +1,159 @@ + + + +equal + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + Compare two sequences for equality. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator==(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a == b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a == b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, e1 == e2 returns true. For any 2 zero length + _sequence_s, e and f, e == f returns + true. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/equal_to.hpp>
    +#include <boost/fusion/include/equal_to.hpp>
    +
    +
    + + Example +
    +
    +vector<int, char> v1(5, 'a');
    +vector<int, char> v2(5, 'a');
    +assert(v1 == v2);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/greater_than.html b/doc/html/fusion/sequence/operator/comparison/greater_than.html new file mode 100644 index 00000000..9f19fd25 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/greater_than.html @@ -0,0 +1,153 @@ + + + +greater + than + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + Lexicographically compare two sequences. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator>(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a > b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a < b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: Returns b < a. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/less_equal.hpp>
    +#include <boost/fusion/include/less_equal.hpp>
    +
    +
    + + Example +
    +
    +vector<int, float> v1(4, 3.3f);
    +vector<short, float> v2(5, 3.3f);
    +vector<long, double> v3(5, 4.4);
    +assert(v2 > v1);
    +assert(v3 > v2);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/greater_than_equal.html b/doc/html/fusion/sequence/operator/comparison/greater_than_equal.html new file mode 100644 index 00000000..e0be2950 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/greater_than_equal.html @@ -0,0 +1,152 @@ + + + +greater + than equal + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + Lexicographically compare two sequences. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator>=(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a >= b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a < b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: Returns !(a < b). +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/greater_equal.hpp>
    +#include <boost/fusion/include/greater_equal.hpp>
    +
    +
    + + Example +
    +
    +vector<int, float> v1(4, 3.3f);
    +vector<short, float> v2(5, 3.3f);
    +vector<long, double> v3(5, 4.4);
    +assert(v2 >= v1);
    +assert(v3 >= v2);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/less_than.html b/doc/html/fusion/sequence/operator/comparison/less_than.html new file mode 100644 index 00000000..42dbe895 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/less_than.html @@ -0,0 +1,155 @@ + + + +less + than + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + Lexicographically compare two sequences. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator<(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a < b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a < b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: Returns the lexicographical + comparison of between a + and b. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/less.hpp>
    +#include <boost/fusion/include/less.hpp>
    +
    +
    + + Example +
    +
    +vector<int, float> v1(4, 3.3f);
    +vector<short, float> v2(5, 3.3f);
    +vector<long, double> v3(5, 4.4);
    +assert(v1 < v2);
    +assert(v2 < v3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/less_than_equal.html b/doc/html/fusion/sequence/operator/comparison/less_than_equal.html new file mode 100644 index 00000000..300ec0ab --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/less_than_equal.html @@ -0,0 +1,153 @@ + + + +less + than equal + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + Lexicographically compare two sequences. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator<=(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a <= b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a < b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: Returns !(b < a). +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/less_equal.hpp>
    +#include <boost/fusion/include/less_equal.hpp>
    +
    +
    + + Example +
    +
    +vector<int, float> v1(4, 3.3f);
    +vector<short, float> v2(5, 3.3f);
    +vector<long, double> v3(5, 4.4);
    +assert(v1 <= v2);
    +assert(v2 <= v3);
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/comparison/not_equal.html b/doc/html/fusion/sequence/operator/comparison/not_equal.html new file mode 100644 index 00000000..089452a4 --- /dev/null +++ b/doc/html/fusion/sequence/operator/comparison/not_equal.html @@ -0,0 +1,155 @@ + + + +not + equal + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + Compare two sequences for inequality. +

    +
    + + Synopsis +
    +
    +template <typename Seq1, typename Seq2>
    +bool
    +operator!=(Seq1 const& a, Seq2 const& b);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + a, + b +

    +
    +

    + Instances of Sequence +

    +
    +

    + Sequence(s) to compare +

    +
    +
    + + Expression + Semantics +
    +
    +a != b
    +
    +

    + Return type: bool +

    +

    + Requirements: +

    +

    + For each element, e1, + in sequence a, and for + each element, e2, in + sequence b, a == b is a valid expression returning a + type that is convertible to bool. +

    +

    + An attempt to compare two Sequences of different lengths results in a + compile time error. +

    +

    + Semantics: +

    +

    + Returns !(a == b). +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/comparison/not_equal_to.hpp>
    +#include <boost/fusion/include/not_equal_to.hpp>
    +
    +
    + + Example +
    +
    +vector<int, char> v3(5, 'b');
    +vector<int, char> t4(2, 'a');
    +assert(v1 != v3);
    +assert(v1 != t4);
    +assert(!(v1 != v2));
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/i_o.html b/doc/html/fusion/sequence/operator/i_o.html new file mode 100644 index 00000000..c8ec47dc --- /dev/null +++ b/doc/html/fusion/sequence/operator/i_o.html @@ -0,0 +1,141 @@ + + + +I/O + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +

    +I/O

    +
    +
    in
    +
    out
    +
    +

    + The I/O operators: << + and >> work generically + on all Fusion sequences. The global operator<< has been overloaded for generic + output streams such that Sequence(s) + are output by recursively calling operator<< for each element. Analogously, + the global operator>> + has been overloaded to extract Sequence(s) + from generic input streams by recursively calling operator>> for each element. +

    +

    + The default delimiter between the elements is space, and the Sequence + is enclosed in parenthesis. For Example: +

    +
    +vector<float, int, std::string> a(1.0f, 2, std::string("Howdy folks!");
    +cout << a;
    +
    +

    + outputs the vector + as: (1.0 2 Howdy folks!) +

    +

    + The library defines three manipulators for changing the default behavior: +

    +
    +

    Manipulators

    +
    +
    tuple_open(arg)
    +

    + Defines the character that is output before the first element. +

    +
    tuple_close(arg)
    +

    + Defines the character that is output after the last element. +

    +
    tuple_delimiter(arg)
    +

    + Defines the delimiter character between elements. +

    +
    +
    +

    + The argument to tuple_open, + tuple_close and tuple_delimiter may be a char, wchar_t, + a C-string, or a wide C-string. +

    +

    + Example: +

    +
    +std::cout << tuple_open('[') << tuple_close(']') << tuple_delimiter(", ") << a;
    +
    +

    + outputs the same vector, a + as: [1.0, 2, Howdy folks!] +

    +

    + The same manipulators work with operator>> and istream + as well. Suppose the std::cin + stream contains the following data: +

    +
    +(1 2 3) [4:5]
    +
    +

    + The code: +

    +
    +vector<int, int, int> i;
    +vector<int, int> j;
    +
    +std::cin >> i;
    +std::cin >> set_open('[') >> set_close(']') >> set_delimiter(':');
    +std::cin >> j;
    +
    +

    + reads the data into the vector(s) i + and j. +

    +

    + Note that extracting Sequence(s) + with std::string or C-style string elements does + not generally work, since the streamed Sequence + representation may not be unambiguously parseable. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/io.hpp>
    +#include <boost/fusion/include/io.hpp>
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/i_o/in.html b/doc/html/fusion/sequence/operator/i_o/in.html new file mode 100644 index 00000000..40fb2b53 --- /dev/null +++ b/doc/html/fusion/sequence/operator/i_o/in.html @@ -0,0 +1,156 @@ + + + +in + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +in
    +
    + + Description +
    +

    + Read a Sequence from an input + stream. +

    +
    + + Synopsis +
    +
    +template <typename IStream, typename Sequence>
    +IStream&
    +operator>>(IStream& is, Sequence& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + is +

    +
    +

    + An input stream. +

    +
    +

    + Stream to extract information from. +

    +
    +

    + seq +

    +
    +

    + A Sequence. +

    +
    +

    + The sequence to read. +

    +
    +
    + + Expression + Semantics +
    +
    +is >> seq
    +
    +

    + Return type: IStream& +

    +

    + Semantics: For each element, e, in sequence, seq, + call is >> + e. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/io/in.hpp>
    +#include <boost/fusion/include/in.hpp>
    +
    +
    + + Example +
    +
    +vector<int, std::string, char> v;
    +std::cin >> v;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/sequence/operator/i_o/out.html b/doc/html/fusion/sequence/operator/i_o/out.html new file mode 100644 index 00000000..63e3d34d --- /dev/null +++ b/doc/html/fusion/sequence/operator/i_o/out.html @@ -0,0 +1,155 @@ + + + +out + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    +
    +out
    +
    + + Description +
    +

    + Write a Sequence to an output + stream. +

    +
    + + Synopsis +
    +
    +template <typename OStream, typename Sequence>
    +OStream&
    +operator<<(OStream& os, Sequence& seq);
    +
    +
    + + Parameters +
    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Requirement +

    +
    +

    + Description +

    +
    +

    + os +

    +
    +

    + An output stream. +

    +
    +

    + Stream to write information to. +

    +
    +

    + seq +

    +
    +

    + A Sequence. +

    +
    +

    + The sequence to write. +

    +
    +
    + + Expression + Semantics +
    +
    +os << seq
    +
    +

    + Return type: OStream& +

    +

    + Semantics: For each element, e, in sequence, seq, + call os << + e. +

    +
    + + Header +
    +
    +#include <boost/fusion/sequence/io/out.hpp>
    +#include <boost/fusion/include/out.hpp>
    +
    +
    + + Example +
    +
    +std::cout << make_vector(123, "Hello", 'x') << std::endl;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/support.html b/doc/html/fusion/support.html index 06a56770..3f08cffc 100644 --- a/doc/html/fusion/support.html +++ b/doc/html/fusion/support.html @@ -2,7 +2,7 @@ Support - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -40,8 +40,12 @@
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/category_of.html b/doc/html/fusion/support/category_of.html index 599c514b..f04098bd 100644 --- a/doc/html/fusion/support/category_of.html +++ b/doc/html/fusion/support/category_of.html @@ -2,7 +2,7 @@ category_of - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,31 +26,31 @@

    - + Description

    A metafunction that establishes the conceptual classification of a particular - Sequence or Iterator - (see Iterator Concepts and - Sequence Concepts). + Sequence or Iterator + (see Iterator Concepts and + Sequence Concepts).

    - + Synopsis

     namespace traits
     {
         template <typename T>
    -    struct category_of 
    +    struct category_of
         {
             typedef unspecified type;
         };
     }
     

    - + Parameters

    @@ -95,7 +95,7 @@

    - + Expression Semantics

    @@ -158,31 +158,36 @@

    Semantics: Establishes the conceptual classification - of a particular Sequence or Iterator. + of a particular Sequence or Iterator.

    - + Header

     #include <boost/fusion/support/category_of.hpp>
    +#include <boost/fusion/include/category_of.hpp>
     

    - + Example

     using boost::is_base_of;
    -typedef traits::category_of<list<> >::type list_category;
    -typedef traits::category_of<vector<> >::type vector_category;
    +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> ));
     
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/deduce.html b/doc/html/fusion/support/deduce.html index 4b7b035b..f245a0c1 100644 --- a/doc/html/fusion/support/deduce.html +++ b/doc/html/fusion/support/deduce.html @@ -2,7 +2,7 @@ deduce - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,7 +26,7 @@

    - + Description

    @@ -39,20 +39,21 @@ Reference wrappers are removed (see boost::ref).

    - + Header

     #include <boost/fusion/support/deduce.hpp>
    +#include <boost/fusion/include/deduce.hpp>
     

    - + Synopsis

     namespace traits
     {
    -    template <typename T> 
    +    template <typename T>
         struct deduce
         {
             typedef unspecified type;
    @@ -60,7 +61,7 @@
     }
     

    - + Example

    @@ -81,15 +82,19 @@
     }
     

    - + See also

    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/deduce_sequence.html b/doc/html/fusion/support/deduce_sequence.html index c7423807..0ac46f2c 100644 --- a/doc/html/fusion/support/deduce_sequence.html +++ b/doc/html/fusion/support/deduce_sequence.html @@ -2,7 +2,7 @@ deduce_sequence - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,33 +26,34 @@

    - + 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.

    - + Header

     #include <boost/fusion/support/deduce_sequence.hpp>
    +#include <boost/fusion/include/deduce_sequence.hpp>
     

    - + Synopsis

     namespace traits
     {
    -    template <class Sequence> 
    +    template <class Sequence>
         struct deduce_sequence
         {
             typedef unspecified type;
    @@ -60,7 +61,7 @@
     }
     

    - + Example

    @@ -75,23 +76,27 @@
     };
     
     template <typename T0, typename T1>
    -holder< vector<T0 const &, T1 const &> > 
    +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) ); 
    +    typedef vector<T0 const &, T1 const &> arg_vec_t;
    +    return holder<arg_vec_t>( arg_vec_t(a0,a1) );
     }
     

    - + See also

    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/is_sequence.html b/doc/html/fusion/support/is_sequence.html index c2e96c86..dbf93333 100644 --- a/doc/html/fusion/support/is_sequence.html +++ b/doc/html/fusion/support/is_sequence.html @@ -2,7 +2,7 @@ is_sequence - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,32 +26,32 @@

    - + Description

    Metafunction that evaluates to mpl::true_ if a certain type T is a - conforming Fusion Sequence, mpl::false_ + conforming Fusion Sequence, mpl::false_ otherwise. This may be specialized to accomodate clients which provide Fusion conforming sequences.

    - + Synopsis

     namespace traits
     {
         template <typename T>
    -    struct is_sequence 
    +    struct is_sequence
         {
             typedef unspecified type;
         };
     }
     

    - + Parameters

    @@ -96,7 +96,7 @@

    - + Expression Semantics

    @@ -114,29 +114,34 @@ otherwise.

    - + Header

     #include <boost/fusion/support/is_sequence.hpp>
    +#include <boost/fusion/include/is_sequence.hpp>
     

    - + 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> > ));
    +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> > ));
     
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/is_view.html b/doc/html/fusion/support/is_view.html index 9f245620..516e6129 100644 --- a/doc/html/fusion/support/is_view.html +++ b/doc/html/fusion/support/is_view.html @@ -2,7 +2,7 @@ is_view - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,13 +26,13 @@

    - + Description

    Metafunction that evaluates to mpl::true_ if a certain type T is a - conforming Fusion View, mpl::false_ + 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 @@ -40,21 +40,21 @@ specialized to accomodate clients providing Fusion conforming views.

    - + Synopsis

     namespace traits
     {
         template <typename T>
    -    struct is_view 
    +    struct is_view
         {
             typedef unspecified type;
         };
     }
     

    - + Parameters

    @@ -99,7 +99,7 @@

    - + Expression Semantics

    @@ -116,14 +116,15 @@
             otherwise.
           

    - + Header

     #include <boost/fusion/support/is_view.hpp>
    +#include <boost/fusion/include/is_view.hpp>
     

    - + Example

    @@ -132,15 +133,19 @@
     
     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;
    +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> ));
     
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/support/pair.html b/doc/html/fusion/support/pair.html index 92548e61..b6fdb969 100644 --- a/doc/html/fusion/support/pair.html +++ b/doc/html/fusion/support/pair.html @@ -2,42 +2,42 @@ pair - + - + - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    -PrevUpHomeNext +PrevUpHomeNext

    - + Description

    Fusion pair type is a half - runtime pair. A half runtime pair is similar to a std::pair, - but, unlike std::pair, + 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.

    - + Synopsis

    @@ -46,10 +46,10 @@
     
     namespace result_of
     {
    -    template <typename First, typename Second>
    +    template <typename Pair>
         struct first;
     
    -    template <typename First, typename Second>
    +    template <typename Pair>
         struct second;
     
         template <typename First, typename Second>
    @@ -61,7 +61,7 @@
     make_pair(Second const &);
     

    - + Template parameters

    @@ -140,7 +140,7 @@

    - + Expression Semantics

    @@ -224,6 +224,18 @@ + + + + @@ -307,14 +320,15 @@
    +

    + p.second +

    +
    +

    + Get the data from p1. +

    +

    p = @@ -232,7 +244,8 @@

    - Assigns a pair, p1, from another pair, p2. + Assigns a pair, p1, + from another pair, p2.

    - + Header

     #include <boost/fusion/support/pair.hpp>
    +#include <boost/fusion/include/pair.hpp>
     

    - + Example

    @@ -326,12 +340,16 @@
     
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    -PrevUpHomeNext +PrevUpHomeNext
    diff --git a/doc/html/fusion/support/tag_of.html b/doc/html/fusion/support/tag_of.html index 57404fd6..602913dd 100644 --- a/doc/html/fusion/support/tag_of.html +++ b/doc/html/fusion/support/tag_of.html @@ -2,7 +2,7 @@ tag_of - + @@ -12,10 +12,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -26,13 +26,13 @@

    - + Description

    All conforming Fusion sequences and iterators have an associated tag type. The purpose of the tag is to enable tag - dispatching from Intrinsic + dispatching from Intrinsic functions to implementations appropriate for the type.

    @@ -40,21 +40,21 @@ conforming sequences.

    - + Synopsis

     namespace traits
     {
         template<typename Sequence>
    -    struct tag_of 
    +    struct tag_of
         {
             typedef unspecified type;
         };
     }
     

    - + Parameters

    @@ -99,7 +99,7 @@

    - + Expression Semantics

    @@ -113,21 +113,22 @@
             with T.
           

    - + Header

     #include <boost/fusion/support/tag_of.hpp>
    +#include <boost/fusion/include/tag_of.hpp>
     

    - + 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;
    +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>));
    @@ -135,8 +136,12 @@
     
    - +
    Copyright © 2001-2007 Joel de Guzman, Dan Marsden, Tobias - Schwinger

    diff --git a/doc/html/fusion/tuple.html b/doc/html/fusion/tuple.html new file mode 100644 index 00000000..cfa62786 --- /dev/null +++ b/doc/html/fusion/tuple.html @@ -0,0 +1,69 @@ + + + +Tuple + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + 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. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple.html b/doc/html/fusion/tuple/class_template_tuple.html new file mode 100644 index 00000000..5a5ea9ff --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple.html @@ -0,0 +1,80 @@ + + + +Class template tuple + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + 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. +

    +

    + + Synopsis +

    +
    +template<
    +    typename T1 = unspecified,
    +    typename T2 = unspecified,
    +    ...
    +    typename TN = unspecified>
    +class tuple;
    +
    +

    + /tuple.hpp> +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple/construction.html b/doc/html/fusion/tuple/class_template_tuple/construction.html new file mode 100644 index 00000000..e9a5c7ed --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple/construction.html @@ -0,0 +1,134 @@ + + + +Construction + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + 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. +

    +
    + + Specification +
    +
    +

    Notation

    +
    +
    T1 + ... TN, + U1 ... + UN
    +

    + Tuple element types +

    +
    P1 + ... PN
    +

    + Parameter types +

    +
    Ti, + Ui
    +

    + The type of the ith + element of a tuple +

    +
    Pi
    +

    + The type of the ith + parameter +

    +
    +
    +
    +tuple();
    +
    +

    + Requirements: Each Ti + is default constructable. +

    +

    + 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 constructable. +

    +

    + 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. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple/element_access.html b/doc/html/fusion/tuple/class_template_tuple/element_access.html new file mode 100644 index 00000000..38d0c243 --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple/element_access.html @@ -0,0 +1,99 @@ + + + +Element + access + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + The TR1 + Tuple provides the get + function to provide access to it's elements by zero based numeric index. +

    +
    + + 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 Ith 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 Ith element of T. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple/relational_operators.html b/doc/html/fusion/tuple/class_template_tuple/relational_operators.html new file mode 100644 index 00000000..896a5c0d --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple/relational_operators.html @@ -0,0 +1,211 @@ + + + +Relational + operators + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + The TR1 + Tuple provides the standard boolean relational operators. +

    +
    + + Specification +
    +
    +

    Notation

    +
    +
    T1 + ... TN, + U1 ... + UN
    +

    + Tuple element types +

    +
    P1 + ... PN
    +

    + Parameter types +

    +
    Ti, + Ui
    +

    + The type of the ith + element of a tuple +

    +
    Pi
    +

    + The type of the ith + 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, get<i>(lhs) == get<i>(rhs) + is a valid expression returning a type that is convertible to bool. +

    +

    + Semantics: Returns true + if and only if get<i>(lhs) == 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, get<i>(lhs) < 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, get<i>(lhs) == 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, get<i>(rhs) < 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, get<i>(rhs) < 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, get<i>(lhs) < get<i>(rhs) + is a valid expression returning a type that is convertible to bool. +

    +

    + Semantics: Returns !(lhs < rhs). +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple/tuple_creation_functions.html b/doc/html/fusion/tuple/class_template_tuple/tuple_creation_functions.html new file mode 100644 index 00000000..5a61e7e9 --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple/tuple_creation_functions.html @@ -0,0 +1,84 @@ + + + +Tuple + creation functions + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + TR1 describes 2 utility functions for creating _tr1tuple_s. make_tuple + builds a tuple out of it's argument list, and tie + builds a tuple of references to it's arguments. The details of these creation + functions are described in this section. +

    +
    + + 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 has no effect. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/class_template_tuple/tuple_helper_classes.html b/doc/html/fusion/tuple/class_template_tuple/tuple_helper_classes.html new file mode 100644 index 00000000..a79dd592 --- /dev/null +++ b/doc/html/fusion/tuple/class_template_tuple/tuple_helper_classes.html @@ -0,0 +1,91 @@ + + + +Tuple + helper classes + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +
    + + Description +
    +

    + The TR1 + Tuple provides 2 helper traits, for compile time access to the + tuple size, and the element types. +

    +
    + + 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 Ith + element of T. Equivalent + to result_of::value_at<I,T>::type. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/tuple/pairs.html b/doc/html/fusion/tuple/pairs.html new file mode 100644 index 00000000..8c91a35f --- /dev/null +++ b/doc/html/fusion/tuple/pairs.html @@ -0,0 +1,112 @@ + + + +Pairs + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + + Description +

    +

    + The TR1 + Tuple interface is specified to provide uniform access to std::pair + as if it were a 2 element tuple. +

    +

    + + 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 thetype 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.[*Returns: + pr.first if I + == 0 + else pr.second. +

    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view.html b/doc/html/fusion/view.html new file mode 100644 index 00000000..7cb0fb2b --- /dev/null +++ b/doc/html/fusion/view.html @@ -0,0 +1,69 @@ + + + +View + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + + +

    + 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. +

    +

    + + Header +

    +
    +#include <boost/fusion/view.hpp>
    +#include <boost/fusion/include/view.hpp>
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/filter_view.html b/doc/html/fusion/view/filter_view.html new file mode 100644 index 00000000..f15d8e8a --- /dev/null +++ b/doc/html/fusion/view/filter_view.html @@ -0,0 +1,246 @@ + + + +filter_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + + 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_. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/filter_view.hpp>
    +#include <boost/fusion/include/filter_view.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename Sequence, typename Pred>
    +struct filter_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + Sequence +

    +
    +

    + A Forward + Sequence +

    +
    +

    +

    +
    +

    + Pred +

    +
    +

    + Unary Metafunction returning an mpl::bool_ +

    +
    +

    +

    +
    +

    + + Model of +

    + +
    +

    Notation

    +
    +
    F
    +

    + A filter_view type +

    +
    f, + f2
    +

    + Instances of filter_view +

    +
    s
    +

    + A Forward Sequence +

    +
    +
    +

    + + Expression Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/iterator_range.html b/doc/html/fusion/view/iterator_range.html new file mode 100644 index 00000000..9487c625 --- /dev/null +++ b/doc/html/fusion/view/iterator_range.html @@ -0,0 +1,261 @@ + + + +iterator_range + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + + Description +

    +

    + iterator_range presents a + sub-range of its underlying sequence delimited by a pair of iterators. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/iterator_range.hpp>
    +#include <boost/fusion/include/iterator_range.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename First, typename Last>
    +struct iterator_range;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + First +

    +
    +

    + A fusion Iterator +

    +
    +

    +

    +
    +

    + Last +

    +
    +

    + A fusion Iterator +

    +
    +

    +

    +
    +

    + + Model of +

    +
    +
    +

    Notation

    +
    +
    IR
    +

    + An iterator_range type +

    +
    f
    +

    + An instance of First +

    +
    l
    +

    + An instance of Last +

    +
    ir, + ir2
    +

    + Instances of iterator_range +

    +
    +
    +

    + + Expression + Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/joint_view.html b/doc/html/fusion/view/joint_view.html new file mode 100644 index 00000000..2c60599c --- /dev/null +++ b/doc/html/fusion/view/joint_view.html @@ -0,0 +1,247 @@ + + + +joint_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + + Description +

    +

    + joint_view presents a view + which is a concatenation of two sequences. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/joint_view.hpp>
    +#include <boost/fusion/include/joint_view.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename Sequence1, typename Sequence2>
    +struct joint_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + Sequence1 +

    +
    +

    + A Forward + Sequence +

    +
    +

    +

    +
    +

    + Sequence2 +

    +
    +

    + A Forward + Sequence +

    +
    +

    +

    +
    +

    + + Model of +

    + +
    +

    Notation

    +
    +
    JV
    +

    + A joint_view type +

    +
    s1
    +

    + An instance of Sequence1 +

    +
    s2
    +

    + An instance of Sequence2 +

    +
    jv, + jv2
    +

    + Instances of joint_view +

    +
    +
    +

    + + Expression Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/reverse_view.html b/doc/html/fusion/view/reverse_view.html new file mode 100644 index 00000000..93260b61 --- /dev/null +++ b/doc/html/fusion/view/reverse_view.html @@ -0,0 +1,219 @@ + + + +reverse_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + reverse_view presents a reversed + view of underlying sequence. The first element will be its last and the last + element will be its first. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/reverse_view.hpp>
    +#include <boost/fusion/include/reverse_view.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename Sequence>
    +struct reverse_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + Sequence +

    +
    +

    + A Bidirectional + Sequence +

    +
    +

    +

    +
    +

    + + Model of +

    + +
    +

    Notation

    +
    +
    RV
    +

    + A reverse_view type +

    +
    s
    +

    + An instance of Sequence +

    +
    rv, + rv2
    +

    + Instances of reverse_view +

    +
    +
    +

    + + Expression + Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Bidirectional + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/single_view.html b/doc/html/fusion/view/single_view.html new file mode 100644 index 00000000..f3f8595c --- /dev/null +++ b/doc/html/fusion/view/single_view.html @@ -0,0 +1,211 @@ + + + +single_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + single_view is a view into + a value as a single element sequence. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/single_view.hpp>
    +#include <boost/fusion/include/single_view.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename T>
    +struct single_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + T +

    +
    +

    + Any type +

    +
    +

    +

    +
    +

    + + Model of +

    + +
    +

    Notation

    +
    +
    S
    +

    + A single_view type +

    +
    s, + s2
    +

    + Instances of single_view +

    +
    x
    +

    + An instance of T +

    +
    +
    +

    + + Expression Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + Example +

    +
    +single_view<int> view(3);
    +std::cout << view << std::endl;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/transform_view.html b/doc/html/fusion/view/transform_view.html new file mode 100644 index 00000000..a129645d --- /dev/null +++ b/doc/html/fusion/view/transform_view.html @@ -0,0 +1,382 @@ + + + +transform_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + 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 Sequence + Traversal Concept) of its underlying sequence or sequences. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/transform_view.hpp>
    +#include <boost/fusion/include/transform_view.hpp>
    +
    +

    + + Synopsis +

    +

    + Unary Version +

    +
    +template <typename Sequence, typename F1>
    +struct transform_view;
    +
    +

    + Binary Version +

    +
    +template <typename Sequence1, typename Sequence2, typename F2>
    +struct transform_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + 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<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<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. +

    +
    +

    +

    +
    +

    + + Model of +

    +
    +
    +

    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 +

    +
    +
    +

    + + 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 Sequence Traversal Concept) + of its underlying sequence or sequences. +

    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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;
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/fusion/view/zip_view.html b/doc/html/fusion/view/zip_view.html new file mode 100644 index 00000000..c23468cc --- /dev/null +++ b/doc/html/fusion/view/zip_view.html @@ -0,0 +1,233 @@ + + + +zip_view + + + + + + + + + + + + + + + +
    Boost C++ LibrariesHomeLibrariesPeopleFAQMore
    +
    +
    +PrevUpHomeNext +
    +
    + +

    + + 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. +

    +

    + + Header +

    +
    +#include <boost/fusion/view/zip_view.hpp>
    +#include <boost/fusion/include/zip_view.hpp>
    +
    +

    + + Synopsis +

    +
    +template <typename Sequences>
    +struct zip_view;
    +
    +

    + + Template parameters +

    +
    +++++ + + + + + + + + + + +
    +

    + Parameter +

    +
    +

    + Description +

    +
    +

    + Default +

    +
    +

    + Sequences +

    +
    +

    + A Forward + Sequence of references to other Fusion _sequence_s +

    +
    +

    +

    +
    +

    + + Model of +

    +
    +
    +

    Notation

    +
    +
    ZV
    +

    + A joint_view type +

    +
    s
    +

    + An instance of Sequences +

    +
    zv1, + zv2
    +

    + Instances of ZV +

    +
    +
    +

    + + Expression Semantics +

    +

    + Semantics of an expression is defined only where it differs from, or is not + defined in Forward + Sequence. +

    +
    ++++ + + + + + + + + + + + + + + + + + + +
    +

    + 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. +

    +
    +

    + + 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))
    +
    +
    + + + +
    +
    +
    +PrevUpHomeNext +
    + + diff --git a/doc/html/images/alert.png b/doc/html/images/alert.png old mode 100755 new mode 100644 diff --git a/doc/html/images/home.png b/doc/html/images/home.png old mode 100755 new mode 100644 diff --git a/doc/html/images/next.png b/doc/html/images/next.png old mode 100755 new mode 100644 diff --git a/doc/html/images/note.png b/doc/html/images/note.png old mode 100755 new mode 100644 diff --git a/doc/html/images/prev.png b/doc/html/images/prev.png old mode 100755 new mode 100644 diff --git a/doc/html/images/smiley.png b/doc/html/images/smiley.png old mode 100755 new mode 100644 diff --git a/doc/html/images/tip.png b/doc/html/images/tip.png old mode 100755 new mode 100644 diff --git a/doc/html/images/up.png b/doc/html/images/up.png old mode 100755 new mode 100644 diff --git a/doc/html/index.html b/doc/html/index.html index 7be69e34..6d3d1f9a 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -2,7 +2,7 @@ Chapter 1. Fusion 2.0 - + @@ -10,10 +10,10 @@ - + - - + +
    Boost C++ LibrariesHomeHome LibrariesPeopleFAQPeopleFAQ More

    @@ -22,10 +22,19 @@

    Chapter 1. Fusion 2.0

    +

    +Joel de Guzman +

    +

    +Dan Marsden +

    +

    +Tobias Schwinger +

    -

    +

    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)

    @@ -48,142 +57,148 @@
    deduce_sequence
    pair
  • -
    Iterators
    +
    Iterator
    -
    Concepts
    +
    Concepts
    -
    Forward +
    Forward Iterator
    -
    Bidirectional +
    Bidirectional Iterator
    -
    Random +
    Random Access Iterator
    -
    Functions
    +
    Functions
    -
    deref
    -
    next
    -
    prior
    -
    distance
    -
    advance
    -
    advance_c
    +
    deref
    +
    next
    +
    prior
    +
    distance
    +
    advance
    +
    advance_c
    -
    Operators
    +
    Operator
    -
    Operator +
    Operator *
    -
    Operator +
    Operator ==
    -
    Operator +
    Operator !=
    -
    Metafunctions
    +
    Metafunctions
    -
    value_of
    -
    deref
    -
    next
    -
    prior
    -
    equal_to
    -
    distance
    -
    advance
    -
    advance_c
    +
    value_of
    +
    deref
    +
    next
    +
    prior
    +
    equal_to
    +
    distance
    +
    advance
    +
    advance_c
    -
    Sequences
    +
    Sequence
    -
    Concepts
    +
    Concepts
    -
    Forward +
    Forward Sequence
    -
    Bidirectional +
    Bidirectional Sequence
    -
    Random +
    Random Access Sequence
    -
    Associative +
    Associative Sequence
    -
    Containers
    +
    Intrinsic
    -
    vector
    -
    cons
    -
    list
    -
    set
    -
    map
    +
    Functions
    +
    Metafunctions
    -
    Views
    +
    Operator
    -
    single_view
    -
    filter_view
    -
    iterator_range
    -
    joint_view
    -
    zip_view
    -
    transform_view
    -
    reverse_view
    -
    -
    Adapted
    -
    -
    std::pair
    -
    mpl sequence
    -
    boost::array
    -
    boost::tuple
    -
    boost::variant
    -
    -
    Intrinsics
    -
    -
    Functions
    -
    Metafunctions
    -
    -
    Generation
    -
    -
    Functions
    -
    MetaFunctions
    -
    -
    Conversion
    -
    -
    Functions
    -
    Metafunctions
    -
    -
    Operators
    -
    -
    I/O
    -
    Comparison
    +
    I/O
    +
    Comparison
    -
    Algorithms
    +
    Container
    -
    Iteration
    +
    vector
    +
    cons
    +
    list
    +
    set
    +
    map
    +
    Generation
    -
    Functions
    -
    Metafunctions
    +
    Functions
    +
    MetaFunctions
    -
    Query
    +
    Conversion
    -
    Functions
    -
    Metafunctions
    -
    -
    Transformation
    -
    -
    Functions
    -
    Metafunctions
    +
    Functions
    +
    Metafunctions
    -
    Tuples
    +
    View
    -
    Class template tuple
    +
    single_view
    +
    filter_view
    +
    iterator_range
    +
    joint_view
    +
    zip_view
    +
    transform_view
    +
    reverse_view
    +
    +
    Adapted
    -
    Construction
    -
    Tuple +
    std::pair
    +
    mpl sequence
    +
    boost::array
    +
    boost::tuple
    +
    BOOST_FUSION_ADAPT_STRUCT
    +
    BOOST_FUSION_ADAPT_ASSOC_STRUCT
    +
    +
    Algorithm
    +
    +
    Iteration
    +
    +
    Functions
    +
    Metafunctions
    +
    +
    Query
    +
    +
    Functions
    +
    Metafunctions
    +
    +
    Transformation
    +
    +
    Functions
    +
    Metafunctions
    +
    +
    +
    Tuple
    +
    +
    Class template tuple
    +
    +
    Construction
    +
    Tuple creation functions
    -
    Tuple +
    Tuple helper classes
    -
    Element +
    Element access
    -
    Relational +
    Relational operators
    -
    Pairs
    +
    Pairs
    Extension
    +
    +
    The Full Extension Mechanism
    +
    Sequence Facade
    +
    Iterator Facade
    +
    Functional
    Concepts
    @@ -225,8 +240,8 @@ - - + +

    Last revised: September 22, 2007 at 01:00:16 GMT

    Last revised: July 21, 2008 at 07:17:27 GMT


    Next
    diff --git a/doc/introduction.qbk b/doc/introduction.qbk index d8f3f880..066f5a33 100644 --- a/doc/introduction.qbk +++ b/doc/introduction.qbk @@ -1,81 +1,90 @@ +[/============================================================================== + 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) +===============================================================================/] [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` can only hold -`int`s. A `list` can only hold elements of type `X`, and so on. +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` can only hold +`int`s. A `list` 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 +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 +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 +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 +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 +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 +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. 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. +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] diff --git a/doc/iterator.qbk b/doc/iterator.qbk new file mode 100644 index 00000000..b057513c --- /dev/null +++ b/doc/iterator.qbk @@ -0,0 +1,882 @@ +[/============================================================================== + 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) +===============================================================================/] +[section Iterator] + +Like __mpl__ and __stl__, iterators are a fundamental concept in Fusion. +As with __mpl__ and __stl__ iterators describe positions, and +provide access to data within an underlying __sequence__. + +[heading Header] + #include + #include + +[section Concepts] + +Fusion iterators are divided into different traversal categories. +__forward_iterator__ is the most basic concept. __bidirectional_iterator__ +is a refinement of __forward_iterator__. __random_access_iterator__ is a +refinement of __bidirectional_iterator__. + +[section Forward Iterator] + +[heading Description] +A Forward Iterator traverses a __sequence__ allowing movement in only one direction through +it's elements, one element at a time. + +[variablelist Notation + [[`i`, `j`] [Forward Iterators]] + [[`I`, `J`] [Forward Iterator types]] + [[`M`] [An __mpl__ integral constant]] + [[`N`] [An integral constant]] +] + +[heading Expression requirements] +A type models Forward Iterator if, in addition to being CopyConstructable, +the following expressions are valid: + +[table + [[Expression] [Return type] [Runtime Complexity]] + [[`__next__(i)`] [__forward_iterator__] [Constant]] + [[`i == j`] [Convertible to bool] [Constant]] + [[`i != j`] [Convertible to bool] [Constant]] + [[`__advance_c__(i)`] [__forward_iterator__] [Constant]] + [[`__advance__(i)`] [__forward_iterator__] [Constant]] + [[`__distance__(i, j)`] [`__result_of_distance__::type`][Constant]] + [[`__deref__(i)`] [`__result_of_deref__::type`] [Constant]] + [[`*i`] [`__result_of_deref__::type`] [Constant]] +] + +[heading Meta Expressions] +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_next__::type`] [Amortized constant time]] + [[`__result_of_equal_to__::type`] [Amortized constant time]] + [[`__result_of_advance_c__::type`] [Linear]] + [[`__result_of_advance__::type`] [Linear]] + [[`__result_of_distance__::type`] [Linear]] + [[`__result_of_deref__::type`] [Amortized constant time]] + [[`__result_of_value_of__::type`] [Amortized constant time]] +] + +[heading Expression Semantics] +[ +table + [[Expression] [Semantics]] + [[`__next__(i)`] [An iterator to the element following `i`]] + [[`i == j`] [Iterator equality comparison]] + [[`i != j`] [Iterator inequality comparison]] + [[`__advance_c__(i)`] [An iterator n elements after `i` in the sequence]] + [[`__advance__(i)`] [Equivalent to `advance_c(i)`]] + [[`__distance__(i, j)`] [The number of elements between `i` and `j`]] + [[`__deref__(i)`] [The element at position`i`]] + [[`*i`] [Equivalent to `deref(i)`]] +] + +[heading Invariants] +The following invariants always hold: + +* `!(i == j) == (i != j)` +* `__next__(i) == __advance_c__<1>(i)` +* `__distance__(i, __advance_c__(i)) == N` +* Using `__next__` to traverse the sequence will never return to a previously seen position +* `__deref__(i)` is equivalent to `*i` +* If `i == j` then `*i` is equivalent to `*j` + +[heading Models] +* __std_pair__ iterator +* __boost_array__ iterator +* __vector__ iterator +* __cons__ iterator +* __list__ iterator +* __set__ iterator +* __map__ iterator +* __single_view__ iterator +* __filter_view__ iterator +* __iterator_range__ iterator +* __joint_view__ iterator +* __transform_view__ iterator +* __reverse_view__ iterator + +[endsect] + +[section Bidirectional Iterator] +[heading Description] +A Bidirectional Iterator traverses a __sequence__ allowing movement in either direction one +element at a time. + +[variablelist Notation + [[`i`] [A Bidirectional Iterator]] + [[`I`] [A Bidirectional Iterator type]] + [[`M`] [An __mpl__ integral constant]] + [[`N`] [An integral constant]] +] + +[heading Refinement of] +__forward_iterator__ + +[heading Expression requirements] +In addition to the requirements defined in __forward_iterator__, +the following expressions must be valid: + +[table + [[Expression] [Return type] [Runtime Complexity]] + [[`__next__(i)`] [__bidirectional_iterator__] [Constant]] + [[`__prior__(i)`] [__bidirectional_iterator__] [Constant]] + [[`__advance_c__(i)`] [__bidirectional_iterator__] [Constant]] + [[`__advance__(i)`] [__bidirectional_iterator__] [Constant]] +] + +[heading Meta Expressions] +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_prior__::type`] [Amortized constant time]] +] + +[heading Expression Semantics] +The semantics of an expression are defined only where they differ from, or are not defined +in __forward_iterator__ + +[table + [[Expression] [Semantics]] + [[`__prior__(i)`] [An iterator to the element preceding `i`]] +] + +[heading Invariants] +In addition to the invariants of __forward_iterator__, +the following invariants always hold: + +* `__prior__(__next__(i)) == i && __prior__(__next__(i)) == __next__(__prior__(i))` +* `__prior__(i) == __advance_c__<-1>(i)` +* Using `__prior__` to traverse a sequence will never return a previously seen position + +[heading Models] +* __std_pair__ iterator +* __boost_array__ iterator +* __vector__ iterator +* __iterator_range__ (where adapted sequence is a __bidirectional_sequence__) +* __transform_view__ (where adapted sequence is a __bidirectional_sequence__) +* __reverse_view__ + +[endsect] + +[section Random Access Iterator] +[heading Description] +A Random Access Iterator traverses a __sequence__ moving in either direction, +permitting efficient arbitrary distance movements back and forward through the +sequence. + +[variablelist Notation + [[`i`, `j`] [Random Access Iterators]] + [[`I`, `J`] [Random Access Iterator types]] + [[`M`] [An __mpl__ integral constant]] + [[`N`] [An integral constant]] +] + +[heading Refinement of] +__bidirectional_iterator__ + +[heading Expression requirements] +In addition to the requirements defined in __bidirectional_iterator__, +the following expressions must be valid: + +[table + [[Expression] [Return type] [Runtime Complexity]] + [[`__next__(i)`] [__random_access_iterator__] [Constant]] + [[`__prior__(i)`] [__random_access_iterator__] [Constant]] + [[`__advance_c__(i)`] [__random_access_iterator__] [Constant]] + [[`__advance__(i)`] [__random_access_iterator__] [Constant]] +] + +[heading Meta Expressions] +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_advance_c__::type`] [Amortized constant time]] + [[`__result_of_advance__::type`] [Amortized constant time]] + [[`__result_of_distance__::type`] [Amortized constant time]] +] + +[heading Models] +* __vector__ iterator +* __std_pair__ iterator +* __boost_array__ iterator +* __iterator_range__ iterator (where adapted sequence is a __random_access_sequence__) +* __transform_view__ iterator (where adapted sequence is a __random_access_sequence__) +* __reverse_view__ iterator (where adapted sequence is a __random_access_sequence__) + +[endsect] + +[endsect] + +[section Functions] +Fusion provides functions for manipulating iterators, analogous to the similar functions +from the __mpl__ library. + +[section deref] + +[heading Description] +Deferences an iterator. + +[heading Synopsis] + template< + typename I + > + typename __result_of_deref__::type deref(I const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __deref__(i); + +[*Return type]: `__result_of_deref__::type` + +[*Semantics]: Dereferences the iterator `i`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + int i(0); + vec v(1,i); + assert(__deref__(__begin__(v)) == 1); + assert(__deref__(__next__(__begin__(v))) == 0); + assert(&(__deref__(__next__(__begin__(v)))) == &i); + +[endsect] + +[section next] + +[heading Description] +Moves an iterator 1 position forwards. + +[heading Synopsis] + template< + typename I + > + typename __result_of_next__::type next(I const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + next(i); + +[*Return type]: A model of the same iterator concept as `i`. + +[*Semantics]: Returns an iterator to the next element after `i`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + vec v(1,2,3); + assert(__deref__(__begin__(v)) == 1); + assert(__deref__(__next__(__begin__(v))) == 2); + assert(__deref__(__next__(__next__(__begin__(v)))) == 3); + +[endsect] + +[section prior] + +[heading Description] +Moves an iterator 1 position backwards. + +[heading Synopsis] + template< + typename I + > + typename __result_of_prior__::type prior(I const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __bidirectional_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __prior__(i); + +[*Return type]: A model of the same iterator concept as `i`. + +[*Semantics]: Returns an iterator to the element prior to `i`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + vec v(1,2); + assert(__deref__(__next__(__begin__(v))) == 2); + assert(__deref__(__prior__(__next__(__begin__(v)))) == 1); + +[endsect] + +[section distance] + +[heading Description] +Returns the distance between 2 iterators. + +[heading Synopsis] + template< + typename I, + typename J + > + typename __result_of_distance__::type distance(I const& i, J const& j); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`, `j`] [Models of __forward_iterator__ into the same sequence] [The start and end points of the distance to be measured]] +] + +[heading Expression Semantics] + __distance__(i,j); + +[*Return type]: `int` + +[*Semantics]: Returns the distance between iterators `i` and `j`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + vec v(1,2,3); + assert(__distance__(__begin__(v), __next__(__next__(__begin__(v)))) == 2); + +[endsect] + +[section advance] + +[heading Description] +Moves an iterator by a specified distance. + +[heading Synopsis] + template< + typename I, + typename M + > + typename __result_of_advance__::type advance(I const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __forward_iterator__] [Iterator to move relative to]] + [[`N`] [An __mpl_integral_constant__] [Number of positions to move]] +] + +[heading Expression Semantics] + __advance__(i); + +[*Return type]: A model of the same iterator concept as `i`. + +[*Semantics]: Returns an iterator to the element `M` positions from `i`. If `i` is a __bidirectional_iterator__ then `M` may be negative. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + vec v(1,2,3); + assert(__deref__(__advance__ >(__begin__(v))) == 3); + +[endsect] + +[section advance_c] + +[heading Description] +Moves an iterator by a specified distance. + +[heading Synopsis] + template< + typename I, + int N + > + typename __result_of_advance_c__::type advance_c(I const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __forward_iterator__] [Iterator to move relative to]] + [[`N`] [Integer constant] [Number of positions to move]] +] + +[heading Expression Semantics] + __advance_c__(i); + +[*Return type]: A model of the same iterator concept as `i`. + +[*Semantics]: Returns an iterator to the element `N` positions from `i`. If `i` is a __bidirectional_iterator__ then `N` may be negative. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + vec v(1,2,3); + assert(__deref__(__advance_c__<2>(__begin__(v))) == 3); + +[endsect] + +[endsect] + +[section Operator] + +Overloaded operators are provided to provide a more natural syntax for dereferencing iterators, and comparing them for equality. + +[section:operator_unary_star Operator *] + +[heading Description] +Dereferences an iterator. + +[heading Synopsis] + template< + typename I + > + typename __result_of_deref__::type operator*(__unspecified__ const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + *i + +[*Return type]: Equivalent to the return type of `__deref__(i)`. + +[*Semantics]: Equivalent to `__deref__(i)`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + + int i(0); + vec v(1,i); + assert(*__begin__(v) == 1); + assert(*__next__(__begin__(v)) == 0); + assert(&(*__next__(__begin__(v))) == &i); + +[endsect] + +[section:operator_equality Operator ==] + +[heading Description] +Compares 2 iterators for equality. + +[heading Synopsis] + template< + typename I, + typename J + > + __unspecified__ operator==(I const& i, J const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`, `j`] [Any fusion iterators] [Operation's arguments]] +] + +[heading Expression Semantics] + i == j + +[*Return type]: Convertible to `bool`. + +[*Semantics]: Equivalent to `__result_of_equal_to__::value` where `I` and `J` are the types of `i` and `j` respectively. + +[heading Header] + #include + #include + +[endsect] + +[section:operator_inequality Operator !=] + +[heading Description] +Compares 2 iterators for inequality. + +[heading Synopsis] + template< + typename I, + typename J + > + __unspecified__ operator==(I const& i, J const& i); + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`i`, `j`] [Any fusion iterators] [Operation's arguments]] +] + +[heading Expression Semantics] + +[*Return type]: Convertible to `bool`. + +[*Semantics]: Equivalent to `!__result_of_equal_to__::value` where `I` and `J` are the types of `i` and `j` respectively. + +[heading Header] + #include + #include + +[endsect] + +[endsect] + +[section Metafunctions] + +[section value_of] + +[heading Description] + +Returns the type stored at the position of an iterator. + +[heading Synopsis] + template< + typename I + > + struct value_of + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_value_of__::type + +[*Return type]: Any type + +[*Semantics]: Returns the type stored in a sequence at iterator position `I`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type first; + typedef __result_of_next__::type second; + typedef __result_of_next__::type third; + + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, int>)); + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, int&>)); + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, const int&>)); + +[endsect] + +[section deref] + +[heading Description] +Returns the type that will be returned by dereferencing an iterator. + +[heading Synposis] + template< + typename I + > + struct deref + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_deref__::type + +[*Return type]: Any type + +[*Semantics]: Returns the result of dereferencing an iterator of type `I`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef const vec const_vec; + typedef __result_of_begin__::type first; + typedef __result_of_next__::type second; + + typedef __result_of_begin__::type const_first; + typedef __result_of_next__::type const_second; + + BOOST_MPL_ASSERT((boost::is_same<__result_of_deref__::type, int&>)); + BOOST_MPL_ASSERT((boost::is_same<__result_of_deref__::type, int&>)); + +[endsect] + +[section next] + +[heading Description] +Returns the type of the next iterator in a sequence. + +[heading Synposis] + template< + typename I + > + struct next + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __forward_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_next__::type + +[*Return type]: A model of the same iterator concept as `I`. + +[*Semantics]: Returns an iterator to the next element in the sequence after `I`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_next__<__result_of_begin__::type>::type second; + + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, double>)); + +[endsect] + +[section prior] + +[heading Description] +Returns the type of the previous iterator in a sequence. + +[heading Synopsis] + template< + typename I + > + struct prior + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __bidirectional_iterator__] [Operation's argument]] +] + +[heading Expression Semantics] + __result_of_prior__::type + +[*Return type]: A model of the same iterator concept as `I`. + +[*Semantics]: Returns an iterator to the previous element in the sequence before `I`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_next__<__result_of_begin__::type>::type second; + + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, double>)); + + typedef __result_of_prior__::type first; + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of__::type, int>)); + +[endsect] + +[section equal_to] + +[heading Description] +Returns a true-valued __mpl_integral_constant__ if `I` and `J` are equal. + +[heading Synopsis] + template< + typename I, + typename J + > + struct equal_to + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`, `J`] [Any fusion iterators] [Operation's arguments]] +] + +[heading Expression Semantics] + __result_of_equal_to__::type + +[*Return type]: A model of __mpl_integral_constant__. + +[*Semantics]: Returns `boost::mpl::true_` if `I` and `J` are iterators to the same position. Returns `boost::mpl::false_` otherwise. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type first; + typedef __result_of_end__::type last; + BOOST_MPL_ASSERT((__result_of_equal_to__)); + BOOST_MPL_ASSERT_NOT((__result_of_equal_to__)); + +[endsect] + +[section distance] + +[heading Description] +Returns the distance between two iterators. + +[heading Synopsis] + template< + typename I, + typename J + > + struct distance + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`, `J`] [Models of __forward_iterator__ into the same sequence] [The start and end points of the distance to be measured]] +] + +[heading Expression Semantics] + __result_of_distance__::type + +[*Return type]: A model of __mpl_integral_constant__. + +[*Semantics]: Returns the distance between iterators of types `I` and `J`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type first; + typedef __result_of_next__::type second; + typedef __result_of_next__::type third; + typedef __result_of_distance__::type dist; + + BOOST_MPL_ASSERT_RELATION(dist::value, ==, 2); + +[endsect] + +[section advance] + +[heading Description] +Moves an iterator a specified distance. + +[heading Synopsis] + template< + typename I, + typename M + > + struct advance + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __forward_iterator__] [Iterator to move relative to]] + [[`M`] [Model of __mpl_integral_constant__] [Number of positions to move]] +] + +[heading Expression Semantics] + __result_of_advance__::type + +[*Return type]: A model of the same iterator concept as `I`. + +[*Semantics]: Returns an iterator a distance `M` from `I`. If `I` is a __bidirectional_iterator__ then `M` may be negative. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type first; + typedef __result_of_next__::type second; + typedef __result_of_next__::type third; + + BOOST_MPL_ASSERT((__result_of_equal_to__<__result_of_advance__ >::type, third>)); + +[endsect] + +[section advance_c] + +[heading Description] +Moves an iterator by a specified distance. + +[heading Synopsis] + template< + typename I, + int N + > + struct advance_c + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`I`] [Model of __forward_iterator__] [Iterator to move relative to]] + [[`N`] [Integer constant] [Number of positions to move]] +] + +[heading Expression Semantics] + __result_of_advance_c__::type + +[*Return type]: A model of the same iterator concept as `I`. + +[*Semantics]: Returns an iterator a distance `N` from `I`. If `I` is a __bidirectional_iterator__ then `N` may be negative. Equivalent to `__result_of_advance__ >::type`. + +[heading Header] + #include + #include + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type first; + typedef __result_of_next__::type second; + typedef __result_of_next__::type third; + + BOOST_MPL_ASSERT((__result_of_equal_to__<__result_of_advance_c__::type, third>)); + +[endsect] + +[endsect] + +[endsect] + diff --git a/doc/notes.qbk b/doc/notes.qbk index f6fab805..e26eee6f 100644 --- a/doc/notes.qbk +++ b/doc/notes.qbk @@ -1,19 +1,26 @@ +[/============================================================================== + 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) +===============================================================================/] [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 +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 +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] @@ -40,95 +47,95 @@ as follows: In the case: -# `Sequence` is the type for which a suitable implementation of +# `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` +# `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 +# `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 extensibe sequence concept in fusion. This does -not mean that Fusion sequences are not extensible. In fact, all Fusion -sequences are inherently extensible. It is just that the manner of sequence -extension in Fusion is diferent from both __stl__ and __mpl__ on account of -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`. +Unlike __mpl__, there is no extensibe sequence concept in fusion. This does +not mean that Fusion sequences are not extensible. In fact, all Fusion +sequences are inherently extensible. It is just that the manner of sequence +extension in Fusion is diferent from both __stl__ and __mpl__ on account of +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. +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 +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__``. +returns a __list__``. 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 +Array arguments are deduced to reference to const types. For example +[footnote Note that the type of a string literal is an array of const +characters, not `const char*`. To get __make_list__ to create a __list__ +with an element of a non-const array type one must use the `ref` wrapper (see __note_boost_ref__).]: __make_list__("Donald", "Daisy") - -creates a __list__ of type + +creates a __list__ of type __list__ [*Function pointers:] -Function pointers are deduced to the plain non-reference type (i.e. to +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 + +creates a __list__ of type __list__ [heading boost::ref] -Fusion's generation functions (e.g. __make_list__) by default stores the +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 +creates a __list__ of type __list__ -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 +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: @@ -139,7 +146,7 @@ For example: __make_list__(ref(a), cref(b)); // creates list __make_list__(cref(ca)); // creates list __make_list__(ref(ca)); // creates list - + See __boost_ref__ for details. [endsect] diff --git a/doc/organization.qbk b/doc/organization.qbk index cff048f8..8b81fbfc 100644 --- a/doc/organization.qbk +++ b/doc/organization.qbk @@ -1,3 +1,10 @@ +[/============================================================================== + 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) +===============================================================================/] [section Organization] The library is organized into layers of modules, with each module addressing a particular @@ -9,13 +16,20 @@ The library is organized in three 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. The -library is header-only. There is no need to build object files to link -against. +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] @@ -24,45 +38,50 @@ against. * iteration * query * transformation -* sequence - * adapted - * array - * mpl - * std_pair - * comparison - * container - * list - * map - * set - * vector - * conversion +* adapted + * array + * mpl + * boost::tuple + * std_pair + * struct + * variant +* view + * filter_view + * iterator_range + * joint_view + * reverse_view + * single_view + * transform_view + * zip_view +* container + * deque + * list + * map + * set + * vector * generation +* mpl +* functional +* sequence + * comparison * intrinsic * io - * utility - * view - * filter_view - * iterator_range - * joint_view - * reverse_view - * single_view - * transform_view - * zip_view * iterator * support [heading Example] -If, for example, you want to use `list`, depending on the granularity that +If, for example, you want to use `list`, depending on the granularity that you desire, you may do so by including one of - #include - #include - #include - -The first includes all sequences. The second includes all of sequence -containers. The third 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.]. + #include + #include + #include + #include + +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] diff --git a/doc/preface.qbk b/doc/preface.qbk index f6a9ff95..5686642a 100644 --- a/doc/preface.qbk +++ b/doc/preface.qbk @@ -1,3 +1,10 @@ +[/============================================================================== + 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) +===============================================================================/] [section Preface] [:['["Algorithms + Data Structures = Programs.]]] @@ -13,32 +20,32 @@ 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. +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 +Tuples are powerful beasts. After having developed two significant projects (__spirit__ and __phoenix__) that relied heavily metaprogramming, it -became apparent that tuples are a powerful means to simplify otherwise tricky -tasks; especially those that require a combination of metaprogramming and -manipulation of heterogenous data types with values. While __mpl__ is an -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. +became apparent that tuples are a powerful means to simplify otherwise tricky +tasks; especially those that require a combination of metaprogramming and +manipulation of heterogenous data types with values. While __mpl__ is an +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 +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. +Some icons are used to mark certain topics indicative of their relevance. These icons precede some text to indicate: [table Icons diff --git a/doc/quick_start.qbk b/doc/quick_start.qbk index 8857b5ea..c0d69f1e 100644 --- a/doc/quick_start.qbk +++ b/doc/quick_start.qbk @@ -1,20 +1,28 @@ +[/============================================================================== + 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) +===============================================================================/] [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__`. +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 +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 + #include -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 +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__ stuff(1, 'x', "howdy"); @@ -22,9 +30,9 @@ using.]: 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 +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] @@ -32,48 +40,49 @@ the similarity ends there. You can do a lot more with Fusion `__vector__` or First, let's include the algorithms: #include - -Now, let's write a function object that prints XML of the form data -for each member in the tuple. + #include + +Now, let's write a function object that prints XML of the form data +for each member in the tuple. struct print_xml { template void operator()(T const& x) const { - std::cout + std::cout << '<' << typeid(x).name() << '>' << x << "' ; } }; - + 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`. +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 +[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 +`__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 +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 -Then, simply: +Then, simply: template void xml_print_pointers(Sequence const& seq) @@ -81,10 +90,10 @@ Then, simply: __for_each__(__filter_if__ >(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 +`__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? @@ -93,12 +102,12 @@ Easy, right? 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. +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 +Fusion's `__map__` associate types with elements. It can be used as a cleverer replacement of the `struct`. Example: namespace fields @@ -109,25 +118,25 @@ replacement of the `struct`. Example: typedef __map__< __fusion_pair__ - , __fusion_pair__ > + , __fusion_pair__ > 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` +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__(a_person); int person_age = __at_key__(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 + +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 @@ -138,21 +147,21 @@ two, if you consider loading and saving) that will work for all your fusion some_archive << data.second; } }; - + template void save(Stuff const& stuff) { __for_each__(stuff, saver()); } -The `save` function is generic and will work for all types of `stuff` +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 +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] diff --git a/doc/references.qbk b/doc/references.qbk index 840e83a3..5b6c21a1 100644 --- a/doc/references.qbk +++ b/doc/references.qbk @@ -1,19 +1,26 @@ +[/============================================================================== + 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) +===============================================================================/] [section References] -# [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts], - David Abrahams, Jeremy Siek, Thomas Witt, 2004-11-01. -# [@http://boost.org/libs/tuple/doc/tuple_users_guide.html The Boost Tuple Library], - Jaakko Jarvi, 2001. -# [@http://www.boost.org/libs/spirit/ Spirit Parser Library], +# [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts], + David Abrahams, Jeremy Siek, Thomas Witt, 2004-11-01. +# [@http://boost.org/libs/tuple/doc/tuple_users_guide.html 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/doc/html/array.html Boost Array], - Nicolai Josuttis, 2002-2004. -# [@http://www.sgi.com/tech/stl/ Standard Template Library Programmer's Guide], - Hewlett-Packard Company, 1994. -# [@http://www.boost.org/doc/html/ref.html Boost.Ref], - Jaakko Jarvi, Peter Dimov, Douglas Gregor, Dave Abrahams, 1999-2002. - +# [@http://www.boost.org/libs/mpl/ The Boost MPL Library], + Aleksey Gurtovoy and David Abrahams, 2002-2004. +# [@http://www.boost.org/doc/html/array.html Boost Array], + Nicolai Josuttis, 2002-2004. +# [@http://www.sgi.com/tech/stl/ Standard Template Library Programmer's Guide], + Hewlett-Packard Company, 1994. +# [@http://www.boost.org/doc/html/ref.html Boost.Ref], + Jaakko Jarvi, Peter Dimov, Douglas Gregor, Dave Abrahams, 1999-2002. + [endsect] diff --git a/doc/sequence.qbk b/doc/sequence.qbk new file mode 100644 index 00000000..18d65191 --- /dev/null +++ b/doc/sequence.qbk @@ -0,0 +1,1825 @@ +[/============================================================================== + 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) +===============================================================================/] +[section Sequence] + +Like __mpl__, the Sequence is a fundamental concept in Fusion. A Sequence +may or may not actually store or contain data. __containers__ are sequences +that hold data. __views__, on the other hand, are sequences that do not +store any data. Instead, they are proxies that impart an alternative +presentation over another sequence. All models of Sequence have an +associated __iterator__ type that can be used to iterate through the +Sequence's elements. + +[heading Header] + + #include + #include + +[section Concepts] + +Fusion Sequences are organized into a hierarchy of concepts. + +[heading Traversal] + +Fusion's sequence traversal related concepts parallel Fusion's +__iterator_concepts__. __forward_sequence__ is the most basic concept. +__bidirectional_sequence__ is a refinement of __forward_sequence__. +__random_access_sequence__ is a refinement of __bidirectional_sequence__. +These concepts pertain to sequence traversal. + +[heading Associativity] + +The __associative_sequence__ concept is orthogonal to traversal. An Associative +Sequence allows efficient retrieval of elements based on keys. + +[section Forward Sequence] + +[heading Description] + +A Forward Sequence is a Sequence whose elements are arranged in a definite +order. The ordering is guaranteed not to change from iteration to +iteration. The requirement of a definite ordering allows the definition of +element-by-element equality (if the container's element type is Equality +Comparable) and of lexicographical ordering (if the container's element +type is LessThan Comparable). + +[variablelist Notation + [[`s`] [A Forward Sequence]] + [[`S`] [A Forward Sequence type]] + [[`o`] [An arbitrary object]] + [[`e`] [A Sequence element]] +] + +[heading Valid Expressions] + +For any Forward Sequence the following expressions must be valid: + +[table + [[Expression] [Return type] [Type Requirements] [Runtime Complexity]] + [[`__begin__(s)`] [__forward_iterator__] [] [Constant]] + [[`__end__(s)`] [__forward_iterator__] [] [Constant]] + [[`__size__(s)`] [__mpl_integral_constant__. + Convertible to int.] [] [Constant]] + [[`__empty__(s)`] [__mpl_boolean_constant__. + Convertible to bool.] [] [Constant]] + [[`__front__(s)`] [Any type] [] [Constant]] + [[`__front__(s) = o`] [Any type] [`s` is mutable and + `e = o`, where `e` + is the first element + in the sequence, is + a valid expression.] [Constant]] +] + +[heading Result Type Expressions] + +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_begin__::type`] [Amortized constant time]] + [[`__result_of_end__::type`] [Amortized constant time]] + [[`__result_of_size__::type`] [Unspecified]] + [[`__result_of_empty__::type`] [Constant time]] + [[`__result_of_front__::type`] [Amortized constant time]] +] + +[heading Expression Semantics] + +[table + [[Expression] [Semantics]] + [[`__begin__(s)`] [An iterator to the first element of the sequence; see __begin__.]] + [[`__end__(s)`] [A past-the-end iterator to the sequence; see __end__.]] + [[`__size__(s)`] [The size of the sequence; see __size__.]] + [[`__empty__(s)`] [A boolean Integral Constant `c` such that + `c::value == true` if and only if the sequence + is empty; see __empty__.]] + [[`__front__(s)`] [The first element in the sequence; see __front__.]] +] + +[heading Invariants] + +For any Forward Sequence s the following invariants always hold: + +* `[__begin__(s), __end__(s))` is always a valid range. +* An __algorithm__ that iterates through the range `[__begin__(s), __end__(s))` + will pass through every element of `s` exactly once. +* `__begin__(s)` is identical to `__end__(s))` if and only if `s` is empty. +* Two different iterations through `s` will access its elements in + the same order. + +[heading Models] + +* __std_pair__ +* __boost_array__ +* __vector__ +* __cons__ +* __list__ +* __set__ +* __map__ +* __single_view__ +* __filter_view__ +* __iterator_range__ +* __joint_view__ +* __transform_view__ +* __reverse_view__ +* __zip_view__ + +[endsect] + +[section Bidirectional Sequence] + +[heading Description] + +A Bidirectional Sequence is a __forward_sequence__ whose iterators model +__bidirectional_iterator__. + +[heading Refinement of] + +__forward_sequence__ + +[variablelist Notation + [[`s`] [A Forward Sequence]] + [[`S`] [A Forward Sequence type]] + [[`o`] [An arbitrary object]] + [[`e`] [A Sequence element]] +] + +[heading Valid Expressions] + +In addition to the requirements defined in __forward_sequence__, for any +Bidirectional Sequence the following must be met: + +[table + [[Expression] [Return type] [Type Requirements] [Runtime Complexity]] + [[`__begin__(s)`] [__bidirectional_iterator__] [] [Constant]] + [[`__end__(s)`] [__bidirectional_iterator__] [] [Constant]] + [[`__back__(s)`] [Any type] [] [Constant]] + [[`__back__(s) = o`] [Any type] [`s` is mutable and + `e = o`, where `e` + is the first element + in the sequence, is + a valid expression.] [Constant]] +] + +[heading Result Type Expressions] + +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_begin__::type`] [Amortized constant time]] + [[`__result_of_end__::type`] [Amortized constant time]] + [[`__result_of_back__::type`] [Amortized constant time]] +] + +[heading Expression Semantics] + +The semantics of an expression are defined only where they differ from, or +are not defined in __forward_sequence__. + +[table + [[Expression] [Semantics]] + [[`__back__(s)`] [The last element in the sequence; see __back__.]] +] + +[heading Models] + +* __std_pair__ +* __boost_array__ +* __vector__ +* __reverse_view__ +* __iterator_range__ (where adapted sequence is a Bidirectional Sequence) +* __transform_view__ (where adapted sequence is a Bidirectional Sequence) +* __zip_view__ (where adapted sequences are models Bidirectional Sequence) + +[endsect] + +[section Random Access Sequence] + +[heading Description] + +A Random Access Sequence is a __bidirectional_sequence__ whose iterators +model __random_access_iterator__. It guarantees constant time access to +arbitrary sequence elements. + +[heading Refinement of] + +__bidirectional_sequence__ + +[variablelist Notation + [[`s`] [A Random Access Sequence]] + [[`S`] [A Random Access Sequence type]] + [[`N`] [An __mpl_integral_constant__]] + [[`o`] [An arbitrary object]] + [[`e`] [A Sequence element]] +] + +[heading Valid Expressions] + +In addition to the requirements defined in __bidirectional_sequence__, for +any Random Access Sequence the following must be met: + +[table + [[Expression] [Return type] [Type Requirements] [Runtime Complexity]] + [[`__begin__(s)`] [__random_access_iterator__] [] [Constant]] + [[`__end__(s)`] [__random_access_iterator__] [] [Constant]] + [[`__at__(s)`] [Any type] [] [Constant]] + [[`__at__(s) = o`] [Any type] [`s` is mutable and + `e = o`, where `e` + is the first element + in the sequence, is + a valid expression.] [Constant]] +] + +[heading Result Type Expressions] + +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_begin__::type`] [Amortized constant time]] + [[`__result_of_end__::type`] [Amortized constant time]] + [[`__result_of_at__::type`] [Amortized constant time]] + [[`__result_of_value_at__::type`] [Amortized constant time]] +] + +[blurb __note__ `__result_of_at__` returns the actual type returned by +`__at__(s)`. In most cases, this is a reference. Hence, there is no way to +know the exact element type using `__result_of_at__`.The element at `N` +may actually be a reference to begin with. For this purpose, you can use +`__result_of_value_at__`.] + +[heading Expression Semantics] + +The semantics of an expression are defined only where they differ from, or +are not defined in __bidirectional_sequence__. + +[table + [[Expression] [Semantics]] + [[`__at__(s)`] [The Nth element from the beginning of the sequence; see __at__.]] +] + +[heading Models] + +* __std_pair__ +* __boost_array__ +* __vector__ +* __reverse_view__ +* __iterator_range__ (where adapted sequence is a Random Access Sequence) +* __transform_view__ (where adapted sequence is a Random Access Sequence) +* __zip_view__ (where adapted sequences are models Random Access Sequence) + +[endsect] + +[section Associative Sequence] + +[heading Description] + +An Associative Sequence allows efficient retrieval of elements based on keys. +Like associative sequences in __mpl__, and unlike associative containers in +__stl__, Fusion associative sequences have no implied ordering relation. +Instead, type identity is used to impose an equivalence relation on keys, and +the order in which sequence elements are traversed during iteration is left +unspecified. In addition, unlike __stl__, Associative Sequences have mutable +iterators. This is due to the fact that there is no associated ordering relation +and the runtime value of the keys themselves do not have any effect on the +associativity of the sequence. + + +[variablelist Notation + [[`s`] [An Associative Sequence]] + [[`S`] [An Associative Sequence type]] + [[`K`] [An arbitrary /key/ type]] + [[`o`] [An arbitrary object]] + [[`e`] [A Sequence element]] +] + +[heading Valid Expressions] + +For any Associative Sequence the following expressions must be valid: + +[table + [[Expression] [Return type] [Type Requirements] [Runtime Complexity]] + [[`__has_key__(s)`] [__mpl_boolean_constant__. + Convertible to bool.] [] [Constant]] + [[`__at_key__(s)`] [Any type] [] [Constant]] + [[`__at_key__(s) = o`] [Any type] [`s` is mutable and + `e = o`, where `e` + is the first element + in the sequence, is + a valid expression.] [Constant]] +] + +[heading Result Type Expressions] + +[table + [[Expression] [Compile Time Complexity]] + [[`__result_of_has_key__::type`] [Amortized constant time]] + [[`__result_of_at_key__::type`] [Amortized constant time]] + [[`__result_of_value_at_key__::type`] [Amortized constant time]] +] + +[blurb __note__ `__result_of_at_key__` returns the actual type returned +by `__at_key__(s)`. In most cases, this is a reference. Hence, there is no +way to know the exact element type using `__result_of_at_key__`.The +element at `K` may actually be a reference to begin with. For this purpose, +you can use `__result_of_value_at_key__`.] + +[heading Expression Semantics] + +[table + [[Expression] [Semantics]] + [[`__has_key__(s)`] [A boolean Integral Constant `c` such that + `c::value == true` if and only if there is + one or more elements with the key `k` in `s`; + see __has_key__.]] + [[`__at_key__(s)`] [The element associated with the key + `K` in the sequence `s`; see __at__.]] +] + +[heading Models] + +* __set__ +* __map__ + +[endsect] + +[endsect] + +[section Intrinsic] + +Intrinsic form the essential interface of every Fusion __sequence__. __stl__ +counterparts of these functions are usually implemented as member +functions. Intrinsic functions, unlike __algorithms__, are not generic +across the full __sequence__ repertoire. They need to be implemented for +each Fusion __sequence__[footnote In practice, many of intrinsic functions +have default implementations that will work in majority of cases]. + +[heading Header] + + #include + #include + +[section Functions] + +[section begin] + +[heading Description] + +Returns an iterator pointing to the first element in the sequence. + +[heading Synopsis] + + template + typename __result_of_begin__::type + begin(Sequence& seq); + + template + typename __result_of_begin__::type + begin(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __forward_sequence__] [The sequence we wish to get an iterator from.]] +] + +[heading Expression Semantics] + + begin(seq); + +[*Return type]: __forward_iterator__ if `seq` is a __forward_sequence__ +else, __bidirectional_iterator__ if `seq` is a __bidirectional_sequence__ +else, __random_access_iterator__ if `seq` is a __random_access_sequence__. + +[*Semantics]: Returns an iterator pointing to the first element in the sequence. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(__deref__(begin(v)) == 1); + +[endsect] + +[section end] + +[heading Description] + +Returns an iterator pointing to one element past the end of the sequence. + +[heading Synopsis] + + template + typename __result_of_end__::type + end(Sequence& seq); + + template + typename __result_of_end__::type + end(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __forward_sequence__] [The sequence we wish to get an iterator from.]] +] + +[heading Expression Semantics] + + end(seq); + +[*Return type]: __forward_iterator__ if `seq` is a __forward_sequence__ +else, __bidirectional_iterator__ if `seq` is a __bidirectional_sequence__ +else, __random_access_iterator__ if `seq` is a __random_access_sequence__. + +[*Semantics]: Returns an iterator pointing to one element past the end of +the sequence. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(__deref__(__prior__(end(v))) == 3); + +[endsect] + +[section empty] + +[heading Description] + +Returns a type convertible to `bool` that evaluates to `true` if the +sequence is empty, else, evaluates to `false`. + +[heading Synopsis] + + template + typename __result_of_empty__::type + empty(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __forward_sequence__] [The sequence we wish to investigate.]] +] + +[heading Expression Semantics] + + empty(seq); + +[*Return type]: Convertible to `bool`. + +[*Semantics]: Evaluates to `true` if the sequence is empty, else, evaluates +to `false`. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(empty(v) == false); + +[endsect] + +[section front] + +[heading Description] + +Returns the first element in the sequence. + +[heading Synopsis] + + template + typename __result_of_front__::type + front(Sequence& seq); + + template + typename __result_of_front__::type + front(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __forward_sequence__] [The sequence we wish to investigate.]] +] + +[heading Expression Semantics] + + front(seq); + +[*Return type]: Returns a reference to the first element in the sequence +`seq` if `seq` is mutable and `e = o`, where `e` is the first element in +the sequence, is a valid expression. Else, returns a type convertable to +the first element in the sequence. + +[*Precondition]: `__empty__(seq) == false` + +[*Semantics]: Returns the first element in the sequence. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(front(v) == 1); + +[endsect] + +[section back] + +[heading Description] + +Returns the last element in the sequence. + +[heading Synopsis] + + template + typename __result_of_back__::type + back(Sequence& seq); + + template + typename __result_of_back__::type + back(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __bidirectional_sequence__] [The sequence we wish to investigate.]] +] + +[heading Expression Semantics] + + back(seq); + +[*Return type]: Returns a reference to the last element in the sequence +`seq` if `seq` is mutable and `e = o`, where `e` is the last element in the +sequence, is a valid expression. Else, returns a type convertable to the +last element in the sequence. + +[*Precondition]: `__empty__(seq) == false` + +[*Semantics]: Returns the last element in the sequence. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(back(v) == 3); + +[endsect] + +[section size] + +[heading Description] + +Returns a type convertible to `int` that evaluates the number of elements +in the sequence. + +[heading Synopsis] + + template + typename __result_of_size__::type + size(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __forward_sequence__] [The sequence we wish to investigate.]] +] + +[heading Expression Semantics] + + size(seq); + +[*Return type]: Convertible to `int`. + +[*Semantics]: Returns the number of elements in the sequence. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(size(v) == 3); + +[endsect] + +[section at] + +[heading Description] + +Returns the N-th element from the beginning of the sequence. + +[heading Synopsis] + + template + typename __result_of_at__::type + at(Sequence& seq); + + template + typename __result_of_at__::type + at(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __random_access_sequence__] [The sequence we wish to investigate.]] + [[`N`] [An __mpl_integral_constant__] [An index from the beginning of the + sequence.]] +] + +[heading Expression Semantics] + + at(seq); + +[*Return type]: Returns a reference to the N-th element from the beginning +of the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the N-th +element from the beginning of the sequence, is a valid expression. Else, +returns a type convertable to the N-th element from the beginning of the +sequence. + +[*Precondition]: `0 <= N::value < __size__(s)` + +[*Semantics]: Equivalent to + + __deref__(__advance__(__begin__(s))) + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(at >(v) == 2); + +[endsect] + +[section at_c] + +[heading Description] + +Returns the N-th element from the beginning of the sequence. + +[heading Synopsis] + + template + typename __result_of_at_c__::type + at_c(Sequence& seq); + + template + typename __result_of_at_c__::type + at_c(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __random_access_sequence__] [The sequence we wish to investigate.]] + [[`N`] [An integral constant] [An index from the beginning of the + sequence.]] +] + +[heading Expression Semantics] + + at_c(seq); + +[*Return type]: Returns a reference to the N-th element from the beginning +of the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the N-th +element from the beginning of the sequence, is a valid expression. Else, +returns a type convertable to the N-th element from the beginning of the +sequence. + +[*Precondition]: `0 <= N < __size__(s)` + +[*Semantics]: Equivalent to + + __deref__(__advance__(__begin__(s))) + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v(1, 2, 3); + assert(at_c<1>(v) == 2); + +[endsect] + +[section has_key] + +[heading Description] + +Returns a type convertible to `bool` that evaluates to `true` if the +sequence contains an element associated with a Key, else, evaluates to +`false`. + +[heading Synopsis] + + template + typename __result_of_has_key__::type + has_key(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __associative_sequence__] [The sequence we wish to investigate.]] + [[`Key`] [Any type] [The queried key.]] +] + +[heading Expression Semantics] + + has_key(seq); + +[*Return type]: Convertible to `bool`. + +[*Semantics]: Evaluates to `true` if the sequence contains an element +associated with Key, else, evaluates to `false`. + +[heading Header] + + #include + #include + +[heading Example] + + __set__ s(1, 'x', true); + assert(has_key(s) == true); + +[endsect] + +[section at_key] + +[heading Description] + +Returns the element associated with a Key from the sequence. + +[heading Synopsis] + + template + typename __result_of_at_key__::type + at_key(Sequence& seq); + + template + typename __result_of_at_key__::type + at_key(Sequence const& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`seq`] [Model of __associative_sequence__] [The sequence we wish to investigate.]] + [[`Key`] [Any type] [The queried key.]] +] + +[heading Expression Semantics] + + at_key(seq); + +[*Return type]: Returns a reference to the element associated with Key from +the sequence `seq` if `seq` is mutable and `e = o`, where `e` is the +element associated with Key, is a valid expression. Else, returns a type +convertable to the element associated with Key. + +[*Precondition]: `has_key(seq) == true` + +[*Semantics]: Returns the element associated with Key. + +[heading Header] + + #include + #include + +[heading Example] + + __set__ s(1, 'x', true); + assert(at_key(s) == 'x'); + +[endsect] + +[section swap] + +[heading Description] + +Performs an element by element swap of the elements in 2 sequences. + +[heading Synopsis] + template + void swap(Seq1& seq1, Seq2& seq2); + +[heading Parameters] + +[table + [[Parameters] [Requirement] [Description]] + [[`seq1`, `seq2`] [Models of __forward_sequence__][The sequences whos elements we wish to swap.]] +] + +[heading Expression Semantics] + + swap(seq1, seq2); + +[*Return type]: `void` + +[*Precondition]: `__size__(seq1) == __size__(seq2)` + +[*Semantics]: Calls `swap(a1, b1)` for corresponding elements in `seq1` and `seq2`. + +/sequence/intrinsic/swap.hpp> + +[heading Example] + __vector__ v1(1, "hello"), v2(2, "world"); + swap(v1, v2); + assert(v1 == __make_vector__(2, "world")); + assert(v2 == __make_vector__(1, "hello")); + +[endsect] + +[endsect] + +[section Metafunctions] + +[section begin] + +[heading Description] +Returns the result type of __begin__. + +[heading Synopsis] + template + struct begin + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::begin::type + +[*Return type]: An iterator modelling the same traversal concept as `Seq`. + +[*Semantics]: Returns the type of an iterator to the first element of `Seq`. + +/sequence/intrinsic/begin.hpp> + +[heading Example] + typedef __vector__ vec; + typedef __result_of_begin__::type it; + BOOST_MPL_ASSERT((boost::is_same<__result_of_deref__::type, int&>)) + +[endsect] + +[section end] + +[heading Description] +Returns the result type of __end__. + +[heading Synopsis] + template + struct end + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::end::type + +[*Return type]: A model of the same traversal concept as `Seq`. + +[*Semantics]: Returns the type of an iterator one past the end of `Seq`. + +/sequence/intrinsic/end.hpp> + +[heading Example] + typedef __vector__ vec; + typedef __result_of_prior__<__result_of_end__::type>::type first; + BOOST_MPL_ASSERT((__result_of_equal_to__::type>)) + +[endsect] + +[section empty] + +[heading Description] +Returns the result type of __empty__. + +[heading Synopsis] + template + struct empty + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::empty::type + +[*Return type]: An __mpl_integral_constant__ + +[*Semantics]: Returns `mpl::true_` if `Seq` has zero elements, `mpl::false_` otherwise. + +/sequence/intrinsic/empty.hpp> + +[heading Example] + typedef __vector__<> empty_vec; + typedef __vector__ vec; + + BOOST_MPL_ASSERT((__result_of_empty__)); + BOOST_MPL_ASSERT_NOT((__result_of_empty__)); + +[endsect] + +[section front] + +[heading Description] +Returns the result type of __front__. + +[heading Synopsis] + template + struct front + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::front::type + +[*Return type]: Any type + +[*Semantics]: The type returned by dereferencing an iterator to the first element in `Seq`. Equivalent to `__result_of_deref__<__result_of_begin__::type>::type`. + +/sequence/intrinsic/front.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_front__::type, int&>)); + +[endsect] + +[section back] + +[heading Description] +Returns the result type of __back__. + +[heading Synopsis] + template + struct back + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::back::type + +[*Return type]: Any type + +[*Semantics]: The type returned by dereferencing an iterator to the last element in the sequence. Equivalent to `__result_of_deref__<__result_of_prior__<__result_of_end__::type>::type>::type`. + +/sequence/intrinsic/back.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_back__::type, char&>)); + +[endsect] + +[section size] + +[heading Description] +Returns the result type of __size__. + +[heading Synopsis] + template + struct size + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] +] + +[heading Expression Semantics] + result_of::size::type + +[*Return type]: An __mpl_integral_constant__. + +[*Semantics]: Returns the number of elements in `Seq`. + +/sequence/intrinsic/size.hpp> + +[heading Example] + typedef __vector__ vec; + typedef __result_of_size__::type size_mpl_integral_constant; + BOOST_MPL_ASSERT_RELATION(size_mpl_integral_constant::value, ==, 3); + +[endsect] + +[section at] + +[heading Description] + +Returns the result type of __at__[footnote __result_of_at__ reflects the +actual return type of the function __at__. __sequence__(s) typically return +references to its elements via the __at__ function. If you want to get +the actual element type, use __result_of_value_at__]. + +[heading Synopsis] + template< + typename Seq, + typename N> + struct at + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`N`][An __mpl_integral_constant__][Index of element]] +] + +[heading Expression Semantics] + result_of::at::type + +[*Return type]: Any type. + +[*Semantics]: Returns the result type of using __at__ to access the `N`th element of `Seq`. + +/sequence/intrinsic/at.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_at__ >::type, float&>)); + +[endsect] + +[section at_c] + +[heading Description] + +Returns the result type of __at_c__[footnote __result_of_at_c__ reflects +the actual return type of the function __at_c__. __sequence__(s) typically +return references to its elements via the __at_c__ function. If you want to +get the actual element type, use __result_of_value_at_c__]. + +[heading Synopsis] + template< + typename Seq, + int M> + struct at_c + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`M`][Positive integer index][Index of element]] +] + +[heading Expression Semantics] + result_of::at_c::type + +[*Return type]: Any type + +[*Semantics]: Returns the result type of using __at_c__ to access the `M`th element of `Seq`. + +/sequence/intrinsic/at.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_at_c__::type, float&>)); + +[endsect] + +[section value_at] + +[heading Description] + +Returns the actual type at a given index from the __sequence__. + +[heading Synopsis] + template< + typename Seq, + typename N> + struct value_at + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`N`][An __mpl_integral_constant__][Index of element]] +] + +[heading Expression Semantics] + result_of::value_at::type + +[*Return type]: Any type. + +[*Semantics]: Returns the actual type at the `N`th element of `Seq`. + +/sequence/intrinsic/value_at.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_at__ >::type, float>)); + +[endsect] + +[section value_at_c] + +[heading Description] + +Returns the actual type at a given index from the __sequence__. + +[heading Synopsis] + template< + typename Seq, + int M> + struct value_at_c + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`M`][Positive integer index][Index of element]] +] + +[heading Expression Semantics] + result_of::value_at_c::type + +[*Return type]: Any type + +[*Semantics]: Returns the actual type at the `M`th element of `Seq`. + +/sequence/intrinsic/value_at.hpp> + +[heading Example] + typedef __vector__ vec; + BOOST_MPL_ASSERT((boost::is_same<__result_of_value_at_c__::type, float>)); + +[endsect] + +[section has_key] + +[heading Description] +Returns the result type of __has_key__. + +[heading Synopsis] + template< + typename Seq, + typename Key> + struct has_key + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`Key`][Any type][Key type]] +] + +[heading Expression Semantics] + result_of::has_key::type + +[*Return type]: An __mpl_integral_constant__. + +[*Semantics]: Returns `mpl::true_` if `Seq` contains an element with key type `Key`, returns `mpl::false_` otherwise. + +/sequence/intrinsic/has_key.hpp> + +[heading Example] + typedef __map__<__pair__, __pair__, __pair__ > mymap; + BOOST_MPL_ASSERT((__result_of_has_key__)); + BOOST_MPL_ASSERT_NOT((__result_of_has_key__)); + +[endsect] + +[section at_key] + +[heading Description] + +Returns the result type of __at_key__[footnote __result_of_at_key__ +reflects the actual return type of the function __at_key__. __sequence__s +typically return references to its elements via the __at_key__ function. If +you want to get the actual element type, use __result_of_value_at_key__]. + +[heading Synopsis] + template< + typename Seq, + typename Key> + struct at_key + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`Key`][Any type][Key type]] +] + +[heading Expression Semantics] + result_of::at_key::type + +[*Return type]: Any type. + +[*Semantics]: Returns the result of using __at_key__ to access the element with key type `Key` in `Seq`. + +/sequence/intrinsic/at_key.hpp> + +[heading Example] + typedef __map__<__pair__, __pair__, __pair__ > mymap; + BOOST_MPL_ASSERT((boost::is_same<__result_of_at_key__::type, char&>)); + +[endsect] + +[section value_at_key] + +[heading Description] +Returns the actual element type associated with a Key from the __sequence__. + +[heading Synopsis] + template< + typename Seq, + typename Key> + struct value_at_key + { + typedef __unspecified__ type; + }; + +[table Parameters + [[Parameter] [Requirement] [Description]] + [[`Seq`][A model of __forward_sequence__][Argument sequence]] + [[`Key`][Any type][Key type]] +] + +[heading Expression Semantics] + result_of::value_at_key::type + +[*Return type]: Any type. + +[*Semantics]: Returns the actual element type associated with key type +`Key` in `Seq`. + +/sequence/intrinsic/value_at_key.hpp> + +[heading Example] + typedef __map__<__pair__, __pair__, __pair__ > mymap; + BOOST_MPL_ASSERT((boost::is_same<__result_of_at_key__::type, char>)); + +[endsect] + +[section swap] + +[heading Description] +Returns the return type of swap. + +[heading Synopsis] + template + struct swap + { + typedef void type; + }; + +[table Parameters + [[Parameters] [Requirement] [Description]] + [[`Seq1`, `Seq2`][Models of __forward_sequence__][The sequences being swapped]] +] + +[heading Expression Semantics] + result_of::swap::type + +[*Return type]: `void`. + +[*Semantics]: Always returns `void`. + +/sequence/intrinsic/swap.hpp> + +[endsect] + +[endsect] + +[endsect] + +[section Operator] + +These operators, like the __algorithms__, work generically on all Fusion +sequences. All conforming Fusion sequences automatically get these +operators for free. + +[section I/O] + +The I/O operators: `<<` and `>>` work generically on all Fusion sequences. +The global `operator<<` has been overloaded for generic output streams such +that __sequence__(s) are output by recursively calling `operator<<` for each +element. Analogously, the global `operator>>` has been overloaded to +extract __sequence__(s) from generic input streams by recursively calling +`operator>>` for each element. + +The default delimiter between the elements is space, and the __sequence__ +is enclosed in parenthesis. For Example: + + __vector__ a(1.0f, 2, std::string("Howdy folks!"); + cout << a; + +outputs the __vector__ as: (1.0 2 Howdy folks!) + +The library defines three manipulators for changing the default behavior: + +[variablelist Manipulators + [[`tuple_open(arg)`] [Defines the character that is output before the first element.]] + [[`tuple_close(arg)`] [Defines the character that is output after the last element.]] + [[`tuple_delimiter(arg)`] [Defines the delimiter character between elements.]] +] + +The argument to `tuple_open`, `tuple_close` and `tuple_delimiter` may be a +`char`, `wchar_t`, a C-string, or a wide C-string. + +Example: + + std::cout << tuple_open('[') << tuple_close(']') << tuple_delimiter(", ") << a; + +outputs the same __vector__, `a` as: [1.0, 2, Howdy folks!] + +The same manipulators work with `operator>>` and `istream` as well. Suppose +the `std::cin` stream contains the following data: + + (1 2 3) [4:5] + +The code: + + __vector__ i; + __vector__ j; + + std::cin >> i; + std::cin >> set_open('[') >> set_close(']') >> set_delimiter(':'); + std::cin >> j; + +reads the data into the __vector__(s) `i` and `j`. + +Note that extracting __sequence__(s) with `std::string` or C-style string +elements does not generally work, since the streamed __sequence__ +representation may not be unambiguously parseable. + +[heading Header] + + #include + #include + +[section in] + +[heading Description] + +Read a __sequence__ from an input stream. + +[heading Synopsis] + + template + IStream& + operator>>(IStream& is, Sequence& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[is] [An input stream.] [Stream to extract information from.]] + [[seq] [A __sequence__.] [The sequence to read.]] +] + +[heading Expression Semantics] + + is >> seq + +[*Return type]: IStream& + +[*Semantics]: For each element, `e`, in sequence, `seq`, call `is >> e`. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v; + std::cin >> v; + +[endsect] + +[section out] + +[heading Description] + +Write a __sequence__ to an output stream. + +[heading Synopsis] + + template + OStream& + operator<<(OStream& os, Sequence& seq); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[os] [An output stream.] [Stream to write information to.]] + [[seq] [A __sequence__.] [The sequence to write.]] +] + +[heading Expression Semantics] + + os << seq + +[*Return type]: OStream& + +[*Semantics]: For each element, `e`, in sequence, `seq`, call `os << e`. + +[heading Header] + + #include + #include + +[heading Example] + + std::cout << __make_vector__(123, "Hello", 'x') << std::endl; + +[endsect] + +[endsect] + +[section Comparison] + +The Comparison operators: `==`, `!=`, `<`, `<=`, `>=` and `>=` work +generically on all Fusion sequences. Comparison operators are "short- +circuited": elementary comparisons start from the first elements and are +performed only until the result is clear. + +[heading Header] + + #include + #include + +[section equal] + +[heading Description] + +Compare two sequences for equality. + +[heading Synopsis] + + template + bool + operator==(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a == b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a == b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `e1 == e2` returns true. For any 2 zero length __sequence__s, +e and f, e == f returns true. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v1(5, 'a'); + __vector__ v2(5, 'a'); + assert(v1 == v2); + +[endsect] + +[section not equal] + +Compare two sequences for inequality. + +[heading Synopsis] + + template + bool + operator!=(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a != b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a == b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: + +Returns !(a == b). + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v3(5, 'b'); + __vector__ t4(2, 'a'); + assert(v1 != v3); + assert(v1 != t4); + assert(!(v1 != v2)); + +[endsect] + +[section less than] + +Lexicographically compare two sequences. + +[heading Synopsis] + + template + bool + operator<(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a < b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a < b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: Returns the lexicographical comparison of between `a` and `b`. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v1(4, 3.3f); + __vector__ v2(5, 3.3f); + __vector__ v3(5, 4.4); + assert(v1 < v2); + assert(v2 < v3); + +[endsect] + +[section less than equal] + +Lexicographically compare two sequences. + +[heading Synopsis] + + template + bool + operator<=(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a <= b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a < b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: Returns !(b < a). + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v1(4, 3.3f); + __vector__ v2(5, 3.3f); + __vector__ v3(5, 4.4); + assert(v1 <= v2); + assert(v2 <= v3); + +[endsect] + +[section greater than] + +Lexicographically compare two sequences. + +[heading Synopsis] + + template + bool + operator>(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a > b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a < b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: Returns b < a. + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v1(4, 3.3f); + __vector__ v2(5, 3.3f); + __vector__ v3(5, 4.4); + assert(v2 > v1); + assert(v3 > v2); + +[endsect] + +[section greater than equal] + +Lexicographically compare two sequences. + +[heading Synopsis] + + template + bool + operator>=(Seq1 const& a, Seq2 const& b); + +[heading Parameters] + +[table + [[Parameter] [Requirement] [Description]] + [[`a, b`] [Instances of __sequence__] [__sequence__(s) to compare]] +] + +[heading Expression Semantics] + + a >= b + +[*Return type]: `bool` + +[*Requirements]: + +For each element, `e1`, in sequence `a`, and for each element, `e2`, in +sequence `b`, `a < b` is a valid expression returning a type that is +convertible to bool. + +An attempt to compare two Sequences of different lengths results in a +compile time error. + +[*Semantics]: Returns !(a < b). + +[heading Header] + + #include + #include + +[heading Example] + + __vector__ v1(4, 3.3f); + __vector__ v2(5, 3.3f); + __vector__ v3(5, 4.4); + assert(v2 >= v1); + assert(v3 >= v2); + +[endsect] + +[endsect] + +[endsect] + +[endsect] + diff --git a/doc/support.qbk b/doc/support.qbk index 0efd05b2..6418766e 100644 --- a/doc/support.qbk +++ b/doc/support.qbk @@ -1,3 +1,10 @@ +[/============================================================================== + 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) +===============================================================================/] [section Support] A couple of classes and metafunctions provide basic support for Fusion. @@ -6,8 +13,8 @@ A couple of classes and metafunctions provide basic support for Fusion. [heading Description] -Metafunction that evaluates to `mpl::true_` if a certain type `T` is a -conforming Fusion __sequence__, `mpl::false_` otherwise. This may be +Metafunction that evaluates to `mpl::true_` if a certain type `T` is a +conforming Fusion __sequence__, `mpl::false_` otherwise. This may be specialized to accomodate clients which provide Fusion conforming sequences. [heading Synopsis] @@ -15,7 +22,7 @@ specialized to accomodate clients which provide Fusion conforming sequences. namespace traits { template - struct is_sequence + struct is_sequence { typedef __unspecified__ type; }; @@ -34,12 +41,13 @@ specialized to accomodate clients which provide Fusion conforming sequences. [*Return type]: An __mpl_boolean_constant__. -[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type +[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type `T` is a conforming Fusion sequence, `mpl::false_` otherwise. [heading Header] #include + #include [heading Example] @@ -56,11 +64,11 @@ specialized to accomodate clients which provide Fusion conforming sequences. [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` +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 accomodate clients providing Fusion conforming views. [heading Synopsis] @@ -68,7 +76,7 @@ may be specialized to accomodate clients providing Fusion conforming views. namespace traits { template - struct is_view + struct is_view { typedef __unspecified__ type; }; @@ -87,12 +95,13 @@ may be specialized to accomodate clients providing Fusion conforming views. [*Return type]: An __mpl_boolean_constant__. -[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type +[*Semantics]: Metafunction that evaluates to `mpl::true_` if a certain type `T` is a conforming Fusion view, `mpl::false_` otherwise. [heading Header] #include + #include [heading Example] @@ -111,11 +120,11 @@ may be specialized to accomodate clients providing Fusion conforming views. [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. +All conforming Fusion sequences and iterators have an associated tag type. The +purpose of the tag is to enable __tag_dispatching__ from __intrinsic__ +functions to implementations appropriate for the type. -This metafunction may be specialized to accomodate clients providing Fusion +This metafunction may be specialized to accomodate clients providing Fusion conforming sequences. [heading Synopsis] @@ -123,7 +132,7 @@ conforming sequences. namespace traits { template - struct tag_of + struct tag_of { typedef __unspecified__ type; }; @@ -147,6 +156,7 @@ conforming sequences. [heading Header] #include + #include [heading Example] @@ -164,8 +174,8 @@ conforming sequences. [heading Description] -A metafunction that establishes the conceptual classification of a particular -__sequence__ or __iterator__ (see __iterator_concepts__ and +A metafunction that establishes the conceptual classification of a particular +__sequence__ or __iterator__ (see __iterator_concepts__ and __sequence_concepts__). [heading Synopsis] @@ -173,7 +183,7 @@ __sequence_concepts__). namespace traits { template - struct category_of + struct category_of { typedef __unspecified__ type; }; @@ -194,55 +204,56 @@ __sequence_concepts__). For Iterators, 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 {}; - }} + 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 {}; + }} For Sequences, the return type is derived from one of: - namespace boost { namespace fusion - { - struct incrementable_sequence_tag {}; - - struct single_pass_sequence_tag - : incrementable_sequence_tag {}; - - struct forward_traversal_tag - : single_pass_sequence_tag {}; - - struct bidirectional_traversal_tag - : forward_traversal_tag {}; - - struct random_access_traversal_tag - : bidirectional_traversal_tag {}; - }} + namespace boost { namespace fusion + { + struct incrementable_sequence_tag {}; + + struct single_pass_sequence_tag + : incrementable_sequence_tag {}; + + struct forward_traversal_tag + : single_pass_sequence_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_sequence_tag {}; - }} + namespace boost { namespace fusion + { + struct associative_sequence_tag {}; + }} -[*Semantics]: Establishes the conceptual classification of a particular +[*Semantics]: Establishes the conceptual classification of a particular __sequence__ or __iterator__. [heading Header] #include + #include [heading Example] @@ -259,18 +270,19 @@ __sequence__ or __iterator__. [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 +It removes references to `const`, references to array types are kept, even +if the array is `const`. Reference wrappers are removed (see __note_boost_ref__). [heading Header] #include + #include [heading Synopsis] namespace traits { - template + template struct deduce { typedef __unspecified__ type; @@ -309,11 +321,12 @@ constructor accepting the original type as its argument. [heading Header] #include + #include [heading Synopsis] namespace traits { - template + template struct deduce_sequence { typedef __unspecified__ type; @@ -332,11 +345,11 @@ constructor accepting the original type as its argument. }; template - holder< __vector__ > + holder< __vector__ > make_holder(T0 const & a0, T1 const & a1) { typedef __vector__ arg_vec_t; - return holder( arg_vec_t(a0,a1) ); + return holder( arg_vec_t(a0,a1) ); } [heading See also] @@ -348,8 +361,8 @@ constructor accepting the original type as its argument. [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. +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] @@ -359,10 +372,10 @@ It is used as elements in __map__s, for example. namespace result_of { - template + template struct first; - template + template struct second; template @@ -401,8 +414,9 @@ It is used as elements in __map__s, for example. [[`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 = p2`] [Assigns a pair, p1, from another pair, `p2`.]] - [[make_pair(s)] [Make a pair given the first type, `F`, and a value for + [[`p.second`] [Get the data from `p1`.]] + [[`p = p2`] [Assigns a pair, `p1`, from another pair, `p2`.]] + [[make_pair(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`.]] @@ -413,6 +427,7 @@ It is used as elements in __map__s, for example. [heading Header] #include + #include [heading Example] diff --git a/doc/tuple.qbk b/doc/tuple.qbk new file mode 100644 index 00000000..97a0aa46 --- /dev/null +++ b/doc/tuple.qbk @@ -0,0 +1,271 @@ +[/============================================================================== + 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) +===============================================================================/] +[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 Synopsis] + template< + typename T1 = __unspecified__, + typename T2 = __unspecified__, + ... + typename TN = __unspecified__> + class tuple; + +/tuple.hpp> + +[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 constructable. + +[*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 constructable. + +[*Semantics]: Copy constructs each element of `*this` with the corresponding element of `t`. + + template + tuple(const tuple& 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__s. `make_tuple` builds a tuple out of it's argument list, and `tie` builds a tuple of references to it's arguments. The details of these creation functions are described in this section. + +[heading Specification] + + template + tuple make_tuple(const T1& t1, const T2& t2, ..., const TN& tn); + +Where `Vi` is `X&` if the cv-unqualified type `Ti` is `reference_wrapper`, otherwise `Vi` is `Ti`. + +[*Returns]: `tuple(t1, t2, ..., tN)` + + template + tuple tie(T1& t1, T2& t2, ..., TN& tn); + +[*Returns]: tuple(t1, t2, ..., tN). When argument `ti` is `ignore`, assigning any value to the corresponding tuple element has 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::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__::type`. + + tuple_element::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__::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 + 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__::type`. + +[*Returns]: A reference to the `I`th element of `T`. + + template + 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__::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 + bool operator==( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(lhs) == __tuple_get__(rhs)` is a valid +expression returning a type that is convertible to `bool`. + +[*Semantics]: Returns `true` if and only if `__tuple_get__(lhs) == __tuple_get__(rhs)` for all `i`. +For any 2 zero length tuples `e` and `f`, `e == f` returns `true`. + + template + bool operator<( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(lhs) < __tuple_get__(rhs)` is a valid +expression returning a type that is convertible to `bool`. + +[*Semantics]: Returns the lexicographical comparison of between `lhs` and `rhs`. + + template + bool operator!=( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(lhs) == __tuple_get__(rhs)` is a valid +expression returning a type that is convertible to `bool`. + +[*Semantics]: Returns `!(lhs == rhs)`. + + template + bool operator<=( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(rhs) < __tuple_get__(lhs)` is a valid +expression returning a type that is convertible to `bool`. + +[*Semantics]: Returns `!(rhs < lhs)` + + template + bool operator>( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(rhs) < __tuple_get__(lhs)` is a valid +expression returning a type that is convertible to `bool`. + +[*Semantics]: Returns `rhs < lhs`. + + template + bool operator>=( + const tuple& lhs, + const tuple& rhs); + +[*Requirements]: For all `i`, `1 <= i < N`, `__tuple_get__(lhs) < __tuple_get__(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 >::value + +[*Type]: An __mpl_integral_constant__ + +[*Value]: Returns 2, the number of elements in a pair. + + tuple_element<0, std::pair >::type + +[*Type]: `T1` + +[*Value]: Returns the type of the first element of the pair + + tuple_element<1, std::pair >::type + +[*Type]: `T2` + +[*Value]: Returns thetype of the second element of the pair + + template + P& get(std::pair& pr); + + template + const P& get(const std::pair& 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] + diff --git a/doc/view.qbk b/doc/view.qbk new file mode 100644 index 00000000..8c614937 --- /dev/null +++ b/doc/view.qbk @@ -0,0 +1,476 @@ +[/============================================================================== + 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) +===============================================================================/] +[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 + #include + +[section single_view] + +`single_view` is a view into a value as a single element sequence. + +[heading Header] + + #include + #include + +[heading Synopsis] + + template + struct single_view; + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`T`] [Any type] []] +] + +[heading Model of] + +* __forward_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 __forward_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 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 + #include + +[heading Synopsis] + + template + 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__ + +[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 __forward_sequence__. + +[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__ vector_type; + + vector_type v("a-string", '@', 987654, true, 6.6); + filter_view > > 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 + #include + +[heading Synopsis] + + template + 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. + +[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 __forward_sequence__. + +[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__ vector_type; + vector_type vec(1, 'x', 3.3, s); + + typedef __result_of_begin__::type A; + typedef __result_of_end__::type B; + typedef __result_of_next__::type C; + typedef __result_of_prior__::type D; + + C c(vec); + D d(vec); + + iterator_range 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 + #include + +[heading Synopsis] + + template + struct joint_view; + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`Sequence1`] [A __forward_sequence__] []] + [[`Sequence2`] [A __forward_sequence__] []] +] + +[heading Model of] + +* __forward_sequence__ + +[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 __forward_sequence__. + +[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__ v1(3, 'x'); + __vector__ v2("hello", 123); + joint_view< + __vector__ + , __vector__ + > 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 + #include + +[heading Synopsis] + + template + 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 `joint_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__ vec1; + typedef __vector__ vec2; + vec1 v1(1,2); + vec2 v2('a','b'); + typedef __vector__ sequences; + std::cout << zip_view(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 + #include + +[heading Synopsis] + +[*Unary Version] + + template + struct transform_view; + +[*Binary Version] + + template + 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__::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__::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 + struct result; + + template + struct result + : remove_reference + {}; + + template + T operator()(T x) const + { + return x * x; + } + }; + + typedef __vector__ vector_type; + vector_type vec(2, 5, 3.3); + + transform_view 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 + #include + +[heading Synopsis] + + template + struct reverse_view; + +[heading Template parameters] + +[table + [[Parameter] [Description] [Default]] + [[`Sequence`] [A __bidirectional_sequence__] []] +] + +[heading Model of] + +* __bidirectional_sequence__ + +[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 __bidirectional_sequence__. + +[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__ vector_type; + vector_type vec(2, 5, 3.3); + + reverse_view reverse(vec); + std::cout << reverse << std::endl; + +[endsect] + +[endsect] diff --git a/example/cookbook/do_the_bind.cpp b/example/cookbook/do_the_bind.cpp index e63556a9..33772383 100644 --- a/example/cookbook/do_the_bind.cpp +++ b/example/cookbook/do_the_bind.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include diff --git a/example/cookbook/fill_em_up.cpp b/example/cookbook/fill_em_up.cpp index c77c7b68..69576612 100644 --- a/example/cookbook/fill_em_up.cpp +++ b/example/cookbook/fill_em_up.cpp @@ -24,8 +24,8 @@ ==============================================================================*/ // We'll use these containers as examples -#include -#include +#include +#include // For doing I/O #include diff --git a/example/extension/Jamfile b/example/extension/Jamfile index cf062603..aabe8302 100644 --- a/example/extension/Jamfile +++ b/example/extension/Jamfile @@ -13,6 +13,8 @@ import testing ; { test-suite example : - [ run test_example.cpp : : : : ] ; + [ run test_example.cpp : : : : ] + [ run triple.cpp : : : : ] + ; } diff --git a/example/extension/triple.cpp b/example/extension/triple.cpp new file mode 100644 index 00000000..ee247439 --- /dev/null +++ b/example/extension/triple.cpp @@ -0,0 +1,319 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ + +/*============================================================================= + An implementation of a std::pair like triple + We use fusion::sequence_facade and fusion::iterator_facade + to make our triple a fully conforming Boost.Fusion random + traversal sequence. +==============================================================================*/ + +#include + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include + +namespace mpl = boost::mpl; +namespace fusion = boost::fusion; + +namespace demo +{ + template + struct triple_iterator + : fusion::iterator_facade, fusion::random_access_traversal_tag> + { + typedef mpl::int_ index; + typedef Seq sequence_type; + + triple_iterator(Seq& seq) + : seq_(seq) {} + + Seq& seq_; + + template + struct value_of; + + template + struct value_of > + : mpl::identity + {}; + + template + struct value_of > + : mpl::identity + {}; + + template + struct value_of > + : mpl::identity + {}; + + template + struct deref; + + template + struct deref > + { + typedef typename + mpl::if_< + boost::is_const + , typename Sq::t0_type const& + , typename Sq::t0_type& + >::type + type; + + static type + call(triple_iterator const& iter) + { + return iter.seq_.t0; + } + }; + + template + struct deref > + { + typedef typename + mpl::if_< + boost::is_const + , typename Sq::t1_type const& + , typename Sq::t1_type& + >::type + type; + + static type + call(triple_iterator const& iter) + { + return iter.seq_.t1; + } + }; + + template + struct deref > + { + typedef typename + mpl::if_< + boost::is_const + , typename Sq::t2_type const& + , typename Sq::t2_type& + >::type + type; + + static type + call(triple_iterator const& iter) + { + return iter.seq_.t2; + } + }; + + template + 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 + 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 + struct distance + { + typedef typename mpl::minus::type type; + + static type call(It1 const& it1, It2 const& it2) + { + return type(); + } + }; + + template + 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 + struct triple + : fusion::sequence_facade, fusion::random_access_traversal_tag> + { + triple(T0 const& t0, T1 const& t1, T2 const& t2) + : t0(t0), t1(t1), t2(t2) + {} + + template + struct begin + { + typedef demo::triple_iterator< + Sq, 0> type; + + static type call(Sq& sq) + { + return type(sq); + } + }; + + template + struct end + { + typedef demo::triple_iterator< + Sq, 3> type; + + static type call(Sq& sq) + { + return type(sq); + } + }; + + template + struct size + : mpl::int_<3> + {}; + + template + struct value_at + : value_at > + {}; + + template + struct value_at > + { + typedef typename Sq::t0_type type; + }; + + template + struct value_at > + { + typedef typename Sq::t1_type type; + }; + + template + struct value_at > + { + typedef typename Sq::t2_type type; + }; + + template + struct at + : at > + {}; + + template + struct at > + { + typedef typename + mpl::if_< + boost::is_const + , typename Sq::t0_type const& + , typename Sq::t0_type& + >::type + type; + + static type call(Sq& sq) + { + return sq.t0; + } + }; + + template + struct at > + { + typedef typename + mpl::if_< + boost::is_const + , typename Sq::t1_type const& + , typename Sq::t1_type& + >::type + type; + + static type call(Sq& sq) + { + return sq.t1; + } + }; + + template + struct at > + { + typedef typename + mpl::if_< + boost::is_const + , 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; + }; +} + +int main() +{ + typedef demo::triple 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::type>)); + BOOST_MPL_ASSERT((boost::is_same::type>)); + BOOST_MPL_ASSERT((boost::is_same::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"); + return boost::report_errors(); +} diff --git a/example/performance/accumulate.cpp b/example/performance/accumulate.cpp index 7d8f0a76..45aa1a11 100644 --- a/example/performance/accumulate.cpp +++ b/example/performance/accumulate.cpp @@ -10,10 +10,12 @@ #include #include -#include +#include #include #include -#include +#include + +#include #include #include @@ -75,14 +77,15 @@ namespace return result / iter; } - struct poly_add { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const @@ -93,11 +96,13 @@ namespace struct poly_mult { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const diff --git a/example/performance/functional.cpp b/example/performance/functional.cpp index 228586eb..e16d764d 100644 --- a/example/performance/functional.cpp +++ b/example/performance/functional.cpp @@ -7,14 +7,14 @@ http://www.boost.org/LICENSE_1_0.txt). ==============================================================================*/ -#include -#include +#include +#include #include #include #include #include -#include +#include #include #include #include @@ -264,12 +264,6 @@ int main() std::cout << "without random access " << call_fused(f,res) << std::endl; total += res; } - { - typedef boost::fusion::vector s; - boost::fusion::unfused_typed f; - std::cout << "unfused_typed " << call_unfused(f,res) << std::endl; - total += res; - } { boost::fusion::unfused_rvalue_args f; std::cout << "unfused_rvalue_args " << call_unfused(f,res) << std::endl; @@ -296,13 +290,6 @@ int main() std::cout << "without random access " << call_fused(f,res) << std::endl; total += res; } - std::cout << std::endl << "Loopback:" << std::endl; - { - typedef boost::fusion::vector s; - boost::fusion::unfused_typed< boost::fusion::fused_function_object, s > f; - std::cout << "unfused_typed,s > " << call_unfused(f,res) << std::endl; - total += res; - } { boost::fusion::unfused_rvalue_args< boost::fusion::fused_function_object > f; std::cout << "unfused_rvalue_args > " << call_unfused(f,res) << std::endl; diff --git a/example/performance/inner_product.cpp b/example/performance/inner_product.cpp index 8257921d..9b9937eb 100644 --- a/example/performance/inner_product.cpp +++ b/example/performance/inner_product.cpp @@ -10,12 +10,14 @@ #include #include -#include +#include #include #include -#include +#include #include +#include + #include #include #include @@ -37,11 +39,13 @@ namespace { struct poly_add { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const @@ -52,11 +56,13 @@ namespace struct poly_mult { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const diff --git a/example/performance/inner_product2.cpp b/example/performance/inner_product2.cpp index b831b219..3e952c07 100644 --- a/example/performance/inner_product2.cpp +++ b/example/performance/inner_product2.cpp @@ -10,12 +10,14 @@ #include #include -#include +#include #include #include -#include +#include #include +#include + #include #include #include @@ -37,11 +39,13 @@ namespace { struct poly_add { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const @@ -52,11 +56,13 @@ namespace struct poly_mult { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const @@ -110,14 +116,16 @@ namespace struct poly_combine { + template + struct result; + template - struct result - { - typedef Rhs type; - }; + struct result + : boost::remove_reference + {}; template - typename result::type + typename result::type operator()(const Lhs& lhs, const Rhs& rhs) const { return rhs + boost::fusion::at_c<0>(lhs) * boost::fusion::at_c<1>(lhs); diff --git a/example/performance/sequence_efficiency.cpp b/example/performance/sequence_efficiency.cpp index 6a24f74f..28b5ec82 100644 --- a/example/performance/sequence_efficiency.cpp +++ b/example/performance/sequence_efficiency.cpp @@ -10,8 +10,10 @@ #define FUSION_MAX_VECTOR_SIZE 30 #include -#include -#include +#include +#include + +#include #include #include @@ -59,11 +61,13 @@ namespace { struct poly_add { + template + struct result; + template - struct result - { - typedef Lhs type; - }; + struct result + : boost::remove_reference + {}; template Lhs operator()(const Lhs& lhs, const Rhs& rhs) const diff --git a/example/performance/timings.txt b/example/performance/timings.txt index 0ab51e55..35549170 100644 --- a/example/performance/timings.txt +++ b/example/performance/timings.txt @@ -1,3 +1,11 @@ +=============================================================================== +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, diff --git a/example/performance/zip_efficiency.cpp b/example/performance/zip_efficiency.cpp index c8132c74..36ded283 100644 --- a/example/performance/zip_efficiency.cpp +++ b/example/performance/zip_efficiency.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include diff --git a/include/boost/fusion/adapted.hpp b/include/boost/fusion/adapted.hpp new file mode 100644 index 00000000..c343405c --- /dev/null +++ b/include/boost/fusion/adapted.hpp @@ -0,0 +1,17 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/adapted/array.hpp b/include/boost/fusion/adapted/array.hpp new file mode 100644 index 00000000..2be9d4ba --- /dev/null +++ b/include/boost/fusion/adapted/array.hpp @@ -0,0 +1,22 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_27122005_1035) +#define BOOST_FUSION_ARRAY_27122005_1035 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/adapted/array/array_iterator.hpp b/include/boost/fusion/adapted/array/array_iterator.hpp new file mode 100644 index 00000000..dbad7763 --- /dev/null +++ b/include/boost/fusion/adapted/array/array_iterator.hpp @@ -0,0 +1,107 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct random_access_traversal_tag; + + template + struct array_iterator + : iterator_facade, random_access_traversal_tag> + { + BOOST_MPL_ASSERT_RELATION(Pos, >=, 0); + BOOST_MPL_ASSERT_RELATION(Pos, <=, Array::static_size); + + typedef mpl::int_ index; + typedef Array array_type; + + array_iterator(Array& a) + : array(a) {} + + Array& array; + + template + struct value_of + { + typedef typename Iterator::array_type array_type; + typedef typename array_type::value_type type; + }; + + template + struct deref + { + typedef typename Iterator::array_type array_type; + typedef typename + mpl::if_< + is_const + , typename array_type::const_reference + , typename array_type::reference + >::type + type; + + static type + call(Iterator const & it) + { + return it.array[Iterator::index::value]; + } + }; + + template + struct advance + { + typedef typename Iterator::index index; + typedef typename Iterator::array_type array_type; + typedef array_iterator type; + + static type + call(Iterator const& i) + { + return type(i.array); + } + }; + + template + struct next : advance > {}; + + template + struct prior : advance > {}; + + template + struct distance : mpl::minus + { + typedef typename + mpl::minus< + typename I2::index, typename I1::index + >::type + type; + + static type + call(I1 const&, I2 const&) + { + return type(); + } + }; + + private: + + array_iterator& operator=(array_iterator const&); + }; +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/at_impl.hpp b/include/boost/fusion/adapted/array/detail/at_impl.hpp new file mode 100644 index 00000000..3c427059 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/at_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +#include + +namespace boost { namespace fusion { + + struct array_tag; + + namespace extension + { + template + struct at_impl; + + template<> + struct at_impl + { + template + struct apply + { + typedef typename mpl::if_< + is_const, + typename Sequence::const_reference, + typename Sequence::reference>::type type; + + static type + call(Sequence& seq) + { + return seq[N::value]; + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/begin_impl.hpp b/include/boost/fusion/adapted/array/detail/begin_impl.hpp new file mode 100644 index 00000000..06dc8c51 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/begin_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion { + + struct array_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef array_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/category_of_impl.hpp b/include/boost/fusion/adapted/array/detail/category_of_impl.hpp new file mode 100644 index 00000000..5d01f053 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/category_of_impl.hpp @@ -0,0 +1,35 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion { + + struct array_tag; + struct random_access_traversal_tag; + + namespace extension + { + template + struct category_of_impl; + + template<> + struct category_of_impl + { + template + struct apply + { + typedef random_access_traversal_tag type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/end_impl.hpp b/include/boost/fusion/adapted/array/detail/end_impl.hpp new file mode 100644 index 00000000..c9432c9b --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/end_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion { + + struct array_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef array_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/is_sequence_impl.hpp b/include/boost/fusion/adapted/array/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..a248c314 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/is_sequence_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion { + + struct array_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply : mpl::true_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/is_view_impl.hpp b/include/boost/fusion/adapted/array/detail/is_view_impl.hpp new file mode 100644 index 00000000..bc821fa6 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/is_view_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion +{ + struct array_tag; + + namespace extension + { + template + struct is_view_impl; + + template<> + struct is_view_impl + { + template + struct apply : mpl::false_ + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/size_impl.hpp b/include/boost/fusion/adapted/array/detail/size_impl.hpp new file mode 100644 index 00000000..63661573 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/size_impl.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 array_tag; + + namespace extension + { + template + struct size_impl; + + template<> + struct size_impl + { + template + struct apply : mpl::int_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/detail/value_at_impl.hpp b/include/boost/fusion/adapted/array/detail/value_at_impl.hpp new file mode 100644 index 00000000..f465b1d6 --- /dev/null +++ b/include/boost/fusion/adapted/array/detail/value_at_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 array_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply + { + typedef typename Sequence::value_type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/array/tag_of.hpp b/include/boost/fusion/adapted/array/tag_of.hpp new file mode 100644 index 00000000..62f81ea0 --- /dev/null +++ b/include/boost/fusion/adapted/array/tag_of.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +#include + +namespace boost +{ + template + class array; +} + +namespace boost { namespace fusion +{ + struct array_tag; + + namespace traits + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct tag_of, void > +#else + struct tag_of > +#endif + { + typedef array_tag type; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple.hpp b/include/boost/fusion/adapted/boost_tuple.hpp new file mode 100644 index 00000000..2924df07 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple.hpp @@ -0,0 +1,20 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp b/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp new file mode 100644 index 00000000..fca135e5 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp @@ -0,0 +1,149 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct forward_traversal_tag; + + namespace detail + { + template + struct boost_tuple_is_empty : mpl::false_ {}; + + template <> + struct boost_tuple_is_empty : mpl::true_ {}; + + template <> + struct boost_tuple_is_empty : mpl::true_ {}; + + template <> + struct boost_tuple_is_empty > : mpl::true_ {}; + + template <> + struct boost_tuple_is_empty const> : mpl::true_ {}; + } + + template + struct boost_tuple_iterator + : iterator_facade, forward_traversal_tag> + { + typedef Cons cons_type; + + explicit boost_tuple_iterator(Cons& cons) + : cons(cons) {} + Cons& cons; + + template + struct value_of : mpl::identity {}; + + template + struct deref + { + typedef typename value_of::type element; + + typedef typename + mpl::if_< + is_const + , typename tuples::access_traits::const_type + , typename tuples::access_traits::non_const_type + >::type + type; + + static type + call(Iterator const& iter) + { + return iter.cons.get_head(); + } + }; + + template + 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 + , add_const + , mpl::identity + >::type> + type; + + static type + call(Iterator const& iter) + { + return type(iter.cons.get_tail()); + } + }; + }; + + template + struct boost_tuple_null_iterator + : iterator_facade, forward_traversal_tag> + { + typedef Null cons_type; + + template + struct equal_to + : mpl::or_< + is_same + , mpl::and_< + detail::boost_tuple_is_empty + , detail::boost_tuple_is_empty + > + > + {}; + }; + + template <> + struct boost_tuple_iterator + : boost_tuple_null_iterator + { + template + explicit boost_tuple_iterator(Cons const&) {} + }; + + template <> + struct boost_tuple_iterator + : boost_tuple_null_iterator + { + template + explicit boost_tuple_iterator(Cons const&) {} + }; + + template <> + struct boost_tuple_iterator > + : boost_tuple_null_iterator > + { + template + explicit boost_tuple_iterator(Cons const&) {} + }; + + template <> + struct boost_tuple_iterator const> + : boost_tuple_null_iterator const> + { + template + explicit boost_tuple_iterator(Cons const&) {} + }; +}} + +#endif + + diff --git a/include/boost/fusion/adapted/boost_tuple/detail/at_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/at_impl.hpp new file mode 100644 index 00000000..b594dfd8 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/at_impl.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 +#include + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + typedef typename + tuples::element::type + element; + + typedef typename + mpl::if_< + is_const + , typename tuples::access_traits::const_type + , typename tuples::access_traits::non_const_type + >::type + type; + + static type + call(Sequence& seq) + { + return tuples::get(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp new file mode 100644 index 00000000..ee9a89eb --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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 + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef boost_tuple_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp new file mode 100644 index 00000000..34f48b1e --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CATEGORY_OF_IMPL_09272006_0726) +#define BOOST_FUSION_CATEGORY_OF_IMPL_09272006_0726 + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + struct forward_traversal_tag; + + namespace extension + { + template + struct category_of_impl; + + template<> + struct category_of_impl + { + template + struct apply + { + typedef forward_traversal_tag type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/end_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/end_impl.hpp new file mode 100644 index 00000000..2fb27a7a --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/end_impl.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_09272006_0721) +#define BOOST_FUSION_END_IMPL_09272006_0721 + +#include +#include +#include + +namespace boost { namespace tuples +{ + struct null_type; +}} + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef + boost_tuple_iterator< + typename mpl::if_< + is_const + , tuples::null_type const + , tuples::null_type + >::type + > + type; + + static type + call(Sequence& seq) + { + return type(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..43d73115 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp @@ -0,0 +1,30 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_IS_SEQUENCE_IMPL_09272006_0726) +#define BOOST_FUSION_IS_SEQUENCE_IMPL_09272006_0726 + +#include + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply : mpl::true_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp new file mode 100644 index 00000000..2927df7b --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp @@ -0,0 +1,30 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_IS_VIEW_IMPL_09272006_0725) +#define BOOST_FUSION_IS_VIEW_IMPL_09272006_0725 + +#include + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct is_view_impl; + + template<> + struct is_view_impl + { + template + struct apply : mpl::false_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/size_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/size_impl.hpp new file mode 100644 index 00000000..167a5035 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/size_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SIZE_IMPL_09272006_0724) +#define BOOST_FUSION_SIZE_IMPL_09272006_0724 + +#include +#include + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply : mpl::int_::value> {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp b/include/boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp new file mode 100644 index 00000000..d46d51e5 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp @@ -0,0 +1,30 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_AT_IMPL_09262006_1926) +#define BOOST_FUSION_VALUE_AT_IMPL_09262006_1926 + +#include + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply : tuples::element {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/boost_tuple/tag_of.hpp b/include/boost/fusion/adapted/boost_tuple/tag_of.hpp new file mode 100644 index 00000000..efae06a2 --- /dev/null +++ b/include/boost/fusion/adapted/boost_tuple/tag_of.hpp @@ -0,0 +1,63 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_TAG_OF_09262006_1900) +#define BOOST_FUSION_TAG_OF_09262006_1900 + +#include + +namespace boost { namespace tuples +{ + struct null_type; + + template < + class T0, class T1, class T2, class T3, class T4, + class T5, class T6, class T7, class T8, class T9 + > + class tuple; + + template + struct cons; +}} + +namespace boost { namespace fusion +{ + struct boost_tuple_tag; + + namespace traits + { + template < + class T0, class T1, class T2, class T3, class T4, + class T5, class T6, class T7, class T8, class T9 + > +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct tag_of, void > +#else + struct tag_of > +#endif + { + typedef boost_tuple_tag type; + }; + + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct tag_of, void > +#else + struct tag_of > +#endif + { + typedef boost_tuple_tag type; + }; + + template <> + struct tag_of + { + typedef boost_tuple_tag type; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl.hpp b/include/boost/fusion/adapted/mpl.hpp new file mode 100644 index 00000000..f8257846 --- /dev/null +++ b/include/boost/fusion/adapted/mpl.hpp @@ -0,0 +1,21 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_MPL_31122005_1152) +#define BOOST_FUSION_MPL_31122005_1152 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/at_impl.hpp b/include/boost/fusion/adapted/mpl/detail/at_impl.hpp new file mode 100644 index 00000000..6f3be1c6 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/at_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1642) +#define BOOST_FUSION_AT_IMPL_31122005_1642 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + typedef typename mpl::at::type type; + + static type + call(Sequence) + { + return type(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/begin_impl.hpp b/include/boost/fusion/adapted/mpl/detail/begin_impl.hpp new file mode 100644 index 00000000..1ec77d8b --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/begin_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1209) +#define BOOST_FUSION_BEGIN_IMPL_31122005_1209 + +#include +#include +#include + +namespace boost { namespace fusion { + + struct mpl_sequence_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename mpl::begin< + typename remove_const::type + >::type iterator; + typedef mpl_iterator type; + + static type + call(Sequence) + { + return type(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/category_of_impl.hpp b/include/boost/fusion/adapted/mpl/detail/category_of_impl.hpp new file mode 100644 index 00000000..ad68fcc9 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/category_of_impl.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_20060217_2141) +#define BOOST_FUSION_CATEGORY_OF_IMPL_20060217_2141 + +#include +#include +#include +#include + +namespace boost { namespace fusion { + + namespace detail + { + template + struct mpl_sequence_category_of + { + // assumes T is an mpl sequence + // there should be no way this will ever be + // called where T is an mpl iterator + + BOOST_STATIC_ASSERT(mpl::is_sequence::value); + typedef typename + mpl_iterator_category< + typename mpl::begin::type::category + >::type + type; + }; + } + + struct mpl_sequence_tag; + + namespace extension + { + template + struct category_of_impl; + + template<> + struct category_of_impl + { + template + struct apply + : detail::mpl_sequence_category_of + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/empty_impl.hpp b/include/boost/fusion/adapted/mpl/detail/empty_impl.hpp new file mode 100644 index 00000000..14e8dfa2 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/empty_impl.hpp @@ -0,0 +1,28 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_EMPTY_IMPL_31122005_1554) +#define BOOST_FUSION_EMPTY_IMPL_31122005_1554 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template <> + struct empty_impl + { + template + struct apply : mpl::empty {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/end_impl.hpp b/include/boost/fusion/adapted/mpl/detail/end_impl.hpp new file mode 100644 index 00000000..e3466956 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/end_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1237) +#define BOOST_FUSION_END_IMPL_31122005_1237 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename mpl::end< + typename remove_const::type + >::type iterator; + typedef mpl_iterator type; + + static type + call(Sequence) + { + return type(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/has_key_impl.hpp b/include/boost/fusion/adapted/mpl/detail/has_key_impl.hpp new file mode 100644 index 00000000..bfecbc73 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/has_key_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1647) +#define BOOST_FUSION_HAS_KEY_IMPL_31122005_1647 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct has_key_impl; + + template <> + struct has_key_impl + { + template + struct apply : mpl::has_key {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp b/include/boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..bf9b349c --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1505) +#define BOOST_FUSION_IS_SEQUENCE_IMPL_31122005_1505 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply : mpl::true_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/is_view_impl.hpp b/include/boost/fusion/adapted/mpl/detail/is_view_impl.hpp new file mode 100644 index 00000000..5ae48c90 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/is_view_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_03202006_0048) +#define BOOST_FUSION_IS_VIEW_IMPL_03202006_0048 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct is_view_impl; + + template<> + struct is_view_impl + { + template + struct apply : mpl::true_ + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/size_impl.hpp b/include/boost/fusion/adapted/mpl/detail/size_impl.hpp new file mode 100644 index 00000000..62893517 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/size_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1508) +#define BOOST_FUSION_SIZE_IMPL_31122005_1508 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply : mpl::size {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/detail/value_at_impl.hpp b/include/boost/fusion/adapted/mpl/detail/value_at_impl.hpp new file mode 100644 index 00000000..5f39e4eb --- /dev/null +++ b/include/boost/fusion/adapted/mpl/detail/value_at_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_31122005_1621) +#define BOOST_FUSION_VALUE_AT_IMPL_31122005_1621 + +#include + +namespace boost { namespace fusion +{ + struct mpl_sequence_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply : mpl::at {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/mpl/mpl_iterator.hpp b/include/boost/fusion/adapted/mpl/mpl_iterator.hpp new file mode 100644 index 00000000..c99b5804 --- /dev/null +++ b/include/boost/fusion/adapted/mpl/mpl_iterator.hpp @@ -0,0 +1,113 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_MPL_ITERATOR_05052005_0731) +#define FUSION_MPL_ITERATOR_05052005_0731 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + template + struct mpl_iterator + : iterator_facade< + mpl_iterator + , typename detail::mpl_iterator_category::type + > + { + typedef typename remove_const::type iterator_type; + + template + struct value_of : mpl::deref {}; + + template + struct deref + { + typedef typename mpl::deref< + typename Iterator::iterator_type>::type + type; + + static type + call(Iterator) + { + return type(); + } + }; + + template + struct next + { + typedef mpl_iterator< + typename mpl::next::type> + type; + + static type + call(Iterator) + { + return type(); + } + }; + + template + struct prior + { + typedef mpl_iterator< + typename mpl::prior::type> + type; + + static type + call(Iterator) + { + return type(); + } + }; + + template + struct advance + { + typedef mpl_iterator< + typename mpl::advance::type> + type; + + static type + call(Iterator const& i) + { + return type(); + } + }; + + template + struct distance : + mpl::distance< + typename I1::iterator_type + , typename I2::iterator_type> + { + typedef typename + mpl::distance< + typename I1::iterator_type + , typename I2::iterator_type + >::type + type; + + static type + call(I1 const&, I2 const&) + { + return type(); + } + }; + }; +}} + +#endif + + diff --git a/include/boost/fusion/adapted/std_pair.hpp b/include/boost/fusion/adapted/std_pair.hpp new file mode 100644 index 00000000..ffc343bc --- /dev/null +++ b/include/boost/fusion/adapted/std_pair.hpp @@ -0,0 +1,70 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_STD_PAIR_24122005_1744) +#define BOOST_FUSION_STD_PAIR_24122005_1744 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace traits + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct tag_of, void > +#else + struct tag_of > +#endif + { + typedef struct_tag type; + }; + } + + namespace extension + { + template + struct struct_member; + + template + struct struct_size; + + template + struct struct_member, 0> + { + typedef T1 type; + + static type& call(std::pair& pair) + { + return pair.first; + } + }; + + template + struct struct_member, 1> + { + typedef T2 type; + + static type& call(std::pair& pair) + { + return pair.second; + } + }; + + template + struct struct_size > : mpl::int_<2> + { + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/at_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/at_impl.hpp new file mode 100644 index 00000000..2f26fa68 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/at_impl.hpp @@ -0,0 +1,71 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1807) +#define BOOST_FUSION_AT_IMPL_24122005_1807 + +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + static int const n_value = N::value; + BOOST_STATIC_ASSERT((n_value >= 0 && n_value < 2)); + typedef typename + mpl::if_c< + (n_value == 0) + , typename Sequence::first_type + , typename Sequence::second_type + > + element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + template + static RT get(Sequence& p, mpl::int_<0>) + { + return p.first; + } + + template + static RT get(Sequence& p, mpl::int_<1>) + { + return p.second; + } + + static type + call(Sequence& p) + { + return get(p, N()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/begin_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/begin_impl.hpp new file mode 100644 index 00000000..1fd48f51 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/begin_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1752) +#define BOOST_FUSION_BEGIN_IMPL_24122005_1752 + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef std_pair_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/category_of_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/category_of_impl.hpp new file mode 100644 index 00000000..68df41dc --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/category_of_impl.hpp @@ -0,0 +1,35 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1731) +#define BOOST_FUSION_CATEGORY_OF_IMPL_24122005_1731 + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + struct random_access_traversal_tag; + + namespace extension + { + template + struct category_of_impl; + + template<> + struct category_of_impl + { + template + struct apply + { + typedef random_access_traversal_tag type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/end_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/end_impl.hpp new file mode 100644 index 00000000..747f2c6f --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/end_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1755) +#define BOOST_FUSION_END_IMPL_24122005_1755 + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef std_pair_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/is_sequence_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..1c669a68 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/is_sequence_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_1651) +#define BOOST_FUSION_IS_SEQUENCE_IMPL_27122005_1651 + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply : mpl::true_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/is_view_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/is_view_impl.hpp new file mode 100644 index 00000000..94842bc0 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/is_view_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_2219) +#define BOOST_FUSION_IS_VIEW_IMPL_27042006_2219 + +#include + +namespace boost { namespace fusion +{ + struct std_pair_tag; + + namespace extension + { + template + struct is_view_impl; + + template<> + struct is_view_impl + { + template + struct apply : mpl::false_ + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/size_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/size_impl.hpp new file mode 100644 index 00000000..5f35bffd --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/size_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1759) +#define BOOST_FUSION_SIZE_IMPL_24122005_1759 + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply : mpl::int_<2> {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/detail/value_at_impl.hpp b/include/boost/fusion/adapted/std_pair/detail/value_at_impl.hpp new file mode 100644 index 00000000..16047ec9 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/detail/value_at_impl.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1917) +#define BOOST_FUSION_VALUE_AT_IMPL_24122005_1917 + +#include +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply + { + static int const n_value = N::value; + BOOST_STATIC_ASSERT((n_value >= 0 && n_value < 2)); + typedef typename + mpl::if_c< + (n_value == 0) + , typename Sequence::first_type + , typename Sequence::second_type + >::type + type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/std_pair/std_pair_iterator.hpp b/include/boost/fusion/adapted/std_pair/std_pair_iterator.hpp new file mode 100644 index 00000000..9469723b --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/std_pair_iterator.hpp @@ -0,0 +1,127 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_STD_PAIR_ITERATOR_09262005_0934) +#define FUSION_STD_PAIR_ITERATOR_09262005_0934 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct random_access_traversal_tag; + + template + struct std_pair_iterator + : iterator_facade, random_access_traversal_tag> + { + BOOST_MPL_ASSERT_RELATION(N_, >=, 0); + BOOST_MPL_ASSERT_RELATION(N_, <=, 2); + + typedef mpl::int_ index; + typedef Pair_ pair_type; + + std_pair_iterator(Pair_& pair) + : pair(pair) {} + Pair_& pair; + + template + struct value_of; + + template + struct value_of > + : mpl::identity {}; + + template + struct value_of > + : mpl::identity {}; + + template + struct deref; + + template + struct deref > + { + typedef typename + mpl::if_< + is_const + , typename Pair::first_type const& + , typename Pair::first_type& + >::type + type; + + static type + call(std_pair_iterator const& iter) + { + return iter.pair.first; + } + }; + + template + struct deref > + { + typedef typename + mpl::if_< + is_const + , typename Pair::second_type const& + , typename Pair::second_type& + >::type + type; + + static type + call(std_pair_iterator const& iter) + { + return iter.pair.second; + } + }; + + template + struct advance + { + typedef typename Iterator::index index; + typedef typename Iterator::pair_type pair_type; + typedef std_pair_iterator type; + + static type + call(Iterator const& iter) + { + return type(iter.pair); + } + }; + + template + struct next : advance > {}; + + template + struct prior : advance > {}; + + template + struct distance : mpl::minus + { + typedef typename + mpl::minus< + typename I2::index, typename I1::index + >::type + type; + + static type + call(I1 const&, I2 const&) + { + return type(); + } + }; + }; +}} + +#endif + + diff --git a/include/boost/fusion/adapted/std_pair/tag_of.hpp b/include/boost/fusion/adapted/std_pair/tag_of.hpp new file mode 100644 index 00000000..7b63d287 --- /dev/null +++ b/include/boost/fusion/adapted/std_pair/tag_of.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1722) +#define BOOST_FUSION_TAG_OF_24122005_1722 + +#include + +#include + +namespace boost { namespace fusion { + + struct std_pair_tag; + + namespace traits + { + template + struct tag_of > + { + typedef std_pair_tag type; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct.hpp b/include/boost/fusion/adapted/struct.hpp new file mode 100644 index 00000000..c3c24e0b --- /dev/null +++ b/include/boost/fusion/adapted/struct.hpp @@ -0,0 +1,28 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_STRUCT_24122005_1744) +#define BOOST_FUSION_STRUCT_24122005_1744 + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp b/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp new file mode 100644 index 00000000..e8ee31b9 --- /dev/null +++ b/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp @@ -0,0 +1,94 @@ +/*============================================================================= + Copyright (c) 2001-2007 Joel de Guzman + Copyright (c) 2007 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_ADAPT_ASSOC_STRUCT_20070508_2207) +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_20070508_2207 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace extension { + template + struct struct_assoc_member; +}}} + + +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT(name, bseq) \ + BOOST_FUSION_ADAPT_ASSOC_STRUCT_I( \ + name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_X bseq, 0)) \ + /***/ + +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_X(x, y, z) ((x, y, z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y(x, y, z) ((x, y, z)) BOOST_FUSION_ADAPT_ASSOC_STRUCT_X +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_X0 +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y0 + +// BOOST_FUSION_ADAPT_ASSOC_STRUCT_I generates the overarching structure and uses +// SEQ_FOR_EACH_I to generate the "linear" substructures. +// Thanks to Paul Mensonides for the PP macro help + +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_I(name, seq) \ + namespace boost { namespace fusion { namespace traits \ + { \ + template <> \ + struct tag_of \ + { \ + typedef struct_tag type; \ + }; \ + }}} \ + namespace boost { namespace fusion { namespace extension \ + { \ + template <> \ + struct struct_size : mpl::int_ {}; \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_ASSOC_STRUCT_C, name, seq) \ + }}} \ + /***/ + +#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_C(r, name, i, xy) \ + template <> \ + struct struct_member \ + { \ + typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type; \ + static type& call(name& struct_) \ + { \ + return struct_.BOOST_PP_TUPLE_ELEM(3, 1, xy); \ + }; \ + }; \ + template<> \ + struct struct_assoc_member \ + { \ + typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type; \ + static type& call(name& struct_) \ + { \ + return struct_.BOOST_PP_TUPLE_ELEM(3, 1, xy); \ + }; \ + }; + /***/ + +#endif diff --git a/include/boost/fusion/adapted/struct/adapt_struct.hpp b/include/boost/fusion/adapted/struct/adapt_struct.hpp new file mode 100644 index 00000000..41de5b1e --- /dev/null +++ b/include/boost/fusion/adapted/struct/adapt_struct.hpp @@ -0,0 +1,75 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_ADAPT_STRUCT_APRIL_2_2007_1158AM) +#define BOOST_FUSION_ADAPT_STRUCT_APRIL_2_2007_1158AM + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BOOST_FUSION_ADAPT_STRUCT(name, bseq) \ + BOOST_FUSION_ADAPT_STRUCT_I( \ + name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_STRUCT_X bseq, 0)) \ + /***/ + +#define BOOST_FUSION_ADAPT_STRUCT_X(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_Y +#define BOOST_FUSION_ADAPT_STRUCT_Y(x, y) ((x, y)) BOOST_FUSION_ADAPT_STRUCT_X +#define BOOST_FUSION_ADAPT_STRUCT_X0 +#define BOOST_FUSION_ADAPT_STRUCT_Y0 + +// BOOST_FUSION_ADAPT_STRUCT_I generates the overarching structure and uses +// SEQ_FOR_EACH_I to generate the "linear" substructures. +// Thanks to Paul Mensonides for the PP macro help + +#define BOOST_FUSION_ADAPT_STRUCT_I(name, seq) \ + namespace boost { namespace fusion { namespace traits \ + { \ + template <> \ + struct tag_of \ + { \ + typedef struct_tag type; \ + }; \ + }}} \ + namespace boost { namespace fusion { namespace extension \ + { \ + template <> \ + struct struct_size : mpl::int_ {}; \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_STRUCT_C, name, seq) \ + }}} \ + /***/ + +#define BOOST_FUSION_ADAPT_STRUCT_C(r, name, i, xy) \ + template <> \ + struct struct_member \ + { \ + typedef BOOST_PP_TUPLE_ELEM(2, 0, xy) type; \ + static type& call(name& struct_) \ + { \ + return struct_.BOOST_PP_TUPLE_ELEM(2, 1, xy); \ + }; \ + }; \ + /***/ + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/at_impl.hpp b/include/boost/fusion/adapted/struct/detail/at_impl.hpp new file mode 100644 index 00000000..809902ae --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/at_impl.hpp @@ -0,0 +1,63 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1807) +#define BOOST_FUSION_AT_IMPL_24122005_1807 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct at_impl; + + template + struct struct_member; + + template + struct struct_size; + + template <> + struct at_impl + { + template + struct apply + { + static int const n_value = N::value; + BOOST_MPL_ASSERT_RELATION( + n_value, <=, extension::struct_size::value); + + typedef typename + extension::struct_member + element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + static type + call(Sequence& seq) + { + return extension:: + struct_member::call(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/at_key_impl.hpp b/include/boost/fusion/adapted/struct/detail/at_key_impl.hpp new file mode 100644 index 00000000..4ce0fce9 --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/at_key_impl.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2001-2007 Joel de Guzman + Copyright (c) 2005-2007 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_20070508_2248) +#define BOOST_FUSION_AT_KEY_IMPL_20070508_2248 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct at_key_impl; + + template + struct struct_assoc_member; + + template <> + struct at_key_impl + { + template + struct apply + { + typedef typename + extension::struct_assoc_member + element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + static type + call(Sequence& seq) + { + return extension:: + struct_assoc_member::call(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/begin_impl.hpp b/include/boost/fusion/adapted/struct/detail/begin_impl.hpp new file mode 100644 index 00000000..bf5a00bc --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/begin_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1752) +#define BOOST_FUSION_BEGIN_IMPL_24122005_1752 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef struct_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/category_of_impl.hpp b/include/boost/fusion/adapted/struct/detail/category_of_impl.hpp new file mode 100644 index 00000000..c23b9751 --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/category_of_impl.hpp @@ -0,0 +1,35 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1731) +#define BOOST_FUSION_CATEGORY_OF_IMPL_24122005_1731 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + struct random_access_traversal_tag; + + namespace extension + { + template + struct category_of_impl; + + template<> + struct category_of_impl + { + template + struct apply + { + typedef random_access_traversal_tag type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/end_impl.hpp b/include/boost/fusion/adapted/struct/detail/end_impl.hpp new file mode 100644 index 00000000..514f7f58 --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/end_impl.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1755) +#define BOOST_FUSION_END_IMPL_24122005_1755 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct end_impl; + + template + struct struct_size; + + template <> + struct end_impl + { + template + struct apply + { + typedef + struct_iterator< + Sequence + , struct_size::value + > + type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/has_key_impl.hpp b/include/boost/fusion/adapted/struct/detail/has_key_impl.hpp new file mode 100644 index 00000000..8972f5df --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/has_key_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2007 Joel de Guzman + Copyright (c) 2005-2007 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_20070508_2231) +#define BOOST_FUSION_HAS_KEY_IMPL_20070508_2231 + +#include +#include + +namespace boost { namespace fusion { + + struct struct_tag; + + namespace extension + { + struct no_such_member; + + template + struct has_key_impl; + + template + struct struct_assoc_member; + + template<> + struct has_key_impl + { + template + struct apply + : mpl::not_::type> > + { + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/is_sequence_impl.hpp b/include/boost/fusion/adapted/struct/detail/is_sequence_impl.hpp new file mode 100644 index 00000000..f81e9fb6 --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/is_sequence_impl.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_1651) +#define BOOST_FUSION_IS_SEQUENCE_IMPL_27122005_1651 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct is_sequence_impl; + + template<> + struct is_sequence_impl + { + template + struct apply : mpl::true_ {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp b/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp new file mode 100644 index 00000000..da6f380b --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_2219) +#define BOOST_FUSION_IS_VIEW_IMPL_27042006_2219 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct is_view_impl; + + template<> + struct is_view_impl + { + template + struct apply : mpl::false_ + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/size_impl.hpp b/include/boost/fusion/adapted/struct/detail/size_impl.hpp new file mode 100644 index 00000000..12ec14ba --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/size_impl.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1759) +#define BOOST_FUSION_SIZE_IMPL_24122005_1759 + +#include + +namespace boost { namespace fusion +{ + namespace extension + { + template + struct struct_size; + } + + struct struct_tag; + + namespace extension + { + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply : extension::struct_size {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/value_at_impl.hpp b/include/boost/fusion/adapted/struct/detail/value_at_impl.hpp new file mode 100644 index 00000000..8f5d97a0 --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/value_at_impl.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_24122005_1917) +#define BOOST_FUSION_VALUE_AT_IMPL_24122005_1917 + +#include +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct value_at_impl; + + template + struct struct_member; + + template + struct struct_size; + + template <> + struct value_at_impl + { + template + struct apply + { + static int const n_value = N::value; + BOOST_MPL_ASSERT_RELATION( + n_value, <=, extension::struct_size::value); + + typedef typename + extension::struct_member::type + type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/detail/value_at_key_impl.hpp b/include/boost/fusion/adapted/struct/detail/value_at_key_impl.hpp new file mode 100644 index 00000000..b1b3dcfb --- /dev/null +++ b/include/boost/fusion/adapted/struct/detail/value_at_key_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2007 Joel de Guzman + Copyright (c) 2005-2007 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_20070508_2300) +#define BOOST_FUSION_VALUE_AT_KEY_IMPL_20070508_2300 + +#include + +namespace boost { namespace fusion +{ + struct struct_tag; + + namespace extension + { + template + struct value_at_key_impl; + + template + struct struct_assoc_member; + + template <> + struct value_at_key_impl + { + template + struct apply + { + typedef typename + extension::struct_assoc_member::type + type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/adapted/struct/extension.hpp b/include/boost/fusion/adapted/struct/extension.hpp new file mode 100644 index 00000000..071b11e9 --- /dev/null +++ b/include/boost/fusion/adapted/struct/extension.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_STRUCT_EXTENSION_APRIL_2_2007_1008AM) +#define FUSION_STRUCT_EXTENSION_APRIL_2_2007_1008AM + +#include + +namespace boost { namespace fusion { namespace extension +{ + template + struct struct_member; + + template + struct struct_size; + + template + struct struct_member + { + typedef typename + add_const::type>::type + type; + + static type& + call(Struct const& struct_) + { + return struct_member::call( + const_cast(struct_)); + } + }; + + template + struct struct_size + : struct_size + {}; + + struct no_such_member; + + template + struct struct_assoc_member + { + typedef no_such_member type; + }; + + template + struct struct_assoc_member + { + typedef typename + add_const::type>::type + type; + + static type& + call(Struct const& struct_) + { + return struct_assoc_member::call( + const_cast(struct_)); + } + }; + +}}} + +#endif + + diff --git a/include/boost/fusion/adapted/struct/struct_iterator.hpp b/include/boost/fusion/adapted/struct/struct_iterator.hpp new file mode 100644 index 00000000..f2eb7ea9 --- /dev/null +++ b/include/boost/fusion/adapted/struct/struct_iterator.hpp @@ -0,0 +1,103 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_STRUCT_ITERATOR_APRIL_2_2007_1008AM) +#define FUSION_STRUCT_ITERATOR_APRIL_2_2007_1008AM + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct random_access_traversal_tag; + + template + struct struct_iterator + : iterator_facade, random_access_traversal_tag> + { + BOOST_MPL_ASSERT_RELATION(N_, >=, 0); + BOOST_MPL_ASSERT_RELATION(N_, <=, extension::struct_size::value); + + typedef mpl::int_ index; + typedef Struct struct_type; + + struct_iterator(Struct& struct_) + : struct_(struct_) {} + Struct& struct_; + + template + struct value_of + : extension::struct_member + { + }; + + template + struct deref + { + typedef typename + add_reference< + typename extension::struct_member::type + >::type + type; + + static type + call(Iterator const& iter) + { + return extension::struct_member:: + call(iter.struct_); + } + }; + + template + struct advance + { + typedef typename Iterator::index index; + typedef typename Iterator::struct_type struct_type; + typedef struct_iterator type; + + static type + call(Iterator const& iter) + { + return type(iter.struct_); + } + }; + + template + struct next : advance > {}; + + template + struct prior : advance > {}; + + template + struct distance : mpl::minus + { + typedef typename + mpl::minus< + typename I2::index, typename I1::index + >::type + type; + + static type + call(I1 const&, I2 const&) + { + return type(); + } + }; + }; +}} + +#endif + + diff --git a/include/boost/fusion/algorithm/iteration/detail/fold.hpp b/include/boost/fusion/algorithm/iteration/detail/fold.hpp index 542a8114..390b188c 100644 --- a/include/boost/fusion/algorithm/iteration/detail/fold.hpp +++ b/include/boost/fusion/algorithm/iteration/detail/fold.hpp @@ -1,3 +1,10 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_FOLD_HPP_20070528_1253) #define BOOST_FUSION_FOLD_HPP_20070528_1253 @@ -98,7 +105,7 @@ namespace detail struct unrolled_fold<3> { template - static typename result_of_unrolled_fold::type + static typename result_of_unrolled_fold::type call(I0 const& i0, State const& state, F f) { typedef typename result_of::next::type I1; @@ -113,7 +120,7 @@ namespace detail struct unrolled_fold<2> { template - static typename result_of_unrolled_fold::type + static typename result_of_unrolled_fold::type call(I0 const& i0, State const& state, F f) { typedef typename result_of::next::type I1; @@ -126,7 +133,7 @@ namespace detail struct unrolled_fold<1> { template - static typename result_of_unrolled_fold::type + static typename result_of_unrolled_fold::type call(I0 const& i0, State const& state, F f) { return f(*i0, state); diff --git a/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp b/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp old mode 100755 new mode 100644 diff --git a/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp b/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp old mode 100755 new mode 100644 index 2534ba4e..0b1852a6 --- a/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp +++ b/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp @@ -14,10 +14,10 @@ #include #include #include -#include +#include #include -#include -#include +#include +#include #include // fwd declarations @@ -117,7 +117,7 @@ namespace boost { namespace fusion { namespace detail private: static type call_(SegmentedRange const &range, mpl::true_) { - return found::call(range, where::call(*range.where)); + return found::call(range, where::call(*range.where_)); } static type call_(SegmentedRange const &range, mpl::false_) diff --git a/include/boost/fusion/algorithm/transformation/clear.hpp b/include/boost/fusion/algorithm/transformation/clear.hpp index 31e4269d..75328232 100644 --- a/include/boost/fusion/algorithm/transformation/clear.hpp +++ b/include/boost/fusion/algorithm/transformation/clear.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_CLEAR_09172005_1127) #define FUSION_CLEAR_09172005_1127 -#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/erase.hpp b/include/boost/fusion/algorithm/transformation/erase.hpp index 9e78da27..d0405c30 100644 --- a/include/boost/fusion/algorithm/transformation/erase.hpp +++ b/include/boost/fusion/algorithm/transformation/erase.hpp @@ -1,20 +1,21 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_ERASE_07232005_0534) #define FUSION_ERASE_07232005_0534 -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include -#include -#include +#include namespace boost { namespace fusion { @@ -25,7 +26,7 @@ namespace boost { namespace fusion { typedef typename result_of::end::type seq_last_type; typedef typename convert_iterator::type first_type; - typedef typename + typedef typename mpl::if_< result_of::equal_to , first_type @@ -33,19 +34,19 @@ namespace boost { namespace fusion >::type type; - static type + static type call(First const& first, mpl::false_) { return fusion::next(convert_iterator::call(first)); } - static type + static type call(First const& first, mpl::true_) { return convert_iterator::call(first); } - static type + static type call(First const& first) { return call(first, result_of::equal_to()); diff --git a/include/boost/fusion/algorithm/transformation/filter.hpp b/include/boost/fusion/algorithm/transformation/filter.hpp index 16244649..52bf6af3 100644 --- a/include/boost/fusion/algorithm/transformation/filter.hpp +++ b/include/boost/fusion/algorithm/transformation/filter.hpp @@ -8,7 +8,7 @@ #if !defined(FUSION_FILTER_02122005_1839) #define FUSION_FILTER_02122005_1839 -#include +#include #include namespace boost { namespace fusion diff --git a/include/boost/fusion/algorithm/transformation/filter_if.hpp b/include/boost/fusion/algorithm/transformation/filter_if.hpp index 4f362882..d13113b1 100644 --- a/include/boost/fusion/algorithm/transformation/filter_if.hpp +++ b/include/boost/fusion/algorithm/transformation/filter_if.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_FILTER_IF_07172005_0818) #define FUSION_FILTER_IF_07172005_0818 -#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/insert.hpp b/include/boost/fusion/algorithm/transformation/insert.hpp index ebe06f14..1702bc19 100644 --- a/include/boost/fusion/algorithm/transformation/insert.hpp +++ b/include/boost/fusion/algorithm/transformation/insert.hpp @@ -1,20 +1,21 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_INSERT_07222005_0730) #define FUSION_INSERT_07222005_0730 -#include -#include -#include -#include #include +#include +#include +#include +#include +#include #include #include -#include +#include namespace boost { namespace fusion { @@ -42,7 +43,7 @@ namespace boost { namespace fusion insert(Sequence const& seq, Position const& pos, T const& x) { typedef result_of::insert< - Sequence const, Position, T> + Sequence const, Position, T> result_of; typedef typename result_of::left_type left_type; typedef typename result_of::right_type right_type; diff --git a/include/boost/fusion/algorithm/transformation/insert_range.hpp b/include/boost/fusion/algorithm/transformation/insert_range.hpp index 4db840aa..1915c413 100644 --- a/include/boost/fusion/algorithm/transformation/insert_range.hpp +++ b/include/boost/fusion/algorithm/transformation/insert_range.hpp @@ -1,19 +1,20 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_INSERT_RANGE_009172005_1147) #define FUSION_INSERT_RANGE_009172005_1147 -#include -#include -#include +#include +#include +#include +#include #include #include #include -#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/join.hpp b/include/boost/fusion/algorithm/transformation/join.hpp index 10a5eecc..4ed78b5f 100644 --- a/include/boost/fusion/algorithm/transformation/join.hpp +++ b/include/boost/fusion/algorithm/transformation/join.hpp @@ -8,7 +8,7 @@ #if !defined(FUSION_JOIN_200601222109) #define FUSION_JOIN_200601222109 -#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/pop_back.hpp b/include/boost/fusion/algorithm/transformation/pop_back.hpp index c83d5904..6eb743fd 100644 --- a/include/boost/fusion/algorithm/transformation/pop_back.hpp +++ b/include/boost/fusion/algorithm/transformation/pop_back.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_POP_BACK_09172005_1038) #define FUSION_POP_BACK_09172005_1038 -#include +#include #include #include #include diff --git a/include/boost/fusion/algorithm/transformation/pop_front.hpp b/include/boost/fusion/algorithm/transformation/pop_front.hpp index d01e3754..aed524d3 100644 --- a/include/boost/fusion/algorithm/transformation/pop_front.hpp +++ b/include/boost/fusion/algorithm/transformation/pop_front.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_POP_FRONT_09172005_1115) #define FUSION_POP_FRONT_09172005_1115 -#include +#include #include #include #include diff --git a/include/boost/fusion/algorithm/transformation/push_back.hpp b/include/boost/fusion/algorithm/transformation/push_back.hpp index 98f63702..4fadc79c 100644 --- a/include/boost/fusion/algorithm/transformation/push_back.hpp +++ b/include/boost/fusion/algorithm/transformation/push_back.hpp @@ -8,8 +8,8 @@ #define FUSION_PUSH_BACK_07162005_0235 #include -#include -#include +#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/push_front.hpp b/include/boost/fusion/algorithm/transformation/push_front.hpp index 526e28f1..10f9fc10 100644 --- a/include/boost/fusion/algorithm/transformation/push_front.hpp +++ b/include/boost/fusion/algorithm/transformation/push_front.hpp @@ -8,8 +8,8 @@ #define FUSION_PUSH_FRONT_07162005_0749 #include -#include -#include +#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/remove.hpp b/include/boost/fusion/algorithm/transformation/remove.hpp index 1eb4bfb3..01718d32 100644 --- a/include/boost/fusion/algorithm/transformation/remove.hpp +++ b/include/boost/fusion/algorithm/transformation/remove.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_REMOVE_07162005_0818) #define FUSION_REMOVE_07162005_0818 -#include +#include #include #include diff --git a/include/boost/fusion/algorithm/transformation/remove_if.hpp b/include/boost/fusion/algorithm/transformation/remove_if.hpp index c2140d17..ab13694d 100644 --- a/include/boost/fusion/algorithm/transformation/remove_if.hpp +++ b/include/boost/fusion/algorithm/transformation/remove_if.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_REMOVE_IF_07162005_0818) #define FUSION_REMOVE_IF_07162005_0818 -#include +#include #include #include diff --git a/include/boost/fusion/algorithm/transformation/replace.hpp b/include/boost/fusion/algorithm/transformation/replace.hpp index 43657f99..780f1a45 100644 --- a/include/boost/fusion/algorithm/transformation/replace.hpp +++ b/include/boost/fusion/algorithm/transformation/replace.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_REPLACE_08182005_0830) #define FUSION_REPLACE_08182005_0830 -#include +#include #include namespace boost { namespace fusion diff --git a/include/boost/fusion/algorithm/transformation/replace_if.hpp b/include/boost/fusion/algorithm/transformation/replace_if.hpp index 07abbdca..90db5683 100644 --- a/include/boost/fusion/algorithm/transformation/replace_if.hpp +++ b/include/boost/fusion/algorithm/transformation/replace_if.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_REPLACE_IF_08182005_0939) #define FUSION_REPLACE_IF_08182005_0939 -#include +#include #include #include #include diff --git a/include/boost/fusion/algorithm/transformation/reverse.hpp b/include/boost/fusion/algorithm/transformation/reverse.hpp index faf78114..b95461c8 100644 --- a/include/boost/fusion/algorithm/transformation/reverse.hpp +++ b/include/boost/fusion/algorithm/transformation/reverse.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_REVERSE_07212005_1230) #define FUSION_REVERSE_07212005_1230 -#include +#include namespace boost { namespace fusion { diff --git a/include/boost/fusion/algorithm/transformation/transform.hpp b/include/boost/fusion/algorithm/transformation/transform.hpp index 0315a8d0..681319bc 100644 --- a/include/boost/fusion/algorithm/transformation/transform.hpp +++ b/include/boost/fusion/algorithm/transformation/transform.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_TRANSFORM_07052005_1057) #define FUSION_TRANSFORM_07052005_1057 -#include +#include namespace boost { namespace fusion { @@ -22,7 +22,11 @@ namespace boost { namespace fusion }; template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct transform +#else struct transform +#endif { typedef transform_view type; }; diff --git a/include/boost/fusion/algorithm/transformation/zip.hpp b/include/boost/fusion/algorithm/transformation/zip.hpp index 33b7d25b..ff6e6b1a 100644 --- a/include/boost/fusion/algorithm/transformation/zip.hpp +++ b/include/boost/fusion/algorithm/transformation/zip.hpp @@ -9,14 +9,15 @@ #if !defined(FUSION_ZIP_HPP_20060125_2058) #define FUSION_ZIP_HPP_20060125_2058 -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include +#include #include #include #include @@ -53,7 +54,13 @@ namespace boost { namespace fusion { namespace result_of { template< BOOST_PP_ENUM_PARAMS(ZIP_ITERATION, typename T) > +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct zip< BOOST_PP_ENUM_PARAMS(ZIP_ITERATION, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(ZIP_ITERATION), FUSION_MAX_ZIP_SEQUENCES, TEXT, void_) > + #undef TEXT +#else struct zip< BOOST_PP_ENUM_PARAMS(ZIP_ITERATION, T) > +#endif { typedef mpl::vector< BOOST_PP_ENUM_PARAMS(ZIP_ITERATION, T) > sequences; typedef typename mpl::transform >::type ref_params; diff --git a/include/boost/fusion/container.hpp b/include/boost/fusion/container.hpp new file mode 100644 index 00000000..1398197d --- /dev/null +++ b/include/boost/fusion/container.hpp @@ -0,0 +1,17 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CLASS_10022005_0614) +#define FUSION_SEQUENCE_CLASS_10022005_0614 + +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/deque.hpp b/include/boost/fusion/container/deque.hpp new file mode 100644 index 00000000..bb29ce2f --- /dev/null +++ b/include/boost/fusion/container/deque.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CONTAINER_DEQUE_24112006_2036) +#define BOOST_FUSION_SEQUENCE_CONTAINER_DEQUE_24112006_2036 + +#include +#include + +#endif + diff --git a/include/boost/fusion/container/deque/back_extended_deque.hpp b/include/boost/fusion/container/deque/back_extended_deque.hpp new file mode 100644 index 00000000..28d5ceca --- /dev/null +++ b/include/boost/fusion/container/deque/back_extended_deque.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BACK_EXTENDED_DEQUE_26112006_2209) +#define BOOST_FUSION_BACK_EXTENDED_DEQUE_26112006_2209 + +#include +#include +#include +#include +#include + +#include +#include + +namespace boost { namespace fusion { + template + struct back_extended_deque + : detail::keyed_element, + sequence_base > + { + typedef detail::keyed_element base; + typedef typename Deque::next_down next_down; + typedef mpl::int_ >::value> next_up; + typedef mpl::plus::type, mpl::int_<1> > size; + + back_extended_deque(Deque const& deque, typename add_reference::type>::type t) + : base(t, deque) + {} + }; +}} + +#endif diff --git a/include/boost/fusion/container/deque/convert.hpp b/include/boost/fusion/container/deque/convert.hpp new file mode 100644 index 00000000..0f3a75e2 --- /dev/null +++ b/include/boost/fusion/container/deque/convert.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_CONVERT_20061213_2207) +#define FUSION_CONVERT_20061213_2207 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace result_of + { + template + struct as_deque + { + typedef typename detail::as_deque::value> gen; + typedef typename gen:: + template apply::type>::type + type; + }; + } + + template + inline typename result_of::as_deque::type + as_deque(Sequence& seq) + { + typedef typename result_of::as_deque::gen gen; + return gen::call(fusion::begin(seq)); + } + + template + inline typename result_of::as_deque::type + as_deque(Sequence const& seq) + { + typedef typename result_of::as_deque::gen gen; + return gen::call(fusion::begin(seq)); + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/deque.hpp b/include/boost/fusion/container/deque/deque.hpp new file mode 100644 index 00000000..27d9ce78 --- /dev/null +++ b/include/boost/fusion/container/deque/deque.hpp @@ -0,0 +1,93 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_26112006_1649) +#define BOOST_FUSION_DEQUE_26112006_1649 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace boost { namespace fusion { + + struct deque_tag; + + template + struct deque + : + detail::deque_keyed_values::type, + sequence_base > + { + typedef deque_tag fusion_tag; + typedef typename detail::deque_keyed_values::type base; + typedef typename detail::deque_initial_size::type size; + typedef mpl::int_ next_up; + typedef mpl::int_< + mpl::if_ >, mpl::int_<0>, mpl::int_<-1> >::type::value> next_down; + typedef mpl::false_ is_view; + +#include + + deque() + {} + + explicit deque(typename add_reference::type>::type t0) + : base(t0, detail::nil_keyed_element()) + {} + + template + deque(deque const& seq) + : base(seq) + {} + + template + deque(Sequence const& seq, typename disable_if >::type* dummy = 0) + : base(base::from_iterator(fusion::begin(seq))) + {} + + template + deque& + operator=(deque const& rhs) + { + base::operator=(rhs); + return *this; + } + + template + deque& + operator=(T const& rhs) + { + base::operator=(rhs); + return *this; + } + + }; +}} + +#endif diff --git a/include/boost/fusion/container/deque/deque_fwd.hpp b/include/boost/fusion/container/deque/deque_fwd.hpp new file mode 100644 index 00000000..415bb2f2 --- /dev/null +++ b/include/boost/fusion/container/deque/deque_fwd.hpp @@ -0,0 +1,24 @@ +/*============================================================================= + Copyright (c) 2005-2007 Joel de Guzman + Copyright (c) 2005-2007 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_DEQUE_FORWARD_02092007_0749) +#define FUSION_DEQUE_FORWARD_02092007_0749 + +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + template< + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_DEQUE_SIZE, typename T, void_)> + struct deque; +}} + +#endif diff --git a/include/boost/fusion/container/deque/deque_iterator.hpp b/include/boost/fusion/container/deque/deque_iterator.hpp new file mode 100644 index 00000000..90c68918 --- /dev/null +++ b/include/boost/fusion/container/deque/deque_iterator.hpp @@ -0,0 +1,106 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_ITERATOR_26112006_2154) +#define BOOST_FUSION_DEQUE_ITERATOR_26112006_2154 + +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct bidirectional_traversal_tag; + + template + struct deque_iterator + : iterator_facade, bidirectional_traversal_tag> + { + typedef Seq sequence; + typedef mpl::int_ index; + + deque_iterator(Seq& seq) + : seq_(seq) + {} + + template + struct value_of + : detail::keyed_element_value_at< + typename Iterator::sequence, typename Iterator::index> + {}; + + template + struct deref + { + typedef typename detail::keyed_element_value_at< + typename Iterator::sequence, typename Iterator::index>::type element_type; + + typedef typename add_reference< + typename mpl::eval_if< + is_const, + add_const, + mpl::identity >::type>::type type; + + static type + call(Iterator const& it) + { + return it.seq_.get(typename Iterator::index()); + } + }; + + template + struct advance + { + typedef typename Iterator::index index; + typedef typename Iterator::sequence sequence; + typedef deque_iterator type; + + static type + call(Iterator const& i) + { + return type(i.seq_); + } + }; + + template + struct next + : advance > + {}; + + template + struct prior + : advance > + {}; + + template + struct distance : mpl::minus + { + typedef typename + mpl::minus< + typename I2::index, typename I1::index + >::type + type; + + static type + call(I1 const&, I2 const&) + { + return type(); + } + }; + + template + struct equal_to + : mpl::equal_to + {}; + + Seq& seq_; + }; + +}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/as_deque.hpp b/include/boost/fusion/container/deque/detail/as_deque.hpp new file mode 100644 index 00000000..e48b7910 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/as_deque.hpp @@ -0,0 +1,102 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_AS_DEQUE_20061213_2210) +#define FUSION_AS_DEQUE_20061213_2210 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template + struct as_deque; + + template <> + struct as_deque<0> + { + template + struct apply + { + typedef deque<> type; + }; + + template + static typename apply::type + call(Iterator) + { + return deque<>(); + } + }; + +#define BOOST_FUSION_NEXT_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::next::type \ + BOOST_PP_CAT(I, BOOST_PP_INC(n)); + +#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data) \ + typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n)) \ + BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n)); + +#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::value_of::type \ + BOOST_PP_CAT(T, n); + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_DEQUE_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_NEXT_ITERATOR +#undef BOOST_FUSION_NEXT_CALL_ITERATOR +#undef BOOST_FUSION_VALUE_OF_ITERATOR + +}}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template <> + struct as_deque + { + template + struct apply + { + BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _) + BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _) + typedef deque type; + }; + + template + static typename apply::type + call(Iterator const& i0) + { + typedef apply gen; + typedef typename gen::type result; + BOOST_PP_REPEAT(BOOST_PP_DEC(N), BOOST_FUSION_NEXT_CALL_ITERATOR, _) + return result(BOOST_PP_ENUM_PARAMS(N, *i)); + } + }; + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/deque/detail/at_impl.hpp b/include/boost/fusion/container/deque/detail/at_impl.hpp new file mode 100644 index 00000000..3dc7cde9 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/at_impl.hpp @@ -0,0 +1,59 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_AT_IMPL_09122006_2017) +#define BOOST_FUSION_DEQUE_AT_IMPL_09122006_2017 + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace boost { namespace fusion { + + struct deque_tag; + + namespace extension + { + template + struct at_impl; + + template<> + struct at_impl + { + template + struct apply + { + typedef typename Sequence::next_up next_up; + typedef typename Sequence::next_down next_down; + BOOST_MPL_ASSERT_RELATION(next_down::value, !=, next_up::value); + + typedef mpl::plus > offset; + typedef mpl::int_::value> adjusted_index; + typedef typename detail::keyed_element_value_at::type element_type; + typedef typename add_reference< + typename mpl::eval_if< + is_const, + add_const, + mpl::identity >::type>::type type; + + static type call(Sequence& seq) + { + return seq.get(adjusted_index()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/begin_impl.hpp b/include/boost/fusion/container/deque/detail/begin_impl.hpp new file mode 100644 index 00000000..13b50143 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/begin_impl.hpp @@ -0,0 +1,46 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_BEGIN_IMPL_09122006_2034) +#define BOOST_FUSION_DEQUE_BEGIN_IMPL_09122006_2034 + +#include + +#include +#include + +namespace boost { namespace fusion { + + struct deque_tag; + + namespace extension + { + template + struct begin_impl; + + template<> + struct begin_impl + { + template + struct apply + { + typedef typename mpl::if_< + mpl::equal_to, + deque_iterator, + deque_iterator< + Sequence, mpl::plus >::value> >::type type; + + static type call(Sequence& seq) + { + return type(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/convert_impl.hpp b/include/boost/fusion/container/deque/detail/convert_impl.hpp new file mode 100644 index 00000000..ac310a19 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/convert_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_IMPL_20061213_2207) +#define FUSION_CONVERT_IMPL_20061213_2207 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct deque_tag; + + namespace extension + { + template + struct convert_impl; + + template <> + struct convert_impl + { + template + struct apply + { + typedef typename detail::as_deque::value> gen; + typedef typename gen:: + template apply::type>::type + type; + + static type call(Sequence& seq) + { + return gen::call(fusion::begin(seq)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/deque_forward_ctor.hpp b/include/boost/fusion/container/deque/detail/deque_forward_ctor.hpp new file mode 100644 index 00000000..813c0491 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/deque_forward_ctor.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PP_IS_ITERATING) +#if !defined(BOOST_FUSION_SEQUENCE_DEQUE_DETAIL_DEQUE_FORWARD_CTOR_04122006_2212) +#define BOOST_FUSION_SEQUENCE_DEQUE_DETAIL_DEQUE_FORWARD_CTOR_04122006_2212 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (2, FUSION_MAX_DEQUE_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else + +#define N BOOST_PP_ITERATION() + +deque(BOOST_PP_ENUM_BINARY_PARAMS(N, typename add_reference::type>::type t)) + : base(detail::deque_keyed_values::call(BOOST_PP_ENUM_PARAMS(N, t))) +{} + +#undef N +#endif diff --git a/include/boost/fusion/container/deque/detail/deque_initial_size.hpp b/include/boost/fusion/container/deque/detail/deque_initial_size.hpp new file mode 100644 index 00000000..8fa56292 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/deque_initial_size.hpp @@ -0,0 +1,33 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_DETAIL_DEQUE_INITIAL_SIZE_26112006_2139) +#define BOOST_FUSION_DEQUE_DETAIL_DEQUE_INITIAL_SIZE_26112006_2139 + +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct void_; + +namespace detail { + + template + struct deque_initial_size + { + typedef mpl::vector args; + typedef typename mpl::find::type first_void; + typedef typename mpl::distance::type, first_void>::type type; + }; +}}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp b/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp new file mode 100644 index 00000000..11b229b2 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp @@ -0,0 +1,75 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_DETAIL_DEQUE_KEYED_VALUES_26112006_1330) +#define BOOST_FUSION_DEQUE_DETAIL_DEQUE_KEYED_VALUES_26112006_1330 + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FUSION_VOID(z, n, _) void_ + +namespace boost { namespace fusion { + + struct void_; + +namespace detail { + + template + struct keyed_element; + + struct nil_keyed_element; + + template + struct deque_keyed_values_impl; + + template + struct deque_keyed_values_impl + { + typedef nil_keyed_element type; + + static type call() + { + return type(); + } + }; + + template + struct deque_keyed_values_impl + { + typedef mpl::int_ >::value> next_index; + + typedef typename deque_keyed_values_impl< + next_index, + BOOST_PP_ENUM_SHIFTED_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type tail; + typedef keyed_element type; + +#include + + }; + + template + struct deque_keyed_values + : deque_keyed_values_impl, BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)> + {}; + +}}} + +#undef FUSION_VOID + +#endif diff --git a/include/boost/fusion/container/deque/detail/deque_keyed_values_call.hpp b/include/boost/fusion/container/deque/detail/deque_keyed_values_call.hpp new file mode 100644 index 00000000..0a39add6 --- /dev/null +++ b/include/boost/fusion/container/deque/detail/deque_keyed_values_call.hpp @@ -0,0 +1,38 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PP_IS_ITERATING) +#if !defined(BOOST_FUSION_SEQUENCE_DEQUE_DETAIL_DEQUE_KEYED_VALUES_CALL_04122006_2211) +#define BOOST_FUSION_SEQUENCE_DEQUE_DETAIL_DEQUE_KEYED_VALUES_CALL_04122006_2211 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_DEQUE_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else + +#define N BOOST_PP_ITERATION() + +static type call(BOOST_PP_ENUM_BINARY_PARAMS(N, typename add_reference::type>::type t)) +{ + return type(t0, + deque_keyed_values_impl< + next_index +#if N > 1 + , BOOST_PP_ENUM_SHIFTED_PARAMS(N, T) +#endif + >::call(BOOST_PP_ENUM_SHIFTED_PARAMS(N, t))); +} + +#undef N +#endif diff --git a/include/boost/fusion/container/deque/detail/end_impl.hpp b/include/boost/fusion/container/deque/detail/end_impl.hpp new file mode 100644 index 00000000..96a1b17d --- /dev/null +++ b/include/boost/fusion/container/deque/detail/end_impl.hpp @@ -0,0 +1,46 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_END_IMPL_09122006_2034) +#define BOOST_FUSION_DEQUE_END_IMPL_09122006_2034 + +#include + +#include +#include + +namespace boost { namespace fusion { + + struct deque_tag; + + namespace extension + { + template + struct end_impl; + + template<> + struct end_impl + { + template + struct apply + { + typedef typename mpl::if_< + mpl::equal_to, + deque_iterator, + deque_iterator< + Sequence, Sequence::next_up::value> >::type type; + + static type call(Sequence& seq) + { + return type(seq); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/keyed_element.hpp b/include/boost/fusion/container/deque/detail/keyed_element.hpp new file mode 100644 index 00000000..177f68ac --- /dev/null +++ b/include/boost/fusion/container/deque/detail/keyed_element.hpp @@ -0,0 +1,111 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330) +#define BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330 + +#include +#include + +#include +#include + +namespace boost { namespace fusion { + + struct fusion_sequence_tag; + +namespace detail { + + struct nil_keyed_element + { + typedef fusion_sequence_tag tag; + void get(); + + template + static nil_keyed_element + from_iterator(It const&) + { + return nil_keyed_element(); + } + }; + + template + struct keyed_element + : Rest + { + typedef Rest base; + typedef fusion_sequence_tag tag; + using Rest::get; + + template + static keyed_element + from_iterator(It const& it) + { + return keyed_element( + *it, base::from_iterator(fusion::next(it))); + } + + template + keyed_element(keyed_element const& rhs) + : Rest(rhs.get_base()), value_(rhs.value_) + {} + + Rest const get_base() const + { + return *this; + } + + typename add_reference::type>::type get(Key) const + { + return value_; + } + + typename add_reference::type get(Key) + { + return value_; + } + + keyed_element(typename add_reference::type>::type value, Rest const& rest) + : Rest(rest), value_(value) + {} + + keyed_element() + : Rest(), value_() + {} + + template + keyed_element& operator=(keyed_element const& rhs) + { + base::operator=(static_cast(rhs)); // cast for msvc-7.1 + value_ = rhs.value_; + return *this; + } + + keyed_element& operator=(keyed_element const& rhs) + { + base::operator=(rhs); + value_ = rhs.value_; + return *this; + } + + Value value_; + }; + + template + struct keyed_element_value_at + : keyed_element_value_at + {}; + + template + struct keyed_element_value_at, Key> + { + typedef Value type; + }; + +}}} + +#endif diff --git a/include/boost/fusion/container/deque/detail/value_at_impl.hpp b/include/boost/fusion/container/deque/detail/value_at_impl.hpp new file mode 100644 index 00000000..ec0351de --- /dev/null +++ b/include/boost/fusion/container/deque/detail/value_at_impl.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_VALUE_AT_IMPL_08122006_0756) +#define BOOST_FUSION_DEQUE_VALUE_AT_IMPL_08122006_0756 + +#include + +#include +#include + +namespace boost { namespace fusion { + + struct deque_tag; + + namespace extension + { + template + struct value_at_impl; + + template<> + struct value_at_impl + { + template + struct apply + { + typedef typename Sequence::next_up next_up; + typedef typename Sequence::next_down next_down; + BOOST_MPL_ASSERT_RELATION(next_down::value, !=, next_up::value); + + typedef mpl::plus > offset; + typedef mpl::int_::value> adjusted_index; + typedef typename detail::keyed_element_value_at::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/deque/front_extended_deque.hpp b/include/boost/fusion/container/deque/front_extended_deque.hpp new file mode 100644 index 00000000..156e66a4 --- /dev/null +++ b/include/boost/fusion/container/deque/front_extended_deque.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_FRONT_EXTENDED_DEQUE_26112006_2209) +#define BOOST_FUSION_FRONT_EXTENDED_DEQUE_26112006_2209 + +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace boost { namespace fusion { + template + struct front_extended_deque + : detail::keyed_element, + sequence_base > + { + typedef detail::keyed_element base; + typedef mpl::int_ >::value> next_down; + typedef typename Deque::next_up next_up; + typedef mpl::plus::type, mpl::int_<1> > size; + + front_extended_deque(Deque const& deque, typename add_reference::type>::type t) + : base(t, deque) + {} + }; +}} + +#endif diff --git a/include/boost/fusion/container/deque/limits.hpp b/include/boost/fusion/container/deque/limits.hpp new file mode 100644 index 00000000..2262f17c --- /dev/null +++ b/include/boost/fusion/container/deque/limits.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEQUE_LIMITS_26112006_1737) +#define BOOST_FUSION_DEQUE_LIMITS_26112006_1737 + +#if !defined(FUSION_MAX_DEQUE_SIZE) +#define FUSION_MAX_DEQUE_SIZE 10 +#endif + +#endif diff --git a/include/boost/fusion/container/ext_/tree.hpp b/include/boost/fusion/container/ext_/tree.hpp new file mode 100644 index 00000000..cd8c5dcd --- /dev/null +++ b/include/boost/fusion/container/ext_/tree.hpp @@ -0,0 +1,130 @@ +/*============================================================================= + Copyright (c) 2006 Eric Niebler + + 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) +==============================================================================*/ +#ifndef FUSION_BINARY_TREE_EAN_05032006_1027 +#define FUSION_BINARY_TREE_EAN_05032006_1027 + +#include +#include +#include +#include +#include +#include +#include +#include // for nil +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct tree_tag; + + namespace detail + { + template + struct reference : add_reference {}; + + template + struct reference : reference::type, false> {}; + + template + struct reference : reference {}; + } + + template + struct tree + : sequence_base > + { + typedef Data data_type; + typedef Left left_type; + typedef Right right_type; + typedef tree_tag fusion_tag; + typedef forward_traversal_tag category; + typedef mpl::false_ is_view; + + typedef typename mpl::if_< + traits::is_sequence + , Data + , single_view + >::type data_view; + + explicit tree( + typename fusion::detail::call_param::type data_ + , typename fusion::detail::call_param::type left_ = Left() + , typename fusion::detail::call_param::type right_ = Right() + ) + : segments(left_, data_view(data_), right_) + {} + + typedef vector3 segments_type; + segments_type segments; + }; + + template + tree make_tree(Data const &data) + { + return tree(data); + } + + template + tree make_tree(Data const &data, Left const &left, Right const &right) + { + return tree(data, left, right); + } + + namespace extension + { + template<> + struct is_segmented_impl + { + template + struct apply : mpl::true_ {}; + }; + + template<> + struct segments_impl + { + template + struct apply + { + typedef typename mpl::if_< + is_const + , typename Sequence::segments_type const & + , typename Sequence::segments_type & + >::type type; + + static type call(Sequence &seq) + { + return seq.segments; + } + }; + }; + + template<> + struct begin_impl + { + template + struct apply + : segmented_begin + {}; + }; + + template<> + struct end_impl + { + template + struct apply + : segmented_end + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/generation.hpp b/include/boost/fusion/container/generation.hpp new file mode 100644 index 00000000..7d92bb2f --- /dev/null +++ b/include/boost/fusion/container/generation.hpp @@ -0,0 +1,20 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_GENERATION_10022005_0615) +#define FUSION_SEQUENCE_GENERATION_10022005_0615 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/generation/cons_tie.hpp b/include/boost/fusion/container/generation/cons_tie.hpp new file mode 100644 index 00000000..88ce0aa4 --- /dev/null +++ b/include/boost/fusion/container/generation/cons_tie.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2005 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_CONS_TIE_07182005_0854) +#define FUSION_CONS_TIE_07182005_0854 + +#include + +namespace boost { namespace fusion +{ + struct nil; + + namespace result_of + { + template + struct cons_tie + { + typedef cons type; + }; + } + + // $$$ do we really want a cons_tie? $$$ + template + inline cons + cons_tie(Car& car) + { + return cons(car); + } + + // $$$ do we really want a cons_tie? $$$ + template + inline cons + cons_tie(Car& car, Cdr const& cdr) + { + return cons(car, cdr); + } +}} + +#endif + diff --git a/include/boost/fusion/container/generation/deque_tie.hpp b/include/boost/fusion/container/generation/deque_tie.hpp new file mode 100644 index 00000000..c5d26c97 --- /dev/null +++ b/include/boost/fusion/container/generation/deque_tie.hpp @@ -0,0 +1,79 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_DEQUE_TIE_07192005_1242) +#define FUSION_DEQUE_TIE_07192005_1242 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_DEQUE_SIZE, typename T, void_) + , typename Extra = void_ + > + struct deque_tie; + } + +#define BOOST_FUSION_REF(z, n, data) BOOST_PP_CAT(T, n)& + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_DEQUE_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_REF + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct deque_tie< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_DEQUE_SIZE, TEXT, void_) > + #undef TEXT +#else + struct deque_tie +#endif + { + typedef deque type; + }; + } + + template + inline deque + deque_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _)) + { + return deque( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/ignore.hpp b/include/boost/fusion/container/generation/ignore.hpp new file mode 100644 index 00000000..6a416c6b --- /dev/null +++ b/include/boost/fusion/container/generation/ignore.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001 Doug Gregor + Copyright (c) 1999-2003 Jaakko Jarvi + Copyright (c) 2001-2006 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_IGNORE_07192005_0329) +#define FUSION_IGNORE_07192005_0329 + +namespace boost { namespace fusion +{ + // Swallows any assignment (by Doug Gregor) + namespace detail + { + struct swallow_assign + { + template + swallow_assign const& + operator=(const T&) const + { + return *this; + } + }; + } + + // "ignore" allows tuple positions to be ignored when using "tie". + detail::swallow_assign const ignore = detail::swallow_assign(); +}} + +#endif diff --git a/include/boost/fusion/container/generation/list_tie.hpp b/include/boost/fusion/container/generation/list_tie.hpp new file mode 100644 index 00000000..44691e02 --- /dev/null +++ b/include/boost/fusion/container/generation/list_tie.hpp @@ -0,0 +1,79 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_LIST_TIE_07192005_0109) +#define FUSION_LIST_TIE_07192005_0109 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_LIST_SIZE, typename T, void_) + , typename Extra = void_ + > + struct list_tie; + } + +// $$$ shouldn't we remove_reference first to allow references? $$$ +#define BOOST_FUSION_REF(z, n, data) BOOST_PP_CAT(T, n)& + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_LIST_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_REF + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct list_tie< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_LIST_SIZE, TEXT, void_) > + #undef TEXT +#else + struct list_tie +#endif + { + typedef list type; + }; + } + + template + inline list + list_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _)) + { + return list( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/make_cons.hpp b/include/boost/fusion/container/generation/make_cons.hpp new file mode 100644 index 00000000..47a2f461 --- /dev/null +++ b/include/boost/fusion/container/generation/make_cons.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_MAKE_CONS_07172005_0918) +#define FUSION_MAKE_CONS_07172005_0918 + +#include +#include + +namespace boost { namespace fusion +{ + struct nil; + + namespace result_of + { + template + struct make_cons + { + typedef cons::type, Cdr> type; + }; + } + + template + inline cons::type> + make_cons(Car const& car) + { + return cons::type>(car); + } + + template + inline cons::type, Cdr> + make_cons(Car const& car, Cdr const& cdr) + { + return cons::type, Cdr>(car, cdr); + } +}} + +#endif + diff --git a/include/boost/fusion/container/generation/make_deque.hpp b/include/boost/fusion/container/generation/make_deque.hpp new file mode 100644 index 00000000..90d146e9 --- /dev/null +++ b/include/boost/fusion/container/generation/make_deque.hpp @@ -0,0 +1,98 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAKE_DEQUE_07162005_0243) +#define FUSION_MAKE_DEQUE_07162005_0243 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_DEQUE_SIZE, typename T, void_) + , typename Extra = void_ + > + struct make_deque; + + template <> + struct make_deque<> + { + typedef deque<> type; + }; + } + + inline deque<> + make_deque() + { + return deque<>(); + } + +#define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data) \ + typename detail::as_fusion_element::type + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_DEQUE_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_AS_FUSION_ELEMENT + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct make_deque< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_DEQUE_SIZE, TEXT, void_) > + #undef TEXT +#else + struct make_deque +#endif + { + typedef deque type; + }; + } + + template + inline deque + make_deque(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _)) + { + return deque( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/make_list.hpp b/include/boost/fusion/container/generation/make_list.hpp new file mode 100644 index 00000000..b4cfd012 --- /dev/null +++ b/include/boost/fusion/container/generation/make_list.hpp @@ -0,0 +1,91 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAKE_LIST_07192005_1239) +#define FUSION_MAKE_LIST_07192005_1239 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_LIST_SIZE, typename T, void_) + , typename Extra = void_ + > + struct make_list; + + template <> + struct make_list<> + { + typedef list<> type; + }; + } + + inline list<> + make_list() + { + return list<>(); + } + +#define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data) \ + typename detail::as_fusion_element::type + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_LIST_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_AS_FUSION_ELEMENT + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct make_list< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_LIST_SIZE, TEXT, void_) > + #undef TEXT +#else + struct make_list +#endif + { + typedef list type; + }; + } + + template + inline list + make_list(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _)) + { + return list( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/make_map.hpp b/include/boost/fusion/container/generation/make_map.hpp new file mode 100644 index 00000000..865d5a20 --- /dev/null +++ b/include/boost/fusion/container/generation/make_map.hpp @@ -0,0 +1,106 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAKE_MAP_07222005_1247) +#define FUSION_MAKE_MAP_07222005_1247 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename K, void_) + , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename D, void_) + , typename Extra = void_ + > + struct make_map; + + template <> + struct make_map<> + { + typedef map<> type; + }; + } + + inline map<> + make_map() + { + return map<>(); + } + +#define BOOST_FUSION_PAIR(z, n, data) \ + fusion::pair< \ + BOOST_PP_CAT(K, n) \ + , typename detail::as_fusion_element::type> + +#define BOOST_FUSION_MAKE_PAIR(z, n, data) \ + fusion::make_pair(BOOST_PP_CAT(_, n)) \ + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_PAIR +#undef BOOST_FUSION_MAKE_PAIR + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS(N, typename K) + , BOOST_PP_ENUM_PARAMS(N, typename D) + > +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct make_map + #undef TEXT +#else + struct make_map +#endif + { + typedef map type; + }; + } + + template < + BOOST_PP_ENUM_PARAMS(N, typename K) + , BOOST_PP_ENUM_PARAMS(N, typename D) + > + inline map + make_map(BOOST_PP_ENUM_BINARY_PARAMS(N, D, const& _)) + { + return map( + BOOST_PP_ENUM(N, BOOST_FUSION_MAKE_PAIR, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/make_set.hpp b/include/boost/fusion/container/generation/make_set.hpp new file mode 100644 index 00000000..52aa952d --- /dev/null +++ b/include/boost/fusion/container/generation/make_set.hpp @@ -0,0 +1,93 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAKE_SET_09162005_1125) +#define FUSION_MAKE_SET_09162005_1125 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename T, void_) + , typename Extra = void_ + > + struct make_set; + + template <> + struct make_set<> + { + typedef set<> type; + }; + } + + inline set<> + make_set() + { + return set<>(); + } + +#define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data) \ + typename detail::as_fusion_element::type + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_ELEMENT +#undef BOOST_FUSION_AS_ELEMENT + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct make_set< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_SET_SIZE, TEXT, void_) > + #undef TEXT +#else + struct make_set +#endif + { + typedef set type; + }; + } + + template + inline set + make_set(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _)) + { + return set( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/make_vector.hpp b/include/boost/fusion/container/generation/make_vector.hpp new file mode 100644 index 00000000..3f9b27f2 --- /dev/null +++ b/include/boost/fusion/container/generation/make_vector.hpp @@ -0,0 +1,91 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAKE_VECTOR_07162005_0243) +#define FUSION_MAKE_VECTOR_07162005_0243 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename T, void_) + , typename Extra = void_ + > + struct make_vector; + + template <> + struct make_vector<> + { + typedef vector<> type; + }; + } + + inline vector<> + make_vector() + { + return vector<>(); + } + +#define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data) \ + typename detail::as_fusion_element::type + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_AS_FUSION_ELEMENT + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct make_vector< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_VECTOR_SIZE, TEXT, void_) > + #undef TEXT +#else + struct make_vector +#endif + { + typedef vector type; + }; + } + + template + inline vector + make_vector(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _)) + { + return vector( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/map_tie.hpp b/include/boost/fusion/container/generation/map_tie.hpp new file mode 100644 index 00000000..39d1e945 --- /dev/null +++ b/include/boost/fusion/container/generation/map_tie.hpp @@ -0,0 +1,110 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAP_TIE_20060814_1116) +#define FUSION_MAP_TIE_20060814_1116 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_MAP_SIZE, typename K, void_) + , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_MAP_SIZE, typename D, void_) + , typename Extra = void_ + > + struct map_tie; + + template <> + struct map_tie<> + { + typedef map<> type; + }; + } + + inline map<> + map_tie() + { + return map<>(); + } + +#define BOOST_FUSION_TIED_PAIR(z, n, data) \ + fusion::pair< \ + BOOST_PP_CAT(K, n) \ + , typename add_reference::type> + +#define BOOST_FUSION_PAIR_TIE(z, n, data) \ + fusion::pair_tie(BOOST_PP_CAT(_, n)) \ + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_MAP_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_PAIR +#undef BOOST_FUSION_MAKE_PAIR + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS(N, typename K) + , BOOST_PP_ENUM_PARAMS(N, typename D) + > +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + + struct map_tie + #undef TEXT +#else + struct map_tie +#endif + { + typedef map type; + }; + } + + template < + BOOST_PP_ENUM_PARAMS(N, typename K) + , BOOST_PP_ENUM_PARAMS(N, typename D) + > + inline map + map_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, D, & _)) + { + return map( + BOOST_PP_ENUM(N, BOOST_FUSION_PAIR_TIE, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/generation/pair_tie.hpp b/include/boost/fusion/container/generation/pair_tie.hpp new file mode 100644 index 00000000..09437a26 --- /dev/null +++ b/include/boost/fusion/container/generation/pair_tie.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PAIR_TIE_20060812_2058) +#define BOOST_FUSION_PAIR_TIE_20060812_2058 + +#include +#include + +namespace boost { namespace fusion { + + template + struct pair; + + namespace result_of + { + template + struct pair_tie + { + typedef fusion::pair type; + }; + } + + template + typename disable_if, typename result_of::pair_tie::type>::type + pair_tie(T& t) + { + return typename result_of::pair_tie::type(t); + } + + template + typename result_of::pair_tie::type + pair_tie(T const& t) + { + return typename result_of::pair_tie::type(t); + } +}} + +#endif diff --git a/include/boost/fusion/container/generation/vector_tie.hpp b/include/boost/fusion/container/generation/vector_tie.hpp new file mode 100644 index 00000000..7f7aaba3 --- /dev/null +++ b/include/boost/fusion/container/generation/vector_tie.hpp @@ -0,0 +1,78 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_VECTOR_TIE_07192005_1242) +#define FUSION_VECTOR_TIE_07192005_1242 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace result_of + { + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename T, void_) + , typename Extra = void_ + > + struct vector_tie; + } + +#define BOOST_FUSION_REF(z, n, data) BOOST_PP_CAT(T, n)& + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_REF + +}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + namespace result_of + { + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + #define TEXT(z, n, text) , text + struct vector_tie< BOOST_PP_ENUM_PARAMS(N, T) BOOST_PP_REPEAT_FROM_TO(BOOST_PP_DEC(N), FUSION_MAX_VECTOR_SIZE, TEXT, void_) > + #undef TEXT +#else + struct vector_tie +#endif + { + typedef vector type; + }; + } + + template + inline vector + vector_tie(BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _)) + { + return vector( + BOOST_PP_ENUM_PARAMS(N, _)); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/list.hpp b/include/boost/fusion/container/list.hpp new file mode 100644 index 00000000..8a0d6456 --- /dev/null +++ b/include/boost/fusion/container/list.hpp @@ -0,0 +1,17 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CLASS_LIST_10022005_0605) +#define FUSION_SEQUENCE_CLASS_LIST_10022005_0605 + +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/list/cons.hpp b/include/boost/fusion/container/list/cons.hpp new file mode 100644 index 00000000..8e500f66 --- /dev/null +++ b/include/boost/fusion/container/list/cons.hpp @@ -0,0 +1,143 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_CONS_07172005_0843) +#define FUSION_CONS_07172005_0843 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + struct cons_tag; + struct forward_traversal_tag; + struct fusion_sequence_tag; + + struct nil : sequence_base + { + typedef mpl::int_<0> size; + typedef cons_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + typedef forward_traversal_tag category; + typedef void_ car_type; + typedef void_ cdr_type; + + nil() {} + + template + nil(Iterator const& iter, mpl::true_ /*this_is_an_iterator*/) + {} + + template + void assign_from_iter(Iterator const& iter) + { + } + }; + + template + struct cons : sequence_base > + { + typedef mpl::int_ size; + typedef cons_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + typedef forward_traversal_tag category; + typedef Car car_type; + typedef Cdr cdr_type; + + cons() + : car(), cdr() {} + + explicit cons(typename detail::call_param::type car) + : car(car), cdr() {} + + cons( + typename detail::call_param::type car + , typename detail::call_param::type cdr) + : car(car), cdr(cdr) {} + + template + cons(cons const& rhs) + : car(rhs.car), cdr(rhs.cdr) {} + + cons(cons const& rhs) + : car(rhs.car), cdr(rhs.cdr) {} + + template + cons( + Sequence const& seq + , typename disable_if< + mpl::or_< + is_convertible // use copy ctor instead + , is_convertible // use copy to car instead + > + >::type* dummy = 0 + ) + : car(*fusion::begin(seq)) + , cdr(fusion::next(fusion::begin(seq)), mpl::true_()) {} + + template + cons(Iterator const& iter, mpl::true_ /*this_is_an_iterator*/) + : car(*iter) + , cdr(fusion::next(iter), mpl::true_()) {} + + template + cons& operator=(cons const& rhs) + { + car = rhs.car; + cdr = rhs.cdr; + return *this; + } + + cons& operator=(cons const& rhs) + { + car = rhs.car; + cdr = rhs.cdr; + return *this; + } + + template + typename disable_if, cons&>::type + operator=(Sequence const& seq) + { + typedef typename result_of::begin::type Iterator; + Iterator iter = fusion::begin(seq); + this->assign_from_iter(iter); + return *this; + } + + template + void assign_from_iter(Iterator const& iter) + { + car = *iter; + cdr.assign_from_iter(fusion::next(iter)); + } + + car_type car; + cdr_type cdr; + }; +}} + +#endif + diff --git a/include/boost/fusion/container/list/cons_iterator.hpp b/include/boost/fusion/container/list/cons_iterator.hpp new file mode 100644 index 00000000..7ef034e3 --- /dev/null +++ b/include/boost/fusion/container/list/cons_iterator.hpp @@ -0,0 +1,85 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_CONS_ITERATOR_07172005_0849) +#define FUSION_CONS_ITERATOR_07172005_0849 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct nil; + struct cons_iterator_tag; + struct forward_traversal_tag; + + template + struct cons_iterator_identity; + + template + struct cons_iterator : iterator_base > + { + typedef cons_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + typedef Cons cons_type; + typedef cons_iterator_identity< + typename add_const::type> + identity; + + explicit cons_iterator(cons_type& cons) + : cons(cons) {} + + cons_type& cons; + }; + + struct nil_iterator : iterator_base + { + typedef forward_traversal_tag category; + typedef cons_iterator_tag fusion_tag; + typedef nil cons_type; + typedef cons_iterator_identity< + add_const::type> + identity; + nil_iterator() {} + explicit nil_iterator(nil const&) {} + }; + + template <> + struct cons_iterator : nil_iterator + { + cons_iterator() {} + explicit cons_iterator(nil const&) {} + }; + + template <> + struct cons_iterator : nil_iterator + { + cons_iterator() {} + explicit cons_iterator(nil const&) {} + }; + + template <> + struct cons_iterator > : nil_iterator + { + cons_iterator() {} + explicit cons_iterator(nil const&) {} + }; + + template <> + struct cons_iterator const> : nil_iterator + { + cons_iterator() {} + explicit cons_iterator(nil const&) {} + }; +}} + +#endif diff --git a/include/boost/fusion/container/list/convert.hpp b/include/boost/fusion/container/list/convert.hpp new file mode 100644 index 00000000..418158cf --- /dev/null +++ b/include/boost/fusion/container/list/convert.hpp @@ -0,0 +1,56 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_09232005_1215) +#define FUSION_CONVERT_09232005_1215 + +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace result_of + { + template + struct as_list + { + typedef typename + detail::build_cons< + typename result_of::begin::type + , typename result_of::end::type + > + build_cons; + + typedef typename build_cons::type type; + + static type + call(Sequence& seq) + { + return build_cons::call(fusion::begin(seq), fusion::end(seq)); + } + }; + } + + template + inline typename result_of::as_list::type + as_list(Sequence& seq) + { + return result_of::as_list::call(seq); + } + + template + inline typename result_of::as_list::type + as_list(Sequence const& seq) + { + return result_of::as_list::call(seq); + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/at_impl.hpp b/include/boost/fusion/container/list/detail/at_impl.hpp new file mode 100644 index 00000000..4dee15dc --- /dev/null +++ b/include/boost/fusion/container/list/detail/at_impl.hpp @@ -0,0 +1,132 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_IMPL_07172005_0726) +#define FUSION_AT_IMPL_07172005_0726 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace detail + { + template + struct cons_deref + { + typedef typename Cons::car_type type; + }; + + template + struct cons_advance + { + typedef typename + cons_advance::type::cdr_type + type; + }; + + template + struct cons_advance + { + typedef Cons type; + }; + + template + struct cons_advance + { + typedef typename Cons::cdr_type type; + }; + + template + struct cons_advance + { +#if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above + typedef typename Cons::cdr_type::cdr_type type; +#else + typedef typename Cons::cdr_type _a; + typedef typename _a::cdr_type type; +#endif + }; + + template + struct cons_advance + { +#if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above + typedef typename Cons::cdr_type::cdr_type::cdr_type type; +#else + typedef typename Cons::cdr_type _a; + typedef typename _a::cdr_type _b; + typedef typename _b::cdr_type type; +#endif + }; + + template + struct cons_advance + { +#if BOOST_WORKAROUND(BOOST_MSVC, > 1400) // VC8 and above + typedef typename Cons::cdr_type::cdr_type::cdr_type::cdr_type type; +#else + typedef typename Cons::cdr_type _a; + typedef typename _a::cdr_type _b; + typedef typename _b::cdr_type _c; + typedef typename _c::cdr_type type; +#endif + }; + } + + struct cons_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + typedef detail::cons_deref< + typename detail::cons_advance::type> + element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + template + static type + call(Cons& s, mpl::int_) + { + return call(s.cdr, mpl::int_()); + } + + template + static type + call(Cons& s, mpl::int_<0>) + { + return s.car; + } + + static type + call(Sequence& s) + { + return call(s, mpl::int_()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/begin_impl.hpp b/include/boost/fusion/container/list/detail/begin_impl.hpp new file mode 100644 index 00000000..a22c9a3d --- /dev/null +++ b/include/boost/fusion/container/list/detail/begin_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_BEGIN_IMPL_07172005_0824) +#define FUSION_BEGIN_IMPL_07172005_0824 + +#include +#include + +namespace boost { namespace fusion +{ + struct nil; + + struct cons_tag; + + template + struct cons; + + template + struct cons_iterator; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef cons_iterator type; + + static type + call(Sequence& t) + { + return type(t); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/build_cons.hpp b/include/boost/fusion/container/list/detail/build_cons.hpp new file mode 100644 index 00000000..befbd4e9 --- /dev/null +++ b/include/boost/fusion/container/list/detail/build_cons.hpp @@ -0,0 +1,57 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BUILD_CONS_09232005_1222) +#define FUSION_BUILD_CONS_09232005_1222 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template < + typename First + , typename Last + , bool is_empty = result_of::equal_to::value> + struct build_cons; + + template + struct build_cons + { + typedef nil type; + + static nil + call(First const&, Last const&) + { + return nil(); + } + }; + + template + struct build_cons + { + typedef + build_cons::type, Last> + next_build_cons; + + typedef cons< + typename result_of::value_of::type + , typename next_build_cons::type> + type; + + static type + call(First const& f, Last const& l) + { + return type(*f, next_build_cons::call(fusion::next(f), l)); + } + }; + +}}} + +#endif diff --git a/include/boost/fusion/container/list/detail/convert_impl.hpp b/include/boost/fusion/container/list/detail/convert_impl.hpp new file mode 100644 index 00000000..cfe7a1df --- /dev/null +++ b/include/boost/fusion/container/list/detail/convert_impl.hpp @@ -0,0 +1,51 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_IMPL_09232005_1215) +#define FUSION_CONVERT_IMPL_09232005_1215 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_tag; + + namespace extension + { + template + struct convert_impl; + + template <> + struct convert_impl + { + template + struct apply + { + typedef typename + detail::build_cons< + typename result_of::begin::type + , typename result_of::end::type + > + build_cons; + + typedef typename build_cons::type type; + + static type + call(Sequence& seq) + { + return build_cons::call(fusion::begin(seq), fusion::end(seq)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/deref_impl.hpp b/include/boost/fusion/container/list/detail/deref_impl.hpp new file mode 100644 index 00000000..5292dced --- /dev/null +++ b/include/boost/fusion/container/list/detail/deref_impl.hpp @@ -0,0 +1,52 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_DEREF_IMPL_07172005_0831) +#define FUSION_DEREF_IMPL_07172005_0831 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + { + template + struct apply + { + typedef typename Iterator::cons_type cons_type; + typedef typename cons_type::car_type value_type; + + typedef typename mpl::eval_if< + is_const + , add_reference::type> + , add_reference >::type + type; + + static type + call(Iterator const& i) + { + return i.cons.car; + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/container/list/detail/empty_impl.hpp b/include/boost/fusion/container/list/detail/empty_impl.hpp new file mode 100644 index 00000000..5c92c733 --- /dev/null +++ b/include/boost/fusion/container/list/detail/empty_impl.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_SEQUENCE_EMPTY_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_SEQUENCE_EMPTY_IMPL_HPP_INCLUDED + +#include + +namespace boost { namespace fusion +{ + struct cons_tag; + + struct nil; + + template + struct cons; + + namespace extension + { + template + struct empty_impl; + + template <> + struct empty_impl + { + template + struct apply + : boost::is_convertible + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/end_impl.hpp b/include/boost/fusion/container/list/detail/end_impl.hpp new file mode 100644 index 00000000..03b5e21d --- /dev/null +++ b/include/boost/fusion/container/list/detail/end_impl.hpp @@ -0,0 +1,51 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_END_IMPL_07172005_0828) +#define FUSION_END_IMPL_07172005_0828 + +#include +#include + +namespace boost { namespace fusion +{ + struct nil; + + struct cons_tag; + + template + struct cons; + + template + struct cons_iterator; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef cons_iterator< + typename mpl::if_, nil const, nil>::type> + type; + + static type + call(Sequence&) + { + return type(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/equal_to_impl.hpp b/include/boost/fusion/container/list/detail/equal_to_impl.hpp new file mode 100644 index 00000000..11925880 --- /dev/null +++ b/include/boost/fusion/container/list/detail/equal_to_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_EQUAL_TO_IMPL_09172005_1120) +#define FUSION_EQUAL_TO_IMPL_09172005_1120 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_iterator_tag; + + namespace extension + { + template + struct equal_to_impl; + + template <> + struct equal_to_impl + { + template + struct apply + : is_same< + typename I1::identity + , typename I2::identity + > + { + }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/container/list/detail/list_forward_ctor.hpp b/include/boost/fusion/container/list/detail/list_forward_ctor.hpp new file mode 100644 index 00000000..39471809 --- /dev/null +++ b/include/boost/fusion/container/list/detail/list_forward_ctor.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_LIST_FORWARD_CTOR_07172005_0113) +#define FUSION_LIST_FORWARD_CTOR_07172005_0113 + +#include +#include +#include +#include +#include + +#define FUSION_LIST_CTOR_MAKE_CONS(z, n, type) tie_cons(BOOST_PP_CAT(_, n) +#define FUSION_LIST_CL_PAREN(z, n, type) ) + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_LIST_SIZE) +#include BOOST_PP_ITERATE() + +#undef FUSION_LIST_CTOR_MAKE_CONS +#undef FUSION_LIST_CL_PAREN + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// +#define N BOOST_PP_ITERATION() + +#if N == 1 + explicit +#endif + list(BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : inherited_type(list_to_cons::call(BOOST_PP_ENUM_PARAMS(N, _))) + {} + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/list/detail/list_to_cons.hpp b/include/boost/fusion/container/list/detail/list_to_cons.hpp new file mode 100644 index 00000000..8e6d6912 --- /dev/null +++ b/include/boost/fusion/container/list/detail/list_to_cons.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2005 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_LIST_TO_CONS_07172005_1041) +#define FUSION_LIST_TO_CONS_07172005_1041 + +#include +#include +#include +#include +#include +#include + +#define FUSION_VOID(z, n, _) void_ + +namespace boost { namespace fusion +{ + struct nil; + struct void_; +}} + +namespace boost { namespace fusion { namespace detail +{ + template + struct list_to_cons + { + typedef T0 head_type; + typedef list_to_cons< + BOOST_PP_ENUM_SHIFTED_PARAMS(FUSION_MAX_LIST_SIZE, T), void_> + tail_list_to_cons; + typedef typename tail_list_to_cons::type tail_type; + + typedef cons type; + + #include + }; + + template <> + struct list_to_cons + { + typedef nil type; + }; +}}} + +#undef FUSION_VOID +#endif diff --git a/include/boost/fusion/container/list/detail/list_to_cons_call.hpp b/include/boost/fusion/container/list/detail/list_to_cons_call.hpp new file mode 100644 index 00000000..069f0598 --- /dev/null +++ b/include/boost/fusion/container/list/detail/list_to_cons_call.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_LIST_TO_CONS_CALL_07192005_0138) +#define FUSION_LIST_TO_CONS_CALL_07192005_0138 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_LIST_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// +#define N BOOST_PP_ITERATION() + + static type + call(BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + { + return type(_0 +#if N > 1 + , tail_list_to_cons::call(BOOST_PP_ENUM_SHIFTED_PARAMS(N, _))); +#else + ); +#endif + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/list/detail/next_impl.hpp b/include/boost/fusion/container/list/detail/next_impl.hpp new file mode 100644 index 00000000..dafa83cc --- /dev/null +++ b/include/boost/fusion/container/list/detail/next_impl.hpp @@ -0,0 +1,59 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_NEXT_IMPL_07172005_0836) +#define FUSION_NEXT_IMPL_07172005_0836 + +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_iterator_tag; + + template + struct cons_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::cons_type cons_type; + typedef typename cons_type::cdr_type cdr_type; + + typedef cons_iterator< + typename mpl::eval_if< + is_const + , add_const + , mpl::identity + >::type> + type; + + static type + call(Iterator const& i) + { + return type(i.cons.cdr); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/container/list/detail/value_at_impl.hpp b/include/boost/fusion/container/list/detail/value_at_impl.hpp new file mode 100644 index 00000000..5f0ff166 --- /dev/null +++ b/include/boost/fusion/container/list/detail/value_at_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_AT_IMPL_07172005_0952) +#define FUSION_VALUE_AT_IMPL_07172005_0952 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply + { + typedef typename + mpl::eval_if< + mpl::bool_ + , mpl::identity + , apply > + >::type + type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/list/detail/value_of_impl.hpp b/include/boost/fusion/container/list/detail/value_of_impl.hpp new file mode 100644 index 00000000..f8175c6d --- /dev/null +++ b/include/boost/fusion/container/list/detail/value_of_impl.hpp @@ -0,0 +1,36 @@ +/*============================================================================= + Copyright (c) 2005 Joel de Guzman + Copyright (c) 2005 Eric Niebler + + 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_VALUE_OF_IMPL_07172005_0838) +#define FUSION_VALUE_OF_IMPL_07172005_0838 + +namespace boost { namespace fusion +{ + struct cons_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename Iterator::cons_type cons_type; + typedef typename cons_type::car_type type; + }; + }; + } + +}} + +#endif + + diff --git a/include/boost/fusion/container/list/limits.hpp b/include/boost/fusion/container/list/limits.hpp new file mode 100644 index 00000000..20ff6dd2 --- /dev/null +++ b/include/boost/fusion/container/list/limits.hpp @@ -0,0 +1,19 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_LIST_LIMITS_07172005_0112) +#define FUSION_LIST_LIMITS_07172005_0112 + +#if !defined(FUSION_MAX_LIST_SIZE) +# define FUSION_MAX_LIST_SIZE 10 +#else +# if FUSION_MAX_LIST_SIZE < 3 +# undef FUSION_MAX_LIST_SIZE +# define FUSION_MAX_LIST_SIZE 10 +# endif +#endif + +#endif diff --git a/include/boost/fusion/container/list/list.hpp b/include/boost/fusion/container/list/list.hpp new file mode 100644 index 00000000..7516df48 --- /dev/null +++ b/include/boost/fusion/container/list/list.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2005 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_LIST_07172005_1153) +#define FUSION_LIST_07172005_1153 + +#include +#include + +namespace boost { namespace fusion +{ + struct nil; + struct void_; + + template + struct list + : detail::list_to_cons::type + { + private: + typedef + detail::list_to_cons + list_to_cons; + + public: + typedef typename list_to_cons::type inherited_type; + + list() + : inherited_type() {} + + template + list(list const& rhs) + : inherited_type(rhs) {} + + template + list(Sequence const& rhs) + : inherited_type(rhs) {} + + // Expand a couple of forwarding constructors for arguments + // of type (T0), (T0, T1), (T0, T1, T2) etc. Exanple: + // + // list( + // typename detail::call_param::type _0 + // , typename detail::call_param::type _1) + // : inherited_type(list_to_cons::call(_0, _1)) {} + #include + + template + list& + operator=(list const& rhs) + { + inherited_type::operator=(rhs); + return *this; + } + + template + list& + operator=(T const& rhs) + { + inherited_type::operator=(rhs); + return *this; + } + }; +}} + +#endif diff --git a/include/boost/fusion/container/list/list_fwd.hpp b/include/boost/fusion/container/list/list_fwd.hpp new file mode 100644 index 00000000..90c088b4 --- /dev/null +++ b/include/boost/fusion/container/list/list_fwd.hpp @@ -0,0 +1,24 @@ +/*============================================================================= + Copyright (c) 2005 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_LIST_FORWARD_07172005_0224) +#define FUSION_LIST_FORWARD_07172005_0224 + +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_LIST_SIZE, typename T, void_) + > + struct list; +}} + +#endif diff --git a/include/boost/fusion/container/map.hpp b/include/boost/fusion/container/map.hpp new file mode 100644 index 00000000..69518311 --- /dev/null +++ b/include/boost/fusion/container/map.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CLASS_MAP_10022005_0606) +#define FUSION_SEQUENCE_CLASS_MAP_10022005_0606 + +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/map/convert.hpp b/include/boost/fusion/container/map/convert.hpp new file mode 100644 index 00000000..f174da58 --- /dev/null +++ b/include/boost/fusion/container/map/convert.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_09232005_1340) +#define FUSION_CONVERT_09232005_1340 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace result_of + { + template + struct as_map + { + typedef typename detail::as_map::value> gen; + typedef typename gen:: + template apply::type>::type + type; + }; + } + + template + inline typename result_of::as_map::type + as_map(Sequence& seq) + { + typedef typename result_of::as_map::gen gen; + return gen::call(fusion::begin(seq)); + } + + template + inline typename result_of::as_map::type + as_map(Sequence const& seq) + { + typedef typename result_of::as_map::gen gen; + return gen::call(fusion::begin(seq)); + } +}} + +#endif diff --git a/include/boost/fusion/container/map/detail/as_map.hpp b/include/boost/fusion/container/map/detail/as_map.hpp new file mode 100644 index 00000000..326877f9 --- /dev/null +++ b/include/boost/fusion/container/map/detail/as_map.hpp @@ -0,0 +1,101 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_AS_MAP_0932005_1339) +#define FUSION_AS_MAP_0932005_1339 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template + struct as_map; + + template <> + struct as_map<0> + { + template + struct apply + { + typedef map<> type; + }; + + template + static typename apply::type + call(Iterator) + { + return map<>(); + } + }; + +#define BOOST_FUSION_NEXT_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::next::type \ + BOOST_PP_CAT(I, BOOST_PP_INC(n)); + +#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data) \ + typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n)) \ + BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n)); + +#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::value_of::type \ + BOOST_PP_CAT(T, n); + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_MAP_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_NEXT_ITERATOR +#undef BOOST_FUSION_NEXT_CALL_ITERATOR +#undef BOOST_FUSION_VALUE_OF_ITERATOR + +}}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template <> + struct as_map + { + template + struct apply + { + BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _) + BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _) + typedef map type; + }; + + template + static typename apply::type + call(Iterator const& i0) + { + typedef apply gen; + typedef typename gen::type result; + BOOST_PP_REPEAT(BOOST_PP_DEC(N), BOOST_FUSION_NEXT_CALL_ITERATOR, _) + return result(BOOST_PP_ENUM_PARAMS(N, *i)); + } + }; + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/map/detail/at_key_impl.hpp b/include/boost/fusion/container/map/detail/at_key_impl.hpp new file mode 100644 index 00000000..8b0d70aa --- /dev/null +++ b/include/boost/fusion/container/map/detail/at_key_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_KEY_IMPL_05222005_0254) +#define FUSION_AT_KEY_IMPL_05222005_0254 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct map_tag; + + namespace extension + { + template + struct at_key_impl; + + template <> + struct at_key_impl + { + template + struct apply + { + typedef typename Sequence::template meta_at_impl element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + static type + call(Sequence& m) + { + return m.at_impl(mpl::identity()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/map/detail/begin_impl.hpp b/include/boost/fusion/container/map/detail/begin_impl.hpp new file mode 100644 index 00000000..5fe25caf --- /dev/null +++ b/include/boost/fusion/container/map/detail/begin_impl.hpp @@ -0,0 +1,56 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_05222005_1108) +#define FUSION_BEGIN_IMPL_05222005_1108 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct map_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename + result_of::begin::type + iterator_type; + + typedef typename + result_of::begin::type + const_iterator_type; + + typedef typename + mpl::eval_if< + is_const + , mpl::identity + , mpl::identity + >::type + type; + + static type + call(Sequence& m) + { + return fusion::begin(m.get_data()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/map/detail/convert_impl.hpp b/include/boost/fusion/container/map/detail/convert_impl.hpp new file mode 100644 index 00000000..aedd3e3d --- /dev/null +++ b/include/boost/fusion/container/map/detail/convert_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_IMPL_09232005_1340) +#define FUSION_CONVERT_IMPL_09232005_1340 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct map_tag; + + namespace extension + { + template + struct convert_impl; + + template <> + struct convert_impl + { + template + struct apply + { + typedef typename detail::as_map::value> gen; + typedef typename gen:: + template apply::type>::type + type; + + static type call(Sequence& seq) + { + return gen::call(fusion::begin(seq)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/map/detail/end_impl.hpp b/include/boost/fusion/container/map/detail/end_impl.hpp new file mode 100644 index 00000000..0cafc92c --- /dev/null +++ b/include/boost/fusion/container/map/detail/end_impl.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_05222005_1108) +#define FUSION_END_IMPL_05222005_1108 + +#include + +namespace boost { namespace fusion +{ + struct map_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename + result_of::end::type + iterator_type; + + typedef typename + result_of::end::type + const_iterator_type; + + typedef typename + mpl::eval_if< + is_const + , mpl::identity + , mpl::identity + >::type + type; + + static type + call(Sequence& m) + { + return fusion::end(m.get_data()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/map/detail/lookup_key.hpp b/include/boost/fusion/container/map/detail/lookup_key.hpp new file mode 100644 index 00000000..17774362 --- /dev/null +++ b/include/boost/fusion/container/map/detail/lookup_key.hpp @@ -0,0 +1,99 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_LOOKUP_KEY_07222005_1248) +#define FUSION_LOOKUP_KEY_07222005_1248 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; +}} + +namespace boost { namespace fusion { namespace detail +{ + template + struct map_data_type + { + typedef typename + add_reference< + typename T::second_type + >::type + type; + }; + + template <> + struct map_data_type + { + typedef void_& type; + }; + + template + struct map_const_data_type + { + typedef typename + add_reference< + typename add_const< + typename T::second_type + >::type + >::type + type; + }; + + template <> + struct map_const_data_type + { + typedef void_ const& type; + }; + + template + struct map_value_type + { + typedef typename T::second_type type; + }; + + template <> + struct map_value_type + { + typedef void_ type; + }; + + template + struct map_key_type + { + typedef typename T::first_type type; + }; + + template + struct map_key_type + { + typedef unknown_key type; + }; + + template + struct map_lookup_key + { + static RT + call(Vector& vec) + { + return vec.at_impl(mpl::int_()).second; + } + }; + + template + struct map_lookup_key, Vector> + { + static void_& + call(Vector& vec); // intentionally undefined + }; +}}} + +#endif + diff --git a/include/boost/fusion/container/map/detail/map_forward_ctor.hpp b/include/boost/fusion/container/map/detail/map_forward_ctor.hpp new file mode 100644 index 00000000..c35168ba --- /dev/null +++ b/include/boost/fusion/container/map/detail/map_forward_ctor.hpp @@ -0,0 +1,38 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAP_FORWARD_CTOR_07222005_0106) +#define FUSION_MAP_FORWARD_CTOR_07222005_0106 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_MAP_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + +#if N == 1 + explicit +#endif + map(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _)) + : data(BOOST_PP_ENUM_PARAMS(N, _)) {} + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/map/detail/map_lookup.hpp b/include/boost/fusion/container/map/detail/map_lookup.hpp new file mode 100644 index 00000000..2f792cbd --- /dev/null +++ b/include/boost/fusion/container/map/detail/map_lookup.hpp @@ -0,0 +1,128 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_MAP_LOOKUP_07212005_1118) +#define FUSION_MAP_LOOKUP_07212005_1118 + +#include +#include +#include +#include +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310) +#pragma warning (push) +#pragma warning(disable: 4348) // redefinition of default parameter +#endif + + template + struct meta_at_impl + { + typedef void_ type; + }; + + template + struct meta_find_impl + { + typedef vector_iterator type; + }; + + template + struct meta_find_impl_const + { + typedef vector_iterator type; + }; + + template + vector_iterator + find_impl(mpl::identity) const + { + return vector_iterator(data); + } + + template + vector_iterator + find_impl(mpl::identity) + { + return vector_iterator(data); + } + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (0, BOOST_PP_DEC(FUSION_MAX_MAP_SIZE)) +#include BOOST_PP_ITERATE() + +#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310) +#pragma warning (pop) +#endif + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template + struct meta_at_impl< + typename detail::map_key_type::type, dummy> + { + typedef typename detail::map_value_type::type type; + }; + + typename detail::map_data_type::type + at_impl(mpl::identity::type>) + { + return detail::map_lookup_key< + N + , typename detail::map_data_type::type + , typename detail::map_key_type::type + , storage_type>::call(data); + } + + typename detail::map_const_data_type::type + at_impl(mpl::identity::type>) const + { + return detail::map_lookup_key< + N + , typename detail::map_const_data_type::type + , typename detail::map_key_type::type + , storage_type const>::call(data); + } + + template + struct meta_find_impl< + typename detail::map_key_type::type, dummy> + { + typedef vector_iterator type; + }; + + template + struct meta_find_impl_const< + typename detail::map_key_type::type, dummy> + { + typedef vector_iterator type; + }; + + vector_iterator + find_impl(mpl::identity::type>) + { + return vector_iterator(data); + } + + vector_iterator + find_impl(mpl::identity::type>) const + { + return vector_iterator(data); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/map/detail/value_at_key_impl.hpp b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp new file mode 100644 index 00000000..6c516462 --- /dev/null +++ b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp @@ -0,0 +1,33 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_VALUE_AT_KEY_IMPL_05222005_0325) +#define FUSION_VALUE_AT_KEY_IMPL_05222005_0325 + +namespace boost { namespace fusion +{ + struct map_tag; + + namespace extension + { + template + struct value_at_key_impl; + + template <> + struct value_at_key_impl + { + template + struct apply + { + typedef typename Sequence:: + template meta_at_impl::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/map/limits.hpp b/include/boost/fusion/container/map/limits.hpp new file mode 100644 index 00000000..738abff4 --- /dev/null +++ b/include/boost/fusion/container/map/limits.hpp @@ -0,0 +1,25 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_MAP_LIMITS_07212005_1104) +#define FUSION_MAP_LIMITS_07212005_1104 + +#include + +#if !defined(FUSION_MAX_MAP_SIZE) +# define FUSION_MAX_MAP_SIZE FUSION_MAX_VECTOR_SIZE +#else +# if FUSION_MAX_MAP_SIZE < 3 +# undef FUSION_MAX_MAP_SIZE +# if (FUSION_MAX_VECTOR_SIZE > 10) +# define FUSION_MAX_MAP_SIZE 10 +# else +# define FUSION_MAX_MAP_SIZE FUSION_MAX_VECTOR_SIZE +# endif +# endif +#endif + +#endif diff --git a/include/boost/fusion/container/map/map.hpp b/include/boost/fusion/container/map/map.hpp new file mode 100644 index 00000000..5f5fb1cc --- /dev/null +++ b/include/boost/fusion/container/map/map.hpp @@ -0,0 +1,71 @@ +/*============================================================================= + Copyright (c) 2005 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_MAP_07212005_1106) +#define FUSION_MAP_07212005_1106 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + struct map_tag; + struct fusion_sequence_tag; + + template + struct map : sequence_base > + { + struct category : forward_traversal_tag, associative_sequence_tag {}; + + typedef map_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + + typedef vector< + BOOST_PP_ENUM_PARAMS(FUSION_MAX_MAP_SIZE, T)> + storage_type; + + typedef typename storage_type::size size; + + map() + : data() {} + + template + map(Sequence const& rhs) + : data(rhs) {} + + #include + #include + + template + map& + operator=(T const& rhs) + { + data = rhs; + return *this; + } + + storage_type& get_data() { return data; } + storage_type const& get_data() const { return data; } + + private: + + storage_type data; + }; +}} + +#endif diff --git a/include/boost/fusion/container/map/map_fwd.hpp b/include/boost/fusion/container/map/map_fwd.hpp new file mode 100644 index 00000000..660466bd --- /dev/null +++ b/include/boost/fusion/container/map/map_fwd.hpp @@ -0,0 +1,24 @@ +/*============================================================================= + Copyright (c) 2005 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_MAP_FORWARD_07212005_1105) +#define FUSION_MAP_FORWARD_07212005_1105 + +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_MAP_SIZE, typename T, void_) + > + struct map; +}} + +#endif diff --git a/include/boost/fusion/container/set.hpp b/include/boost/fusion/container/set.hpp new file mode 100644 index 00000000..6b7674d6 --- /dev/null +++ b/include/boost/fusion/container/set.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CLASS_SET_10022005_0607) +#define FUSION_SEQUENCE_CLASS_SET_10022005_0607 + +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/set/convert.hpp b/include/boost/fusion/container/set/convert.hpp new file mode 100644 index 00000000..1aaddf0c --- /dev/null +++ b/include/boost/fusion/container/set/convert.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_09232005_1341) +#define FUSION_CONVERT_09232005_1341 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace result_of + { + template + struct as_set + { + typedef typename detail::as_set::value> gen; + typedef typename gen:: + template apply::type>::type + type; + }; + } + + template + inline typename result_of::as_set::type + as_set(Sequence& seq) + { + typedef typename result_of::as_set::gen gen; + return gen::call(fusion::begin(seq)); + } + + template + inline typename result_of::as_set::type + as_set(Sequence const& seq) + { + typedef typename result_of::as_set::gen gen; + return gen::call(fusion::begin(seq)); + } +}} + +#endif diff --git a/include/boost/fusion/container/set/detail/as_set.hpp b/include/boost/fusion/container/set/detail/as_set.hpp new file mode 100644 index 00000000..33786338 --- /dev/null +++ b/include/boost/fusion/container/set/detail/as_set.hpp @@ -0,0 +1,101 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_AS_SET_0932005_1341) +#define FUSION_AS_SET_0932005_1341 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template + struct as_set; + + template <> + struct as_set<0> + { + template + struct apply + { + typedef set<> type; + }; + + template + static typename apply::type + call(Iterator) + { + return set<>(); + } + }; + +#define BOOST_FUSION_NEXT_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::next::type \ + BOOST_PP_CAT(I, BOOST_PP_INC(n)); + +#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data) \ + typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n)) \ + BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n)); + +#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::value_of::type \ + BOOST_PP_CAT(T, n); + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_SET_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_NEXT_ITERATOR +#undef BOOST_FUSION_NEXT_CALL_ITERATOR +#undef BOOST_FUSION_VALUE_OF_ITERATOR + +}}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template <> + struct as_set + { + template + struct apply + { + BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _) + BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _) + typedef set type; + }; + + template + static typename apply::type + call(Iterator const& i0) + { + typedef apply gen; + typedef typename gen::type result; + BOOST_PP_REPEAT(BOOST_PP_DEC(N), BOOST_FUSION_NEXT_CALL_ITERATOR, _) + return result(BOOST_PP_ENUM_PARAMS(N, *i)); + } + }; + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/set/detail/at_key_impl.hpp b/include/boost/fusion/container/set/detail/at_key_impl.hpp new file mode 100644 index 00000000..d0c1de00 --- /dev/null +++ b/include/boost/fusion/container/set/detail/at_key_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_KEY_IMPL_09162005_1118) +#define FUSION_AT_KEY_IMPL_09162005_1118 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct set_tag; + + namespace extension + { + template + struct at_key_impl; + + template <> + struct at_key_impl + { + template + struct apply + { + typedef typename Sequence::template meta_at_impl element; + + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + static type + call(Sequence& s) + { + return s.at_impl(mpl::identity()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/set/detail/begin_impl.hpp b/include/boost/fusion/container/set/detail/begin_impl.hpp new file mode 100644 index 00000000..9b42df72 --- /dev/null +++ b/include/boost/fusion/container/set/detail/begin_impl.hpp @@ -0,0 +1,56 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_09162005_1120) +#define FUSION_BEGIN_IMPL_09162005_1120 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct set_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename + result_of::begin::type + iterator_type; + + typedef typename + result_of::begin::type + const_iterator_type; + + typedef typename + mpl::eval_if< + is_const + , mpl::identity + , mpl::identity + >::type + type; + + static type + call(Sequence& s) + { + return fusion::begin(s.get_data()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/set/detail/convert_impl.hpp b/include/boost/fusion/container/set/detail/convert_impl.hpp new file mode 100644 index 00000000..1aa79fb1 --- /dev/null +++ b/include/boost/fusion/container/set/detail/convert_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_IMPL_09232005_1341) +#define FUSION_CONVERT_IMPL_09232005_1341 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct set_tag; + + namespace extension + { + template + struct convert_impl; + + template <> + struct convert_impl + { + template + struct apply + { + typedef typename detail::as_set::value> gen; + typedef typename gen:: + template apply::type>::type + type; + + static type call(Sequence& seq) + { + return gen::call(fusion::begin(seq)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/set/detail/end_impl.hpp b/include/boost/fusion/container/set/detail/end_impl.hpp new file mode 100644 index 00000000..4df78a3f --- /dev/null +++ b/include/boost/fusion/container/set/detail/end_impl.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_09162005_1121) +#define FUSION_END_IMPL_09162005_1121 + +#include + +namespace boost { namespace fusion +{ + struct set_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename + result_of::end::type + iterator_type; + + typedef typename + result_of::end::type + const_iterator_type; + + typedef typename + mpl::eval_if< + is_const + , mpl::identity + , mpl::identity + >::type + type; + + static type + call(Sequence& s) + { + return fusion::end(s.get_data()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/set/detail/lookup_key.hpp b/include/boost/fusion/container/set/detail/lookup_key.hpp new file mode 100644 index 00000000..a1b9e8b9 --- /dev/null +++ b/include/boost/fusion/container/set/detail/lookup_key.hpp @@ -0,0 +1,93 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_LOOKUP_KEY_09162005_1111) +#define FUSION_LOOKUP_KEY_09162005_1111 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; +}} + +namespace boost { namespace fusion { namespace detail +{ + template + struct set_data_type + { + typedef typename add_reference::type type; + }; + + template <> + struct set_data_type + { + typedef void_& type; + }; + + template + struct set_const_data_type + { + typedef typename + add_reference< + typename add_const::type + >::type + type; + }; + + template <> + struct set_const_data_type + { + typedef void_ const& type; + }; + + template + struct set_value_type + { + typedef T type; + }; + + template <> + struct set_value_type + { + typedef void_ type; + }; + + template + struct set_key_type + { + typedef T type; + }; + + template + struct set_key_type + { + typedef unknown_key type; + }; + + template + struct set_lookup_key + { + static RT + call(Vector& vec) + { + return vec.at_impl(mpl::int_()); + } + }; + + template + struct set_lookup_key, Vector> + { + static void_& + call(Vector& vec); // intentionally undefined + }; +}}} + +#endif + diff --git a/include/boost/fusion/container/set/detail/set_forward_ctor.hpp b/include/boost/fusion/container/set/detail/set_forward_ctor.hpp new file mode 100644 index 00000000..d105b150 --- /dev/null +++ b/include/boost/fusion/container/set/detail/set_forward_ctor.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_SET_FORWARD_CTOR_09162005_1115) +#define FUSION_SET_FORWARD_CTOR_09162005_1115 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_SET_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + +#if N == 1 + explicit +#endif + set(BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : data(BOOST_PP_ENUM_PARAMS(N, _)) {} + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/set/detail/set_lookup.hpp b/include/boost/fusion/container/set/detail/set_lookup.hpp new file mode 100644 index 00000000..6df4b401 --- /dev/null +++ b/include/boost/fusion/container/set/detail/set_lookup.hpp @@ -0,0 +1,128 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_SET_LOOKUP_09162005_1116) +#define FUSION_SET_LOOKUP_09162005_1116 + +#include +#include +#include +#include +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310) +#pragma warning (push) +#pragma warning(disable: 4348) // redefinition of default parameter +#endif + + template + struct meta_at_impl + { + typedef void_ type; + }; + + template + struct meta_find_impl + { + typedef vector_iterator type; + }; + + template + struct meta_find_impl_const + { + typedef vector_iterator type; + }; + + template + vector_iterator + find_impl(mpl::identity) const + { + return vector_iterator(data); + } + + template + vector_iterator + find_impl(mpl::identity) + { + return vector_iterator(data); + } + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (0, BOOST_PP_DEC(FUSION_MAX_SET_SIZE)) +#include BOOST_PP_ITERATE() + +#if defined(BOOST_MSVC) && (BOOST_MSVC == 1310) +#pragma warning (pop) +#endif + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template + struct meta_at_impl< + typename detail::set_key_type::type, dummy> + { + typedef typename detail::set_value_type::type type; + }; + + typename detail::set_data_type::type + at_impl(mpl::identity::type>) + { + return detail::set_lookup_key< + N + , typename detail::set_data_type::type + , typename detail::set_key_type::type + , storage_type>::call(data); + } + + typename detail::set_const_data_type::type + at_impl(mpl::identity::type>) const + { + return detail::set_lookup_key< + N + , typename detail::set_const_data_type::type + , typename detail::set_key_type::type + , storage_type const>::call(data); + } + + template + struct meta_find_impl< + typename detail::set_key_type::type, dummy> + { + typedef vector_iterator type; + }; + + template + struct meta_find_impl_const< + typename detail::set_key_type::type, dummy> + { + typedef vector_iterator type; + }; + + vector_iterator + find_impl(mpl::identity::type>) + { + return vector_iterator(data); + } + + vector_iterator + find_impl(mpl::identity::type>) const + { + return vector_iterator(data); + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/set/detail/value_at_key_impl.hpp b/include/boost/fusion/container/set/detail/value_at_key_impl.hpp new file mode 100644 index 00000000..40f68ba0 --- /dev/null +++ b/include/boost/fusion/container/set/detail/value_at_key_impl.hpp @@ -0,0 +1,35 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_VALUE_AT_KEY_IMPL_09162005_1123) +#define FUSION_VALUE_AT_KEY_IMPL_09162005_1123 + +#include + +namespace boost { namespace fusion +{ + struct set_tag; + + namespace extension + { + template + struct value_at_key_impl; + + template <> + struct value_at_key_impl + { + template + struct apply + { + typedef typename Sequence:: + template meta_at_impl::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/set/limits.hpp b/include/boost/fusion/container/set/limits.hpp new file mode 100644 index 00000000..35eb0803 --- /dev/null +++ b/include/boost/fusion/container/set/limits.hpp @@ -0,0 +1,25 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SET_LIMITS_09162005_1103) +#define FUSION_SET_LIMITS_09162005_1103 + +#include + +#if !defined(FUSION_MAX_SET_SIZE) +# define FUSION_MAX_SET_SIZE FUSION_MAX_VECTOR_SIZE +#else +# if FUSION_MAX_SET_SIZE < 3 +# undef FUSION_MAX_SET_SIZE +# if (FUSION_MAX_VECTOR_SIZE > 10) +# define FUSION_MAX_SET_SIZE 10 +# else +# define FUSION_MAX_SET_SIZE FUSION_MAX_VECTOR_SIZE +# endif +# endif +#endif + +#endif diff --git a/include/boost/fusion/container/set/set.hpp b/include/boost/fusion/container/set/set.hpp new file mode 100644 index 00000000..07580bb6 --- /dev/null +++ b/include/boost/fusion/container/set/set.hpp @@ -0,0 +1,71 @@ +/*============================================================================= + Copyright (c) 2005 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_SET_09162005_1104) +#define FUSION_SET_09162005_1104 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + struct set_tag; + struct fusion_sequence_tag; + + template + struct set : sequence_base > + { + struct category : forward_traversal_tag, associative_sequence_tag {}; + + typedef set_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + + typedef vector< + BOOST_PP_ENUM_PARAMS(FUSION_MAX_SET_SIZE, T)> + storage_type; + + typedef typename storage_type::size size; + + set() + : data() {} + + template + set(Sequence const& rhs) + : data(rhs) {} + + #include + #include + + template + set& + operator=(T const& rhs) + { + data = rhs; + return *this; + } + + storage_type& get_data() { return data; } + storage_type const& get_data() const { return data; } + + private: + + storage_type data; + }; +}} + +#endif diff --git a/include/boost/fusion/container/set/set_fwd.hpp b/include/boost/fusion/container/set/set_fwd.hpp new file mode 100644 index 00000000..7facb513 --- /dev/null +++ b/include/boost/fusion/container/set/set_fwd.hpp @@ -0,0 +1,24 @@ +/*============================================================================= + Copyright (c) 2005 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_SET_FORWARD_09162005_1102) +#define FUSION_SET_FORWARD_09162005_1102 + +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_SET_SIZE, typename T, void_) + > + struct set; +}} + +#endif diff --git a/include/boost/fusion/container/vector.hpp b/include/boost/fusion/container/vector.hpp new file mode 100644 index 00000000..389a102e --- /dev/null +++ b/include/boost/fusion/container/vector.hpp @@ -0,0 +1,21 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_CLASS_VECTOR_10022005_0602) +#define FUSION_SEQUENCE_CLASS_VECTOR_10022005_0602 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/container/vector/convert.hpp b/include/boost/fusion/container/vector/convert.hpp new file mode 100644 index 00000000..a31578a2 --- /dev/null +++ b/include/boost/fusion/container/vector/convert.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_09222005_1104) +#define FUSION_CONVERT_09222005_1104 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace result_of + { + template + struct as_vector + { + typedef typename detail::as_vector::value> gen; + typedef typename gen:: + template apply::type>::type + type; + }; + } + + template + inline typename result_of::as_vector::type + as_vector(Sequence& seq) + { + typedef typename result_of::as_vector::gen gen; + return gen::call(fusion::begin(seq)); + } + + template + inline typename result_of::as_vector::type + as_vector(Sequence const& seq) + { + typedef typename result_of::as_vector::gen gen; + return gen::call(fusion::begin(seq)); + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/advance_impl.hpp b/include/boost/fusion/container/vector/detail/advance_impl.hpp new file mode 100644 index 00000000..c2c97b18 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/advance_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ADVANCE_IMPL_09172005_1156) +#define FUSION_ADVANCE_IMPL_09172005_1156 + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + + template + struct vector_iterator; + + namespace extension + { + template + struct advance_impl; + + template <> + struct advance_impl + { + template + struct apply + { + typedef typename Iterator::index index; + typedef typename Iterator::vector vector; + typedef vector_iterator type; + + static type + call(Iterator const& i) + { + return type(i.vec); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/as_vector.hpp b/include/boost/fusion/container/vector/detail/as_vector.hpp new file mode 100644 index 00000000..fa8dadcf --- /dev/null +++ b/include/boost/fusion/container/vector/detail/as_vector.hpp @@ -0,0 +1,101 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_AS_VECTOR_09222005_0950) +#define FUSION_AS_VECTOR_09222005_0950 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template + struct as_vector; + + template <> + struct as_vector<0> + { + template + struct apply + { + typedef vector<> type; + }; + + template + static typename apply::type + call(Iterator) + { + return vector<>(); + } + }; + +#define BOOST_FUSION_NEXT_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::next::type \ + BOOST_PP_CAT(I, BOOST_PP_INC(n)); + +#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data) \ + typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n)) \ + BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n)); + +#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data) \ + typedef typename fusion::result_of::value_of::type \ + BOOST_PP_CAT(T, n); + +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#undef BOOST_FUSION_NEXT_ITERATOR +#undef BOOST_FUSION_NEXT_CALL_ITERATOR +#undef BOOST_FUSION_VALUE_OF_ITERATOR + +}}} + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + + template <> + struct as_vector + { + template + struct apply + { + BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _) + BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _) + typedef vector type; + }; + + template + static typename apply::type + call(Iterator const& i0) + { + typedef apply gen; + typedef typename gen::type result; + BOOST_PP_REPEAT(BOOST_PP_DEC(N), BOOST_FUSION_NEXT_CALL_ITERATOR, _) + return result(BOOST_PP_ENUM_PARAMS(N, *i)); + } + }; + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/vector/detail/at_impl.hpp b/include/boost/fusion/container/vector/detail/at_impl.hpp new file mode 100644 index 00000000..1a00f428 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/at_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_IMPL_05042005_0741) +#define FUSION_AT_IMPL_05042005_0741 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + typedef mpl::at element; + typedef typename + mpl::eval_if< + is_const + , detail::cref_result + , detail::ref_result + >::type + type; + + static type + call(Sequence& v) + { + return v.at_impl(N()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/begin_impl.hpp b/include/boost/fusion/container/vector/detail/begin_impl.hpp new file mode 100644 index 00000000..d2d687be --- /dev/null +++ b/include/boost/fusion/container/vector/detail/begin_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_05042005_1136) +#define FUSION_BEGIN_IMPL_05042005_1136 + +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef vector_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/convert_impl.hpp b/include/boost/fusion/container/vector/detail/convert_impl.hpp new file mode 100644 index 00000000..5e1d080f --- /dev/null +++ b/include/boost/fusion/container/vector/detail/convert_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_IMPL_09222005_1104) +#define FUSION_CONVERT_IMPL_09222005_1104 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + + namespace extension + { + template + struct convert_impl; + + template <> + struct convert_impl + { + template + struct apply + { + typedef typename detail::as_vector::value> gen; + typedef typename gen:: + template apply::type>::type + type; + + static type call(Sequence& seq) + { + return gen::call(fusion::begin(seq)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/deref_impl.hpp b/include/boost/fusion/container/vector/detail/deref_impl.hpp new file mode 100644 index 00000000..bd9f3d06 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/deref_impl.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_05042005_1037) +#define FUSION_DEREF_IMPL_05042005_1037 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + { + template + struct apply + { + typedef typename Iterator::vector vector; + typedef typename Iterator::index index; + typedef typename mpl::at< + typename vector::types, index> + element; + + typedef typename + mpl::eval_if< + is_const + , fusion::detail::cref_result + , fusion::detail::ref_result + >::type + type; + + static type + call(Iterator const& i) + { + return i.vec.at_impl(index()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/distance_impl.hpp b/include/boost/fusion/container/vector/detail/distance_impl.hpp new file mode 100644 index 00000000..9664d5c2 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/distance_impl.hpp @@ -0,0 +1,41 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DISTANCE_IMPL_09172005_0751) +#define FUSION_DISTANCE_IMPL_09172005_0751 + +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + + namespace extension + { + template + struct distance_impl; + + template <> + struct distance_impl + { + template + struct apply : mpl::minus + { + static typename mpl::minus< + typename Last::index, typename First::index>::type + call(First const&, Last const&) + { + typedef typename mpl::minus< + typename Last::index, typename First::index>::type + result; + return result(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/end_impl.hpp b/include/boost/fusion/container/vector/detail/end_impl.hpp new file mode 100644 index 00000000..f33282dc --- /dev/null +++ b/include/boost/fusion/container/vector/detail/end_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_05042005_1142) +#define FUSION_END_IMPL_05042005_1142 + +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::size size; + typedef vector_iterator type; + + static type + call(Sequence& v) + { + return type(v); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/equal_to_impl.hpp b/include/boost/fusion/container/vector/detail/equal_to_impl.hpp new file mode 100644 index 00000000..5ff81c61 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/equal_to_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_EQUAL_TO_IMPL_05052005_1215) +#define FUSION_EQUAL_TO_IMPL_05052005_1215 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + + namespace extension + { + template + struct equal_to_impl; + + template <> + struct equal_to_impl + { + template + struct apply + : is_same< + typename I1::identity + , typename I2::identity + > + { + }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/container/vector/detail/next_impl.hpp b/include/boost/fusion/container/vector/detail/next_impl.hpp new file mode 100644 index 00000000..b11cfdb2 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/next_impl.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_05042005_1058) +#define FUSION_NEXT_IMPL_05042005_1058 + +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + template + struct vector_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::vector vector; + typedef typename Iterator::index index; + typedef vector_iterator type; + + static type + call(Iterator const& i) + { + return type(i.vec); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/prior_impl.hpp b/include/boost/fusion/container/vector/detail/prior_impl.hpp new file mode 100644 index 00000000..610591b6 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/prior_impl.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PRIOR_IMPL_05042005_1145) +#define FUSION_PRIOR_IMPL_05042005_1145 + +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + template + struct vector_iterator; + + namespace extension + { + template + struct prior_impl; + + template <> + struct prior_impl + { + template + struct apply + { + typedef typename Iterator::vector vector; + typedef typename Iterator::index index; + typedef vector_iterator type; + + static type + call(Iterator const& i) + { + return type(i.vec); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/value_at_impl.hpp b/include/boost/fusion/container/vector/detail/value_at_impl.hpp new file mode 100644 index 00000000..0178054b --- /dev/null +++ b/include/boost/fusion/container/vector/detail/value_at_impl.hpp @@ -0,0 +1,33 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_AT_IMPL_05052005_0232) +#define FUSION_VALUE_AT_IMPL_05052005_0232 + +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply + { + typedef typename mpl::at::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/value_of_impl.hpp b/include/boost/fusion/container/vector/detail/value_of_impl.hpp new file mode 100644 index 00000000..3a775fbb --- /dev/null +++ b/include/boost/fusion/container/vector/detail/value_of_impl.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_OF_IMPL_05052005_1128) +#define FUSION_VALUE_OF_IMPL_05052005_1128 + +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename Iterator::vector vector; + typedef typename Iterator::index index; + typedef typename mpl::at< + typename vector::types, index>::type + type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/container/vector/detail/vector_forward_ctor.hpp b/include/boost/fusion/container/vector/detail/vector_forward_ctor.hpp new file mode 100644 index 00000000..e4680bb8 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/vector_forward_ctor.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_VECTOR_FORWARD_CTOR_07122005_1123) +#define FUSION_VECTOR_FORWARD_CTOR_07122005_1123 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + +#if N == 1 + explicit +#endif + vector(BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : vec(BOOST_PP_ENUM_PARAMS(N, _)) {} + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/container/vector/detail/vector_n.hpp b/include/boost/fusion/container/vector/detail/vector_n.hpp new file mode 100644 index 00000000..01981ab3 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/vector_n.hpp @@ -0,0 +1,150 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +// No include guard. This file is meant to be included many times + +#if !defined(FUSION_MACRO_05042005) +#define FUSION_MACRO_05042005 + +#define FUSION_MEMBER_DEFAULT_INIT(z, n, _) m##n(T##n()) +#define FUSION_MEMBER_INIT(z, n, _) m##n(_##n) +#define FUSION_COPY_INIT(z, n, _) m##n(other.m##n) +#define FUSION_MEMBER_DECL(z, n, _) T##n m##n; + +#define FUSION_MEMBER_ASSIGN(z, n, _) \ + this->BOOST_PP_CAT(m, n) = vec.BOOST_PP_CAT(m, n); + +#define FUSION_DEREF_MEMBER_ASSIGN(z, n, _) \ + this->BOOST_PP_CAT(m, n) = *BOOST_PP_CAT(i, n); + +#define FUSION_AT_IMPL(z, n, _) \ + typename add_reference::type \ + at_impl(mpl::int_) { return this->m##n; } \ + typename add_reference::type>::type \ + at_impl(mpl::int_) const { return this->m##n; } + +#define FUSION_ITER_DECL_VAR(z, n, _) \ + typedef typename result_of::next< \ + BOOST_PP_CAT(I, BOOST_PP_DEC(n))>::type BOOST_PP_CAT(I, n); \ + BOOST_PP_CAT(I, n) BOOST_PP_CAT(i, n) \ + = fusion::next(BOOST_PP_CAT(i, BOOST_PP_DEC(n))); + +#endif + +#define N BOOST_PP_ITERATION() + + template + struct BOOST_PP_CAT(vector_data, N) : sequence_base + { + BOOST_PP_CAT(vector_data, N)() + : BOOST_PP_ENUM(N, FUSION_MEMBER_DEFAULT_INIT, _) {} + + BOOST_PP_CAT(vector_data, N)( + BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : BOOST_PP_ENUM(N, FUSION_MEMBER_INIT, _) {} + + BOOST_PP_CAT(vector_data, N)( + BOOST_PP_CAT(vector_data, N) const& other) + : BOOST_PP_ENUM(N, FUSION_COPY_INIT, _) {} + + BOOST_PP_CAT(vector_data, N)& + operator=(BOOST_PP_CAT(vector_data, N) const& vec) + { + BOOST_PP_REPEAT(N, FUSION_MEMBER_ASSIGN, _) + return *this; + } + + template + static BOOST_PP_CAT(vector_data, N) + init_from_sequence(Sequence const& seq) + { + typedef typename result_of::begin::type I0; + I0 i0 = fusion::begin(seq); + BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_ITER_DECL_VAR, _) + return BOOST_PP_CAT(vector_data, N)(BOOST_PP_ENUM_PARAMS(N, *i)); + } + + BOOST_PP_REPEAT(N, FUSION_MEMBER_DECL, _) + }; + + template + struct BOOST_PP_CAT(vector, N) + : BOOST_PP_CAT(vector_data, N)< + BOOST_PP_CAT(vector, N) + , BOOST_PP_ENUM_PARAMS(N, T)> + { + typedef BOOST_PP_CAT(vector, N) this_type; + typedef BOOST_PP_CAT(vector_data, N) base_type; + typedef mpl::BOOST_PP_CAT(vector, N) types; + typedef vector_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + typedef random_access_traversal_tag category; + typedef mpl::int_ size; + + BOOST_PP_CAT(vector, N)() {} + +#if (N == 1) + explicit +#endif + BOOST_PP_CAT(vector, N)( + BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : base_type(BOOST_PP_ENUM_PARAMS(N, _)) {} + + template + BOOST_PP_CAT(vector, N)( + BOOST_PP_CAT(vector, N) const& vec) + : base_type(BOOST_PP_ENUM_PARAMS(N, vec.m)) {} + + template + BOOST_PP_CAT(vector, N)( + Sequence const& seq +#if (N == 1) + , typename disable_if >::type* dummy = 0 +#endif + ) + : base_type(base_type::init_from_sequence(seq)) {} + + template + BOOST_PP_CAT(vector, N)& + operator=(BOOST_PP_CAT(vector, N) const& vec) + { + BOOST_PP_REPEAT(N, FUSION_MEMBER_ASSIGN, _) + return *this; + } + + template + typename disable_if, this_type&>::type + operator=(Sequence const& seq) + { + typedef typename result_of::begin::type I0; + I0 i0 = fusion::begin(seq); + BOOST_PP_REPEAT_FROM_TO(1, N, FUSION_ITER_DECL_VAR, _) + BOOST_PP_REPEAT(N, FUSION_DEREF_MEMBER_ASSIGN, _) + return *this; + } + + BOOST_PP_REPEAT(N, FUSION_AT_IMPL, _) + + template + typename add_reference::type>::type + at_impl(I i) + { + return this->at_impl(mpl::int_()); + } + + template + typename add_reference::type>::type>::type + at_impl(I i) const + { + return this->at_impl(mpl::int_()); + } + }; + +#undef N + diff --git a/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp b/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp new file mode 100644 index 00000000..29248907 --- /dev/null +++ b/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp @@ -0,0 +1,99 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_VECTOR_N_CHOOSER_07072005_1248) +#define FUSION_VECTOR_N_CHOOSER_07072005_1248 + +#include + +// include vector0..N where N is FUSION_MAX_VECTOR_SIZE +#include +#if (FUSION_MAX_VECTOR_SIZE > 10) +#include +#endif +#if (FUSION_MAX_VECTOR_SIZE > 20) +#include +#endif +#if (FUSION_MAX_VECTOR_SIZE > 30) +#include +#endif +#if (FUSION_MAX_VECTOR_SIZE > 40) +#include +#endif + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; +}} + +namespace boost { namespace fusion { namespace detail +{ + template + struct get_vector_n; + + template <> + struct get_vector_n<0> + { + template + struct call + { + typedef vector0 type; + }; + }; + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + + template + struct vector_n_chooser + { + typedef + mpl::BOOST_PP_CAT(vector, FUSION_MAX_VECTOR_SIZE) + + input; + + typedef typename mpl::begin::type begin; + typedef typename mpl::find::type end; + typedef typename mpl::distance::type size; + + typedef typename get_vector_n::template + call::type + type; + }; +}}} + +#endif + +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// +#else // defined(BOOST_PP_IS_ITERATING) + +#define N BOOST_PP_ITERATION() + + template <> + struct get_vector_n + { + template + struct call + { + typedef BOOST_PP_CAT(vector, N) type; + }; + }; + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) diff --git a/include/boost/fusion/container/vector/limits.hpp b/include/boost/fusion/container/vector/limits.hpp new file mode 100644 index 00000000..0e7e3a03 --- /dev/null +++ b/include/boost/fusion/container/vector/limits.hpp @@ -0,0 +1,19 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR_LIMITS_07072005_1246) +#define FUSION_VECTOR_LIMITS_07072005_1246 + +#if !defined(FUSION_MAX_VECTOR_SIZE) +# define FUSION_MAX_VECTOR_SIZE 10 +#else +# if FUSION_MAX_VECTOR_SIZE < 3 +# undef FUSION_MAX_VECTOR_SIZE +# define FUSION_MAX_VECTOR_SIZE 10 +# endif +#endif + +#endif diff --git a/include/boost/fusion/container/vector/vector.hpp b/include/boost/fusion/container/vector/vector.hpp new file mode 100644 index 00000000..aef3134c --- /dev/null +++ b/include/boost/fusion/container/vector/vector.hpp @@ -0,0 +1,151 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR_07072005_1244) +#define FUSION_VECTOR_07072005_1244 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + struct fusion_sequence_tag; + + template + struct vector + : sequence_base > + { + private: + + typedef typename detail::vector_n_chooser< + BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>::type + vector_n; + + template + friend struct vector; + + public: + + typedef typename vector_n::types types; + typedef typename vector_n::fusion_tag fusion_tag; + typedef typename vector_n::tag tag; + typedef typename vector_n::size size; + typedef typename vector_n::category category; + typedef typename vector_n::is_view is_view; + + vector() + : vec() {} + + template + vector(vector const& rhs) + : vec(rhs.vec) {} + + vector(vector const& rhs) + : vec(rhs.vec) {} + + template + vector(Sequence const& rhs) +#if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) + : vec(ctor_helper(rhs, is_base_of())) {} +#else + : vec(rhs) {} +#endif + + // Expand a couple of forwarding constructors for arguments + // of type (T0), (T0, T1), (T0, T1, T2) etc. Example: + // + // vector( + // typename detail::call_param::type _0 + // , typename detail::call_param::type _1) + // : vec(_0, _1) {} + #include + + template + vector& + operator=(vector const& rhs) + { + vec = rhs.vec; + return *this; + } + + template + vector& + operator=(T const& rhs) + { + vec = rhs; + return *this; + } + + template + typename add_reference< + typename mpl::at_c::type + >::type + at_impl(mpl::int_ index) + { + return vec.at_impl(index); + } + + template + typename add_reference< + typename add_const< + typename mpl::at_c::type + >::type + >::type + at_impl(mpl::int_ index) const + { + return vec.at_impl(index); + } + + template + typename add_reference< + typename mpl::at::type + >::type + at_impl(I index) + { + return vec.at_impl(mpl::int_()); + } + + template + typename add_reference< + typename add_const< + typename mpl::at::type + >::type + >::type + at_impl(I index) const + { + return vec.at_impl(mpl::int_()); + } + + private: + +#if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) + static vector_n const& + ctor_helper(vector const& rhs, mpl::true_) + { + return rhs.vec; + } + + template + static T const& + ctor_helper(T const& rhs, mpl::false_) + { + return rhs; + } +#endif + + vector_n vec; + }; +}} + +#endif diff --git a/include/boost/fusion/container/vector/vector10.hpp b/include/boost/fusion/container/vector/vector10.hpp new file mode 100644 index 00000000..28531b6f --- /dev/null +++ b/include/boost/fusion/container/vector/vector10.hpp @@ -0,0 +1,66 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR10_05042005_0257) +#define FUSION_VECTOR10_05042005_0257 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + struct fusion_sequence_tag; + struct random_access_traversal_tag; + + struct vector0 : sequence_base + { + typedef mpl::vector0<> types; + typedef vector_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::false_ is_view; + typedef random_access_traversal_tag category; + typedef mpl::int_<0> size; + + vector0() {} + + template + vector0(Sequence const& seq) + {} + }; + +// expand vector1 to vector10 +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (1, 10) +#include BOOST_PP_ITERATE() + +}} + +#endif + diff --git a/include/boost/fusion/container/vector/vector20.hpp b/include/boost/fusion/container/vector/vector20.hpp new file mode 100644 index 00000000..be711006 --- /dev/null +++ b/include/boost/fusion/container/vector/vector20.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR20_05052005_0205) +#define FUSION_VECTOR20_05052005_0205 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + struct fusion_sequence_tag; + struct random_access_traversal_tag; + +// expand vector11 to vector20 +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (11, 20) +#include BOOST_PP_ITERATE() + +}} + +#endif + diff --git a/include/boost/fusion/container/vector/vector30.hpp b/include/boost/fusion/container/vector/vector30.hpp new file mode 100644 index 00000000..efbe9293 --- /dev/null +++ b/include/boost/fusion/container/vector/vector30.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR30_05052005_0206) +#define FUSION_VECTOR30_05052005_0206 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + struct fusion_sequence_tag; + struct random_access_traversal_tag; + +// expand vector21 to vector30 +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (21, 30) +#include BOOST_PP_ITERATE() + +}} + +#endif + diff --git a/include/boost/fusion/container/vector/vector40.hpp b/include/boost/fusion/container/vector/vector40.hpp new file mode 100644 index 00000000..b72a23c5 --- /dev/null +++ b/include/boost/fusion/container/vector/vector40.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR40_05052005_0208) +#define FUSION_VECTOR40_05052005_0208 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + struct fusion_sequence_tag; + struct random_access_traversal_tag; + +// expand vector31 to vector40 +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (31, 40) +#include BOOST_PP_ITERATE() + +}} + +#endif + diff --git a/include/boost/fusion/container/vector/vector50.hpp b/include/boost/fusion/container/vector/vector50.hpp new file mode 100644 index 00000000..ab8515d7 --- /dev/null +++ b/include/boost/fusion/container/vector/vector50.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR50_05052005_0207) +#define FUSION_VECTOR50_05052005_0207 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_tag; + struct fusion_sequence_tag; + struct random_access_traversal_tag; + +// expand vector41 to vector50 +#define BOOST_PP_FILENAME_1 +#define BOOST_PP_ITERATION_LIMITS (41, 50) +#include BOOST_PP_ITERATE() + +}} + +#endif + diff --git a/include/boost/fusion/container/vector/vector_fwd.hpp b/include/boost/fusion/container/vector/vector_fwd.hpp new file mode 100644 index 00000000..2c4848db --- /dev/null +++ b/include/boost/fusion/container/vector/vector_fwd.hpp @@ -0,0 +1,25 @@ +/*============================================================================= + Copyright (c) 1999-2003 Jaakko Jarvi + Copyright (c) 2001-2006 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_VECTOR_FORWARD_07072005_0125) +#define FUSION_VECTOR_FORWARD_07072005_0125 + +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + + template < + BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( + FUSION_MAX_VECTOR_SIZE, typename T, void_) + > + struct vector; +}} + +#endif diff --git a/include/boost/fusion/container/vector/vector_iterator.hpp b/include/boost/fusion/container/vector/vector_iterator.hpp new file mode 100644 index 00000000..9feeb520 --- /dev/null +++ b/include/boost/fusion/container/vector/vector_iterator.hpp @@ -0,0 +1,46 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VECTOR_ITERATOR_05042005_0635) +#define FUSION_VECTOR_ITERATOR_05042005_0635 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct vector_iterator_tag; + struct random_access_traversal_tag; + + template + struct vector_iterator_identity; + + template + struct vector_iterator : iterator_base > + { + typedef mpl::int_ index; + typedef Vector vector; + typedef vector_iterator_tag fusion_tag; + typedef random_access_traversal_tag category; + typedef vector_iterator_identity< + typename add_const::type, N> identity; + + vector_iterator(Vector& vec) + : vec(vec) {} + Vector& vec; + }; +}} + +#endif + diff --git a/include/boost/fusion/functional/adapter/limits.hpp b/include/boost/fusion/functional/adapter/limits.hpp index 476fe021..cf6701c4 100644 --- a/include/boost/fusion/functional/adapter/limits.hpp +++ b/include/boost/fusion/functional/adapter/limits.hpp @@ -9,7 +9,7 @@ #if !defined(BOOST_FUSION_FUNCTIONAL_ADAPTER_LIMITS_HPP_INCLUDED) # define BOOST_FUSION_FUNCTIONAL_ADAPTER_LIMITS_HPP_INCLUDED -# include +# include # if !defined(BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY) # define BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY 6 diff --git a/include/boost/fusion/functional/adapter/unfused_generic.hpp b/include/boost/fusion/functional/adapter/unfused_generic.hpp index 69191ef3..82b1e4b0 100644 --- a/include/boost/fusion/functional/adapter/unfused_generic.hpp +++ b/include/boost/fusion/functional/adapter/unfused_generic.hpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp b/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp index 7b801cf7..ba2f31b6 100644 --- a/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp +++ b/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp @@ -17,7 +17,7 @@ #include -#include +#include #include #include diff --git a/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp b/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp index eea0fec9..3c80475e 100644 --- a/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp +++ b/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp @@ -17,7 +17,7 @@ #include -#include +#include #include #include diff --git a/include/boost/fusion/functional/adapter/unfused_typed.hpp b/include/boost/fusion/functional/adapter/unfused_typed.hpp index 94385a35..9ee3a7a6 100644 --- a/include/boost/fusion/functional/adapter/unfused_typed.hpp +++ b/include/boost/fusion/functional/adapter/unfused_typed.hpp @@ -22,8 +22,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/include/boost/fusion/functional/invocation/invoke.hpp b/include/boost/fusion/functional/invocation/invoke.hpp index bac695cc..f021d923 100644 --- a/include/boost/fusion/functional/invocation/invoke.hpp +++ b/include/boost/fusion/functional/invocation/invoke.hpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -71,21 +71,21 @@ namespace boost { namespace fusion { namespace ft = function_types; - template< - typename Function, class Sequence, + template< + typename Function, class Sequence, int N = result_of::size::value, bool CBI = ft::is_callable_builtin::value, bool RandomAccess = traits::is_random_access::value > struct invoke_impl; - template + template struct invoke_param_types; template struct invoke_data_member; - template + template struct invoke_mem_fn; #define BOOST_PP_FILENAME_1 @@ -116,7 +116,7 @@ namespace boost { namespace fusion invoke_mem_fn, invoke_data_member >, mpl::identity< invoke_nonmember_builtin< - Function,Sequence,1,RandomAccess> > + Function,Sequence,1,RandomAccess> > >::type { }; @@ -139,7 +139,7 @@ namespace boost { namespace fusion public: - typedef typename boost::add_reference::type + typedef typename boost::add_reference::type result_type; static inline result_type call(T C::* f, Sequence & s) @@ -154,10 +154,10 @@ namespace boost { namespace fusion { template struct invoke { - typedef typename detail::invoke_impl< + typedef typename detail::invoke_impl< typename boost::remove_reference::type, Sequence >::result_type type; - }; + }; } template @@ -242,7 +242,7 @@ namespace boost { namespace fusion public: typedef typename boost::result_of< - Function(BOOST_PP_ENUM_PARAMS(N,typename seq::T)) + Function(BOOST_PP_ENUM_PARAMS(N,typename seq::T)) >::type result_type; template @@ -274,7 +274,7 @@ namespace boost { namespace fusion typename seq::I0 i0 = fusion::begin(s); BOOST_PP_REPEAT_FROM_TO(1,N,M,~) - return (that_ptr< typename mpl::front< + return (that_ptr< typename mpl::front< ft::parameter_types >::type >::get(*i0)->*f)(BOOST_PP_ENUM_SHIFTED_PARAMS(N,*i)); } @@ -302,5 +302,5 @@ namespace boost { namespace fusion #undef N #endif // defined(BOOST_PP_IS_ITERATING) -#endif +#endif diff --git a/include/boost/fusion/functional/invocation/invoke_function_object.hpp b/include/boost/fusion/functional/invocation/invoke_function_object.hpp index ad742265..24c02c2b 100644 --- a/include/boost/fusion/functional/invocation/invoke_function_object.hpp +++ b/include/boost/fusion/functional/invocation/invoke_function_object.hpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -51,14 +51,14 @@ namespace boost { namespace fusion namespace detail { - template< - class Function, class Sequence, + template< + class Function, class Sequence, int N = result_of::size::value, - bool RandomAccess = traits::is_random_access::value + bool RandomAccess = traits::is_random_access::value > struct invoke_function_object_impl; - template + template struct invoke_function_object_param_types; #define BOOST_PP_FILENAME_1 \ @@ -72,10 +72,10 @@ namespace boost { namespace fusion { template struct invoke_function_object { - typedef typename detail::invoke_function_object_impl< + typedef typename detail::invoke_function_object_impl< typename boost::remove_reference::type, Sequence >::result_type type; - }; + }; } template @@ -114,8 +114,7 @@ namespace boost { namespace fusion typedef typename boost::result_of< #define M(z,j,data) \ - typename boost::remove_reference< \ - typename result_of::at_c::type >::type + typename result_of::at_c::type Function (BOOST_PP_ENUM(N,M,~)) >::type result_type; #undef M @@ -155,7 +154,7 @@ namespace boost { namespace fusion } }; - template + template struct invoke_function_object_param_types { #if N > 0 @@ -174,5 +173,5 @@ namespace boost { namespace fusion #undef N #endif // defined(BOOST_PP_IS_ITERATING) -#endif +#endif diff --git a/include/boost/fusion/functional/invocation/invoke_procedure.hpp b/include/boost/fusion/functional/invocation/invoke_procedure.hpp index 31822ade..502b38aa 100644 --- a/include/boost/fusion/functional/invocation/invoke_procedure.hpp +++ b/include/boost/fusion/functional/invocation/invoke_procedure.hpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -58,8 +58,8 @@ namespace boost { namespace fusion { namespace ft = function_types; - template< - typename Function, class Sequence, + template< + typename Function, class Sequence, int N = result_of::size::value, bool MFP = ft::is_member_function_pointer::value, bool RandomAccess = traits::is_random_access::value @@ -167,5 +167,5 @@ namespace boost { namespace fusion #undef N #endif // defined(BOOST_PP_IS_ITERATING) -#endif +#endif diff --git a/include/boost/fusion/include/accumulate.hpp b/include/boost/fusion/include/accumulate.hpp new file mode 100644 index 00000000..b9ca6526 --- /dev/null +++ b/include/boost/fusion/include/accumulate.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ACCUMULATE) +#define FUSION_INCLUDE_ACCUMULATE + +#include + +#endif diff --git a/include/boost/fusion/include/adapt_struct.hpp b/include/boost/fusion/include/adapt_struct.hpp index 2fab5de7..facc8970 100644 --- a/include/boost/fusion/include/adapt_struct.hpp +++ b/include/boost/fusion/include/adapt_struct.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_ADAPT_STRUCT) #define FUSION_INCLUDE_ADAPT_STRUCT -#include +#include #endif diff --git a/include/boost/fusion/include/adapted.hpp b/include/boost/fusion/include/adapted.hpp new file mode 100644 index 00000000..1827267d --- /dev/null +++ b/include/boost/fusion/include/adapted.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ADAPTED) +#define FUSION_INCLUDE_ADAPTED + +#include + +#endif diff --git a/include/boost/fusion/include/adapter.hpp b/include/boost/fusion/include/adapter.hpp new file mode 100644 index 00000000..2441d7ca --- /dev/null +++ b/include/boost/fusion/include/adapter.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ADAPTER) +#define FUSION_INCLUDE_ADAPTER + +#include + +#endif diff --git a/include/boost/fusion/include/advance.hpp b/include/boost/fusion/include/advance.hpp new file mode 100644 index 00000000..cb9ed7a9 --- /dev/null +++ b/include/boost/fusion/include/advance.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ADVANCE) +#define FUSION_INCLUDE_ADVANCE + +#include + +#endif diff --git a/include/boost/fusion/include/algorithm.hpp b/include/boost/fusion/include/algorithm.hpp new file mode 100644 index 00000000..1a362fd8 --- /dev/null +++ b/include/boost/fusion/include/algorithm.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ALGORITHM) +#define FUSION_INCLUDE_ALGORITHM + +#include + +#endif diff --git a/include/boost/fusion/include/all.hpp b/include/boost/fusion/include/all.hpp new file mode 100644 index 00000000..58026268 --- /dev/null +++ b/include/boost/fusion/include/all.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ALL) +#define FUSION_INCLUDE_ALL + +#include + +#endif diff --git a/include/boost/fusion/include/array.hpp b/include/boost/fusion/include/array.hpp new file mode 100644 index 00000000..b54cd70d --- /dev/null +++ b/include/boost/fusion/include/array.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ARRAY) +#define FUSION_INCLUDE_ARRAY + +#include + +#endif diff --git a/include/boost/fusion/include/as_deque.hpp b/include/boost/fusion/include/as_deque.hpp new file mode 100644 index 00000000..8f1686f2 --- /dev/null +++ b/include/boost/fusion/include/as_deque.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AS_DEQUE) +#define FUSION_INCLUDE_AS_DEQUE + +#include + +#endif diff --git a/include/boost/fusion/include/as_list.hpp b/include/boost/fusion/include/as_list.hpp new file mode 100644 index 00000000..6c477d24 --- /dev/null +++ b/include/boost/fusion/include/as_list.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AS_LIST) +#define FUSION_INCLUDE_AS_LIST + +#include + +#endif diff --git a/include/boost/fusion/include/as_map.hpp b/include/boost/fusion/include/as_map.hpp new file mode 100644 index 00000000..bdfd3f53 --- /dev/null +++ b/include/boost/fusion/include/as_map.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AS_MAP) +#define FUSION_INCLUDE_AS_MAP + +#include + +#endif diff --git a/include/boost/fusion/include/as_set.hpp b/include/boost/fusion/include/as_set.hpp new file mode 100644 index 00000000..c0d5a8b3 --- /dev/null +++ b/include/boost/fusion/include/as_set.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AS_SET) +#define FUSION_INCLUDE_AS_SET + +#include + +#endif diff --git a/include/boost/fusion/include/as_vector.hpp b/include/boost/fusion/include/as_vector.hpp index 2136b492..4c9b39d0 100644 --- a/include/boost/fusion/include/as_vector.hpp +++ b/include/boost/fusion/include/as_vector.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_AS_VECTOR) #define FUSION_INCLUDE_AS_VECTOR -#include +#include #endif diff --git a/include/boost/fusion/include/at_c.hpp b/include/boost/fusion/include/at_c.hpp new file mode 100644 index 00000000..a2403d16 --- /dev/null +++ b/include/boost/fusion/include/at_c.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AT_C) +#define FUSION_INCLUDE_AT_C + +#include + +#endif diff --git a/include/boost/fusion/include/at_key.hpp b/include/boost/fusion/include/at_key.hpp new file mode 100644 index 00000000..89a0aae2 --- /dev/null +++ b/include/boost/fusion/include/at_key.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_AT_KEY) +#define FUSION_INCLUDE_AT_KEY + +#include + +#endif diff --git a/include/boost/fusion/include/back.hpp b/include/boost/fusion/include/back.hpp new file mode 100644 index 00000000..d5e77f0a --- /dev/null +++ b/include/boost/fusion/include/back.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_BACK) +#define FUSION_INCLUDE_BACK + +#include + +#endif diff --git a/include/boost/fusion/include/boost_tuple.hpp b/include/boost/fusion/include/boost_tuple.hpp new file mode 100644 index 00000000..1ccc94da --- /dev/null +++ b/include/boost/fusion/include/boost_tuple.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_BOOST_TUPLE) +#define FUSION_INCLUDE_BOOST_TUPLE + +#include + +#endif diff --git a/include/boost/fusion/include/category_of.hpp b/include/boost/fusion/include/category_of.hpp new file mode 100644 index 00000000..c390686c --- /dev/null +++ b/include/boost/fusion/include/category_of.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CATEGORY_OF) +#define FUSION_INCLUDE_CATEGORY_OF + +#include + +#endif diff --git a/include/boost/fusion/include/clear.hpp b/include/boost/fusion/include/clear.hpp new file mode 100644 index 00000000..7fd86332 --- /dev/null +++ b/include/boost/fusion/include/clear.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CLEAR) +#define FUSION_INCLUDE_CLEAR + +#include + +#endif diff --git a/include/boost/fusion/include/comparison.hpp b/include/boost/fusion/include/comparison.hpp new file mode 100644 index 00000000..e7790f28 --- /dev/null +++ b/include/boost/fusion/include/comparison.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_COMPARISON) +#define FUSION_INCLUDE_COMPARISON + +#include + +#endif diff --git a/include/boost/fusion/include/cons.hpp b/include/boost/fusion/include/cons.hpp new file mode 100644 index 00000000..853eb6d2 --- /dev/null +++ b/include/boost/fusion/include/cons.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CONS) +#define FUSION_INCLUDE_CONS + +#include + +#endif diff --git a/include/boost/fusion/include/cons_tie.hpp b/include/boost/fusion/include/cons_tie.hpp new file mode 100644 index 00000000..740e1739 --- /dev/null +++ b/include/boost/fusion/include/cons_tie.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CONS_TIE) +#define FUSION_INCLUDE_CONS_TIE + +#include + +#endif diff --git a/include/boost/fusion/include/container.hpp b/include/boost/fusion/include/container.hpp new file mode 100644 index 00000000..657b4c30 --- /dev/null +++ b/include/boost/fusion/include/container.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CONTAINER) +#define FUSION_INCLUDE_CONTAINER + +#include + +#endif diff --git a/include/boost/fusion/include/convert.hpp b/include/boost/fusion/include/convert.hpp new file mode 100644 index 00000000..1d64ea1b --- /dev/null +++ b/include/boost/fusion/include/convert.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_CONVERT) +#define FUSION_INCLUDE_CONVERT + +#include + +#endif diff --git a/include/boost/fusion/include/count.hpp b/include/boost/fusion/include/count.hpp new file mode 100644 index 00000000..750a0303 --- /dev/null +++ b/include/boost/fusion/include/count.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_COUNT) +#define FUSION_INCLUDE_COUNT + +#include + +#endif diff --git a/include/boost/fusion/include/count_if.hpp b/include/boost/fusion/include/count_if.hpp new file mode 100644 index 00000000..ff804ae9 --- /dev/null +++ b/include/boost/fusion/include/count_if.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_COUNT_IF) +#define FUSION_INCLUDE_COUNT_IF + +#include + +#endif diff --git a/include/boost/fusion/include/deduce.hpp b/include/boost/fusion/include/deduce.hpp new file mode 100644 index 00000000..43ec5c0f --- /dev/null +++ b/include/boost/fusion/include/deduce.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_DEDUCE) +#define FUSION_INCLUDE_DEDUCE + +#include + +#endif diff --git a/include/boost/fusion/include/deduce_sequence.hpp b/include/boost/fusion/include/deduce_sequence.hpp new file mode 100644 index 00000000..a8d36c08 --- /dev/null +++ b/include/boost/fusion/include/deduce_sequence.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_DEDUCE_SEQUENCE) +#define FUSION_INCLUDE_DEDUCE_SEQUENCE + +#include + +#endif diff --git a/include/boost/fusion/include/deque.hpp b/include/boost/fusion/include/deque.hpp new file mode 100644 index 00000000..17386a1d --- /dev/null +++ b/include/boost/fusion/include/deque.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_DEQUE) +#define FUSION_INCLUDE_DEQUE + +#include + +#endif diff --git a/include/boost/fusion/include/deque_fwd.hpp b/include/boost/fusion/include/deque_fwd.hpp new file mode 100644 index 00000000..915c3cbb --- /dev/null +++ b/include/boost/fusion/include/deque_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_DEQUE) +#define FUSION_INCLUDE_DEQUE + +#include + +#endif diff --git a/include/boost/fusion/include/deque_tie.hpp b/include/boost/fusion/include/deque_tie.hpp new file mode 100644 index 00000000..8adbc4c0 --- /dev/null +++ b/include/boost/fusion/include/deque_tie.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_GENERATION) +#define FUSION_INCLUDE_GENERATION + +#include +#include + +#endif diff --git a/include/boost/fusion/include/distance.hpp b/include/boost/fusion/include/distance.hpp new file mode 100644 index 00000000..fac103a6 --- /dev/null +++ b/include/boost/fusion/include/distance.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_DISTANCE) +#define FUSION_INCLUDE_DISTANCE + +#include + +#endif diff --git a/include/boost/fusion/include/empty.hpp b/include/boost/fusion/include/empty.hpp new file mode 100644 index 00000000..0a8af33c --- /dev/null +++ b/include/boost/fusion/include/empty.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_EMPTY) +#define FUSION_INCLUDE_EMPTY + +#include + +#endif diff --git a/include/boost/fusion/include/end.hpp b/include/boost/fusion/include/end.hpp index 60be1a98..61d65de0 100644 --- a/include/boost/fusion/include/end.hpp +++ b/include/boost/fusion/include/end.hpp @@ -4,8 +4,8 @@ Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ -#if !defined(FUSION_INCLUDE_BEGIN) -#define FUSION_INCLUDE_BEGIN +#if !defined(FUSION_INCLUDE_END) +#define FUSION_INCLUDE_END #include diff --git a/include/boost/fusion/include/erase.hpp b/include/boost/fusion/include/erase.hpp new file mode 100644 index 00000000..b7e6fafb --- /dev/null +++ b/include/boost/fusion/include/erase.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ERASE) +#define FUSION_INCLUDE_ERASE + +#include + +#endif diff --git a/include/boost/fusion/include/erase_key.hpp b/include/boost/fusion/include/erase_key.hpp new file mode 100644 index 00000000..e13c889f --- /dev/null +++ b/include/boost/fusion/include/erase_key.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ERASE_KEY) +#define FUSION_INCLUDE_ERASE_KEY + +#include + +#endif diff --git a/include/boost/fusion/include/filter.hpp b/include/boost/fusion/include/filter.hpp new file mode 100644 index 00000000..234e4064 --- /dev/null +++ b/include/boost/fusion/include/filter.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FILTER) +#define FUSION_INCLUDE_FILTER + +#include + +#endif diff --git a/include/boost/fusion/include/filter_view.hpp b/include/boost/fusion/include/filter_view.hpp new file mode 100644 index 00000000..196df8a0 --- /dev/null +++ b/include/boost/fusion/include/filter_view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FILTER_VIEW) +#define FUSION_INCLUDE_FILTER_VIEW + +#include + +#endif diff --git a/include/boost/fusion/include/find.hpp b/include/boost/fusion/include/find.hpp new file mode 100644 index 00000000..cf50c412 --- /dev/null +++ b/include/boost/fusion/include/find.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FIND) +#define FUSION_INCLUDE_FIND + +#include + +#endif diff --git a/include/boost/fusion/include/find_if.hpp b/include/boost/fusion/include/find_if.hpp new file mode 100644 index 00000000..aa1a4c7a --- /dev/null +++ b/include/boost/fusion/include/find_if.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FIND_IF) +#define FUSION_INCLUDE_FIND_IF + +#include + +#endif diff --git a/include/boost/fusion/include/fold.hpp b/include/boost/fusion/include/fold.hpp new file mode 100644 index 00000000..40bf3a79 --- /dev/null +++ b/include/boost/fusion/include/fold.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FOLD) +#define FUSION_INCLUDE_FOLD + +#include + +#endif diff --git a/include/boost/fusion/include/front.hpp b/include/boost/fusion/include/front.hpp new file mode 100644 index 00000000..495deaf7 --- /dev/null +++ b/include/boost/fusion/include/front.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FRONT) +#define FUSION_INCLUDE_FRONT + +#include + +#endif diff --git a/include/boost/fusion/include/functional.hpp b/include/boost/fusion/include/functional.hpp new file mode 100644 index 00000000..ab38fe1f --- /dev/null +++ b/include/boost/fusion/include/functional.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FUNCTIONAL) +#define FUSION_INCLUDE_FUNCTIONAL + +#include + +#endif diff --git a/include/boost/fusion/include/fused.hpp b/include/boost/fusion/include/fused.hpp new file mode 100644 index 00000000..fa9dd464 --- /dev/null +++ b/include/boost/fusion/include/fused.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FUSED) +#define FUSION_INCLUDE_FUSED + +#include + +#endif diff --git a/include/boost/fusion/include/fused_function_object.hpp b/include/boost/fusion/include/fused_function_object.hpp new file mode 100644 index 00000000..d35140c6 --- /dev/null +++ b/include/boost/fusion/include/fused_function_object.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FUSED_FUNCTION_OBJECT) +#define FUSION_INCLUDE_FUSED_FUNCTION_OBJECT + +#include + +#endif diff --git a/include/boost/fusion/include/fused_procedure.hpp b/include/boost/fusion/include/fused_procedure.hpp new file mode 100644 index 00000000..9df4717b --- /dev/null +++ b/include/boost/fusion/include/fused_procedure.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_FUSED_PROCEDURE) +#define FUSION_INCLUDE_FUSED_PROCEDURE + +#include + +#endif diff --git a/include/boost/fusion/include/generation.hpp b/include/boost/fusion/include/generation.hpp new file mode 100644 index 00000000..8adbc4c0 --- /dev/null +++ b/include/boost/fusion/include/generation.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_GENERATION) +#define FUSION_INCLUDE_GENERATION + +#include +#include + +#endif diff --git a/include/boost/fusion/include/greater.hpp b/include/boost/fusion/include/greater.hpp new file mode 100644 index 00000000..a5ff306f --- /dev/null +++ b/include/boost/fusion/include/greater.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_NOT_GREATER) +#define FUSION_INCLUDE_NOT_GREATER + +#include + +#endif diff --git a/include/boost/fusion/include/greater_equal.hpp b/include/boost/fusion/include/greater_equal.hpp new file mode 100644 index 00000000..3a092551 --- /dev/null +++ b/include/boost/fusion/include/greater_equal.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_GREATER_EQUAL) +#define FUSION_INCLUDE_GREATER_EQUAL + +#include + +#endif diff --git a/include/boost/fusion/include/has_key.hpp b/include/boost/fusion/include/has_key.hpp new file mode 100644 index 00000000..4eef64a1 --- /dev/null +++ b/include/boost/fusion/include/has_key.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_HAS_KEY) +#define FUSION_INCLUDE_EMPTY + +#include + +#endif diff --git a/include/boost/fusion/include/ignore.hpp b/include/boost/fusion/include/ignore.hpp new file mode 100644 index 00000000..8adbc4c0 --- /dev/null +++ b/include/boost/fusion/include/ignore.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_GENERATION) +#define FUSION_INCLUDE_GENERATION + +#include +#include + +#endif diff --git a/include/boost/fusion/include/in.hpp b/include/boost/fusion/include/in.hpp new file mode 100644 index 00000000..ca285c0e --- /dev/null +++ b/include/boost/fusion/include/in.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 Hartmut Kaiser + + 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_INCLUDE_IN) +#define FUSION_INCLUDE_IN + +#include + +#endif diff --git a/include/boost/fusion/include/insert.hpp b/include/boost/fusion/include/insert.hpp new file mode 100644 index 00000000..53c0b05e --- /dev/null +++ b/include/boost/fusion/include/insert.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INSERT) +#define FUSION_INCLUDE_INSERT + +#include + +#endif diff --git a/include/boost/fusion/include/insert_range.hpp b/include/boost/fusion/include/insert_range.hpp new file mode 100644 index 00000000..f7093ed9 --- /dev/null +++ b/include/boost/fusion/include/insert_range.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INSERT_RANGE) +#define FUSION_INCLUDE_INSERT_RANGE + +#include + +#endif diff --git a/include/boost/fusion/include/intrinsic.hpp b/include/boost/fusion/include/intrinsic.hpp new file mode 100644 index 00000000..c9d78711 --- /dev/null +++ b/include/boost/fusion/include/intrinsic.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INTRINSIC) +#define FUSION_INCLUDE_INTRINSIC + +#include + +#endif diff --git a/include/boost/fusion/include/invocation.hpp b/include/boost/fusion/include/invocation.hpp new file mode 100644 index 00000000..2a6f12a3 --- /dev/null +++ b/include/boost/fusion/include/invocation.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INVOCATION) +#define FUSION_INCLUDE_INVOCATION + +#include + +#endif diff --git a/include/boost/fusion/include/invoke.hpp b/include/boost/fusion/include/invoke.hpp new file mode 100644 index 00000000..45226425 --- /dev/null +++ b/include/boost/fusion/include/invoke.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INVOKE) +#define FUSION_INCLUDE_INVOKE + +#include + +#endif diff --git a/include/boost/fusion/include/invoke_function_object.hpp b/include/boost/fusion/include/invoke_function_object.hpp new file mode 100644 index 00000000..4ffeb24d --- /dev/null +++ b/include/boost/fusion/include/invoke_function_object.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INVOKE_FUNCTION_OBJECT) +#define FUSION_INCLUDE_INVOKE_FUNCTION_OBJECT + +#include + +#endif diff --git a/include/boost/fusion/include/invoke_procedure.hpp b/include/boost/fusion/include/invoke_procedure.hpp new file mode 100644 index 00000000..afd46259 --- /dev/null +++ b/include/boost/fusion/include/invoke_procedure.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_INVOKE_PROCEDURE) +#define FUSION_INCLUDE_INVOKE_PROCEDURE + +#include + +#endif diff --git a/include/boost/fusion/include/is_iterator.hpp b/include/boost/fusion/include/is_iterator.hpp new file mode 100644 index 00000000..31348eb7 --- /dev/null +++ b/include/boost/fusion/include/is_iterator.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_IS_ITERATOR) +#define FUSION_INCLUDE_IS_ITERATOR + +#include + +#endif diff --git a/include/boost/fusion/include/is_view.hpp b/include/boost/fusion/include/is_view.hpp new file mode 100644 index 00000000..5ebc3473 --- /dev/null +++ b/include/boost/fusion/include/is_view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_IS_VIEW) +#define FUSION_INCLUDE_IS_VIEW + +#include + +#endif diff --git a/include/boost/fusion/include/iteration.hpp b/include/boost/fusion/include/iteration.hpp new file mode 100644 index 00000000..372aa726 --- /dev/null +++ b/include/boost/fusion/include/iteration.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ITERATION) +#define FUSION_INCLUDE_ITERATION + +#include + +#endif diff --git a/include/boost/fusion/include/iterator.hpp b/include/boost/fusion/include/iterator.hpp new file mode 100644 index 00000000..2ed8e838 --- /dev/null +++ b/include/boost/fusion/include/iterator.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ITERATOR) +#define FUSION_INCLUDE_ITERATOR + +#include + +#endif diff --git a/include/boost/fusion/include/iterator_base.hpp b/include/boost/fusion/include/iterator_base.hpp new file mode 100644 index 00000000..bbd35321 --- /dev/null +++ b/include/boost/fusion/include/iterator_base.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ITERATOR_BASE) +#define FUSION_INCLUDE_ITERATOR_BASE + +#include + +#endif diff --git a/include/boost/fusion/include/iterator_facade.hpp b/include/boost/fusion/include/iterator_facade.hpp new file mode 100644 index 00000000..a36f8b16 --- /dev/null +++ b/include/boost/fusion/include/iterator_facade.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ITERATOR_FACADE) +#define FUSION_INCLUDE_ITERATOR_FACADE + +#include + +#endif diff --git a/include/boost/fusion/include/iterator_range.hpp b/include/boost/fusion/include/iterator_range.hpp new file mode 100644 index 00000000..54eba6dd --- /dev/null +++ b/include/boost/fusion/include/iterator_range.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ITERATOR_RANGE) +#define FUSION_INCLUDE_ITERATOR_RANGE + +#include + +#endif diff --git a/include/boost/fusion/include/joint_view.hpp b/include/boost/fusion/include/joint_view.hpp index c60e34e5..e3d1e204 100644 --- a/include/boost/fusion/include/joint_view.hpp +++ b/include/boost/fusion/include/joint_view.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_JOINT_VIEW) #define FUSION_INCLUDE_JOINT_VIEW -#include +#include #endif diff --git a/include/boost/fusion/include/less.hpp b/include/boost/fusion/include/less.hpp new file mode 100644 index 00000000..bd4d2771 --- /dev/null +++ b/include/boost/fusion/include/less.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_LESS) +#define FUSION_INCLUDE_LESS + +#include + +#endif diff --git a/include/boost/fusion/include/less_equal.hpp b/include/boost/fusion/include/less_equal.hpp new file mode 100644 index 00000000..2ac1b72b --- /dev/null +++ b/include/boost/fusion/include/less_equal.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_LESS_EQUAL) +#define FUSION_INCLUDE_LESS_EQUAL + +#include + +#endif diff --git a/include/boost/fusion/include/list.hpp b/include/boost/fusion/include/list.hpp index fb5c0b42..0a3a1a63 100644 --- a/include/boost/fusion/include/list.hpp +++ b/include/boost/fusion/include/list.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_LIST) #define FUSION_INCLUDE_LIST -#include +#include #endif diff --git a/include/boost/fusion/include/list_fwd.hpp b/include/boost/fusion/include/list_fwd.hpp new file mode 100644 index 00000000..08823bf6 --- /dev/null +++ b/include/boost/fusion/include/list_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_LIST_FWD) +#define FUSION_INCLUDE_LIST_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/list_tie.hpp b/include/boost/fusion/include/list_tie.hpp new file mode 100644 index 00000000..8adbc4c0 --- /dev/null +++ b/include/boost/fusion/include/list_tie.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_GENERATION) +#define FUSION_INCLUDE_GENERATION + +#include +#include + +#endif diff --git a/include/boost/fusion/include/make_cons.hpp b/include/boost/fusion/include/make_cons.hpp index a0181953..76c4caa5 100644 --- a/include/boost/fusion/include/make_cons.hpp +++ b/include/boost/fusion/include/make_cons.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_MAKE_CONS) #define FUSION_INCLUDE_MAKE_CONS -#include +#include #endif diff --git a/include/boost/fusion/include/make_deque.hpp b/include/boost/fusion/include/make_deque.hpp new file mode 100644 index 00000000..35520e8d --- /dev/null +++ b/include/boost/fusion/include/make_deque.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_DEQUE) +#define FUSION_INCLUDE_MAKE_DEQUE + +#include + +#endif diff --git a/include/boost/fusion/include/make_fused.hpp b/include/boost/fusion/include/make_fused.hpp new file mode 100644 index 00000000..6ed860ef --- /dev/null +++ b/include/boost/fusion/include/make_fused.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_FUSED) +#define FUSION_INCLUDE_MAKE_FUSED + +#include + +#endif diff --git a/include/boost/fusion/include/make_fused_function_object.hpp b/include/boost/fusion/include/make_fused_function_object.hpp new file mode 100644 index 00000000..dfc1295b --- /dev/null +++ b/include/boost/fusion/include/make_fused_function_object.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_FUSED_FUNCTION_OBJECT) +#define FUSION_INCLUDE_MAKE_FUSED_FUNCTION_OBJECT + +#include + +#endif diff --git a/include/boost/fusion/include/make_fused_procedure.hpp b/include/boost/fusion/include/make_fused_procedure.hpp new file mode 100644 index 00000000..94e44717 --- /dev/null +++ b/include/boost/fusion/include/make_fused_procedure.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_FUSED_PROCEDURE) +#define FUSION_INCLUDE_MAKE_FUSED_PROCEDURE + +#include + +#endif diff --git a/include/boost/fusion/include/make_list.hpp b/include/boost/fusion/include/make_list.hpp new file mode 100644 index 00000000..7adb3507 --- /dev/null +++ b/include/boost/fusion/include/make_list.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_LIST) +#define FUSION_INCLUDE_MAKE_LIST + +#include + +#endif diff --git a/include/boost/fusion/include/make_map.hpp b/include/boost/fusion/include/make_map.hpp new file mode 100644 index 00000000..90d59921 --- /dev/null +++ b/include/boost/fusion/include/make_map.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_MAP) +#define FUSION_INCLUDE_MAKE_MAP + +#include + +#endif diff --git a/include/boost/fusion/include/make_set.hpp b/include/boost/fusion/include/make_set.hpp new file mode 100644 index 00000000..19f344f6 --- /dev/null +++ b/include/boost/fusion/include/make_set.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_SET) +#define FUSION_INCLUDE_MAKE_SET + +#include + +#endif diff --git a/include/boost/fusion/include/make_tuple.hpp b/include/boost/fusion/include/make_tuple.hpp new file mode 100644 index 00000000..8cfbdc8e --- /dev/null +++ b/include/boost/fusion/include/make_tuple.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_TUPLE) +#define FUSION_INCLUDE_MAKE_TUPLE + +#include + +#endif diff --git a/include/boost/fusion/include/make_unfused_generic.hpp b/include/boost/fusion/include/make_unfused_generic.hpp new file mode 100644 index 00000000..dcebceb1 --- /dev/null +++ b/include/boost/fusion/include/make_unfused_generic.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_UNFUSED_GENERIC) +#define FUSION_INCLUDE_MAKE_UNFUSED_GENERIC + +#include + +#endif diff --git a/include/boost/fusion/include/make_unfused_lvalue_args.hpp b/include/boost/fusion/include/make_unfused_lvalue_args.hpp new file mode 100644 index 00000000..1805bb18 --- /dev/null +++ b/include/boost/fusion/include/make_unfused_lvalue_args.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_UNFUSED_LVALUE_ARGS) +#define FUSION_INCLUDE_MAKE_UNFUSED_LVALUE_ARGS + +#include + +#endif diff --git a/include/boost/fusion/include/make_unfused_rvalue_args.hpp b/include/boost/fusion/include/make_unfused_rvalue_args.hpp new file mode 100644 index 00000000..0d546be7 --- /dev/null +++ b/include/boost/fusion/include/make_unfused_rvalue_args.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAKE_UNFUSED_RVALUE_ARGS) +#define FUSION_INCLUDE_MAKE_UNFUSED_RVALUE_ARGS + +#include + +#endif diff --git a/include/boost/fusion/include/make_vector.hpp b/include/boost/fusion/include/make_vector.hpp index d2a90cb4..b165ba3e 100644 --- a/include/boost/fusion/include/make_vector.hpp +++ b/include/boost/fusion/include/make_vector.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_MAKE_VECTOR) #define FUSION_INCLUDE_MAKE_VECTOR -#include +#include #endif diff --git a/include/boost/fusion/include/map.hpp b/include/boost/fusion/include/map.hpp new file mode 100644 index 00000000..07441b4a --- /dev/null +++ b/include/boost/fusion/include/map.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAP) +#define FUSION_INCLUDE_MAP + +#include + +#endif diff --git a/include/boost/fusion/include/map_fwd.hpp b/include/boost/fusion/include/map_fwd.hpp new file mode 100644 index 00000000..970c4132 --- /dev/null +++ b/include/boost/fusion/include/map_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAP_FWD) +#define FUSION_INCLUDE_MAP_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/map_tie.hpp b/include/boost/fusion/include/map_tie.hpp new file mode 100644 index 00000000..89aeb716 --- /dev/null +++ b/include/boost/fusion/include/map_tie.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_MAP_TIE) +#define FUSION_INCLUDE_MAP_TIE + +#include + +#endif diff --git a/include/boost/fusion/include/mpl.hpp b/include/boost/fusion/include/mpl.hpp index 5e3f906d..8a1cbfd0 100644 --- a/include/boost/fusion/include/mpl.hpp +++ b/include/boost/fusion/include/mpl.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_INCLUDE_MPL) #define FUSION_INCLUDE_MPL -#include -#include +#include +#include #endif diff --git a/include/boost/fusion/include/none.hpp b/include/boost/fusion/include/none.hpp new file mode 100644 index 00000000..19720ef8 --- /dev/null +++ b/include/boost/fusion/include/none.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_NONE) +#define FUSION_INCLUDE_NONE + +#include + +#endif diff --git a/include/boost/fusion/include/not_equal_to.hpp b/include/boost/fusion/include/not_equal_to.hpp new file mode 100644 index 00000000..9e23b899 --- /dev/null +++ b/include/boost/fusion/include/not_equal_to.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_NOT_EQUAL_TO) +#define FUSION_INCLUDE_NOT_EQUAL_TO + +#include +#include + +#endif diff --git a/include/boost/fusion/include/out.hpp b/include/boost/fusion/include/out.hpp new file mode 100644 index 00000000..9ecef3e7 --- /dev/null +++ b/include/boost/fusion/include/out.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 Hartmut Kaiser + + 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_INCLUDE_OUT) +#define FUSION_INCLUDE_OUT + +#include + +#endif diff --git a/include/boost/fusion/include/pair.hpp b/include/boost/fusion/include/pair.hpp new file mode 100644 index 00000000..97ebfcd8 --- /dev/null +++ b/include/boost/fusion/include/pair.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_PAIR) +#define FUSION_INCLUDE_PAIR + +#include + +#endif diff --git a/include/boost/fusion/include/pair_tie.hpp b/include/boost/fusion/include/pair_tie.hpp new file mode 100644 index 00000000..ac192cad --- /dev/null +++ b/include/boost/fusion/include/pair_tie.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_PAIR_TIE) +#define FUSION_INCLUDE_PAIR_TIE + +#include + +#endif diff --git a/include/boost/fusion/include/pop_back.hpp b/include/boost/fusion/include/pop_back.hpp new file mode 100644 index 00000000..b5a808cd --- /dev/null +++ b/include/boost/fusion/include/pop_back.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_POP_BACK) +#define FUSION_INCLUDE_POP_BACK + +#include + +#endif diff --git a/include/boost/fusion/include/pop_front.hpp b/include/boost/fusion/include/pop_front.hpp new file mode 100644 index 00000000..7df977e0 --- /dev/null +++ b/include/boost/fusion/include/pop_front.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_POP_FRONT) +#define FUSION_INCLUDE_POP_FRONT + +#include + +#endif diff --git a/include/boost/fusion/include/prior.hpp b/include/boost/fusion/include/prior.hpp new file mode 100644 index 00000000..b18a55a3 --- /dev/null +++ b/include/boost/fusion/include/prior.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_PRIOR) +#define FUSION_INCLUDE_PRIOR + +#include + +#endif diff --git a/include/boost/fusion/include/push_back.hpp b/include/boost/fusion/include/push_back.hpp new file mode 100644 index 00000000..4908e87c --- /dev/null +++ b/include/boost/fusion/include/push_back.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_PUSH_BACK) +#define FUSION_INCLUDE_PUSH_BACK + +#include + +#endif diff --git a/include/boost/fusion/include/query.hpp b/include/boost/fusion/include/query.hpp new file mode 100644 index 00000000..6e5144b5 --- /dev/null +++ b/include/boost/fusion/include/query.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_QUERY) +#define FUSION_INCLUDE_QUERY + +#include + +#endif diff --git a/include/boost/fusion/include/remove.hpp b/include/boost/fusion/include/remove.hpp new file mode 100644 index 00000000..7f0b4657 --- /dev/null +++ b/include/boost/fusion/include/remove.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REMOVE_IF) +#define FUSION_INCLUDE_REMOVE_IF + +#include + +#endif diff --git a/include/boost/fusion/include/remove_if.hpp b/include/boost/fusion/include/remove_if.hpp new file mode 100644 index 00000000..7f0b4657 --- /dev/null +++ b/include/boost/fusion/include/remove_if.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REMOVE_IF) +#define FUSION_INCLUDE_REMOVE_IF + +#include + +#endif diff --git a/include/boost/fusion/include/repetetive_view.hpp b/include/boost/fusion/include/repetetive_view.hpp new file mode 100644 index 00000000..f56bca88 --- /dev/null +++ b/include/boost/fusion/include/repetetive_view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REPETETIVE_VIEW) +#define FUSION_INCLUDE_REPETETIVE_VIEW + +#include + +#endif diff --git a/include/boost/fusion/include/replace.hpp b/include/boost/fusion/include/replace.hpp new file mode 100644 index 00000000..4d0b3af8 --- /dev/null +++ b/include/boost/fusion/include/replace.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REPLACE) +#define FUSION_INCLUDE_REPLACE + +#include + +#endif diff --git a/include/boost/fusion/include/replace_if.hpp b/include/boost/fusion/include/replace_if.hpp new file mode 100644 index 00000000..354e13ab --- /dev/null +++ b/include/boost/fusion/include/replace_if.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REPLACE_IF) +#define FUSION_INCLUDE_REPLACE_IF + +#include + +#endif diff --git a/include/boost/fusion/include/reverse.hpp b/include/boost/fusion/include/reverse.hpp new file mode 100644 index 00000000..3f9fd782 --- /dev/null +++ b/include/boost/fusion/include/reverse.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REVERSE) +#define FUSION_INCLUDE_REVERSE + +#include + +#endif diff --git a/include/boost/fusion/include/reverse_view.hpp b/include/boost/fusion/include/reverse_view.hpp new file mode 100644 index 00000000..844532d6 --- /dev/null +++ b/include/boost/fusion/include/reverse_view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_REVERSE_VIEW) +#define FUSION_INCLUDE_REVERSE_VIEW + +#include + +#endif diff --git a/include/boost/fusion/include/sequence.hpp b/include/boost/fusion/include/sequence.hpp new file mode 100644 index 00000000..09cded77 --- /dev/null +++ b/include/boost/fusion/include/sequence.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SEQUENCE) +#define FUSION_INCLUDE_SEQUENCE + +#include + +#endif diff --git a/include/boost/fusion/include/sequence_base.hpp b/include/boost/fusion/include/sequence_base.hpp new file mode 100644 index 00000000..7e50a237 --- /dev/null +++ b/include/boost/fusion/include/sequence_base.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SEQUENCE_BASE) +#define FUSION_INCLUDE_SEQUENCE_BASE + +#include + +#endif diff --git a/include/boost/fusion/include/sequence_facade.hpp b/include/boost/fusion/include/sequence_facade.hpp new file mode 100644 index 00000000..b8773e28 --- /dev/null +++ b/include/boost/fusion/include/sequence_facade.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SEQUENCE_FACADE) +#define FUSION_INCLUDE_SEQUENCE_FACADE + +#include + +#endif diff --git a/include/boost/fusion/include/set.hpp b/include/boost/fusion/include/set.hpp new file mode 100644 index 00000000..90dd5004 --- /dev/null +++ b/include/boost/fusion/include/set.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SET) +#define FUSION_INCLUDE_SET + +#include + +#endif diff --git a/include/boost/fusion/include/set_fwd.hpp b/include/boost/fusion/include/set_fwd.hpp new file mode 100644 index 00000000..9bc45ad5 --- /dev/null +++ b/include/boost/fusion/include/set_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SET_FWD) +#define FUSION_INCLUDE_SET_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/single_view.hpp b/include/boost/fusion/include/single_view.hpp index ae60d867..a95d04a8 100644 --- a/include/boost/fusion/include/single_view.hpp +++ b/include/boost/fusion/include/single_view.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_SINGLE_VIEW) #define FUSION_INCLUDE_SINGLE_VIEW -#include +#include #endif diff --git a/include/boost/fusion/include/size.hpp b/include/boost/fusion/include/size.hpp new file mode 100644 index 00000000..02d2a00f --- /dev/null +++ b/include/boost/fusion/include/size.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SIZE) +#define FUSION_INCLUDE_SIZE + +#include + +#endif diff --git a/include/boost/fusion/include/std_pair.hpp b/include/boost/fusion/include/std_pair.hpp index bb4d5952..98f37c86 100644 --- a/include/boost/fusion/include/std_pair.hpp +++ b/include/boost/fusion/include/std_pair.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_STD_PAIR) #define FUSION_INCLUDE_STD_PAIR -#include +#include #endif diff --git a/include/boost/fusion/include/struct.hpp b/include/boost/fusion/include/struct.hpp new file mode 100644 index 00000000..f0886aab --- /dev/null +++ b/include/boost/fusion/include/struct.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_STRUCT) +#define FUSION_INCLUDE_STRUCT + +#include + +#endif diff --git a/include/boost/fusion/include/support.hpp b/include/boost/fusion/include/support.hpp new file mode 100644 index 00000000..d57eafeb --- /dev/null +++ b/include/boost/fusion/include/support.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_SUPPORT) +#define FUSION_INCLUDE_SUPPORT + +#include + +#endif diff --git a/include/boost/fusion/include/tag_of.hpp b/include/boost/fusion/include/tag_of.hpp new file mode 100644 index 00000000..f15b41b5 --- /dev/null +++ b/include/boost/fusion/include/tag_of.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TAG_OF) +#define FUSION_INCLUDE_TAG_OF + +#include + +#endif diff --git a/include/boost/fusion/include/tag_of_fwd.hpp b/include/boost/fusion/include/tag_of_fwd.hpp new file mode 100644 index 00000000..fbc7ebe7 --- /dev/null +++ b/include/boost/fusion/include/tag_of_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TAG_OF_FWD) +#define FUSION_INCLUDE_TAG_OF_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/transform_view.hpp b/include/boost/fusion/include/transform_view.hpp index 7564c6ab..3aceaaee 100644 --- a/include/boost/fusion/include/transform_view.hpp +++ b/include/boost/fusion/include/transform_view.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_TRANSFORM_VIEW) #define FUSION_INCLUDE_TRANSFORM_VIEW -#include +#include #endif diff --git a/include/boost/fusion/include/transformation.hpp b/include/boost/fusion/include/transformation.hpp new file mode 100644 index 00000000..f14ab70c --- /dev/null +++ b/include/boost/fusion/include/transformation.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TRANSFORMATION) +#define FUSION_INCLUDE_TRANSFORMATION + +#include + +#endif diff --git a/include/boost/fusion/include/tuple.hpp b/include/boost/fusion/include/tuple.hpp new file mode 100644 index 00000000..52e53fb5 --- /dev/null +++ b/include/boost/fusion/include/tuple.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TUPLE) +#define FUSION_INCLUDE_TUPLE + +#include + +#endif diff --git a/include/boost/fusion/include/tuple_fwd.hpp b/include/boost/fusion/include/tuple_fwd.hpp new file mode 100644 index 00000000..a66653a3 --- /dev/null +++ b/include/boost/fusion/include/tuple_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TUPLE_FWD) +#define FUSION_INCLUDE_TUPLE_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/tuple_tie.hpp b/include/boost/fusion/include/tuple_tie.hpp new file mode 100644 index 00000000..677976a6 --- /dev/null +++ b/include/boost/fusion/include/tuple_tie.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_TUPLE_TIE) +#define FUSION_INCLUDE_TUPLE_TIE + +#include + +#endif diff --git a/include/boost/fusion/include/unfused_generic.hpp b/include/boost/fusion/include/unfused_generic.hpp new file mode 100644 index 00000000..d377900f --- /dev/null +++ b/include/boost/fusion/include/unfused_generic.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_UNFUSED_GENERIC) +#define FUSION_INCLUDE_UNFUSED_GENERIC + +#include + +#endif diff --git a/include/boost/fusion/include/unfused_lvalue_args.hpp b/include/boost/fusion/include/unfused_lvalue_args.hpp new file mode 100644 index 00000000..17acc261 --- /dev/null +++ b/include/boost/fusion/include/unfused_lvalue_args.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_UNFUSED_LVALUE_ARGS) +#define FUSION_INCLUDE_UNFUSED_LVALUE_ARGS + +#include + +#endif diff --git a/include/boost/fusion/include/unfused_rvalue_args.hpp b/include/boost/fusion/include/unfused_rvalue_args.hpp new file mode 100644 index 00000000..556b2dee --- /dev/null +++ b/include/boost/fusion/include/unfused_rvalue_args.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_UNFUSED_RVALUE_ARGS) +#define FUSION_INCLUDE_UNFUSED_RVALUE_ARGS + +#include + +#endif diff --git a/include/boost/fusion/include/unfused_typed.hpp b/include/boost/fusion/include/unfused_typed.hpp new file mode 100644 index 00000000..a118b306 --- /dev/null +++ b/include/boost/fusion/include/unfused_typed.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_UNFUSED_TYPED) +#define FUSION_INCLUDE_UNFUSED_TYPED + +#include + +#endif diff --git a/include/boost/fusion/include/unused.hpp b/include/boost/fusion/include/unused.hpp new file mode 100644 index 00000000..f91ea8fe --- /dev/null +++ b/include/boost/fusion/include/unused.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_UNUSED) +#define FUSION_INCLUDE_UNUSED + +#include + +#endif diff --git a/include/boost/fusion/include/value_at_key.hpp b/include/boost/fusion/include/value_at_key.hpp new file mode 100644 index 00000000..4ab3dc14 --- /dev/null +++ b/include/boost/fusion/include/value_at_key.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VALUE_AT_KEY) +#define FUSION_INCLUDE_VALUE_AT_KEY + +#include + +#endif diff --git a/include/boost/fusion/include/vector.hpp b/include/boost/fusion/include/vector.hpp index e49568e2..689c2f88 100644 --- a/include/boost/fusion/include/vector.hpp +++ b/include/boost/fusion/include/vector.hpp @@ -1,12 +1,12 @@ /*============================================================================= Copyright (c) 2001-2007 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_INCLUDE_VECTOR) #define FUSION_INCLUDE_VECTOR -#include +#include #endif diff --git a/include/boost/fusion/include/vector10.hpp b/include/boost/fusion/include/vector10.hpp new file mode 100644 index 00000000..d3e10ddc --- /dev/null +++ b/include/boost/fusion/include/vector10.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR10) +#define FUSION_INCLUDE_VECTOR10 + +#include + +#endif diff --git a/include/boost/fusion/include/vector20.hpp b/include/boost/fusion/include/vector20.hpp new file mode 100644 index 00000000..accda290 --- /dev/null +++ b/include/boost/fusion/include/vector20.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR20) +#define FUSION_INCLUDE_VECTOR20 + +#include + +#endif diff --git a/include/boost/fusion/include/vector30.hpp b/include/boost/fusion/include/vector30.hpp new file mode 100644 index 00000000..72a72a25 --- /dev/null +++ b/include/boost/fusion/include/vector30.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR30) +#define FUSION_INCLUDE_VECTOR30 + +#include + +#endif diff --git a/include/boost/fusion/include/vector40.hpp b/include/boost/fusion/include/vector40.hpp new file mode 100644 index 00000000..427c5319 --- /dev/null +++ b/include/boost/fusion/include/vector40.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR40) +#define FUSION_INCLUDE_VECTOR40 + +#include + +#endif diff --git a/include/boost/fusion/include/vector50.hpp b/include/boost/fusion/include/vector50.hpp new file mode 100644 index 00000000..5980373b --- /dev/null +++ b/include/boost/fusion/include/vector50.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR50) +#define FUSION_INCLUDE_VECTOR50 + +#include + +#endif diff --git a/include/boost/fusion/include/vector_fwd.hpp b/include/boost/fusion/include/vector_fwd.hpp new file mode 100644 index 00000000..578754fb --- /dev/null +++ b/include/boost/fusion/include/vector_fwd.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VECTOR_FWD) +#define FUSION_INCLUDE_VECTOR_FWD + +#include + +#endif diff --git a/include/boost/fusion/include/vector_tie.hpp b/include/boost/fusion/include/vector_tie.hpp index 35f4abed..3a0431c1 100644 --- a/include/boost/fusion/include/vector_tie.hpp +++ b/include/boost/fusion/include/vector_tie.hpp @@ -7,6 +7,6 @@ #if !defined(FUSION_INCLUDE_VECTOR_TIE) #define FUSION_INCLUDE_VECTOR_TIE -#include +#include #endif diff --git a/include/boost/fusion/include/view.hpp b/include/boost/fusion/include/view.hpp new file mode 100644 index 00000000..48405df8 --- /dev/null +++ b/include/boost/fusion/include/view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VIEW) +#define FUSION_INCLUDE_VIEW + +#include + +#endif diff --git a/include/boost/fusion/include/void.hpp b/include/boost/fusion/include/void.hpp new file mode 100644 index 00000000..b3e9cf27 --- /dev/null +++ b/include/boost/fusion/include/void.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_VOID) +#define FUSION_INCLUDE_VOID + +#include + +#endif diff --git a/include/boost/fusion/include/zip.hpp b/include/boost/fusion/include/zip.hpp new file mode 100644 index 00000000..8a565610 --- /dev/null +++ b/include/boost/fusion/include/zip.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ZIP) +#define FUSION_INCLUDE_ZIP + +#include + +#endif diff --git a/include/boost/fusion/include/zip_view.hpp b/include/boost/fusion/include/zip_view.hpp new file mode 100644 index 00000000..1aecfd4d --- /dev/null +++ b/include/boost/fusion/include/zip_view.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2007 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_INCLUDE_ZIP_VIEW) +#define FUSION_INCLUDE_ZIP_VIEW + +#include + +#endif diff --git a/include/boost/fusion/iterator/mpl/convert_iterator.hpp b/include/boost/fusion/iterator/mpl/convert_iterator.hpp index fc2efacf..5716ce4e 100644 --- a/include/boost/fusion/iterator/mpl/convert_iterator.hpp +++ b/include/boost/fusion/iterator/mpl/convert_iterator.hpp @@ -1,19 +1,21 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_CONVERT_ITERATOR_05062005_1218) #define FUSION_CONVERT_ITERATOR_05062005_1218 #include -#include #include #include namespace boost { namespace fusion { + template + struct mpl_iterator; // forward declaration + // Test T. If it is a fusion iterator, return a reference to it. // else, assume it is an mpl iterator. diff --git a/include/boost/fusion/mpl.hpp b/include/boost/fusion/mpl.hpp index 6eb2538b..e499df93 100644 --- a/include/boost/fusion/mpl.hpp +++ b/include/boost/fusion/mpl.hpp @@ -1,7 +1,7 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_MPL_09172006_2049) @@ -9,7 +9,24 @@ // The fusion <--> MPL link headers #include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #endif diff --git a/include/boost/fusion/mpl/at.hpp b/include/boost/fusion/mpl/at.hpp new file mode 100644 index 00000000..a164bb32 --- /dev/null +++ b/include/boost/fusion/mpl/at.hpp @@ -0,0 +1,33 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_10022005_1616) +#define FUSION_AT_10022005_1616 + +#include +#include + +namespace boost { +namespace fusion +{ + struct fusion_sequence_tag; +} + +namespace mpl +{ + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply : fusion::result_of::value_at {}; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/back.hpp b/include/boost/fusion/mpl/back.hpp new file mode 100644 index 00000000..1f5197e2 --- /dev/null +++ b/include/boost/fusion/mpl/back.hpp @@ -0,0 +1,32 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BACK_10022005_1620) +#define FUSION_BACK_10022005_1620 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct back_impl; + + template <> + struct back_impl + { + template + struct apply : + fusion::result_of::value_of< + typename fusion::result_of::prior< + typename fusion::result_of::end::type + >::type> {}; + }; +}} + +#endif diff --git a/include/boost/fusion/mpl/begin.hpp b/include/boost/fusion/mpl/begin.hpp new file mode 100644 index 00000000..be8b3142 --- /dev/null +++ b/include/boost/fusion/mpl/begin.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_10022005_1620) +#define FUSION_BEGIN_10022005_1620 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef fusion_iterator::type> type; + }; + }; +}} + +#endif diff --git a/include/boost/fusion/mpl/clear.hpp b/include/boost/fusion/mpl/clear.hpp new file mode 100644 index 00000000..14b3489e --- /dev/null +++ b/include/boost/fusion/mpl/clear.hpp @@ -0,0 +1,33 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CLEAR_10022005_1817) +#define FUSION_CLEAR_10022005_1817 + +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct clear_impl; + + template <> + struct clear_impl + { + template + struct apply + { + typedef typename + fusion::detail::clear::type>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/detail/clear.hpp b/include/boost/fusion/mpl/detail/clear.hpp new file mode 100644 index 00000000..d8c32d5a --- /dev/null +++ b/include/boost/fusion/mpl/detail/clear.hpp @@ -0,0 +1,46 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CLEAR_10022005_1442) +#define FUSION_CLEAR_10022005_1442 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct cons_tag; + struct map_tag; + struct set_tag; + struct vector_tag; + struct deque_tag; + + namespace detail + { + template + struct clear; + + template <> + struct clear : mpl::identity > {}; + + template <> + struct clear : mpl::identity > {}; + + template <> + struct clear : mpl::identity > {}; + + template <> + struct clear : mpl::identity > {}; + + template <> + struct clear : mpl::identity > {}; + } +}} + +#endif diff --git a/include/boost/fusion/mpl/empty.hpp b/include/boost/fusion/mpl/empty.hpp new file mode 100644 index 00000000..a0e27d66 --- /dev/null +++ b/include/boost/fusion/mpl/empty.hpp @@ -0,0 +1,26 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_EMPTY_10022005_1619) +#define FUSION_EMPTY_10022005_1619 + +#include +#include + +namespace boost { namespace mpl +{ + template + struct empty_impl; + + template <> + struct empty_impl + { + template + struct apply : fusion::result_of::empty {}; + }; +}} + +#endif diff --git a/include/boost/fusion/mpl/end.hpp b/include/boost/fusion/mpl/end.hpp new file mode 100644 index 00000000..ed3320b2 --- /dev/null +++ b/include/boost/fusion/mpl/end.hpp @@ -0,0 +1,31 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_10022005_1619) +#define FUSION_END_10022005_1619 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef fusion_iterator::type> type; + }; + }; +}} + +#endif diff --git a/include/boost/fusion/mpl/erase.hpp b/include/boost/fusion/mpl/erase.hpp new file mode 100644 index 00000000..a8b092ae --- /dev/null +++ b/include/boost/fusion/mpl/erase.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ERASE_10022005_1835) +#define FUSION_ERASE_10022005_1835 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct erase_impl; + + template <> + struct erase_impl + { + template + struct apply + { + typedef typename + fusion::result_of::erase::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/erase_key.hpp b/include/boost/fusion/mpl/erase_key.hpp new file mode 100644 index 00000000..3cda2686 --- /dev/null +++ b/include/boost/fusion/mpl/erase_key.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ERASE_KEY_10022005_1907) +#define FUSION_ERASE_KEY_10022005_1907 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct erase_key_impl; + + template <> + struct erase_key_impl + { + template + struct apply + { + typedef typename + fusion::result_of::erase_key::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/front.hpp b/include/boost/fusion/mpl/front.hpp new file mode 100644 index 00000000..97a26f73 --- /dev/null +++ b/include/boost/fusion/mpl/front.hpp @@ -0,0 +1,28 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_FRONT_10022005_1618) +#define FUSION_FRONT_10022005_1618 + +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct front_impl; + + template <> + struct front_impl + { + template + struct apply : + fusion::result_of::value_of::type> {}; + }; +}} + +#endif diff --git a/include/boost/fusion/mpl/has_key.hpp b/include/boost/fusion/mpl/has_key.hpp new file mode 100644 index 00000000..beac7c64 --- /dev/null +++ b/include/boost/fusion/mpl/has_key.hpp @@ -0,0 +1,27 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_HAS_KEY_10022005_1617) +#define FUSION_HAS_KEY_10022005_1617 + +#include +#include + +namespace boost { namespace mpl +{ + template + struct has_key_impl; + + template <> + struct has_key_impl + { + template + struct apply : fusion::result_of::has_key {}; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/insert.hpp b/include/boost/fusion/mpl/insert.hpp new file mode 100644 index 00000000..76918ce9 --- /dev/null +++ b/include/boost/fusion/mpl/insert.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_INSERT_10022005_1837) +#define FUSION_INSERT_10022005_1837 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct insert_impl; + + template <> + struct insert_impl + { + template + struct apply + { + typedef typename + fusion::result_of::insert::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/insert_range.hpp b/include/boost/fusion/mpl/insert_range.hpp new file mode 100644 index 00000000..4da39365 --- /dev/null +++ b/include/boost/fusion/mpl/insert_range.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_INSERT_RANGE_10022005_1838) +#define FUSION_INSERT_RANGE_10022005_1838 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct insert_range_impl; + + template <> + struct insert_range_impl + { + template + struct apply + { + typedef typename + fusion::result_of::insert_range::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/pop_back.hpp b/include/boost/fusion/mpl/pop_back.hpp new file mode 100644 index 00000000..84bd75a4 --- /dev/null +++ b/include/boost/fusion/mpl/pop_back.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_POP_BACK_10022005_1801) +#define FUSION_POP_BACK_10022005_1801 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct pop_back_impl; + + template <> + struct pop_back_impl + { + template + struct apply + { + typedef typename + fusion::result_of::pop_back::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/pop_front.hpp b/include/boost/fusion/mpl/pop_front.hpp new file mode 100644 index 00000000..ffe6c302 --- /dev/null +++ b/include/boost/fusion/mpl/pop_front.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_POP_FRONT_10022005_1800) +#define FUSION_POP_FRONT_10022005_1800 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct pop_front_impl; + + template <> + struct pop_front_impl + { + template + struct apply + { + typedef typename + fusion::result_of::pop_front::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/push_back.hpp b/include/boost/fusion/mpl/push_back.hpp new file mode 100644 index 00000000..e96faa06 --- /dev/null +++ b/include/boost/fusion/mpl/push_back.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PUSH_BACK_10022005_1647) +#define FUSION_PUSH_BACK_10022005_1647 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct push_back_impl; + + template <> + struct push_back_impl + { + template + struct apply + { + typedef typename + fusion::result_of::push_back::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/push_front.hpp b/include/boost/fusion/mpl/push_front.hpp new file mode 100644 index 00000000..c508d652 --- /dev/null +++ b/include/boost/fusion/mpl/push_front.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PUSH_FRONT_10022005_1720) +#define FUSION_PUSH_FRONT_10022005_1720 + +#include +#include +#include +#include + +namespace boost { namespace mpl +{ + template + struct push_front_impl; + + template <> + struct push_front_impl + { + template + struct apply + { + typedef typename + fusion::result_of::push_front::type + result; + + typedef typename + fusion::result_of::convert< + typename fusion::detail::tag_of::type, result>::type + type; + }; + }; +}} + +#endif + diff --git a/include/boost/fusion/mpl/size.hpp b/include/boost/fusion/mpl/size.hpp new file mode 100644 index 00000000..2c724281 --- /dev/null +++ b/include/boost/fusion/mpl/size.hpp @@ -0,0 +1,26 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SIZE_10022005_1617) +#define FUSION_SIZE_10022005_1617 + +#include +#include + +namespace boost { namespace mpl +{ + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply : fusion::result_of::size {}; + }; +}} + +#endif diff --git a/include/boost/fusion/sequence.hpp b/include/boost/fusion/sequence.hpp index 9a794c2e..9c3ed873 100644 --- a/include/boost/fusion/sequence.hpp +++ b/include/boost/fusion/sequence.hpp @@ -8,13 +8,9 @@ #define FUSION_ITERATOR_10022005_0559 #include -#include #include -#include -#include #include #include -#include -#include +#include #endif diff --git a/include/boost/fusion/sequence/comparison/detail/equal_to.hpp b/include/boost/fusion/sequence/comparison/detail/equal_to.hpp index c4f91238..6c78408a 100644 --- a/include/boost/fusion/sequence/comparison/detail/equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/detail/equal_to.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/detail/greater.hpp b/include/boost/fusion/sequence/comparison/detail/greater.hpp index 34cf1448..6807d367 100644 --- a/include/boost/fusion/sequence/comparison/detail/greater.hpp +++ b/include/boost/fusion/sequence/comparison/detail/greater.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp b/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp index 0cf4c388..08b98760 100644 --- a/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp +++ b/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/detail/less.hpp b/include/boost/fusion/sequence/comparison/detail/less.hpp index 3fc6429f..0c457c41 100644 --- a/include/boost/fusion/sequence/comparison/detail/less.hpp +++ b/include/boost/fusion/sequence/comparison/detail/less.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/detail/less_equal.hpp b/include/boost/fusion/sequence/comparison/detail/less_equal.hpp index 3d48ae5c..ee8a111e 100644 --- a/include/boost/fusion/sequence/comparison/detail/less_equal.hpp +++ b/include/boost/fusion/sequence/comparison/detail/less_equal.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp b/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp index 87911b6d..5e939675 100644 --- a/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/equal_to.hpp b/include/boost/fusion/sequence/comparison/equal_to.hpp index cea3c9c1..fb27f15c 100644 --- a/include/boost/fusion/sequence/comparison/equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/equal_to.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/greater.hpp b/include/boost/fusion/sequence/comparison/greater.hpp index 3ef215a1..8df806e4 100644 --- a/include/boost/fusion/sequence/comparison/greater.hpp +++ b/include/boost/fusion/sequence/comparison/greater.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/greater_equal.hpp b/include/boost/fusion/sequence/comparison/greater_equal.hpp index df365c3a..3a20e0e8 100644 --- a/include/boost/fusion/sequence/comparison/greater_equal.hpp +++ b/include/boost/fusion/sequence/comparison/greater_equal.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/less.hpp b/include/boost/fusion/sequence/comparison/less.hpp index 4d3c086c..a86c3517 100644 --- a/include/boost/fusion/sequence/comparison/less.hpp +++ b/include/boost/fusion/sequence/comparison/less.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/less_equal.hpp b/include/boost/fusion/sequence/comparison/less_equal.hpp index 0f5a953c..518e1c0f 100644 --- a/include/boost/fusion/sequence/comparison/less_equal.hpp +++ b/include/boost/fusion/sequence/comparison/less_equal.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/comparison/not_equal_to.hpp b/include/boost/fusion/sequence/comparison/not_equal_to.hpp index 34d2cab6..54648e16 100644 --- a/include/boost/fusion/sequence/comparison/not_equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/not_equal_to.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/convert.hpp b/include/boost/fusion/sequence/convert.hpp new file mode 100644 index 00000000..a6e3ccca --- /dev/null +++ b/include/boost/fusion/sequence/convert.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_CONVERT_10022005_1442) +#define FUSION_CONVERT_10022005_1442 + +namespace boost { namespace fusion +{ + namespace extension + { + template + struct convert_impl; + } + + namespace result_of + { + template + struct convert + { + typedef typename extension::convert_impl gen; + + typedef typename + gen::template apply::type + type; + }; + } + + template + inline typename result_of::convert::type + convert(Sequence& seq) + { + typedef typename result_of::convert::gen gen; + return gen::call(seq); + } + + template + inline typename result_of::convert::type + convert(Sequence const& seq) + { + typedef typename result_of::convert::gen gen; + return gen::call(seq); + } +}} + +#endif diff --git a/include/boost/fusion/sequence/intrinsic.hpp b/include/boost/fusion/sequence/intrinsic.hpp index 59aaf9ff..8c5f4abd 100644 --- a/include/boost/fusion/sequence/intrinsic.hpp +++ b/include/boost/fusion/sequence/intrinsic.hpp @@ -1,7 +1,7 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_INTRINSIC_10022005_0618) @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/include/boost/fusion/sequence/intrinsic/at_c.hpp b/include/boost/fusion/sequence/intrinsic/at_c.hpp new file mode 100644 index 00000000..4dc53ae0 --- /dev/null +++ b/include/boost/fusion/sequence/intrinsic/at_c.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_AT_C_08252008_0308) +#define FUSION_AT_C_08252008_0308 + +#include + +#endif + diff --git a/include/boost/fusion/sequence/intrinsic/ext_/segments.hpp b/include/boost/fusion/sequence/intrinsic/ext_/segments.hpp old mode 100755 new mode 100644 diff --git a/include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp b/include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp old mode 100755 new mode 100644 diff --git a/include/boost/fusion/sequence/intrinsic/swap.hpp b/include/boost/fusion/sequence/intrinsic/swap.hpp index 90570c1f..7a385ae8 100644 --- a/include/boost/fusion/sequence/intrinsic/swap.hpp +++ b/include/boost/fusion/sequence/intrinsic/swap.hpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include diff --git a/include/boost/fusion/sequence/io/detail/in.hpp b/include/boost/fusion/sequence/io/detail/in.hpp index 93d63791..cd772514 100644 --- a/include/boost/fusion/sequence/io/detail/in.hpp +++ b/include/boost/fusion/sequence/io/detail/in.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 1999-2003 Jeremiah Willcock Copyright (c) 2001-2006 Joel de Guzman diff --git a/include/boost/fusion/sequence/io/detail/manip.hpp b/include/boost/fusion/sequence/io/detail/manip.hpp index 382eb32f..dd9a5265 100644 --- a/include/boost/fusion/sequence/io/detail/manip.hpp +++ b/include/boost/fusion/sequence/io/detail/manip.hpp @@ -1,6 +1,6 @@ /*============================================================================= Copyright (c) 1999-2003 Jeremiah Willcock - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/sequence/io/detail/out.hpp b/include/boost/fusion/sequence/io/detail/out.hpp index bd74e20a..c8ab2085 100644 --- a/include/boost/fusion/sequence/io/detail/out.hpp +++ b/include/boost/fusion/sequence/io/detail/out.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 1999-2003 Jeremiah Willcock Copyright (c) 2001-2006 Joel de Guzman diff --git a/include/boost/fusion/sequence/io/in.hpp b/include/boost/fusion/sequence/io/in.hpp index 039190eb..19142d46 100644 --- a/include/boost/fusion/sequence/io/in.hpp +++ b/include/boost/fusion/sequence/io/in.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 1999-2003 Jeremiah Willcock Copyright (c) 2001-2006 Joel de Guzman diff --git a/include/boost/fusion/sequence/io/out.hpp b/include/boost/fusion/sequence/io/out.hpp index 48098e57..017f0e97 100644 --- a/include/boost/fusion/sequence/io/out.hpp +++ b/include/boost/fusion/sequence/io/out.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 1999-2003 Jeremiah Willcock Copyright (c) 2001-2006 Joel de Guzman diff --git a/include/boost/fusion/support/deduce.hpp b/include/boost/fusion/support/deduce.hpp index 846fbc4d..37710ec1 100644 --- a/include/boost/fusion/support/deduce.hpp +++ b/include/boost/fusion/support/deduce.hpp @@ -25,6 +25,24 @@ namespace boost { namespace fusion { namespace traits typedef T type; }; + template + struct deduce + { + typedef T type; + }; + + template + struct deduce + { + typedef T type; + }; + + template + struct deduce + { + typedef T type; + }; + // Keep references on mutable LValues template diff --git a/include/boost/fusion/support/deduce_sequence.hpp b/include/boost/fusion/support/deduce_sequence.hpp index 41ecbd1b..77631b79 100644 --- a/include/boost/fusion/support/deduce_sequence.hpp +++ b/include/boost/fusion/support/deduce_sequence.hpp @@ -1,7 +1,7 @@ /*============================================================================= Copyright (c) 2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -10,9 +10,9 @@ #define BOOST_FUSION_SUPPORT_DEDUCE_SEQUENCE_HPP_INCLUDED #include -#include -#include -#include +#include +#include + namespace boost { namespace fusion { namespace traits { @@ -22,19 +22,20 @@ namespace boost { namespace fusion { namespace traits { struct deducer { - template - struct apply + template + struct result; + + template + struct result< Self(T) > : fusion::traits::deduce { }; }; } - // We cannot use fusion::transform_view here as result_of looses cv qualifiers - // on built in types template struct deduce_sequence : result_of::as_vector< - typename mpl::transform::type> + fusion::transform_view > { }; }}} diff --git a/include/boost/fusion/support/detail/as_fusion_element.hpp b/include/boost/fusion/support/detail/as_fusion_element.hpp index 78e4b631..2d020644 100644 --- a/include/boost/fusion/support/detail/as_fusion_element.hpp +++ b/include/boost/fusion/support/detail/as_fusion_element.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/include/boost/fusion/support/ext_/is_segmented.hpp b/include/boost/fusion/support/ext_/is_segmented.hpp old mode 100755 new mode 100644 diff --git a/include/boost/fusion/support/iterator_base.hpp b/include/boost/fusion/support/iterator_base.hpp index 39d05c40..2f909b2e 100644 --- a/include/boost/fusion/support/iterator_base.hpp +++ b/include/boost/fusion/support/iterator_base.hpp @@ -1,14 +1,12 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_ITERATOR_BASE_05042005_1008) #define FUSION_ITERATOR_BASE_05042005_1008 -#include - namespace boost { namespace fusion { struct iterator_root {}; diff --git a/include/boost/fusion/support/pair.hpp b/include/boost/fusion/support/pair.hpp index 67758071..cf285714 100644 --- a/include/boost/fusion/support/pair.hpp +++ b/include/boost/fusion/support/pair.hpp @@ -2,13 +2,12 @@ Copyright (c) 2005 Joel de Guzman Copyright (c) 2006 Tobias Schwinger - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_PAIR_07222005_1203) #define FUSION_PAIR_07222005_1203 -#include #include #include @@ -23,7 +22,7 @@ namespace boost { namespace fusion pair(typename detail::call_param::type val) : second(val) {} - + template pair(pair const& rhs) : second(rhs.second) {} @@ -45,7 +44,7 @@ namespace boost { namespace fusion template struct make_pair { - typedef fusion::pair::type> type; }; @@ -84,16 +83,16 @@ namespace boost { namespace fusion is >> p.second; return is; } - + template - inline bool + inline bool operator==(pair const& l, pair const& r) { return l.second == r.second; } template - inline bool + inline bool operator!=(pair const& l, pair const& r) { return l.second != r.second; diff --git a/include/boost/fusion/support/sequence_base.hpp b/include/boost/fusion/support/sequence_base.hpp index 1a82848d..1d436ef1 100644 --- a/include/boost/fusion/support/sequence_base.hpp +++ b/include/boost/fusion/support/sequence_base.hpp @@ -2,13 +2,12 @@ Copyright (c) 2001-2006 Joel de Guzman Copyright (c) 2007 Tobias Schwinger - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_BASE_04182005_0737) #define FUSION_SEQUENCE_BASE_04182005_0737 -#include #include namespace boost { namespace fusion @@ -37,7 +36,7 @@ namespace boost { namespace fusion namespace boost { namespace mpl { // Deliberately break mpl::begin, so it doesn't lie that a Fusion sequence - // is not an MPL sequence by returning mpl::void_. + // is not an MPL sequence by returning mpl::void_. // In other words: Fusion Sequences are always MPL Sequences, but they can // be incompletely defined. template<> struct begin_impl< boost::fusion::fusion_sequence_tag >; diff --git a/include/boost/fusion/support/tag_of.hpp b/include/boost/fusion/support/tag_of.hpp index a1ccf12d..282da411 100644 --- a/include/boost/fusion/support/tag_of.hpp +++ b/include/boost/fusion/support/tag_of.hpp @@ -1,22 +1,22 @@ /*============================================================================= Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_TAG_OF_09232005_0845) #define FUSION_TAG_OF_09232005_0845 +#include #include #include #include #include -#include #include #include #include #include -#include +#include namespace boost { @@ -26,13 +26,13 @@ namespace boost namespace tuples { struct null_type; - + template < - class T0, class T1, class T2, class T3, class T4, + class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9 > class tuple; - + template struct cons; } @@ -53,7 +53,7 @@ namespace boost { namespace fusion {}; template < - class T0, class T1, class T2, class T3, class T4, + class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9 > struct is_specialized > diff --git a/include/boost/fusion/support/tag_of_fwd.hpp b/include/boost/fusion/support/tag_of_fwd.hpp index 053cacaf..e6c883d5 100644 --- a/include/boost/fusion/support/tag_of_fwd.hpp +++ b/include/boost/fusion/support/tag_of_fwd.hpp @@ -2,14 +2,14 @@ Copyright (c) 2001-2006 Joel de Guzman Copyright (c) 2005-2006 Dan Marsden - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_FWD_31122005_1445) #define BOOST_FUSION_TAG_OF_FWD_31122005_1445 -namespace boost { namespace fusion { - +namespace boost { namespace fusion +{ namespace traits { template diff --git a/include/boost/fusion/support/void.hpp b/include/boost/fusion/support/void.hpp index 63275b11..7dd11e5c 100644 --- a/include/boost/fusion/support/void.hpp +++ b/include/boost/fusion/support/void.hpp @@ -1,7 +1,14 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SUPPORT_VOID_20070706_2125) #define BOOST_FUSION_SUPPORT_VOID_20070706_2125 -namespace boost { namespace fusion { +namespace boost { namespace fusion +{ struct void_ {}; }} diff --git a/include/boost/fusion/tuple.hpp b/include/boost/fusion/tuple.hpp index c4b56b9e..affcecca 100644 --- a/include/boost/fusion/tuple.hpp +++ b/include/boost/fusion/tuple.hpp @@ -10,6 +10,6 @@ #include #include #include -#include +#include #endif diff --git a/include/boost/fusion/tuple/detail/tuple_expand.hpp b/include/boost/fusion/tuple/detail/tuple_expand.hpp new file mode 100644 index 00000000..806515f9 --- /dev/null +++ b/include/boost/fusion/tuple/detail/tuple_expand.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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) +==============================================================================*/ +#ifndef BOOST_PP_IS_ITERATING +#if !defined(FUSION_TUPLE_EXPAND_10032005_0815) +#define FUSION_TUPLE_EXPAND_10032005_0815 + +#include +#include +#include + +#define BOOST_PP_FILENAME_1 \ + +#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE) +#include BOOST_PP_ITERATE() + +#endif +#else // defined(BOOST_PP_IS_ITERATING) +/////////////////////////////////////////////////////////////////////////////// +// +// Preprocessor vertical repetition code +// +/////////////////////////////////////////////////////////////////////////////// + +#define N BOOST_PP_ITERATION() + +#if N == 1 + explicit +#endif + tuple(BOOST_PP_ENUM_BINARY_PARAMS( + N, typename detail::call_param::type _)) + : base_type(BOOST_PP_ENUM_PARAMS(N, _)) {} + + template + tuple(tuple const& rhs) + : base_type(rhs) {} + + template + tuple& operator=(tuple const& rhs) + { + base_type::operator=(rhs); + return *this; + } + +#undef N +#endif // defined(BOOST_PP_IS_ITERATING) + diff --git a/include/boost/fusion/tuple/tuple.hpp b/include/boost/fusion/tuple/tuple.hpp index a32e6b3e..a97cadeb 100644 --- a/include/boost/fusion/tuple/tuple.hpp +++ b/include/boost/fusion/tuple/tuple.hpp @@ -1,14 +1,14 @@ /*============================================================================= Copyright (c) 2005 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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_TUPLE_10032005_0810) #define FUSION_TUPLE_10032005_0810 #include -#include +#include #include #include #include @@ -16,6 +16,7 @@ #include #include #include +#include namespace boost { namespace fusion { @@ -23,35 +24,50 @@ namespace boost { namespace fusion struct tuple : vector { typedef vector< - BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)> + BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)> base_type; tuple() : base_type() {} - - template - tuple(Sequence const& rhs) + + tuple(tuple const& rhs) : base_type(rhs) {} - #include + template + tuple(std::pair const& rhs) + : base_type(rhs) {} + + #include template - tuple& - operator=(T const& rhs) + tuple& operator=(T const& rhs) + { + base_type::operator=(rhs); + return *this; + } + + tuple& operator=(tuple const& rhs) + { + base_type::operator=(rhs); + return *this; + } + + template + tuple& operator=(std::pair const& rhs) { base_type::operator=(rhs); return *this; } }; - template + template struct tuple_size : result_of::size {}; - template + template struct tuple_element : result_of::value_at_c {}; template - inline typename + inline typename lazy_disable_if< is_const , result_of::at_c diff --git a/include/boost/fusion/tuple/tuple_fwd.hpp b/include/boost/fusion/tuple/tuple_fwd.hpp index f3e660e5..1a127cab 100644 --- a/include/boost/fusion/tuple/tuple_fwd.hpp +++ b/include/boost/fusion/tuple/tuple_fwd.hpp @@ -7,7 +7,7 @@ #if !defined(FUSION_TUPLE_FORWARD_10032005_0956) #define FUSION_TUPLE_FORWARD_10032005_0956 -#include +#include #include namespace boost { namespace fusion diff --git a/include/boost/fusion/view.hpp b/include/boost/fusion/view.hpp new file mode 100644 index 00000000..12d5cc5d --- /dev/null +++ b/include/boost/fusion/view.hpp @@ -0,0 +1,17 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_10022005_0620) +#define FUSION_SEQUENCE_VIEW_10022005_0620 + +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/boost/fusion/view/detail/strictest_traversal.hpp b/include/boost/fusion/view/detail/strictest_traversal.hpp new file mode 100644 index 00000000..e74ffbfc --- /dev/null +++ b/include/boost/fusion/view/detail/strictest_traversal.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_STRICTEST_TRAVERSAL_20060123_2101) +#define FUSION_STRICTEST_TRAVERSAL_20060123_2101 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct forward_traversal_tag; + struct bidirectional_traversal_tag; + struct random_access_traversal_tag; + + namespace detail + { + template::value> + struct stricter_traversal + { + typedef Tag1 type; + }; + + template + struct stricter_traversal + { + typedef Tag2 type; + }; + + struct strictest_traversal_impl + { + template + struct result; + + template + struct result + { + typedef typename remove_reference::type next_value; + typedef typename remove_reference::type strictest_so_far; + + typedef strictest_so_far tag1; + typedef typename traits::category_of::type tag2; + + typedef typename stricter_traversal::type type; + }; + }; + + template + struct strictest_traversal + : result_of::fold< + Sequence, fusion::random_access_traversal_tag, + strictest_traversal_impl> + {}; + + } +}} + +#endif diff --git a/include/boost/fusion/view/ext_/multiple_view.hpp b/include/boost/fusion/view/ext_/multiple_view.hpp new file mode 100644 index 00000000..e34b1d62 --- /dev/null +++ b/include/boost/fusion/view/ext_/multiple_view.hpp @@ -0,0 +1,178 @@ +/*============================================================================= + Copyright (c) 2001-2006 Eric Niebler + + 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 FUSION_MULTIPLE_VIEW_05052005_0335 +#define FUSION_MULTIPLE_VIEW_05052005_0335 + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct multiple_view_tag; + struct forward_traversal_tag; + struct fusion_sequence_tag; + + template + struct multiple_view + : sequence_base > + { + typedef multiple_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef forward_traversal_tag category; + typedef mpl::true_ is_view; + typedef mpl::int_ size; + typedef T value_type; + + multiple_view() + : val() + {} + + explicit multiple_view(typename detail::call_param::type val) + : val(val) + {} + + value_type val; + }; + + template + inline multiple_view::type> + make_multiple_view(T const& v) + { + return multiple_view::type>(v); + } + + struct multiple_view_iterator_tag; + struct forward_traversal_tag; + + template + struct multiple_view_iterator + : iterator_base > + { + typedef multiple_view_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + typedef typename MultipleView::value_type value_type; + typedef MultipleView multiple_view_type; + typedef Index index; + + explicit multiple_view_iterator(multiple_view_type const &view_) + : view(view_) + {} + + multiple_view_type view; + }; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef multiple_view_iterator< + typename mpl::next::type + , typename Iterator::multiple_view_type + > type; + + static type + call(Iterator const &where) + { + return type(where.view); + } + }; + }; + + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef multiple_view_iterator< + typename Sequence::size + , Sequence + > type; + + static type + call(Sequence &seq) + { + return type(seq); + } + }; + }; + + template + struct deref_impl; + + template <> + struct deref_impl + { + template + struct apply + { + typedef typename Iterator::value_type type; + + static type + call(Iterator const& i) + { + return i.view.val; + } + }; + }; + + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef multiple_view_iterator< + mpl::int_<0> + , Sequence + > type; + + static type + call(Sequence &seq) + { + return type(seq); + } + }; + }; + + template + struct value_of_impl; + + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename Iterator::multiple_view_type multiple_view_type; + typedef typename multiple_view_type::value_type type; + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/ext_/segmented_iterator.hpp b/include/boost/fusion/view/ext_/segmented_iterator.hpp new file mode 100644 index 00000000..0a192bdc --- /dev/null +++ b/include/boost/fusion/view/ext_/segmented_iterator.hpp @@ -0,0 +1,434 @@ +/*============================================================================= + Copyright (c) 2006 Eric Niebler + + 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) +==============================================================================*/ +#ifndef FUSION_SEGMENTED_ITERATOR_EAN_05032006_1027 +#define FUSION_SEGMENTED_ITERATOR_EAN_05032006_1027 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for nil +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct fusion_sequence_tag; + + namespace detail + { + using mpl::_; + using mpl::not_; + + //////////////////////////////////////////////////////////////////////////// + template + struct is_empty + : result_of::equal_to< + typename result_of::begin::type + , typename result_of::end::type + > + {}; + + template + struct is_empty + : is_empty + {}; + + //////////////////////////////////////////////////////////////////////////// + struct not_is_empty_pred + { + template + struct apply + : not_ > + {}; + }; + + struct segmented_range_tag; + + //////////////////////////////////////////////////////////////////////////// + template + struct segmented_range + : sequence_base > + { + BOOST_MPL_ASSERT_NOT((is_reference)); + typedef mpl::bool_ is_segmented; + typedef segmented_range_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + typedef Iterator iterator_type; + + // If this is a range of segments, skip over the empty ones + typedef typename mpl::if_< + is_segmented + , filter_view + , Sequence + >::type sequence_non_ref_type; + + typedef typename mpl::if_< + traits::is_view + , sequence_non_ref_type + , sequence_non_ref_type & + >::type sequence_type; + + typedef typename traits::category_of::type category; + + explicit segmented_range(Sequence &sequence_) + : sequence(sequence_type(sequence_)) + , where_(fusion::begin(sequence)) + {} + + segmented_range(sequence_type sequence_, iterator_type const &wh) + : sequence(sequence_) + , where_(wh) + {} + + sequence_type sequence; + iterator_type where_; + }; + } + + namespace extension + { + template<> + struct is_segmented_impl + { + template + struct apply + : Sequence::is_segmented + {}; + }; + + template<> + struct size_impl + { + template + struct apply + : mpl::int_< + result_of::distance< + typename Sequence::iterator_type + , typename result_of::end::type + >::value + > + {}; + }; + + template<> + struct segments_impl + { + template + struct apply + { + typedef Sequence &type; + static type call(Sequence &seq) + { + return seq; + } + }; + }; + + template<> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::iterator_type type; + static type call(Sequence &seq) + { + return seq.where_; + } + }; + }; + + template<> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::sequence_non_ref_type sequence; + typedef typename result_of::end::type type; + + static type call(Sequence &seq) + { + return fusion::end(seq.sequence); + } + }; + }; + } + + namespace detail + { + /////////////////////////////////////////////////////////////////////// + template + struct range_next; + + template + struct range_next > + { + typedef typename result_of::next::type iterator_type; + typedef segmented_range type; + + static type call(segmented_range const &rng) + { + return type(rng.sequence, fusion::next(rng.where_)); + } + }; + + /////////////////////////////////////////////////////////////////////// + template + struct is_range_next_empty + : is_empty::type> + {}; + + template<> + struct is_range_next_empty + : mpl::true_ + {}; + + /////////////////////////////////////////////////////////////////////// + template::value> + struct as_segmented_range + { + typedef typename result_of::segments::type segments; + typedef typename remove_reference::type sequence; + typedef typename result_of::begin >::type begin; + typedef segmented_range type; + + static type call(Sequence &seq) + { + segments segs(fusion::segments(seq)); + return type(segs); + } + }; + + template + struct as_segmented_range + { + typedef typename remove_reference::type sequence; + typedef typename result_of::begin::type begin; + typedef segmented_range type; + + static type call(Sequence &seq) + { + return type(seq); + } + }; + + template + struct as_segmented_range, IsSegmented> + { + typedef segmented_range type; + static type &call(type &seq) + { + return seq; + } + }; + + /////////////////////////////////////////////////////////////////////// + template< + typename Sequence + , typename State = nil + , bool IsSegmented = traits::is_segmented::value + > + struct push_segments + { + typedef typename as_segmented_range::type range; + typedef typename result_of::begin::type begin; + typedef typename result_of::deref::type next_ref; + typedef typename remove_reference::type next; + typedef push_segments > push; + typedef typename push::type type; + + static type call(Sequence &seq, State const &state) + { + range rng(as_segmented_range::call(seq)); + next_ref nxt(*fusion::begin(rng)); + return push::call(nxt, fusion::make_cons(rng, state)); + } + }; + + template + struct push_segments + { + typedef typename as_segmented_range::type range; + typedef cons type; + + static type call(Sequence &seq, State const &state) + { + range rng(as_segmented_range::call(seq)); + return fusion::make_cons(rng, state); + } + }; + + /////////////////////////////////////////////////////////////////////// + template::value> + struct pop_segments + { + typedef range_next next; + typedef push_segments push; + typedef typename push::type type; + + static type call(State const &state) + { + typename next::type rng(next::call(state.car)); + return push::call(rng, state.cdr); + } + }; + + template + struct pop_segments + { + typedef pop_segments pop; + typedef typename pop::type type; + + static type call(State const &state) + { + return pop::call(state.cdr); + } + }; + + template<> + struct pop_segments + { + typedef nil type; + + static type call(nil const &) + { + return nil(); + } + }; + } // namespace detail + + struct segmented_iterator_tag; + + //////////////////////////////////////////////////////////////////////////// + template + struct segmented_iterator + : fusion::iterator_base > + { + typedef segmented_iterator_tag fusion_tag; + typedef fusion::forward_traversal_tag category; + + typedef Cons cons_type; + typedef typename Cons::car_type car_type; + typedef typename Cons::cdr_type cdr_type; + + explicit segmented_iterator(Cons const &cons) + : cons_(cons) + {} + + cons_type const &cons() const { return this->cons_; }; + car_type const &car() const { return this->cons_.car; }; + cdr_type const &cdr() const { return this->cons_.cdr; }; + + private: + Cons cons_; + }; + + /////////////////////////////////////////////////////////////////////////// + template + struct segmented_begin + { + typedef typename detail::push_segments push; + typedef segmented_iterator type; + + static type call(Sequence &seq) + { + return type(push::call(seq, nil())); + } + }; + + /////////////////////////////////////////////////////////////////////////// + template + struct segmented_end + { + typedef segmented_iterator type; + + static type call(Sequence &) + { + return type(nil()); + } + }; + + namespace extension + { + template<> + struct value_of_impl + { + template + struct apply + { + typedef typename result_of::begin::type begin; + typedef typename result_of::value_of::type type; + }; + }; + + template<> + struct deref_impl + { + template + struct apply + { + typedef typename result_of::begin::type begin; + typedef typename result_of::deref::type type; + + static type call(Iterator const &it) + { + return *fusion::begin(it.car()); + } + }; + }; + + // discards the old head, expands the right child of the new head + // and pushes the result to the head of the list. + + template<> + struct next_impl + { + template< + typename Iterator + , bool IsSegmentDone = detail::is_range_next_empty::value + > + struct apply + { + typedef typename Iterator::cdr_type cdr_type; + typedef detail::range_next next; + typedef segmented_iterator > type; + + static type call(Iterator const &it) + { + return type(fusion::make_cons(next::call(it.car()), it.cdr())); + } + }; + + template + struct apply // segment done, move to next segment + { + typedef typename Iterator::cdr_type cdr_type; + typedef typename detail::pop_segments pop; + typedef segmented_iterator type; + + static type call(Iterator const &it) + { + return type(pop::call(it.cdr())); + } + }; + }; + } +}} // namespace boost::fusion + +#endif diff --git a/include/boost/fusion/view/ext_/segmented_iterator_range.hpp b/include/boost/fusion/view/ext_/segmented_iterator_range.hpp new file mode 100644 index 00000000..803e642b --- /dev/null +++ b/include/boost/fusion/view/ext_/segmented_iterator_range.hpp @@ -0,0 +1,537 @@ +/*============================================================================= + Copyright (c) 2006 Eric Niebler + + 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) +==============================================================================*/ +#ifndef FUSION_SEGMENTED_ITERATOR_RANGE_EAN_05032006_1027 +#define FUSION_SEGMENTED_ITERATOR_RANGE_EAN_05032006_1027 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + namespace detail + { + //////////////////////////////////////////////////////////////////////////// + template + struct reverse_cons; + + template + struct reverse_cons, State> + { + typedef reverse_cons > reverse; + typedef typename reverse::type type; + + static type call(cons const &cons, State const &state = State()) + { + return reverse::call(cons.cdr, fusion::make_cons(cons.car, state)); + } + }; + + template + struct reverse_cons + { + typedef State type; + + static State const &call(nil const &, State const &state = State()) + { + return state; + } + }; + + //////////////////////////////////////////////////////////////////////////// + // tags + struct full_view {}; + struct left_view {}; + struct right_view {}; + struct center_view {}; + + template + struct segmented_view_tag; + + //////////////////////////////////////////////////////////////////////////// + // a segmented view of that includes all elements either to the + // right or the left of a segmented iterator. + template + struct segmented_view + : sequence_base > + { + typedef segmented_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + typedef forward_traversal_tag category; + + explicit segmented_view(Cons1 const &cons) + : cons(cons) + {} + + typedef Cons1 cons_type; + cons_type const &cons; + }; + + // a segmented view that contains all the elements in between + // two segmented iterators + template + struct segmented_view + : sequence_base > + { + typedef segmented_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + typedef forward_traversal_tag category; + + segmented_view(Cons1 const &lcons, Cons2 const &rcons) + : left_cons(lcons) + , right_cons(rcons) + {} + + typedef Cons1 left_cons_type; + typedef Cons2 right_cons_type; + + left_cons_type const &left_cons; + right_cons_type const &right_cons; + }; + + //////////////////////////////////////////////////////////////////////////// + // Used to transform a sequence of segments. The first segment is + // bounded by RightCons, and the last segment is bounded by LeftCons + // and all the others are passed through unchanged. + template + struct segments_transform + { + explicit segments_transform(RightCons const &cons_) + : right_cons(cons_) + , left_cons(cons_) + {} + + segments_transform(RightCons const &right_cons_, LeftCons const &left_cons_) + : right_cons(right_cons_) + , left_cons(left_cons_) + {} + + template + struct result_; + + template + struct result_ + { + typedef segmented_view type; + }; + + template + struct result_ + { + typedef segmented_view type; + }; + + template + struct result_ + { + typedef Second type; + }; + + template + struct result; + + template + struct result + : result_< + typename remove_cv::type>::type + , typename remove_cv::type>::type + > + {}; + + template + segmented_view operator ()(right_view, Second &second) const + { + return segmented_view(this->right_cons); + } + + template + segmented_view operator ()(left_view, Second &second) const + { + return segmented_view(this->left_cons); + } + + template + Second &operator ()(full_view, Second &second) const + { + return second; + } + + private: + RightCons const &right_cons; + LeftCons const &left_cons; + }; + + } // namespace detail + + namespace extension + { + //////////////////////////////////////////////////////////////////////////// + template + struct is_segmented_impl > + { + template + struct apply + : mpl::true_ + {}; + }; + + //////////////////////////////////////////////////////////////////////////// + template<> + struct segments_impl > + { + template< + typename Sequence + , typename Cdr = typename Sequence::cons_type::cdr_type + > + struct apply + { + typedef typename Sequence::cons_type::car_type segmented_range; + typedef typename result_of::size::type size; + typedef typename mpl::prior::type size_minus_1; + typedef detail::segments_transform tfx; + typedef joint_view< + single_view const + , multiple_view const + > mask; + typedef transform_view type; + + static type call(Sequence &seq) + { + return type( + mask( + make_single_view(detail::right_view()) + , make_multiple_view(detail::full_view()) + ) + , seq.cons.car + , tfx(seq.cons.cdr) + ); + } + }; + + template + struct apply + { + typedef typename Sequence::cons_type::car_type segmented_range; + typedef typename segmented_range::iterator_type begin; + typedef typename segmented_range::sequence_non_ref_type sequence_type; + typedef typename result_of::end::type end; + typedef iterator_range range; + typedef single_view type; + + static type call(Sequence &seq) + { + return type(range(seq.cons.car.where_, fusion::end(seq.cons.car.sequence))); + } + }; + }; + + //////////////////////////////////////////////////////////////////////////// + template<> + struct segments_impl > + { + template< + typename Sequence + , typename Cdr = typename Sequence::cons_type::cdr_type + > + struct apply + { + typedef typename Sequence::cons_type::car_type right_segmented_range; + typedef typename right_segmented_range::sequence_type sequence_type; + typedef typename right_segmented_range::iterator_type iterator_type; + + typedef iterator_range< + typename result_of::begin::type + , typename result_of::next::type + > segmented_range; + + typedef detail::segments_transform tfx; + typedef typename result_of::size::type size; + typedef typename mpl::prior::type size_minus_1; + typedef joint_view< + multiple_view const + , single_view const + > mask; + typedef transform_view type; + + static type call(Sequence &seq) + { + return type( + mask( + make_multiple_view(detail::full_view()) + , make_single_view(detail::left_view()) + ) + , segmented_range(fusion::begin(seq.cons.car.sequence), fusion::next(seq.cons.car.where_)) + , tfx(seq.cons.cdr) + ); + } + }; + + template + struct apply + { + typedef typename Sequence::cons_type::car_type segmented_range; + typedef typename segmented_range::sequence_non_ref_type sequence_type; + typedef typename result_of::begin::type begin; + typedef typename segmented_range::iterator_type end; + typedef iterator_range range; + typedef single_view type; + + static type call(Sequence &seq) + { + return type(range(fusion::begin(seq.cons.car.sequence), seq.cons.car.where_)); + } + }; + }; + + //////////////////////////////////////////////////////////////////////////// + template<> + struct segments_impl > + { + template + struct apply + { + typedef typename Sequence::right_cons_type right_cons_type; + typedef typename Sequence::left_cons_type left_cons_type; + typedef typename right_cons_type::car_type right_segmented_range; + typedef typename left_cons_type::car_type left_segmented_range; + + typedef iterator_range< + typename result_of::begin::type + , typename result_of::next::type>::type + > segmented_range; + + typedef typename mpl::minus< + typename result_of::size::type + , mpl::int_<2> + >::type size_minus_2; + + BOOST_MPL_ASSERT_RELATION(0, <=, size_minus_2::value); + + typedef detail::segments_transform< + typename left_cons_type::cdr_type + , typename right_cons_type::cdr_type + > tfx; + + typedef joint_view< + multiple_view const + , single_view const + > left_mask; + + typedef joint_view< + single_view const + , left_mask const + > mask; + + typedef transform_view type; + + static type call(Sequence &seq) + { + left_mask lmask( + make_multiple_view(detail::full_view()) + , make_single_view(detail::left_view()) + ); + return type( + mask(make_single_view(detail::right_view()), lmask) + , segmented_range(fusion::begin(seq.left_cons.car), fusion::next(fusion::begin(seq.right_cons.car))) + , tfx(seq.left_cons.cdr, seq.right_cons.cdr) + ); + } + }; + }; + } + + // specialize iterator_range for use with segmented iterators, so that + // it presents a segmented view of the range. + template + struct iterator_range; + + template + struct iterator_range, segmented_iterator > + : sequence_base, segmented_iterator > > + { + typedef typename convert_iterator >::type begin_type; + typedef typename convert_iterator >::type end_type; + typedef typename detail::reverse_cons::type begin_cons_type; + typedef typename detail::reverse_cons::type end_cons_type; + typedef iterator_range_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef typename traits::category_of::type category; + typedef typename result_of::distance::type size; + typedef mpl::true_ is_view; + + iterator_range(segmented_iterator const& first_, segmented_iterator const& last_) + : first(convert_iterator >::call(first_)) + , last(convert_iterator >::call(last_)) + , first_cons(detail::reverse_cons::call(first_.cons())) + , last_cons(detail::reverse_cons::call(last_.cons())) + {} + + begin_type first; + end_type last; + + begin_cons_type first_cons; + end_cons_type last_cons; + }; + + namespace detail + { + + template + struct same_segment + : mpl::false_ + {}; + + template + struct same_segment, cons > + : mpl::and_< + traits::is_segmented + , is_same + > + {}; + + //////////////////////////////////////////////////////////////////////////// + template + struct segments_gen; + + //////////////////////////////////////////////////////////////////////////// + template + struct segments_gen2 + { + typedef segments_gen gen; + typedef typename gen::type type; + + static type call(Cons1 const &cons1, Cons2 const &cons2) + { + return gen::call(cons1.cdr, cons2.cdr); + } + }; + + template + struct segments_gen2 + { + typedef segmented_view view; + typedef typename result_of::segments::type type; + + static type call(Cons1 const &cons1, Cons2 const &cons2) + { + view v(cons1, cons2); + return fusion::segments(v); + } + }; + + template + struct segments_gen2, cons, false> + { + typedef iterator_range< + typename Car1::iterator_type + , typename Car2::iterator_type + > range; + + typedef single_view type; + + static type call(cons const &cons1, cons const &cons2) + { + return type(range(cons1.car.where_, cons2.car.where_)); + } + }; + + //////////////////////////////////////////////////////////////////////////// + template + struct segments_gen + : segments_gen2::value> + {}; + + template + struct segments_gen, nil> + { + typedef segmented_view > view; + typedef typename result_of::segments::type type; + + static type call(cons const &cons, nil const &) + { + view v(cons); + return fusion::segments(v); + } + }; + + template<> + struct segments_gen + { + typedef nil type; + + static type call(nil const &, nil const &) + { + return nil(); + } + }; + } // namespace detail + + namespace extension + { + template + struct is_segmented_impl; + + // An iterator_range of segmented_iterators is segmented + template<> + struct is_segmented_impl + { + template + struct is_segmented_iterator : mpl::false_ {}; + + template + struct is_segmented_iterator > : mpl::true_ {}; + + template + struct apply + : mpl::and_< + is_segmented_iterator + , is_segmented_iterator + > + {}; + }; + + template + struct segments_impl; + + template<> + struct segments_impl + { + template + struct apply + { + typedef typename Sequence::begin_cons_type begin_cons; + typedef typename Sequence::end_cons_type end_cons; + + typedef detail::segments_gen gen; + typedef typename gen::type type; + + static type call(Sequence &sequence) + { + return gen::call(sequence.first_cons, sequence.last_cons); + } + }; + }; + } + +}} + +#endif diff --git a/include/boost/fusion/view/filter_view.hpp b/include/boost/fusion/view/filter_view.hpp new file mode 100644 index 00000000..c649407f --- /dev/null +++ b/include/boost/fusion/view/filter_view.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_FILTER_VIEW_10022005_0608) +#define FUSION_SEQUENCE_VIEW_FILTER_VIEW_10022005_0608 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/filter_view/detail/begin_impl.hpp b/include/boost/fusion/view/filter_view/detail/begin_impl.hpp new file mode 100644 index 00000000..2ffe7bd0 --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/begin_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_05062005_0903) +#define FUSION_BEGIN_IMPL_05062005_0903 + +namespace boost { namespace fusion +{ + struct filter_view_tag; + + template + struct filter_iterator; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::first_type first_type; + typedef typename Sequence::last_type last_type; + typedef typename Sequence::pred_type pred_type; + typedef filter_iterator type; + + static type + call(Sequence& s) + { + return type(s.first()); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/detail/deref_impl.hpp b/include/boost/fusion/view/filter_view/detail/deref_impl.hpp new file mode 100644 index 00000000..3e6447c5 --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/deref_impl.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_05062005_0905) +#define FUSION_DEREF_IMPL_05062005_0905 + +#include + +namespace boost { namespace fusion +{ + struct filter_view_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + : detail::adapt_deref_traits {}; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/detail/end_impl.hpp b/include/boost/fusion/view/filter_view/detail/end_impl.hpp new file mode 100644 index 00000000..677004d4 --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/end_impl.hpp @@ -0,0 +1,44 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_05062005_0906) +#define FUSION_END_IMPL_05062005_0906 + +namespace boost { namespace fusion +{ + struct filter_view_tag; + + template + struct filter_iterator; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::last_type last_type; + typedef typename Sequence::pred_type pred_type; + typedef filter_iterator type; + + static type + call(Sequence& s) + { + return type(s.last()); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/detail/equal_to_impl.hpp b/include/boost/fusion/view/filter_view/detail/equal_to_impl.hpp new file mode 100644 index 00000000..5d7b2932 --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/equal_to_impl.hpp @@ -0,0 +1,34 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_EQUAL_TO_IMPL_02012005_2133) +#define BOOST_FUSION_EQUAL_TO_IMPL_02012005_2133 + +namespace boost { namespace fusion +{ + struct filter_view_iterator_tag; + + namespace extension + { + template + struct equal_to; + + template + struct equal_to_impl; + + template<> + struct equal_to_impl + { + template + struct apply + : result_of::equal_to + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/filter_view/detail/next_impl.hpp b/include/boost/fusion/view/filter_view/detail/next_impl.hpp new file mode 100644 index 00000000..8423dfe1 --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/next_impl.hpp @@ -0,0 +1,64 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_06052005_0900) +#define FUSION_NEXT_IMPL_06052005_0900 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct filter_view_iterator_tag; + + template + struct filter_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename Iterator::last_type last_type; + typedef typename Iterator::pred_type pred_type; + + typedef typename + mpl::eval_if< + result_of::equal_to + , mpl::identity + , result_of::next + >::type + next_type; + + typedef typename detail::static_find_if< + next_type, last_type, pred_type> + filter; + + typedef filter_iterator< + typename filter::type, last_type, pred_type> + type; + + static type + call(Iterator const& i) + { + return type(filter::call(i.first)); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/detail/size_impl.hpp b/include/boost/fusion/view/filter_view/detail/size_impl.hpp new file mode 100644 index 00000000..1c5a0aca --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/size_impl.hpp @@ -0,0 +1,38 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SIZE_IMPL_09232005_1058) +#define FUSION_SIZE_IMPL_09232005_1058 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct filter_view_tag; + + namespace extension + { + template + struct size_impl; + + template <> + struct size_impl + { + template + struct apply + : result_of::distance< + typename result_of::begin::type + , typename result_of::end::type> + {}; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/detail/value_of_impl.hpp b/include/boost/fusion/view/filter_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..f9188f6f --- /dev/null +++ b/include/boost/fusion/view/filter_view/detail/value_of_impl.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_OF_IMPL_05062005_0857) +#define FUSION_VALUE_OF_IMPL_05062005_0857 + +#include + +namespace boost { namespace fusion +{ + struct filter_view_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + : detail::adapt_value_traits {}; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/filter_view.hpp b/include/boost/fusion/view/filter_view/filter_view.hpp new file mode 100644 index 00000000..a34747e6 --- /dev/null +++ b/include/boost/fusion/view/filter_view/filter_view.hpp @@ -0,0 +1,51 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_FILTER_VIEW_HPP) +#define FUSION_SEQUENCE_FILTER_VIEW_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct filter_view_tag; + struct forward_traversal_tag; + struct fusion_sequence_tag; + + template + struct filter_view : sequence_base > + { + typedef filter_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef forward_traversal_tag category; + typedef mpl::true_ is_view; + + typedef typename result_of::begin::type first_type; + typedef typename result_of::end::type last_type; + typedef Pred pred_type; + + filter_view(Sequence& seq) + : seq(seq) + {} + + first_type first() const { return fusion::begin(seq); } + last_type last() const { return fusion::end(seq); } + typename mpl::if_, Sequence, Sequence&>::type seq; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/filter_view/filter_view_iterator.hpp b/include/boost/fusion/view/filter_view/filter_view_iterator.hpp new file mode 100644 index 00000000..be93c657 --- /dev/null +++ b/include/boost/fusion/view/filter_view/filter_view_iterator.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_FILTER_VIEW_ITERATOR_05062005_0849) +#define FUSION_FILTER_VIEW_ITERATOR_05062005_0849 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct filter_view_iterator_tag; + struct forward_traversal_tag; + + template + struct filter_iterator : iterator_base > + { + typedef convert_iterator first_converter; + typedef typename first_converter::type first_iter; + typedef convert_iterator last_converter; + typedef typename last_converter::type last_iter; + + typedef filter_view_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + typedef detail::static_find_if filter; + typedef typename filter::type first_type; + typedef last_iter last_type; + typedef Pred pred_type; + + filter_iterator(First const& first) + : first(filter::call(first_converter::call(first))) {} + + first_type first; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/iterator_range.hpp b/include/boost/fusion/view/iterator_range.hpp new file mode 100644 index 00000000..f8d30221 --- /dev/null +++ b/include/boost/fusion/view/iterator_range.hpp @@ -0,0 +1,12 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_ITERATOR_RANGE_10022005_0610) +#define FUSION_SEQUENCE_VIEW_ITERATOR_RANGE_10022005_0610 + +#include + +#endif diff --git a/include/boost/fusion/view/iterator_range/detail/at_impl.hpp b/include/boost/fusion/view/iterator_range/detail/at_impl.hpp new file mode 100644 index 00000000..5f882aaa --- /dev/null +++ b/include/boost/fusion/view/iterator_range/detail/at_impl.hpp @@ -0,0 +1,44 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_ITERATOR_RANGE_AT_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_ITERATOR_RANGE_AT_IMPL_HPP_INCLUDED + +#include +#include + +namespace boost { namespace fusion +{ + struct iterator_range_tag; + + namespace extension + { + template + struct at_impl; + + template <> + struct at_impl + { + template + struct apply + { + typedef typename Seq::begin_type begin_type; + typedef typename result_of::advance::type pos; + typedef typename result_of::deref::type type; + + static type + call(Seq& s) + { + return * advance(s.first); + } + }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/view/iterator_range/detail/begin_impl.hpp b/include/boost/fusion/view/iterator_range/detail/begin_impl.hpp new file mode 100644 index 00000000..32341369 --- /dev/null +++ b/include/boost/fusion/view/iterator_range/detail/begin_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_05062005_1226) +#define FUSION_BEGIN_IMPL_05062005_1226 + +namespace boost { namespace fusion +{ + struct iterator_range_tag; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::begin_type type; + + static type + call(Sequence& s) + { + return s.first; + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/iterator_range/detail/end_impl.hpp b/include/boost/fusion/view/iterator_range/detail/end_impl.hpp new file mode 100644 index 00000000..dacbe191 --- /dev/null +++ b/include/boost/fusion/view/iterator_range/detail/end_impl.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_05062005_1226) +#define FUSION_END_IMPL_05062005_1226 + +namespace boost { namespace fusion +{ + struct iterator_range_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::end_type type; + + static type + call(Sequence& s) + { + return s.last; + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/iterator_range/detail/value_at_impl.hpp b/include/boost/fusion/view/iterator_range/detail/value_at_impl.hpp new file mode 100644 index 00000000..b6fe8881 --- /dev/null +++ b/include/boost/fusion/view/iterator_range/detail/value_at_impl.hpp @@ -0,0 +1,38 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_ITERATOR_RANGE_VALUE_AT_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_ITERATOR_RANGE_VALUE_AT_IMPL_HPP_INCLUDED + +#include +#include + +namespace boost { namespace fusion +{ + struct iterator_range_tag; + + namespace extension + { + template + struct value_at_impl; + + template <> + struct value_at_impl + { + template + struct apply + { + typedef typename Seq::begin_type begin_type; + typedef typename result_of::advance::type pos; + typedef typename result_of::value_of::type type; + }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/view/iterator_range/iterator_range.hpp b/include/boost/fusion/view/iterator_range/iterator_range.hpp new file mode 100644 index 00000000..0036f0ae --- /dev/null +++ b/include/boost/fusion/view/iterator_range/iterator_range.hpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ITERATOR_RANGE_05062005_1224) +#define FUSION_ITERATOR_RANGE_05062005_1224 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct iterator_range_tag; + struct fusion_sequence_tag; + + template + struct iterator_range : sequence_base > + { + typedef typename convert_iterator::type begin_type; + typedef typename convert_iterator::type end_type; + typedef iterator_range_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef typename result_of::distance::type size; + typedef mpl::true_ is_view; + + typedef typename traits::category_of::type category; + + iterator_range(First const& first, Last const& last) + : first(convert_iterator::call(first)) + , last(convert_iterator::call(last)) {} + + begin_type first; + end_type last; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/joint_view.hpp b/include/boost/fusion/view/joint_view.hpp new file mode 100644 index 00000000..cd1b8571 --- /dev/null +++ b/include/boost/fusion/view/joint_view.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_JOINT_VIEW_10022005_0610) +#define FUSION_SEQUENCE_VIEW_JOINT_VIEW_10022005_0610 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/joint_view/detail/begin_impl.hpp b/include/boost/fusion/view/joint_view/detail/begin_impl.hpp new file mode 100644 index 00000000..e2b0281e --- /dev/null +++ b/include/boost/fusion/view/joint_view/detail/begin_impl.hpp @@ -0,0 +1,66 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_07162005_0115) +#define FUSION_BEGIN_IMPL_07162005_0115 + +#include +#include + +namespace boost { namespace fusion +{ + struct joint_view_tag; + + template + struct joint_view_iterator; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::first_type first_type; + typedef typename Sequence::last_type last_type; + typedef typename Sequence::concat_type concat_type; + typedef result_of::equal_to equal_to; + + typedef typename + mpl::if_< + equal_to + , concat_type + , joint_view_iterator + >::type + type; + + static type + call(Sequence& s, mpl::true_) + { + return s.concat(); + } + + static type + call(Sequence& s, mpl::false_) + { + return type(s.first(), s.concat()); + } + + static type + call(Sequence& s) + { + return call(s, equal_to()); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/joint_view/detail/deref_impl.hpp b/include/boost/fusion/view/joint_view/detail/deref_impl.hpp new file mode 100644 index 00000000..7eb47184 --- /dev/null +++ b/include/boost/fusion/view/joint_view/detail/deref_impl.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_07162005_0137) +#define FUSION_DEREF_IMPL_07162005_0137 + +#include + +namespace boost { namespace fusion +{ + struct joint_view_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + : detail::adapt_deref_traits {}; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/joint_view/detail/end_impl.hpp b/include/boost/fusion/view/joint_view/detail/end_impl.hpp new file mode 100644 index 00000000..5bdeb02e --- /dev/null +++ b/include/boost/fusion/view/joint_view/detail/end_impl.hpp @@ -0,0 +1,40 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_07162005_0128) +#define FUSION_END_IMPL_07162005_0128 + +#include +#include + +namespace boost { namespace fusion +{ + struct joint_view_tag; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::concat_last_type type; + + static type + call(Sequence& s) + { + return s.concat_last(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/joint_view/detail/next_impl.hpp b/include/boost/fusion/view/joint_view/detail/next_impl.hpp new file mode 100644 index 00000000..80d3580d --- /dev/null +++ b/include/boost/fusion/view/joint_view/detail/next_impl.hpp @@ -0,0 +1,70 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_07162005_0136) +#define FUSION_NEXT_IMPL_07162005_0136 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct joint_view_iterator_tag; + + template + struct joint_view_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename Iterator::last_type last_type; + typedef typename Iterator::concat_type concat_type; + typedef typename result_of::next::type next_type; + typedef result_of::equal_to equal_to; + + typedef typename + mpl::if_< + equal_to + , concat_type + , joint_view_iterator + >::type + type; + + static type + call(Iterator const& i, mpl::true_) + { + return i.concat; + } + + static type + call(Iterator const& i, mpl::false_) + { + return type(fusion::next(i.first), i.concat); + } + + static type + call(Iterator const& i) + { + return call(i, equal_to()); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/joint_view/detail/value_of_impl.hpp b/include/boost/fusion/view/joint_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..53afe1c9 --- /dev/null +++ b/include/boost/fusion/view/joint_view/detail/value_of_impl.hpp @@ -0,0 +1,29 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_IMPL_07162005_0132) +#define FUSION_VALUE_IMPL_07162005_0132 + +#include + +namespace boost { namespace fusion +{ + struct joint_view_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + : detail::adapt_value_traits {}; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/joint_view/joint_view.hpp b/include/boost/fusion/view/joint_view/joint_view.hpp new file mode 100644 index 00000000..9cc798d3 --- /dev/null +++ b/include/boost/fusion/view/joint_view/joint_view.hpp @@ -0,0 +1,61 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_JOINT_VIEW_07162005_0140) +#define FUSION_JOINT_VIEW_07162005_0140 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct joint_view_tag; + struct forward_traversal_tag; + struct fusion_sequence_tag; + + template + struct joint_view : sequence_base > + { + typedef joint_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef forward_traversal_tag category; + typedef mpl::true_ is_view; + + typedef typename result_of::begin::type first_type; + typedef typename result_of::end::type last_type; + typedef typename result_of::begin::type concat_type; + typedef typename result_of::end::type concat_last_type; + typedef typename mpl::plus, result_of::size >::type size; + + joint_view(Sequence1& seq1, Sequence2& seq2) + : seq1(seq1) + , seq2(seq2) + {} + + first_type first() const { return fusion::begin(seq1); } + concat_type concat() const { return fusion::begin(seq2); } + concat_last_type concat_last() const { return fusion::end(seq2); } + + private: + + typename mpl::if_, Sequence1, Sequence1&>::type seq1; + typename mpl::if_, Sequence2, Sequence2&>::type seq2; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/joint_view/joint_view_iterator.hpp b/include/boost/fusion/view/joint_view/joint_view_iterator.hpp new file mode 100644 index 00000000..18696d7e --- /dev/null +++ b/include/boost/fusion/view/joint_view/joint_view_iterator.hpp @@ -0,0 +1,52 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_JOINT_VIEW_ITERATOR_07162005_0140) +#define FUSION_JOINT_VIEW_ITERATOR_07162005_0140 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct joint_view_iterator_tag; + struct forward_traversal_tag; + + template + struct joint_view_iterator + : iterator_base > + { + typedef convert_iterator first_converter; + typedef convert_iterator last_converter; + typedef convert_iterator concat_converter; + + typedef typename first_converter::type first_type; + typedef typename last_converter::type last_type; + typedef typename concat_converter::type concat_type; + + typedef joint_view_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + BOOST_STATIC_ASSERT((!result_of::equal_to::value)); + + joint_view_iterator(First const& first, Concat const& concat) + : first(first_converter::call(first)) + , concat(concat_converter::call(concat)) + {} + + first_type first; + concat_type concat; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/repetitive_view.hpp b/include/boost/fusion/view/repetitive_view.hpp new file mode 100644 index 00000000..fef1462f --- /dev/null +++ b/include/boost/fusion/view/repetitive_view.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_HPP_INCLUDED + +#include +#include + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/detail/begin_impl.hpp b/include/boost/fusion/view/repetitive_view/detail/begin_impl.hpp new file mode 100644 index 00000000..321d7b8d --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/detail/begin_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_BEGIN_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_BEGIN_IMPL_HPP_INCLUDED + +#include +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template + struct repetitive_view_iterator; + + namespace extension + { + template + struct begin_impl; + + template<> + struct begin_impl + { + template + struct apply + { + typedef typename View::sequence_type sequence_type; + + typedef repetitive_view_iterator::type > type; + + static type call(View const& v) + { + return type(v.seq); + } + }; + }; + + } + +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/detail/deref_impl.hpp b/include/boost/fusion/view/repetitive_view/detail/deref_impl.hpp new file mode 100644 index 00000000..2c0caf80 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/detail/deref_impl.hpp @@ -0,0 +1,44 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_DEREF_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_DEREF_IMPL_HPP_INCLUDED + +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template<> + struct deref_impl + { + template + struct apply + { + typedef typename + result_of::deref::type + type; + + static type call(Iterator const& i) + { + return *i.pos; + } + }; + }; + + } + +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/detail/end_impl.hpp b/include/boost/fusion/view/repetitive_view/detail/end_impl.hpp new file mode 100644 index 00000000..52e36da5 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/detail/end_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_END_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_END_IMPL_HPP_INCLUDED + +#include +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template + struct repetitive_view_iterator; + + namespace extension + { + template + struct end_impl; + + template<> + struct end_impl + { + template + struct apply + { + typedef typename View::sequence_type sequence_type; + + typedef repetitive_view_iterator::type > type; + + static type call(View const& v) + { + return type(v.seq,end(v.seq)); + } + }; + }; + + } + +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/detail/next_impl.hpp b/include/boost/fusion/view/repetitive_view/detail/next_impl.hpp new file mode 100644 index 00000000..b629cb01 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/detail/next_impl.hpp @@ -0,0 +1,90 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_NEXT_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_NEXT_IMPL_HPP_INCLUDED + +#include +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + template + struct repetitive_view_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template::type>::value > + struct apply_nonempty // + { + // advanvce to next position + + typedef repetitive_view_iterator< + typename Iterator::sequence_type, + typename result_of::next::type + > + type; + + static type call(Iterator const& i) + { + return type(i.seq, next(i.pos)); + } + }; + template + struct apply_nonempty + { + // reset to beginning + + typedef repetitive_view_iterator< + typename Iterator::sequence_type, + typename Iterator::first_type + > + type; + + static type call(Iterator const& i) + { + return type(i.seq); + } + }; + + template ::value > + struct apply // + : apply_nonempty + { }; + + template + struct apply + { + // eps^n = eps + + typedef Iterator type; + + static type call(Iterator const& i) + { + return type(i); + } + }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp b/include/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..bf5f2f06 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp @@ -0,0 +1,34 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_VALUE_OF_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_VALUE_OF_IMPL_HPP_INCLUDED + +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template<> + struct value_of_impl + { + template + struct apply + : result_of::value_of + { }; + }; + } +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/repetitive_view.hpp b/include/boost/fusion/view/repetitive_view/repetitive_view.hpp new file mode 100644 index 00000000..050affb1 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/repetitive_view.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_REPETITIVE_VIEW_VIEW_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_REPETITIVE_VIEW_HPP_INCLUDED + +#include +#include + +#include +#include + +#include +#include + + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + struct fusion_sequence_tag; + + template struct repetitive_view + : sequence_base< repetitive_view > + { + typedef repetitive_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + + typedef single_pass_traversal_tag category; + + typedef typename boost::remove_reference::type sequence_type; + typedef typename + mpl::if_, Sequence, sequence_type&>::type + stored_seq_type; + + repetitive_view(Sequence& seq) + : seq(seq) {} + + stored_seq_type seq; + }; + +}} + +#endif diff --git a/include/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp b/include/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp new file mode 100644 index 00000000..24e146c0 --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp @@ -0,0 +1,19 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_FWD_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_FWD_HPP_INCLUDED + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template struct repetitive_view; +}} + +#endif + diff --git a/include/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp b/include/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp new file mode 100644 index 00000000..9a7334de --- /dev/null +++ b/include/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp @@ -0,0 +1,51 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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_REPETITIVE_VIEW_ITERATOR_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_HPP_ITERATOR_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + template::type> + struct repetitive_view_iterator + : iterator_base< repetitive_view_iterator > + { + typedef repetitive_view_iterator_tag fusion_tag; + + typedef Sequence sequence_type; + typedef typename convert_iterator::type pos_type; + typedef typename convert_iterator::type>::type first_type; + typedef typename convert_iterator::type>::type end_type; + typedef single_pass_traversal_tag category; + + explicit repetitive_view_iterator(Sequence& seq) + : seq(seq), pos(begin(seq)) {} + + repetitive_view_iterator(Sequence& seq, pos_type const& pos) + : seq(seq), pos(pos) {} + + Sequence& seq; + pos_type pos; + + }; +}} + +#endif + diff --git a/include/boost/fusion/view/reverse_view.hpp b/include/boost/fusion/view/reverse_view.hpp new file mode 100644 index 00000000..634b398c --- /dev/null +++ b/include/boost/fusion/view/reverse_view.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_REVERSE_VIEW_10022005_0612) +#define FUSION_SEQUENCE_VIEW_REVERSE_VIEW_10022005_0612 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/reverse_view/detail/advance_impl.hpp b/include/boost/fusion/view/reverse_view/detail/advance_impl.hpp new file mode 100644 index 00000000..8785881e --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/advance_impl.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ADVANCE_IMPL_14122005_2015) +#define FUSION_ADVANCE_IMPL_14122005_2015 + +#include +#include + +namespace boost { namespace fusion { + + struct reverse_view_iterator_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template + struct advance_impl; + + template<> + struct advance_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename mpl::negate::type negative_dist; + typedef typename result_of::advance::type advanced_type; + typedef reverse_view_iterator type; + + static type + call(Iterator const& i) + { + return type(boost::fusion::advance(i.first)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/reverse_view/detail/begin_impl.hpp b/include/boost/fusion/view/reverse_view/detail/begin_impl.hpp new file mode 100644 index 00000000..b7968f56 --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/begin_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_07202005_0849) +#define FUSION_BEGIN_IMPL_07202005_0849 + +namespace boost { namespace fusion +{ + struct reverse_view_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef reverse_view_iterator type; + + static type + call(Sequence const& s) + { + return type(s.last()); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/detail/deref_impl.hpp b/include/boost/fusion/view/reverse_view/detail/deref_impl.hpp new file mode 100644 index 00000000..97cb8915 --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/deref_impl.hpp @@ -0,0 +1,48 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_07202005_0851) +#define FUSION_DEREF_IMPL_07202005_0851 + +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + { + template + struct apply + { + typedef typename + result_of::deref< + typename result_of::prior< + typename Iterator::first_type + >::type + >::type + type; + + static type + call(Iterator const& i) + { + return *fusion::prior(i.first); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/detail/distance_impl.hpp b/include/boost/fusion/view/reverse_view/detail/distance_impl.hpp new file mode 100644 index 00000000..5edc7499 --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/distance_impl.hpp @@ -0,0 +1,45 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DISTANCE_IMPL_14122005_2104) +#define FUSION_DISTANCE_IMPL_14122005_2104 + +#include + +namespace boost { namespace fusion { + + struct reverse_view_iterator_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template + struct distance_impl; + + template<> + struct distance_impl + { + template + struct apply + { + typedef typename First::first_type first_type; + typedef typename Last::first_type last_type; + typedef typename result_of::distance::type type; + + static type + call(First const& first, Last const& last) + { + return boost::fusion::distance(last.first, first.first); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/reverse_view/detail/end_impl.hpp b/include/boost/fusion/view/reverse_view/detail/end_impl.hpp new file mode 100644 index 00000000..916e49d0 --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/end_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_07202005_0851) +#define FUSION_END_IMPL_07202005_0851 + +namespace boost { namespace fusion +{ + struct reverse_view_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef reverse_view_iterator type; + + static type + call(Sequence const& s) + { + return type(s.first()); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/detail/next_impl.hpp b/include/boost/fusion/view/reverse_view/detail/next_impl.hpp new file mode 100644 index 00000000..c036510c --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/next_impl.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_07202005_0856) +#define FUSION_NEXT_IMPL_07202005_0856 + +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_iterator_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename prior_impl:: + template apply + wrapped; + + typedef reverse_view_iterator type; + + static type + call(Iterator const& i) + { + return type(wrapped::call(i.first)); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/detail/prior_impl.hpp b/include/boost/fusion/view/reverse_view/detail/prior_impl.hpp new file mode 100644 index 00000000..317054fc --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/prior_impl.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PRIOR_IMPL_07202005_0857) +#define FUSION_PRIOR_IMPL_07202005_0857 + +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_iterator_tag; + + template + struct reverse_view_iterator; + + namespace extension + { + template <> + struct prior_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename next_impl:: + template apply + wrapped; + + typedef reverse_view_iterator type; + + static type + call(Iterator const& i) + { + return type(wrapped::call(i.first)); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/detail/value_of_impl.hpp b/include/boost/fusion/view/reverse_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..bf9b2ade --- /dev/null +++ b/include/boost/fusion/view/reverse_view/detail/value_of_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_OF_IMPL_07202005_0900) +#define FUSION_VALUE_OF_IMPL_07202005_0900 + +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename + result_of::value_of< + typename result_of::prior< + typename Iterator::first_type + >::type + >::type + type; + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/reverse_view.hpp b/include/boost/fusion/view/reverse_view/reverse_view.hpp new file mode 100644 index 00000000..c939f7ce --- /dev/null +++ b/include/boost/fusion/view/reverse_view/reverse_view.hpp @@ -0,0 +1,58 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_REVERSE_VIEW_07202005_0836) +#define FUSION_REVERSE_VIEW_07202005_0836 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_tag; + struct fusion_sequence_tag; + + template + struct reverse_view : sequence_base > + { + typedef reverse_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + + typedef typename traits::category_of::type category; + typedef typename result_of::begin::type first_type; + typedef typename result_of::end::type last_type; + typedef typename result_of::size::type size; + + BOOST_STATIC_ASSERT(( + is_base_of< + bidirectional_traversal_tag + , typename traits::category_of::type>::value)); + + reverse_view(Sequence& seq) + : seq(seq) + {} + + first_type first() const { return fusion::begin(seq); } + last_type last() const { return fusion::end(seq); } + typename mpl::if_, Sequence, Sequence&>::type seq; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/reverse_view/reverse_view_iterator.hpp b/include/boost/fusion/view/reverse_view/reverse_view_iterator.hpp new file mode 100644 index 00000000..0a890437 --- /dev/null +++ b/include/boost/fusion/view/reverse_view/reverse_view_iterator.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_REVERSE_VIEW_ITERATOR_07202005_0835) +#define FUSION_REVERSE_VIEW_ITERATOR_07202005_0835 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct reverse_view_iterator_tag; + + template + struct reverse_view_iterator + : iterator_base > + { + typedef convert_iterator converter; + typedef typename converter::type first_type; + typedef reverse_view_iterator_tag fusion_tag; + typedef typename traits::category_of::type category; + + BOOST_STATIC_ASSERT(( + is_base_of< + bidirectional_traversal_tag + , category>::value)); + + reverse_view_iterator(First const& first) + : first(converter::call(first)) {} + + first_type first; + }; +}} + +#endif + diff --git a/include/boost/fusion/view/single_view.hpp b/include/boost/fusion/view/single_view.hpp new file mode 100644 index 00000000..3640fae8 --- /dev/null +++ b/include/boost/fusion/view/single_view.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SINGLE_VIEW_03192006_2216) +#define FUSION_SINGLE_VIEW_03192006_2216 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/single_view/detail/begin_impl.hpp b/include/boost/fusion/view/single_view/detail/begin_impl.hpp new file mode 100644 index 00000000..395992be --- /dev/null +++ b/include/boost/fusion/view/single_view/detail/begin_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_05052005_0305) +#define FUSION_BEGIN_IMPL_05052005_0305 + +namespace boost { namespace fusion +{ + struct single_view_tag; + + template + struct single_view_iterator; + + namespace extension + { + template + struct begin_impl; + + template <> + struct begin_impl + { + template + struct apply + { + typedef single_view_iterator type; + + static type + call(Sequence& s) + { + return type(s); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/detail/deref_impl.hpp b/include/boost/fusion/view/single_view/detail/deref_impl.hpp new file mode 100644 index 00000000..355cf6ac --- /dev/null +++ b/include/boost/fusion/view/single_view/detail/deref_impl.hpp @@ -0,0 +1,43 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_05052005_0258) +#define FUSION_DEREF_IMPL_05052005_0258 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct single_view_iterator_tag; + + namespace extension + { + template + struct deref_impl; + + template <> + struct deref_impl + { + template + struct apply + { + typedef typename Iterator::value_type type; + + static type + call(Iterator const& i) + { + return i.val; + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/detail/end_impl.hpp b/include/boost/fusion/view/single_view/detail/end_impl.hpp new file mode 100644 index 00000000..d239c242 --- /dev/null +++ b/include/boost/fusion/view/single_view/detail/end_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_05052005_0332) +#define FUSION_END_IMPL_05052005_0332 + +namespace boost { namespace fusion +{ + struct single_view_tag; + + template + struct single_view_iterator_end; + + namespace extension + { + template + struct end_impl; + + template <> + struct end_impl + { + template + struct apply + { + typedef single_view_iterator_end type; + + static type + call(Sequence&) + { + return type(); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/detail/next_impl.hpp b/include/boost/fusion/view/single_view/detail/next_impl.hpp new file mode 100644 index 00000000..c9cdafdf --- /dev/null +++ b/include/boost/fusion/view/single_view/detail/next_impl.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_05052005_0331) +#define FUSION_NEXT_IMPL_05052005_0331 + +namespace boost { namespace fusion +{ + struct single_view_iterator_tag; + + template + struct single_view_iterator_end; + + template + struct single_view_iterator; + + namespace extension + { + template + struct next_impl; + + template <> + struct next_impl + { + template + struct apply + { + typedef single_view_iterator_end< + typename Iterator::single_view_type> + type; + + static type + call(Iterator) + { + return type(); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/detail/value_of_impl.hpp b/include/boost/fusion/view/single_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..f975eb14 --- /dev/null +++ b/include/boost/fusion/view/single_view/detail/value_of_impl.hpp @@ -0,0 +1,34 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_IMPL_05052005_0324) +#define FUSION_VALUE_IMPL_05052005_0324 + +namespace boost { namespace fusion +{ + struct single_view_iterator_tag; + + namespace extension + { + template + struct value_of_impl; + + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename Iterator::single_view_type single_view_type; + typedef typename single_view_type::value_type type; + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/single_view.hpp b/include/boost/fusion/view/single_view/single_view.hpp new file mode 100644 index 00000000..7c10afe6 --- /dev/null +++ b/include/boost/fusion/view/single_view/single_view.hpp @@ -0,0 +1,54 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SINGLE_VIEW_05052005_0335) +#define FUSION_SINGLE_VIEW_05052005_0335 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct single_view_tag; + struct forward_traversal_tag; + struct fusion_sequence_tag; + + template + struct single_view : sequence_base > + { + typedef single_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef forward_traversal_tag category; + typedef mpl::true_ is_view; + typedef mpl::int_<1> size; + typedef T value_type; + + single_view() + : val() {} + + explicit single_view(typename detail::call_param::type val) + : val(val) {} + + value_type val; + }; + + template + inline single_view::type> + make_single_view(T const& v) + { + return single_view::type>(v); + } +}} + +#endif + + diff --git a/include/boost/fusion/view/single_view/single_view_iterator.hpp b/include/boost/fusion/view/single_view/single_view_iterator.hpp new file mode 100644 index 00000000..1a44bb15 --- /dev/null +++ b/include/boost/fusion/view/single_view/single_view_iterator.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SINGLE_VIEW_ITERATOR_05052005_0340) +#define FUSION_SINGLE_VIEW_ITERATOR_05052005_0340 + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct single_view_iterator_tag; + struct forward_traversal_tag; + + template + struct single_view_iterator_end + : iterator_base > + { + typedef single_view_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + }; + + template + struct single_view_iterator + : iterator_base > + { + typedef single_view_iterator_tag fusion_tag; + typedef forward_traversal_tag category; + typedef typename SingleView::value_type value_type; + typedef SingleView single_view_type; + + explicit single_view_iterator(single_view_type const& view) + : val(view.val) {} + + value_type val; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view.hpp b/include/boost/fusion/view/transform_view.hpp new file mode 100644 index 00000000..744d063c --- /dev/null +++ b/include/boost/fusion/view/transform_view.hpp @@ -0,0 +1,13 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_SEQUENCE_VIEW_TRANSFORM_VIEW_10022005_0612) +#define FUSION_SEQUENCE_VIEW_TRANSFORM_VIEW_10022005_0612 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/advance_impl.hpp b/include/boost/fusion/view/transform_view/detail/advance_impl.hpp new file mode 100644 index 00000000..6b323484 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/advance_impl.hpp @@ -0,0 +1,75 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_ADVANCE_IMPL_13122005_1906) +#define FUSION_ADVANCE_IMPL_13122005_1906 + +#include + +namespace boost { namespace fusion +{ + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + template + struct transform_view_iterator; + + template + struct transform_view_iterator2; + + namespace extension + { + template + struct advance_impl; + + // Unary Version + template<> + struct advance_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename result_of::advance::type advanced_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator type; + + static type + call(Iterator const& i) + { + return type(boost::fusion::advance(i.first), i.f); + } + }; + }; + + // Binary Version + template<> + struct advance_impl + { + template + struct apply + { + typedef typename Iterator::first1_type first1_type; + typedef typename Iterator::first2_type first2_type; + typedef typename result_of::advance::type advanced1_type; + typedef typename result_of::advance::type advanced2_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator2 type; + + static type + call(Iterator const& i) + { + return type( + boost::fusion::advance(i.first1) + , boost::fusion::advance(i.first2), i.f); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/apply_transform_result.hpp b/include/boost/fusion/view/transform_view/detail/apply_transform_result.hpp new file mode 100644 index 00000000..73be3045 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/apply_transform_result.hpp @@ -0,0 +1,37 @@ +/*============================================================================= + Copyright (c) 2001-2006 Joel de Guzman + Copyright (c) 2007 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_APPLY_TRANSFORM_RESULT_02092006_1936) +#define BOOST_FUSION_APPLY_TRANSFORM_RESULT_02092006_1936 + +#include + +namespace boost { namespace fusion +{ + struct void_; + + namespace detail + { + template + struct apply_transform_result + { + template + struct apply + : boost::result_of + {}; + + template + struct apply + : boost::result_of + {}; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/detail/at_impl.hpp b/include/boost/fusion/view/transform_view/detail/at_impl.hpp new file mode 100644 index 00000000..620d96fe --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/at_impl.hpp @@ -0,0 +1,63 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_20061029_1946) +#define BOOST_FUSION_AT_IMPL_20061029_1946 + +#include +#include +#include + +namespace boost { namespace fusion { + struct transform_view_tag; + struct transform_view2_tag; + + namespace extension + { + template + struct at_impl; + + template<> + struct at_impl + { + template + struct apply + { + typedef typename Seq::transform_type F; + typedef detail::apply_transform_result transform_type; + typedef typename boost::fusion::result_of::at::type value_type; + typedef typename mpl::apply::type type; + + static type call(Seq& seq) + { + return seq.f(boost::fusion::at(seq.seq)); + } + }; + }; + + template<> + struct at_impl + { + template + struct apply + { + typedef typename Seq::transform_type F; + typedef detail::apply_transform_result transform_type; + typedef typename boost::fusion::result_of::at::type value1_type; + typedef typename boost::fusion::result_of::at::type value2_type; + typedef typename mpl::apply::type type; + + static type call(Seq& seq) + { + return seq.f(boost::fusion::at(seq.seq1), boost::fusion::at(seq.seq2)); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/begin_impl.hpp b/include/boost/fusion/view/transform_view/detail/begin_impl.hpp new file mode 100644 index 00000000..75b04382 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/begin_impl.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_BEGIN_IMPL_07162005_1031) +#define FUSION_BEGIN_IMPL_07162005_1031 + +#include + +namespace boost { namespace fusion +{ + template + struct transform_view_iterator; + + template + struct transform_view_iterator2; + + namespace extension + { + template + struct begin_impl; + + // Unary Version + template <> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::first_type first_type; + typedef typename Sequence::transform_type transform_type; + typedef transform_view_iterator type; + + static type + call(Sequence& s) + { + return type(s.first(), s.f); + } + }; + }; + + // Binary Version + template <> + struct begin_impl + { + template + struct apply + { + typedef typename Sequence::first1_type first1_type; + typedef typename Sequence::first2_type first2_type; + typedef typename Sequence::transform_type transform_type; + typedef transform_view_iterator2 type; + + static type + call(Sequence& s) + { + return type(s.first1(), s.first2(), s.f); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/detail/deref_impl.hpp b/include/boost/fusion/view/transform_view/detail/deref_impl.hpp new file mode 100644 index 00000000..3849f80a --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/deref_impl.hpp @@ -0,0 +1,76 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DEREF_IMPL_07162005_1026) +#define FUSION_DEREF_IMPL_07162005_1026 + +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + namespace extension + { + template + struct deref_impl; + + // Unary Version + template <> + struct deref_impl + { + template + struct apply + { + typedef typename + result_of::deref::type + value_type; + + typedef detail::apply_transform_result transform_type; + typedef typename mpl::apply::type type; + + static type + call(Iterator const& i) + { + return i.f(*i.first); + } + }; + }; + + // Binary Version + template <> + struct deref_impl + { + template + struct apply + { + typedef typename + result_of::deref::type + value1_type; + typedef typename + result_of::deref::type + value2_type; + + typedef detail::apply_transform_result transform_type; + typedef typename mpl::apply::type type; + + static type + call(Iterator const& i) + { + return i.f(*i.first1, *i.first2); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/detail/distance_impl.hpp b/include/boost/fusion/view/transform_view/detail/distance_impl.hpp new file mode 100644 index 00000000..d5ae0adc --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/distance_impl.hpp @@ -0,0 +1,59 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_DISTANCE_IMPL_13122005_2139) +#define FUSION_DISTANCE_IMPL_13122005_2139 + +#include + +namespace boost { namespace fusion { + + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + namespace extension + { + template + struct distance_impl; + + // Unary Version + template<> + struct distance_impl + { + template + struct apply + : result_of::distance + { + static + typename result_of::distance::type + call(First const& first, Last const& last) + { + return boost::fusion::distance(first.first, last.first); + } + }; + }; + + // Binary Version + template<> + struct distance_impl + { + template + struct apply + : result_of::distance + { + static + typename result_of::distance::type + call(First const& first, Last const& last) + { + return boost::fusion::distance(first.first1, last.first1); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/end_impl.hpp b/include/boost/fusion/view/transform_view/detail/end_impl.hpp new file mode 100644 index 00000000..465a2cbe --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/end_impl.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_END_IMPL_07162005_1028) +#define FUSION_END_IMPL_07162005_1028 + +#include + +namespace boost { namespace fusion +{ + template + struct transform_view_iterator; + + template + struct transform_view_iterator2; + + namespace extension + { + template + struct end_impl; + + // Unary Version + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::last_type last_type; + typedef typename Sequence::transform_type transform_type; + typedef transform_view_iterator type; + + static type + call(Sequence& s) + { + return type(s.last(), s.f); + } + }; + }; + + // Binary Version + template <> + struct end_impl + { + template + struct apply + { + typedef typename Sequence::last1_type last1_type; + typedef typename Sequence::last2_type last2_type; + typedef typename Sequence::transform_type transform_type; + typedef transform_view_iterator2 type; + + static type + call(Sequence& s) + { + return type(s.last1(), s.last2(), s.f); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/detail/equal_to_impl.hpp b/include/boost/fusion/view/transform_view/detail/equal_to_impl.hpp new file mode 100644 index 00000000..063a00ed --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/equal_to_impl.hpp @@ -0,0 +1,42 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_TRANSFORM_VIEW_ITERATOR_20070127_0957) +#define BOOST_FUSION_TRANSFORM_VIEW_ITERATOR_20070127_0957 + +#include + +namespace boost { namespace fusion { + + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + namespace extension + { + template + struct equal_to_impl; + + template<> + struct equal_to_impl + { + template + struct apply + : result_of::equal_to + {}; + }; + + template<> + struct equal_to_impl + { + template + struct apply + : result_of::equal_to + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/next_impl.hpp b/include/boost/fusion/view/transform_view/detail/next_impl.hpp new file mode 100644 index 00000000..4d6ec743 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/next_impl.hpp @@ -0,0 +1,74 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_NEXT_IMPL_07162005_1029) +#define FUSION_NEXT_IMPL_07162005_1029 + +#include + +namespace boost { namespace fusion +{ + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + template + struct transform_view_iterator; + + template + struct transform_view_iterator2; + + namespace extension + { + template + struct next_impl; + + // Unary Version + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename result_of::next::type next_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator type; + + static type + call(Iterator const& i) + { + return type(fusion::next(i.first), i.f); + } + }; + }; + + // Binary Version + template <> + struct next_impl + { + template + struct apply + { + typedef typename Iterator::first1_type first1_type; + typedef typename Iterator::first2_type first2_type; + typedef typename result_of::next::type next1_type; + typedef typename result_of::next::type next2_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator2 type; + + static type + call(Iterator const& i) + { + return type(fusion::next(i.first1), fusion::next(i.first2), i.f); + } + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/detail/prior_impl.hpp b/include/boost/fusion/view/transform_view/detail/prior_impl.hpp new file mode 100644 index 00000000..f7d49966 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/prior_impl.hpp @@ -0,0 +1,73 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_PREV_IMPL_13122005_2110) +#define FUSION_PREV_IMPL_13122005_2110 + +#include + +namespace boost { namespace fusion +{ + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + template + struct transform_view_iterator; + + template + struct transform_view_iterator2; + + namespace extension + { + template + struct prior_impl; + + // Unary Version + template<> + struct prior_impl + { + template + struct apply + { + typedef typename Iterator::first_type first_type; + typedef typename result_of::prior::type prior_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator type; + + static type + call(Iterator const& i) + { + return type(fusion::prior(i.first), i.f); + } + }; + }; + + // Binary Version + template<> + struct prior_impl + { + template + struct apply + { + typedef typename Iterator::first1_type first1_type; + typedef typename Iterator::first2_type first2_type; + typedef typename result_of::prior::type prior1_type; + typedef typename result_of::prior::type prior2_type; + typedef typename Iterator::transform_type transform_type; + typedef transform_view_iterator2 type; + + static type + call(Iterator const& i) + { + return type(fusion::prior(i.first1), fusion::prior(i.first2), i.f); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/value_at_impl.hpp b/include/boost/fusion/view/transform_view/detail/value_at_impl.hpp new file mode 100644 index 00000000..bd4409f7 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/value_at_impl.hpp @@ -0,0 +1,53 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_20061101_0745) +#define BOOST_FUSION_VALUE_AT_IMPL_20061101_0745 + +#include +#include +#include + +namespace boost { namespace fusion { + struct transform_view_tag; + struct transform_view2_tag; + + namespace extension + { + template + struct value_at_impl; + + template<> + struct value_at_impl + { + template + struct apply + { + typedef typename Seq::transform_type F; + typedef detail::apply_transform_result transform_type; + typedef typename boost::fusion::result_of::value_at::type value_type; + typedef typename mpl::apply::type type; + }; + }; + + template<> + struct value_at_impl + { + template + struct apply + { + typedef typename Seq::transform_type F; + typedef detail::apply_transform_result transform_type; + typedef typename boost::fusion::result_of::value_at::type value1_type; + typedef typename boost::fusion::result_of::value_at::type value2_type; + typedef typename mpl::apply::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp b/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..08bbf209 --- /dev/null +++ b/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp @@ -0,0 +1,63 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_VALUE_OF_IMPL_07162005_1030) +#define FUSION_VALUE_OF_IMPL_07162005_1030 + +#include +#include +#include + +namespace boost { namespace fusion +{ + struct transform_view_iterator_tag; + struct transform_view_iterator2_tag; + + namespace extension + { + template + struct value_of_impl; + + // Unary Version + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename + result_of::value_of::type + value_type; + + typedef detail::apply_transform_result transform_type; + typedef typename mpl::apply::type type; + }; + }; + + // Binary Version + template <> + struct value_of_impl + { + template + struct apply + { + typedef typename + result_of::value_of::type + value1_type; + typedef typename + result_of::value_of::type + value2_type; + + typedef detail::apply_transform_result transform_type; + typedef typename mpl::apply::type type; + }; + }; + } +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/transform_view.hpp b/include/boost/fusion/view/transform_view/transform_view.hpp new file mode 100644 index 00000000..fcf876a0 --- /dev/null +++ b/include/boost/fusion/view/transform_view/transform_view.hpp @@ -0,0 +1,107 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_TRANSFORM_VIEW_07162005_1037) +#define FUSION_TRANSFORM_VIEW_07162005_1037 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct void_; + struct transform_view_tag; + struct transform_view2_tag; + struct fusion_sequence_tag; + + // Binary Version + template + struct transform_view : sequence_base > + { + BOOST_STATIC_ASSERT(result_of::size::value == result_of::size::value); + typedef transform_view2_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + + typedef typename traits::category_of::type category1; + typedef typename traits::category_of::type category2; + typedef typename detail::strictest_traversal< + fusion::vector2 >::type category; + typedef typename result_of::begin::type first1_type; + typedef typename result_of::begin::type first2_type; + typedef typename result_of::end::type last1_type; + typedef typename result_of::end::type last2_type; + typedef typename result_of::size::type size; + typedef Sequence1 sequence1_type; + typedef Sequence2 sequence2_type; + typedef F transform_type; + + transform_view(Sequence1& seq1, Sequence2& seq2, F const& binop) + : f(binop) + , seq1(seq1) + , seq2(seq2) + {} + + first1_type first1() const { return fusion::begin(seq1); } + first2_type first2() const { return fusion::begin(seq2); } + last1_type last1() const { return fusion::end(seq1); } + last2_type last2() const { return fusion::end(seq2); } + + transform_type f; + typename mpl::if_, Sequence1, Sequence1&>::type seq1; + typename mpl::if_, Sequence2, Sequence2&>::type seq2; + }; + + // Unary Version + template +#if defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) + struct transform_view : sequence_base > +#else + struct transform_view : sequence_base > +#endif + { + typedef transform_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + + typedef typename traits::category_of::type category; + typedef typename result_of::begin::type first_type; + typedef typename result_of::end::type last_type; + typedef typename result_of::size::type size; + typedef Sequence sequence_type; + typedef F transform_type; + + transform_view(Sequence& seq, F const& f) + : seq(seq) + , f(f) + {} + + first_type first() const { return fusion::begin(seq); } + last_type last() const { return fusion::end(seq); } + typename mpl::if_, Sequence, Sequence&>::type seq; + transform_type f; + }; +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/transform_view_fwd.hpp b/include/boost/fusion/view/transform_view/transform_view_fwd.hpp new file mode 100644 index 00000000..7dca304a --- /dev/null +++ b/include/boost/fusion/view/transform_view/transform_view_fwd.hpp @@ -0,0 +1,22 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_TRANSFORM_VIEW_FORWARD_01052006_1839) +#define FUSION_TRANSFORM_VIEW_FORWARD_01052006_1839 + +namespace boost { namespace fusion +{ + struct void_; + struct transform_view_tag; + struct transform_view2_tag; + + template + struct transform_view; +}} + +#endif + + diff --git a/include/boost/fusion/view/transform_view/transform_view_iterator.hpp b/include/boost/fusion/view/transform_view/transform_view_iterator.hpp new file mode 100644 index 00000000..bb4b6afd --- /dev/null +++ b/include/boost/fusion/view/transform_view/transform_view_iterator.hpp @@ -0,0 +1,69 @@ +/*============================================================================= + Copyright (c) 2001-2006 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_TRANSFORM_VIEW_ITERATOR_07162005_1033) +#define FUSION_TRANSFORM_VIEW_ITERATOR_07162005_1033 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + // Unary Version + struct transform_view_iterator_tag; + + template + struct transform_view_iterator + : iterator_base > + { + typedef transform_view_iterator_tag fusion_tag; + typedef convert_iterator converter; + typedef typename converter::type first_type; + typedef typename traits::category_of::type category; + typedef F transform_type; + + transform_view_iterator(First const& first, F const& f) + : first(converter::call(first)), f(f) {} + + first_type first; + transform_type f; + }; + + // Binary Version + struct transform_view_iterator2_tag; + + template + struct transform_view_iterator2 + : iterator_base > + { + typedef transform_view_iterator2_tag fusion_tag; + typedef convert_iterator converter1; + typedef convert_iterator converter2; + typedef typename converter1::type first1_type; + typedef typename converter2::type first2_type; + typedef typename traits::category_of::type category; + typedef F transform_type; + + transform_view_iterator2(First1 const& first1, First2 const& first2, F const& f) + : first1(converter1::call(first1)), first2(converter2::call(first2)), f(f) {} + + first1_type first1; + first2_type first2; + transform_type f; + }; +}} + +#endif + diff --git a/include/boost/fusion/view/zip_view.hpp b/include/boost/fusion/view/zip_view.hpp new file mode 100644 index 00000000..f7a16ea0 --- /dev/null +++ b/include/boost/fusion/view/zip_view.hpp @@ -0,0 +1,14 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_ZIP_VIEW_23012006_0811) +#define FUSION_ZIP_VIEW_23012006_0811 + +#include +#include + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/advance_impl.hpp b/include/boost/fusion/view/zip_view/detail/advance_impl.hpp new file mode 100644 index 00000000..9aa00deb --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/advance_impl.hpp @@ -0,0 +1,69 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_ADVANCE_IMPL_20061024_2021) +#define FUSION_ADVANCE_IMPL_20061024_2021 + +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + namespace detail + { + template + struct poly_advance + { + template + struct result; + + template + struct result(It)> + { + typedef typename remove_reference::type it; + typedef typename result_of::advance::type type; + }; + + template + typename result::type + operator()(const It& it) const + { + return fusion::advance(it); + } + }; + } + + namespace extension + { + template + struct advance_impl; + + template<> + struct advance_impl + { + template + struct apply + { + typedef zip_view_iterator< + typename result_of::transform >::type> type; + + static type + call(It const& it) + { + return type( + fusion::transform(it.iterators_, detail::poly_advance())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/at_impl.hpp b/include/boost/fusion/view/zip_view/detail/at_impl.hpp new file mode 100644 index 00000000..b01b8cfa --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/at_impl.hpp @@ -0,0 +1,92 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_AT_IMPL_20060124_1933) +#define FUSION_AT_IMPL_20060124_1933 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace boost { namespace fusion +{ + struct zip_view_tag; + + namespace detail + { + template + struct poly_at + { + template + struct result; + + template + struct result(SeqRef)> + : mpl::eval_if, + mpl::identity, + result_of::at::type, N> > + { + BOOST_MPL_ASSERT((is_reference)); + }; + + template + typename result::type + operator()(Seq& seq) const + { + return fusion::at(seq); + } + + template + typename result::type + operator()(Seq const& seq) const + { + return fusion::at(seq); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct at_impl; + + template<> + struct at_impl + { + template + struct apply + { + typedef typename result_of::as_vector< + typename result_of::transform< + typename Seq::sequences, detail::poly_at >::type>::type type; + + static type + call(Seq& seq) + { + return type( + fusion::transform(seq.sequences_, detail::poly_at())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/begin_impl.hpp b/include/boost/fusion/view/zip_view/detail/begin_impl.hpp new file mode 100644 index 00000000..674dea38 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/begin_impl.hpp @@ -0,0 +1,92 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_BEGIN_IMPL_20060123_2147) +#define FUSION_BEGIN_IMPL_20060123_2147 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_tag; + + namespace detail + { + struct poly_begin + { + template + struct result; + + template + struct result + : mpl::eval_if, + mpl::identity, + result_of::begin::type> > + { + BOOST_MPL_ASSERT((is_reference)); + }; + + template + typename result::type + operator()(Seq& seq) const + { + return fusion::begin(seq); + } + + template + typename result::type + operator()(Seq const& seq) const + { + return fusion::begin(seq); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct begin_impl; + + template<> + struct begin_impl + { + template + struct apply + { + typedef zip_view_iterator< + typename result_of::transform::type, + typename Sequence::category> type; + + static type + call(Sequence& sequence) + { + return type( + fusion::transform(sequence.sequences_, detail::poly_begin())); + } + }; + + + + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/deref_impl.hpp b/include/boost/fusion/view/zip_view/detail/deref_impl.hpp new file mode 100644 index 00000000..69cc8825 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/deref_impl.hpp @@ -0,0 +1,83 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_DEREF_IMPL_20061024_1959) +#define FUSION_DEREF_IMPL_20061024_1959 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + namespace detail + { + struct poly_deref + { + template + struct result; + + template + struct result + { + typedef typename remove_const< + typename remove_reference::type>::type it; + + typedef typename mpl::eval_if, + mpl::identity, + result_of::deref >::type type; + }; + + template + typename result::type + operator()(const It& it) const + { + return fusion::deref(it); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct deref_impl; + + template<> + struct deref_impl + { + template + struct apply + { + typedef typename result_of::as_vector< + typename result_of::transform::type>::type type; + + static type + call(It const& it) + { + return type( + fusion::transform(it.iterators_, detail::poly_deref())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/distance_impl.hpp b/include/boost/fusion/view/zip_view/detail/distance_impl.hpp new file mode 100644 index 00000000..61447278 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/distance_impl.hpp @@ -0,0 +1,82 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_DISTANCE_IMPL_20060124_2033) +#define FUSION_DISTANCE_IMPL_20060124_2033 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + struct random_access_iterator_tag; + + namespace detail + { + template + struct best_distance + { + typedef typename result_of::find_if< + typename SearchIt::iterators, is_same, random_access_iterator_tag> > finder; + + BOOST_MPL_ASSERT_NOT((is_same >)); + + typedef typename result_of::distance::type type; + }; + + template + struct default_distance + : result_of::distance< + typename result_of::value_at_c::type, + typename result_of::value_at_c::type> + {}; + + template + struct zip_view_iterator_distance + { + typedef typename result_of::find_if< + typename It1::iterators, is_same, random_access_iterator_tag> > finder; + + typedef typename mpl::eval_if< + is_same::type>, + detail::default_distance , + detail::best_distance >::type type; + }; + } + + namespace extension + { + template + struct distance_impl; + + template<> + struct distance_impl + { + template + struct apply + : detail::zip_view_iterator_distance::type + { + static typename detail::zip_view_iterator_distance::type + call(It1 const& it1, It2 const& it2) + { + return typename detail::zip_view_iterator_distance::type(); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/end_impl.hpp b/include/boost/fusion/view/zip_view/detail/end_impl.hpp new file mode 100644 index 00000000..fa9c31db --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/end_impl.hpp @@ -0,0 +1,103 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_END_IMPL_20060123_2208) +#define FUSION_END_IMPL_20060123_2208 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_tag; + + namespace detail + { + template + struct get_endpoint + { + typedef typename remove_reference::type Seq; + typedef typename result_of::begin::type begin; + typedef typename result_of::advance::type type; + }; + + template + struct endpoints + { + template + struct result; + + template + struct result(SeqRef)> + : mpl::eval_if, + mpl::identity, + get_endpoint > + { + BOOST_MPL_ASSERT((is_reference)); + }; + + template + typename result::type + operator()(Seq& seq) const + { + return fusion::advance(fusion::begin(seq)); + } + + template + typename result::type + operator()(Seq const& seq) + { + return fusion::advance(fusion::begin(seq)); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct end_impl; + + template<> + struct end_impl + { + template + struct apply + { + typedef zip_view_iterator< + typename result_of::transform >::type, + typename Sequence::category> type; + + static type + call(Sequence& sequence) + { + return type( + fusion::transform(sequence.sequences_, detail::endpoints())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/equal_to_impl.hpp b/include/boost/fusion/view/zip_view/detail/equal_to_impl.hpp new file mode 100644 index 00000000..c3962a63 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/equal_to_impl.hpp @@ -0,0 +1,62 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_EQUAL_TO_IMPL_20060128_1423) +#define FUSION_EQUAL_TO_IMPL_20060128_1423 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + namespace detail + { + template + struct zip_iterators_equal + { + typedef mpl::zip_view > zipped; + typedef mpl::transform_view > > transformed; + + typedef typename mpl::find_if >::type found; + + typedef typename is_same::type, found>::type type; + }; + } + + namespace extension + { + template + struct equal_to_impl; + + template<> + struct equal_to_impl + { + template + struct apply + : detail::zip_iterators_equal::type + {}; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/next_impl.hpp b/include/boost/fusion/view/zip_view/detail/next_impl.hpp new file mode 100644 index 00000000..1c9c0245 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/next_impl.hpp @@ -0,0 +1,83 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_NEXT_IMPL_20060124_2006) +#define FUSION_NEXT_IMPL_20060124_2006 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + namespace detail + { + struct poly_next + { + template + struct result; + + template + struct result + { + typedef typename remove_const< + typename remove_reference::type>::type it; + + typedef typename mpl::eval_if, + mpl::identity, + result_of::next >::type type; + }; + + template + typename result::type + operator()(const It& it) const + { + return fusion::next(it); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct next_impl; + + template<> + struct next_impl + { + template + struct apply + { + typedef fusion::zip_view_iterator< + typename result_of::transform::type, + typename Iterator::category> type; + + static type + call(Iterator const& it) + { + return type( + fusion::transform(it.iterators_, detail::poly_next())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/prior_impl.hpp b/include/boost/fusion/view/zip_view/detail/prior_impl.hpp new file mode 100644 index 00000000..49b99397 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/prior_impl.hpp @@ -0,0 +1,83 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_PRIOR_IMPL_20060124_2006) +#define FUSION_PRIOR_IMPL_20060124_2006 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + namespace detail + { + struct poly_prior + { + template + struct result; + + template + struct result + { + typedef typename remove_const< + typename remove_reference::type>::type it; + typedef typename mpl::eval_if, + mpl::identity, + result_of::prior >::type type; + }; + + template + typename result::type + operator()(const It& it) const + { + return fusion::prior(it); + } + + unused_type operator()(unused_type const&) const + { + return unused_type(); + } + }; + } + + namespace extension + { + template + struct prior_impl; + + template<> + struct prior_impl + { + template + struct apply + { + typedef zip_view_iterator< + typename result_of::transform::type, + typename Iterator::category> type; + + static type + call(Iterator const& it) + + { + return type( + fusion::transform(it.iterators_, detail::poly_prior())); + } + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/size_impl.hpp b/include/boost/fusion/view/zip_view/detail/size_impl.hpp new file mode 100644 index 00000000..70798d28 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/size_impl.hpp @@ -0,0 +1,35 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_SIZE_IMPL_20060124_0800) +#define FUSION_SIZE_IMPL_20060124_0800 + +namespace boost { namespace fusion { + + struct zip_view_tag; + + namespace extension + { + template + struct size; + + template + struct size_impl; + + template<> + struct size_impl + { + template + struct apply + { + typedef typename Sequence::size type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/value_at_impl.hpp b/include/boost/fusion/view/zip_view/detail/value_at_impl.hpp new file mode 100644 index 00000000..7905b063 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/value_at_impl.hpp @@ -0,0 +1,61 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_VALUE_AT_IMPL_20060124_2129) +#define FUSION_VALUE_AT_IMPL_20060124_2129 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { + + struct zip_view_tag; + + namespace detail + { + template + struct poly_value_at + { + template + struct result; + + template + struct result(Seq)> + : mpl::eval_if, + mpl::identity, + result_of::value_at::type, N> > + {}; + }; + } + + namespace extension + { + template + struct value_at_impl; + + template<> + struct value_at_impl + { + template + struct apply + { + typedef typename result_of::transform< + typename Sequence::sequences, + detail::poly_value_at >::type values; + typedef typename result_of::as_vector::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/detail/value_of_impl.hpp b/include/boost/fusion/view/zip_view/detail/value_of_impl.hpp new file mode 100644 index 00000000..4ba4c3c5 --- /dev/null +++ b/include/boost/fusion/view/zip_view/detail/value_of_impl.hpp @@ -0,0 +1,61 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_VALUE_OF_IMPL_20060124_2147) +#define FUSION_VALUE_OF_IMPL_20060124_2147 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace fusion +{ + struct zip_view_iterator_tag; + + namespace detail + { + struct poly_value_of + { + template + struct result; + + template + struct result + : mpl::eval_if, + mpl::identity, + result_of::value_of > + {}; + }; + } + + namespace extension + { + template + struct value_of_impl; + + template<> + struct value_of_impl + { + template + struct apply + { + typedef typename result_of::transform< + typename Iterator::iterators, + detail::poly_value_of>::type values; + + typedef typename result_of::as_vector::type type; + }; + }; + } +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/zip_view.hpp b/include/boost/fusion/view/zip_view/zip_view.hpp new file mode 100644 index 00000000..340feafb --- /dev/null +++ b/include/boost/fusion/view/zip_view/zip_view.hpp @@ -0,0 +1,115 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_ZIP_VIEW_23012006_0813) +#define FUSION_ZIP_VIEW_23012006_0813 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace boost { namespace fusion { + + namespace detail + { + template + struct all_references + : fusion::result_of::equal_to > >::type, typename fusion::result_of::end::type> + {}; + + struct seq_ref_size + { + template + struct result; + + template + struct result + { + static int const high_int = static_cast( + (static_cast(~0) >> 1) - 1); + + typedef typename remove_reference::type SeqClass; + + typedef typename mpl::eval_if< + traits::is_forward, + result_of::size, + mpl::int_ >::type type; + }; + }; + + struct poly_min + { + template + struct result; + + template + struct result + { + typedef typename remove_reference::type lhs; + typedef typename remove_reference::type rhs; + typedef typename mpl::min::type type; + }; + }; + + template + struct min_size + { + typedef typename result_of::transform::type sizes; + typedef typename result_of::fold::type, detail::poly_min>::type type; + }; + } + + struct zip_view_tag; + struct fusion_sequence_tag; + + template + struct zip_view : sequence_base< zip_view > + { + typedef typename result_of::remove::type real_sequences; + BOOST_MPL_ASSERT((detail::all_references)); + typedef typename detail::strictest_traversal::type category; + typedef zip_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + typedef typename fusion::result_of::as_vector::type sequences; + typedef typename detail::min_size::type size; + + zip_view( + const Sequences& seqs) + : sequences_(seqs) + {}; + + sequences sequences_; + }; +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/zip_view_iterator.hpp b/include/boost/fusion/view/zip_view/zip_view_iterator.hpp new file mode 100644 index 00000000..66b514dc --- /dev/null +++ b/include/boost/fusion/view/zip_view/zip_view_iterator.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_ZIP_VIEW_ITERATOR_23012006_0814) +#define FUSION_ZIP_VIEW_ITERATOR_23012006_0814 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace boost { namespace fusion { + + struct zip_view_iterator_tag; + + template< + typename IteratorSequence, + typename Traversal> + struct zip_view_iterator + : iterator_base > + { + typedef zip_view_iterator_tag fusion_tag; + typedef Traversal category; + + template + zip_view_iterator( + const InitSeq& iterator_seq) + : iterators_(iterator_seq) + {} + + typedef typename result_of::as_vector::type iterators; + iterators iterators_; + }; +}} + +#endif diff --git a/include/boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp b/include/boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp new file mode 100644 index 00000000..e2b9a7d4 --- /dev/null +++ b/include/boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp @@ -0,0 +1,22 @@ +/*============================================================================= + Copyright (c) 2001-2006 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(FUSION_ZIP_VIEW_ITERATOR_FWD) +#define FUSION_ZIP_VIEW_ITERATOR_FWD + +#include + +namespace boost { namespace fusion { + + template< + typename IteratorSequence, + typename Traversal = typename detail::strictest_traversal::type> + struct zip_view_iterator; + +}} + +#endif diff --git a/test/Jamfile b/test/Jamfile index f70629b8..12407035 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -81,7 +81,6 @@ import testing ; [ run sequence/single_view.cpp : : : : ] [ run sequence/std_pair.cpp : : : : ] [ run sequence/array.cpp : : : : ] - [ run sequence/variant.cpp : : : : ] [ run sequence/tuple_comparison.cpp : : : : ] [ run sequence/tuple_construction.cpp : : : : ] [ run sequence/tuple_copy.cpp : : : : ] @@ -90,6 +89,7 @@ import testing ; [ run sequence/tuple_misc.cpp : : : : ] [ run sequence/tuple_mutate.cpp : : : : ] [ run sequence/tuple_tie.cpp : : : : ] + [ run sequence/tr1_tuple_auto_conv.cpp : : : : ] [ run sequence/transform_view.cpp : : : : ] [ run sequence/vector_comparison.cpp : : : : ] [ run sequence/vector_construction.cpp : : : : ] diff --git a/test/algorithm/all.cpp b/test/algorithm/all.cpp index 983059c8..47c65e50 100644 --- a/test/algorithm/all.cpp +++ b/test/algorithm/all.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/any.cpp b/test/algorithm/any.cpp index 71685ef2..69f114f8 100644 --- a/test/algorithm/any.cpp +++ b/test/algorithm/any.cpp @@ -7,8 +7,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/clear.cpp b/test/algorithm/clear.cpp index 309f3e28..9122af2c 100644 --- a/test/algorithm/clear.cpp +++ b/test/algorithm/clear.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include -#include +#include #include #include diff --git a/test/algorithm/count.cpp b/test/algorithm/count.cpp index ae6ccde6..e87ff9d8 100644 --- a/test/algorithm/count.cpp +++ b/test/algorithm/count.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/count_if.cpp b/test/algorithm/count_if.cpp index 1a8c02e5..d67e464c 100644 --- a/test/algorithm/count_if.cpp +++ b/test/algorithm/count_if.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/erase.cpp b/test/algorithm/erase.cpp index efe7dcfe..310c7260 100644 --- a/test/algorithm/erase.cpp +++ b/test/algorithm/erase.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include +#include +#include +#include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/erase_key.cpp b/test/algorithm/erase_key.cpp index d940714c..56c64780 100644 --- a/test/algorithm/erase_key.cpp +++ b/test/algorithm/erase_key.cpp @@ -5,15 +5,15 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/test/algorithm/ext_/find_if_s.cpp b/test/algorithm/ext_/find_if_s.cpp old mode 100755 new mode 100644 index d57876e2..7f33ea45 --- a/test/algorithm/ext_/find_if_s.cpp +++ b/test/algorithm/ext_/find_if_s.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/ext_/for_each_s.cpp b/test/algorithm/ext_/for_each_s.cpp old mode 100755 new mode 100644 index 6758872c..63ffed2c --- a/test/algorithm/ext_/for_each_s.cpp +++ b/test/algorithm/ext_/for_each_s.cpp @@ -5,13 +5,13 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include -#include -#include +#include +#include struct print { diff --git a/test/algorithm/filter.cpp b/test/algorithm/filter.cpp index 21c93ed0..5bca82bf 100644 --- a/test/algorithm/filter.cpp +++ b/test/algorithm/filter.cpp @@ -6,10 +6,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/filter_if.cpp b/test/algorithm/filter_if.cpp index 681d2bbd..f5f1b190 100644 --- a/test/algorithm/filter_if.cpp +++ b/test/algorithm/filter_if.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/find.cpp b/test/algorithm/find.cpp index 1b913a73..25a61e94 100644 --- a/test/algorithm/find.cpp +++ b/test/algorithm/find.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/test/algorithm/find_if.cpp b/test/algorithm/find_if.cpp index 93c694cb..2b402b9f 100644 --- a/test/algorithm/find_if.cpp +++ b/test/algorithm/find_if.cpp @@ -5,8 +5,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/fold.cpp b/test/algorithm/fold.cpp index 933eadb3..a890da67 100644 --- a/test/algorithm/fold.cpp +++ b/test/algorithm/fold.cpp @@ -6,11 +6,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/for_each.cpp b/test/algorithm/for_each.cpp index 18ebbda9..a0054fad 100644 --- a/test/algorithm/for_each.cpp +++ b/test/algorithm/for_each.cpp @@ -5,8 +5,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/insert.cpp b/test/algorithm/insert.cpp index 8780636f..a489d630 100644 --- a/test/algorithm/insert.cpp +++ b/test/algorithm/insert.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/insert_range.cpp b/test/algorithm/insert_range.cpp index 0aef1e81..f4dccb05 100644 --- a/test/algorithm/insert_range.cpp +++ b/test/algorithm/insert_range.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/join.cpp b/test/algorithm/join.cpp index 39709c50..186876fb 100644 --- a/test/algorithm/join.cpp +++ b/test/algorithm/join.cpp @@ -7,9 +7,9 @@ ==============================================================================*/ #include #include -#include +#include #include -#include +#include #include int main() diff --git a/test/algorithm/none.cpp b/test/algorithm/none.cpp index 5747494b..ec5676b6 100644 --- a/test/algorithm/none.cpp +++ b/test/algorithm/none.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/algorithm/pop_back.cpp b/test/algorithm/pop_back.cpp index 5f9ebaf4..3bd98248 100644 --- a/test/algorithm/pop_back.cpp +++ b/test/algorithm/pop_back.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include diff --git a/test/algorithm/pop_front.cpp b/test/algorithm/pop_front.cpp index 8e87a959..1d187592 100644 --- a/test/algorithm/pop_front.cpp +++ b/test/algorithm/pop_front.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include diff --git a/test/algorithm/push_back.cpp b/test/algorithm/push_back.cpp index 94e013a3..420ca3c4 100644 --- a/test/algorithm/push_back.cpp +++ b/test/algorithm/push_back.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/push_front.cpp b/test/algorithm/push_front.cpp index dabdbf77..380ddc0c 100644 --- a/test/algorithm/push_front.cpp +++ b/test/algorithm/push_front.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include diff --git a/test/algorithm/remove.cpp b/test/algorithm/remove.cpp index a0f20ba0..479ed56a 100644 --- a/test/algorithm/remove.cpp +++ b/test/algorithm/remove.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/remove_if.cpp b/test/algorithm/remove_if.cpp index ee4ca848..aa7250d3 100644 --- a/test/algorithm/remove_if.cpp +++ b/test/algorithm/remove_if.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/replace.cpp b/test/algorithm/replace.cpp index 3ccf13b1..11525220 100644 --- a/test/algorithm/replace.cpp +++ b/test/algorithm/replace.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include -#include +#include #include #include diff --git a/test/algorithm/replace_if.cpp b/test/algorithm/replace_if.cpp index 01b2df8a..322c3028 100644 --- a/test/algorithm/replace_if.cpp +++ b/test/algorithm/replace_if.cpp @@ -5,13 +5,13 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include +#include +#include +#include #include #include #include -#include +#include #include #include diff --git a/test/algorithm/reverse.cpp b/test/algorithm/reverse.cpp index 598edac0..3c06d21a 100644 --- a/test/algorithm/reverse.cpp +++ b/test/algorithm/reverse.cpp @@ -5,10 +5,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/transform.cpp b/test/algorithm/transform.cpp index c7ce3625..fac0c92a 100644 --- a/test/algorithm/transform.cpp +++ b/test/algorithm/transform.cpp @@ -6,10 +6,10 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include #include #include diff --git a/test/algorithm/zip.cpp b/test/algorithm/zip.cpp index eb60ba17..df7eb599 100644 --- a/test/algorithm/zip.cpp +++ b/test/algorithm/zip.cpp @@ -7,9 +7,9 @@ ==============================================================================*/ #include #include -#include +#include #include -#include +#include #include int main() diff --git a/test/algorithm/zip2.cpp b/test/algorithm/zip2.cpp index 0823af0e..c8007117 100644 --- a/test/algorithm/zip2.cpp +++ b/test/algorithm/zip2.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include int main() diff --git a/test/algorithm/zip_ignore.cpp b/test/algorithm/zip_ignore.cpp index cd71ed44..a12b5820 100644 --- a/test/algorithm/zip_ignore.cpp +++ b/test/algorithm/zip_ignore.cpp @@ -6,7 +6,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include #include diff --git a/test/functional/fused.cpp b/test/functional/fused.cpp index 4b960ee0..e2c89395 100644 --- a/test/functional/fused.cpp +++ b/test/functional/fused.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/test/functional/fused_function_object.cpp b/test/functional/fused_function_object.cpp index 50a1b38b..c8d4c590 100644 --- a/test/functional/fused_function_object.cpp +++ b/test/functional/fused_function_object.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include namespace fusion = boost::fusion; using boost::noncopyable; diff --git a/test/functional/fused_procedure.cpp b/test/functional/fused_procedure.cpp index d4fd0d9f..57443c20 100644 --- a/test/functional/fused_procedure.cpp +++ b/test/functional/fused_procedure.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include namespace fusion = boost::fusion; using boost::noncopyable; diff --git a/test/functional/invoke.cpp b/test/functional/invoke.cpp index f6e4c868..68c59e4b 100644 --- a/test/functional/invoke.cpp +++ b/test/functional/invoke.cpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -17,12 +17,12 @@ #include -#include -#include +#include +#include #include #include -#include -#include +#include +#include #include #include @@ -127,10 +127,10 @@ class members { public: int data; - + members() : data(20) - { } + { } int nullary() { return data + 1; } int nullary_c() const { return data + 2; } @@ -340,17 +340,17 @@ void result_type_tests() using boost::is_same; BOOST_TEST(( is_same< - fusion::result_of::invoke::type, int + fusion::result_of::invoke::type, int >::value )); // disabled until boost::result_of supports it // BOOST_TEST(( is_same< -// fusion::result_of::invoke >::type, int +// fusion::result_of::invoke >::type, int // >::value )); - BOOST_TEST(( is_same< - fusion::result_of::invoke >::type, int + BOOST_TEST(( is_same< + fusion::result_of::invoke >::type, int >::value )); // disabled until boost::result_of supports it -// BOOST_TEST(( is_same< +// BOOST_TEST(( is_same< // fusion::result_of::invoke >::type, int // >::value )); } diff --git a/test/functional/invoke_function_object.cpp b/test/functional/invoke_function_object.cpp index 0f6272b2..375bc4c5 100644 --- a/test/functional/invoke_function_object.cpp +++ b/test/functional/invoke_function_object.cpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -17,12 +17,12 @@ #include -#include -#include +#include +#include #include #include -#include -#include +#include +#include #include #include @@ -41,7 +41,7 @@ struct object_nc : boost::noncopyable {}; struct fobj { // Handle nullary separately to exercise result_of support - template + template struct result; template @@ -97,7 +97,7 @@ struct fobj_nc { typedef int type; }; - + int operator()(int i) { return 14 + i; } int operator()(int i) const { return 15 + i; } }; diff --git a/test/functional/invoke_procedure.cpp b/test/functional/invoke_procedure.cpp index bf92ef23..2dc93c5a 100644 --- a/test/functional/invoke_procedure.cpp +++ b/test/functional/invoke_procedure.cpp @@ -1,8 +1,8 @@ /*============================================================================= - Copyright (c) 2005-2006 João Abecasis + Copyright (c) 2005-2006 Joao Abecasis Copyright (c) 2006-2007 Tobias Schwinger - - Use modification and distribution are subject to the Boost Software + + 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). ==============================================================================*/ @@ -15,12 +15,12 @@ #include -#include -#include +#include +#include #include #include -#include -#include +#include +#include #include #include @@ -48,10 +48,10 @@ class members { public: int data; - + members() : data(20) - { } + { } int nullary() { return element1 = data + 1; } int nullary_c() const { return element1 = data + 2; } diff --git a/test/functional/make_fused.cpp b/test/functional/make_fused.cpp index a1cd77f7..aab7928a 100644 --- a/test/functional/make_fused.cpp +++ b/test/functional/make_fused.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include namespace fusion = boost::fusion; using boost::noncopyable; diff --git a/test/functional/make_fused_function_object.cpp b/test/functional/make_fused_function_object.cpp index 51808266..dec2411a 100644 --- a/test/functional/make_fused_function_object.cpp +++ b/test/functional/make_fused_function_object.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include namespace fusion = boost::fusion; using boost::noncopyable; diff --git a/test/functional/make_fused_procedure.cpp b/test/functional/make_fused_procedure.cpp index ebe5b555..754c17bc 100644 --- a/test/functional/make_fused_procedure.cpp +++ b/test/functional/make_fused_procedure.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include namespace fusion = boost::fusion; using boost::noncopyable; diff --git a/test/sequence/adapt_assoc_struct.cpp b/test/sequence/adapt_assoc_struct.cpp index 926294a6..acab2b97 100644 --- a/test/sequence/adapt_assoc_struct.cpp +++ b/test/sequence/adapt_assoc_struct.cpp @@ -6,7 +6,7 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include #include @@ -16,10 +16,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/adapt_struct.cpp b/test/sequence/adapt_struct.cpp index 114b8862..2d208b57 100644 --- a/test/sequence/adapt_struct.cpp +++ b/test/sequence/adapt_struct.cpp @@ -5,17 +5,17 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -42,6 +42,9 @@ BOOST_FUSION_ADAPT_STRUCT( (int, y) ) +struct s { int m; }; +BOOST_FUSION_ADAPT_STRUCT(s, (int, m)) + int main() { @@ -101,6 +104,16 @@ main() l = p; } + { // begin/end + using namespace boost::fusion; + using boost::is_same; + + typedef result_of::begin::type b; + typedef result_of::end::type e; + // this fails + BOOST_MPL_ASSERT((is_same::type, e>)); + } + return boost::report_errors(); } diff --git a/test/sequence/array.cpp b/test/sequence/array.cpp index 3a776d52..0ca5255d 100644 --- a/test/sequence/array.cpp +++ b/test/sequence/array.cpp @@ -8,7 +8,7 @@ #include -#include +#include #include #include diff --git a/test/sequence/as_list.cpp b/test/sequence/as_list.cpp index aa45d469..52846d9d 100644 --- a/test/sequence/as_list.cpp +++ b/test/sequence/as_list.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/as_map.cpp b/test/sequence/as_map.cpp index b1b336fb..32e3a420 100644 --- a/test/sequence/as_map.cpp +++ b/test/sequence/as_map.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/as_set.cpp b/test/sequence/as_set.cpp index 40488f32..12a3641c 100644 --- a/test/sequence/as_set.cpp +++ b/test/sequence/as_set.cpp @@ -5,13 +5,13 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/as_vector.cpp b/test/sequence/as_vector.cpp index b5c3425e..27905de5 100644 --- a/test/sequence/as_vector.cpp +++ b/test/sequence/as_vector.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/back_extended_deque.cpp b/test/sequence/back_extended_deque.cpp index f58dfdc6..61d8ece7 100644 --- a/test/sequence/back_extended_deque.cpp +++ b/test/sequence/back_extended_deque.cpp @@ -1,17 +1,18 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Copyright (c) 2006 Dan Marsden - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 -#include -#include +#include +#include #include -#include +#include +#include #include #include diff --git a/test/sequence/boost_tuple.cpp b/test/sequence/boost_tuple.cpp index 522686fd..07e39695 100644 --- a/test/sequence/boost_tuple.cpp +++ b/test/sequence/boost_tuple.cpp @@ -5,17 +5,17 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/comparison.hpp b/test/sequence/comparison.hpp index 429c93c6..0fd30d9d 100644 --- a/test/sequence/comparison.hpp +++ b/test/sequence/comparison.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/cons.cpp b/test/sequence/cons.cpp index 644ced5c..3bd6437f 100644 --- a/test/sequence/cons.cpp +++ b/test/sequence/cons.cpp @@ -7,11 +7,11 @@ ==============================================================================*/ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/construction.hpp b/test/sequence/construction.hpp index 6c289749..5c6abdf2 100644 --- a/test/sequence/construction.hpp +++ b/test/sequence/construction.hpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 #include -#include +#include #if !defined(FUSION_AT) #define FUSION_AT at_c @@ -57,7 +57,9 @@ test() FUSION_SEQUENCE<> empty0; +#ifndef TR1_TUPLE_TEST FUSION_SEQUENCE<> empty1(empty); +#endif FUSION_SEQUENCE t1; BOOST_TEST(FUSION_AT<0>(t1) == int()); diff --git a/test/sequence/copy.hpp b/test/sequence/copy.hpp index f47a0bca..29f8baac 100644 --- a/test/sequence/copy.hpp +++ b/test/sequence/copy.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying @@ -7,7 +7,7 @@ ==============================================================================*/ #include #include -#include +#include #include #include #include diff --git a/test/sequence/deduce_sequence.cpp b/test/sequence/deduce_sequence.cpp index 9c6d1ef4..ea661662 100644 --- a/test/sequence/deduce_sequence.cpp +++ b/test/sequence/deduce_sequence.cpp @@ -7,7 +7,7 @@ ==============================================================================*/ #include -#include +#include #include #include @@ -35,7 +35,7 @@ struct test_seq_ctor #define TEST_SAME_ELEMENTS(a,b) BOOST_TEST(( boost::mpl::equal< a, b >::type::value )) typedef fusion::vector args1; -typedef fusion::vector storable1; +typedef fusion::vector storable1; template struct test_seq_ctor; typedef fusion::vector< reference_wrapper &, reference_wrapper &, @@ -45,7 +45,7 @@ template struct test_seq_ctor; typedef fusion::vector args3; -typedef fusion::vector storable3; +typedef fusion::vector storable3; template struct test_seq_ctor; typedef fusion::vector args4; diff --git a/test/sequence/deque_comparison.cpp b/test/sequence/deque_comparison.cpp index 2c6db999..604a82e5 100644 --- a/test/sequence/deque_comparison.cpp +++ b/test/sequence/deque_comparison.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE deque #include "comparison.hpp" diff --git a/test/sequence/deque_construction.cpp b/test/sequence/deque_construction.cpp index 7ec3caff..9f605ed5 100644 --- a/test/sequence/deque_construction.cpp +++ b/test/sequence/deque_construction.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE deque #include "construction.hpp" diff --git a/test/sequence/deque_copy.cpp b/test/sequence/deque_copy.cpp index 6d3ee13f..712c42c7 100644 --- a/test/sequence/deque_copy.cpp +++ b/test/sequence/deque_copy.cpp @@ -1,14 +1,14 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include +#include #define FUSION_SEQUENCE deque #include "copy.hpp" diff --git a/test/sequence/deque_iterator.cpp b/test/sequence/deque_iterator.cpp index 414b94c5..baf6f827 100644 --- a/test/sequence/deque_iterator.cpp +++ b/test/sequence/deque_iterator.cpp @@ -5,7 +5,7 @@ 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 +#include #define FUSION_SEQUENCE deque #define FUSION_TRAVERSAL_TAG bidirectional_traversal_tag diff --git a/test/sequence/deque_make.cpp b/test/sequence/deque_make.cpp index dfdc681d..334ea029 100644 --- a/test/sequence/deque_make.cpp +++ b/test/sequence/deque_make.cpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include +#include #define FUSION_SEQUENCE deque #include "make.hpp" diff --git a/test/sequence/deque_misc.cpp b/test/sequence/deque_misc.cpp index 01784c1e..f3063079 100644 --- a/test/sequence/deque_misc.cpp +++ b/test/sequence/deque_misc.cpp @@ -1,14 +1,14 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include +#include #define FUSION_SEQUENCE deque #include "misc.hpp" diff --git a/test/sequence/deque_mutate.cpp b/test/sequence/deque_mutate.cpp index 8b56aeac..39bdc381 100644 --- a/test/sequence/deque_mutate.cpp +++ b/test/sequence/deque_mutate.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Copyright (c) 2006 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 +#include #define FUSION_SEQUENCE deque #include "mutate.hpp" diff --git a/test/sequence/deque_tie.cpp b/test/sequence/deque_tie.cpp index 2afb519f..d6bd4926 100644 --- a/test/sequence/deque_tie.cpp +++ b/test/sequence/deque_tie.cpp @@ -1,15 +1,15 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include -#include +#include +#include +#include +#include #define FUSION_SEQUENCE deque #include "tie.hpp" diff --git a/test/sequence/deque_value_at.cpp b/test/sequence/deque_value_at.cpp index 4a0a9ab3..7e528b79 100644 --- a/test/sequence/deque_value_at.cpp +++ b/test/sequence/deque_value_at.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE deque #include "value_at.hpp" diff --git a/test/sequence/ext_/iterator_range_s.cpp b/test/sequence/ext_/iterator_range_s.cpp old mode 100755 new mode 100644 index 4f6ead43..02a49ad4 --- a/test/sequence/ext_/iterator_range_s.cpp +++ b/test/sequence/ext_/iterator_range_s.cpp @@ -7,11 +7,11 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include @@ -43,8 +43,8 @@ process_tree(Tree const &tree) using namespace fusion; using mpl::_; - typedef typename result_of::find_if_s >::type short_iter; - typedef typename result_of::find_if_s >::type float_iter; + typedef typename fusion::result_of::find_if_s >::type short_iter; + typedef typename fusion::result_of::find_if_s >::type float_iter; typedef iterator_range slice_t; BOOST_STATIC_ASSERT(traits::is_segmented::value); diff --git a/test/sequence/filter_view.cpp b/test/sequence/filter_view.cpp index 28dbb8a0..a89abec2 100644 --- a/test/sequence/filter_view.cpp +++ b/test/sequence/filter_view.cpp @@ -5,13 +5,13 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include +#include +#include +#include #include #include -#include -#include +#include +#include #include #include #include @@ -95,6 +95,7 @@ main() // (e.g. comeau 4.3.3, intel) have problems with this. // vc7.1 and g++ are ok. The errors from comeau are useless. +#ifndef __EDG_VERSION__ typedef vector_c vector_type; typedef filter_view > > filter_view_type; vector_type v; @@ -102,6 +103,7 @@ main() std::cout << view << std::endl; BOOST_TEST((view == make_vector(1, 2, 0, -1))); BOOST_STATIC_ASSERT(result_of::size::value == 4); +#endif } { diff --git a/test/sequence/front_extended_deque.cpp b/test/sequence/front_extended_deque.cpp index 2afa6190..7234e955 100644 --- a/test/sequence/front_extended_deque.cpp +++ b/test/sequence/front_extended_deque.cpp @@ -1,17 +1,18 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Copyright (c) 2006 Dan Marsden - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 -#include -#include +#include +#include #include -#include +#include +#include #include #include diff --git a/test/sequence/io.cpp b/test/sequence/io.cpp index 3629ea39..00e88b13 100644 --- a/test/sequence/io.cpp +++ b/test/sequence/io.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (C) 1999-2003 Jaakko Järvi + Copyright (C) 1999-2003 Jaakko Jarvi 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 -#include -#include +#include +#include #include #include #include diff --git a/test/sequence/iterator_range.cpp b/test/sequence/iterator_range.cpp index 1abaf0d5..af42cadd 100644 --- a/test/sequence/iterator_range.cpp +++ b/test/sequence/iterator_range.cpp @@ -5,9 +5,9 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/test/sequence/joint_view.cpp b/test/sequence/joint_view.cpp index eb108df1..8dc4eb3c 100644 --- a/test/sequence/joint_view.cpp +++ b/test/sequence/joint_view.cpp @@ -5,11 +5,11 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include -#include +#include #include #include diff --git a/test/sequence/list_comparison.cpp b/test/sequence/list_comparison.cpp index 19094687..9e379acf 100644 --- a/test/sequence/list_comparison.cpp +++ b/test/sequence/list_comparison.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE list #include "comparison.hpp" diff --git a/test/sequence/list_construction.cpp b/test/sequence/list_construction.cpp index 83d748be..2d9f0f19 100644 --- a/test/sequence/list_construction.cpp +++ b/test/sequence/list_construction.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE list #include "construction.hpp" diff --git a/test/sequence/list_copy.cpp b/test/sequence/list_copy.cpp index 68ae042f..1decdc25 100644 --- a/test/sequence/list_copy.cpp +++ b/test/sequence/list_copy.cpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include +#include #define FUSION_SEQUENCE list #include "copy.hpp" diff --git a/test/sequence/list_iterator.cpp b/test/sequence/list_iterator.cpp index 515a6e0f..f7cc6e1d 100644 --- a/test/sequence/list_iterator.cpp +++ b/test/sequence/list_iterator.cpp @@ -4,7 +4,7 @@ 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 +#include #define FUSION_SEQUENCE list #define FUSION_NO_PRIOR diff --git a/test/sequence/list_make.cpp b/test/sequence/list_make.cpp index 55833b64..58463ca9 100644 --- a/test/sequence/list_make.cpp +++ b/test/sequence/list_make.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include +#include #define FUSION_SEQUENCE list #include "make.hpp" diff --git a/test/sequence/list_misc.cpp b/test/sequence/list_misc.cpp index c5ff71ca..d9f8eb43 100644 --- a/test/sequence/list_misc.cpp +++ b/test/sequence/list_misc.cpp @@ -1,13 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 -#include -#include +#include +#include #define FUSION_SEQUENCE list #define FUSION_FORWARD_ONLY diff --git a/test/sequence/list_mutate.cpp b/test/sequence/list_mutate.cpp index abfc9a3e..15afff64 100644 --- a/test/sequence/list_mutate.cpp +++ b/test/sequence/list_mutate.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE list #include "mutate.hpp" diff --git a/test/sequence/list_tie.cpp b/test/sequence/list_tie.cpp index e227edee..e858dc99 100644 --- a/test/sequence/list_tie.cpp +++ b/test/sequence/list_tie.cpp @@ -1,14 +1,14 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include -#include +#include +#include +#include +#include #define FUSION_SEQUENCE list #include "tie.hpp" diff --git a/test/sequence/list_value_at.cpp b/test/sequence/list_value_at.cpp index 9bd3de69..d0fec91a 100644 --- a/test/sequence/list_value_at.cpp +++ b/test/sequence/list_value_at.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE list #include "value_at.hpp" diff --git a/test/sequence/make.hpp b/test/sequence/make.hpp index c6494474..37d847ac 100644 --- a/test/sequence/make.hpp +++ b/test/sequence/make.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/make_list.cpp b/test/sequence/make_list.cpp index 55833b64..58463ca9 100644 --- a/test/sequence/make_list.cpp +++ b/test/sequence/make_list.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include +#include #define FUSION_SEQUENCE list #include "make.hpp" diff --git a/test/sequence/make_vector.cpp b/test/sequence/make_vector.cpp index ffd06489..4e5ea89e 100644 --- a/test/sequence/make_vector.cpp +++ b/test/sequence/make_vector.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include +#include #define FUSION_SEQUENCE vector #include "make.hpp" diff --git a/test/sequence/map.cpp b/test/sequence/map.cpp index b170158d..5f58b9dc 100644 --- a/test/sequence/map.cpp +++ b/test/sequence/map.cpp @@ -5,8 +5,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/sequence/map_tie.cpp b/test/sequence/map_tie.cpp index aef31c51..1232812d 100644 --- a/test/sequence/map_tie.cpp +++ b/test/sequence/map_tie.cpp @@ -7,7 +7,7 @@ ==============================================================================*/ #include -#include +#include #include struct key_zero; diff --git a/test/sequence/misc.hpp b/test/sequence/misc.hpp index 01ee773d..4c51a18c 100644 --- a/test/sequence/misc.hpp +++ b/test/sequence/misc.hpp @@ -1,13 +1,14 @@ /*============================================================================= - Copyright (C) 1999-2003 Jaakko Järvi + Copyright (C) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 #include #include +#include #include #include #include @@ -105,7 +106,7 @@ struct test_intrinsics2 BOOST_STATIC_ASSERT((boost::mpl::equal::value)); #endif - + typedef boost::fusion::FUSION_SEQUENCE target3; typedef boost::mpl::push_front::type seq3; BOOST_STATIC_ASSERT((boost::mpl::equal::value)); @@ -170,9 +171,9 @@ test() BOOST_STATIC_ASSERT(!traits::is_sequence::value); BOOST_STATIC_ASSERT(!traits::is_sequence::value); } - + { // testing mpl compatibility - + // test begin, end, next, prior, advance, size, deref, etc. //~ typedef FUSION_SEQUENCE tuple_type; //~ test_intrinsics1 test1; @@ -181,7 +182,7 @@ test() // test an algorithm typedef FUSION_SEQUENCE t1; typedef boost::mpl::find::type iter; - typedef boost::mpl::deref::type type; + typedef boost::mpl::deref::type type; BOOST_STATIC_ASSERT((boost::is_same::value)); } diff --git a/test/sequence/mutate.hpp b/test/sequence/mutate.hpp index d50d84d0..a2388786 100644 --- a/test/sequence/mutate.hpp +++ b/test/sequence/mutate.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/repetitive_view.cpp b/test/sequence/repetitive_view.cpp index 0a2c01d9..54da37bc 100644 --- a/test/sequence/repetitive_view.cpp +++ b/test/sequence/repetitive_view.cpp @@ -7,10 +7,10 @@ ==============================================================================*/ #include -#include +#include -#include -#include +#include +#include #include #include diff --git a/test/sequence/reverse_view.cpp b/test/sequence/reverse_view.cpp index 3cc2bf91..3fb20e55 100644 --- a/test/sequence/reverse_view.cpp +++ b/test/sequence/reverse_view.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include -#include +#include #include #include #include diff --git a/test/sequence/set.cpp b/test/sequence/set.cpp index c658380e..95c5b40d 100644 --- a/test/sequence/set.cpp +++ b/test/sequence/set.cpp @@ -5,8 +5,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/test/sequence/single_view.cpp b/test/sequence/single_view.cpp index fd1d1341..e3faa26a 100644 --- a/test/sequence/single_view.cpp +++ b/test/sequence/single_view.cpp @@ -6,7 +6,7 @@ ==============================================================================*/ #include #include -#include +#include #include #include diff --git a/test/sequence/std_pair.cpp b/test/sequence/std_pair.cpp index d0434821..b5c18d17 100644 --- a/test/sequence/std_pair.cpp +++ b/test/sequence/std_pair.cpp @@ -5,17 +5,17 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include +#include #include #include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/test/sequence/swap.cpp b/test/sequence/swap.cpp index f9573d52..7df7b822 100644 --- a/test/sequence/swap.cpp +++ b/test/sequence/swap.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include diff --git a/test/sequence/tie.hpp b/test/sequence/tie.hpp index 6097ef8e..cb928906 100644 --- a/test/sequence/tie.hpp +++ b/test/sequence/tie.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/tr1_tuple_auto_conv.cpp b/test/sequence/tr1_tuple_auto_conv.cpp new file mode 100644 index 00000000..0c20fa3f --- /dev/null +++ b/test/sequence/tr1_tuple_auto_conv.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +namespace Core +{ + class AutoConverter + { + std::tr1::shared_ptr t_; + + public: + AutoConverter(std::tr1::shared_ptr const & t) + : t_(t) + {} + + template + operator C () + { + try + { + boost::any & a = (*t_); + + return boost::any_cast(a); + } + catch(boost::bad_any_cast & e) + { + std::cerr << "Internal conversion bug: " + << "Failed to convert data holder to " + << typeid(C).name() << "\n" + << e.what() + << std::endl; + + C c = C(); + return c; + } + } + }; + + + inline AutoConverter Demo() + { + std::tr1::shared_ptr p_result + (new boost::any(std::tr1::make_tuple(1, 2, 3, 4))); + return p_result; + } + +} // namespace Core + + +int main(int argc, char* argv[]) +{ + std::tr1::tuple test = Core::Demo(); + return 0; +} + diff --git a/test/sequence/transform_view.cpp b/test/sequence/transform_view.cpp index 3dce9043..b1a48073 100644 --- a/test/sequence/transform_view.cpp +++ b/test/sequence/transform_view.cpp @@ -5,12 +5,12 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include -#include +#include #include -#include +#include #include #include #include diff --git a/test/sequence/tuple_comparison.cpp b/test/sequence/tuple_comparison.cpp index fde2ad47..aa2ed73f 100644 --- a/test/sequence/tuple_comparison.cpp +++ b/test/sequence/tuple_comparison.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include #define FUSION_SEQUENCE tuple #include "comparison.hpp" diff --git a/test/sequence/tuple_construction.cpp b/test/sequence/tuple_construction.cpp index 0d357002..ec602abb 100644 --- a/test/sequence/tuple_construction.cpp +++ b/test/sequence/tuple_construction.cpp @@ -1,13 +1,14 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + 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 -#include +#include +#define TR1_TUPLE_TEST #define FUSION_SEQUENCE tuple #define FUSION_AT get #include "construction.hpp" diff --git a/test/sequence/tuple_copy.cpp b/test/sequence/tuple_copy.cpp index 9a4d80e1..4332efbe 100644 --- a/test/sequence/tuple_copy.cpp +++ b/test/sequence/tuple_copy.cpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/tuple_element.cpp b/test/sequence/tuple_element.cpp index 496fd6e1..ccf61f6e 100644 --- a/test/sequence/tuple_element.cpp +++ b/test/sequence/tuple_element.cpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/tuple_make.cpp b/test/sequence/tuple_make.cpp index 77ff412f..e05aee34 100644 --- a/test/sequence/tuple_make.cpp +++ b/test/sequence/tuple_make.cpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/tuple_misc.cpp b/test/sequence/tuple_misc.cpp index 704ebd3a..7d9ab0e7 100644 --- a/test/sequence/tuple_misc.cpp +++ b/test/sequence/tuple_misc.cpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include #define FUSION_SEQUENCE tuple #define FUSION_AT get diff --git a/test/sequence/tuple_mutate.cpp b/test/sequence/tuple_mutate.cpp index 8770b520..bba3a33e 100644 --- a/test/sequence/tuple_mutate.cpp +++ b/test/sequence/tuple_mutate.cpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/tuple_tie.cpp b/test/sequence/tuple_tie.cpp index e91c47a3..0db9153e 100644 --- a/test/sequence/tuple_tie.cpp +++ b/test/sequence/tuple_tie.cpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/value_at.hpp b/test/sequence/value_at.hpp index d655f13e..d791fb5e 100644 --- a/test/sequence/value_at.hpp +++ b/test/sequence/value_at.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying diff --git a/test/sequence/vector_comparison.cpp b/test/sequence/vector_comparison.cpp index 0a7ae781..bb7c3c34 100644 --- a/test/sequence/vector_comparison.cpp +++ b/test/sequence/vector_comparison.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE vector #include "comparison.hpp" diff --git a/test/sequence/vector_construction.cpp b/test/sequence/vector_construction.cpp index 4f1eaa02..0f672a45 100644 --- a/test/sequence/vector_construction.cpp +++ b/test/sequence/vector_construction.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE vector #include "construction.hpp" diff --git a/test/sequence/vector_copy.cpp b/test/sequence/vector_copy.cpp index e554a768..12769353 100644 --- a/test/sequence/vector_copy.cpp +++ b/test/sequence/vector_copy.cpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include +#include #define FUSION_SEQUENCE vector #include "copy.hpp" diff --git a/test/sequence/vector_iterator.cpp b/test/sequence/vector_iterator.cpp index 662466fa..bcf15c69 100644 --- a/test/sequence/vector_iterator.cpp +++ b/test/sequence/vector_iterator.cpp @@ -4,8 +4,8 @@ Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ -#include -#include +#include +#include #define FUSION_SEQUENCE vector #define FUSION_TRAVERSAL_TAG random_access_traversal_tag diff --git a/test/sequence/vector_make.cpp b/test/sequence/vector_make.cpp index ffd06489..4e5ea89e 100644 --- a/test/sequence/vector_make.cpp +++ b/test/sequence/vector_make.cpp @@ -1,12 +1,12 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include +#include +#include #define FUSION_SEQUENCE vector #include "make.hpp" diff --git a/test/sequence/vector_misc.cpp b/test/sequence/vector_misc.cpp index e2a22fb7..c23b539d 100644 --- a/test/sequence/vector_misc.cpp +++ b/test/sequence/vector_misc.cpp @@ -1,13 +1,13 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include +#include +#include +#include #define FUSION_SEQUENCE vector #include "misc.hpp" diff --git a/test/sequence/vector_mutate.cpp b/test/sequence/vector_mutate.cpp index 60a410b7..dc242f07 100644 --- a/test/sequence/vector_mutate.cpp +++ b/test/sequence/vector_mutate.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE vector #include "mutate.hpp" diff --git a/test/sequence/vector_n.cpp b/test/sequence/vector_n.cpp index e7ff4ad3..b051ca89 100644 --- a/test/sequence/vector_n.cpp +++ b/test/sequence/vector_n.cpp @@ -5,16 +5,16 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/test/sequence/vector_tie.cpp b/test/sequence/vector_tie.cpp index 348e235c..066dad87 100644 --- a/test/sequence/vector_tie.cpp +++ b/test/sequence/vector_tie.cpp @@ -1,14 +1,14 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 -#include -#include -#include +#include +#include +#include +#include #define FUSION_SEQUENCE vector #include "tie.hpp" diff --git a/test/sequence/vector_value_at.cpp b/test/sequence/vector_value_at.cpp index e4aa9ac4..ffd84b34 100644 --- a/test/sequence/vector_value_at.cpp +++ b/test/sequence/vector_value_at.cpp @@ -1,11 +1,11 @@ /*============================================================================= - Copyright (c) 1999-2003 Jaakko Järvi + Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2006 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 +#include #define FUSION_SEQUENCE vector #include "value_at.hpp" diff --git a/test/sequence/zip_view.cpp b/test/sequence/zip_view.cpp index 485760cd..7f88f52a 100644 --- a/test/sequence/zip_view.cpp +++ b/test/sequence/zip_view.cpp @@ -7,9 +7,9 @@ ==============================================================================*/ #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -19,8 +19,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include diff --git a/test/sequence/zip_view2.cpp b/test/sequence/zip_view2.cpp index c8c42e1e..8a07aa88 100644 --- a/test/sequence/zip_view2.cpp +++ b/test/sequence/zip_view2.cpp @@ -9,9 +9,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -21,8 +21,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/test/sequence/zip_view_ignore.cpp b/test/sequence/zip_view_ignore.cpp index 5eb3bf39..2a300809 100644 --- a/test/sequence/zip_view_ignore.cpp +++ b/test/sequence/zip_view_ignore.cpp @@ -6,8 +6,8 @@ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include -#include -#include +#include +#include #include #include #include diff --git a/todo.txt b/todo.txt index c1e0df08..e4f49f61 100644 --- a/todo.txt +++ b/todo.txt @@ -1,7 +1,35 @@ +=============================================================================== +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) +=============================================================================== + +* Provide macros for adapting classes, similar to BOOST_FUSION_ADAPT_STRUCT + and BOOST_FUSION_ADAPT_ASSOC_STRUCT, but with with user control over + member accessors (e.g. get and set free functions). + +* Document extension::struct_size, extension::struct_member and + extension::struct_assoc_member in extension section. + +* Document rationale behind at and value_at and how to choose which + to use. + +* Reinstate the function object algorithms + +* Break all dependency cycles if there are some more + +* Break the view<-->algorithm dependency cycle + +* Improve extension docs + +* Document sequence/convert + * Consider object equivalent of functions and algorithms (so you can do transform(iterators, deref()) with needing to put together a wrapper for deref). -* Make algorithms work with mutable data +* Make algorithms work with mutable data * Consider segmented sequence / algorithm support @@ -81,17 +109,17 @@ tosh: * Provide infinity-aware default implementation for Incrementable Sequences Thoughts: It would probably be cleaner to have infinity conceptually - orthogonal so there can be infinite Bidi/RA/Assoc Sequences. + orthogonal so there can be infinite Bidi/RA/Assoc Sequences. OTOH it complicates things in way that might not be worth it... -* Implement always_view/always with repetitive_view > +* Implement always_view/always with repetitive_view > semantics - using repetitive_view will for this purpose will be way too much overhead. ? Functional wrappers for intrinsics/algorithms. * Rewrite functional benchmark - + ========================================================== From the fusion review (please mark all done items):