forked from boostorg/fusion
462 lines
14 KiB
Plaintext
462 lines
14 KiB
Plaintext
![]() |
[section View]
|
||
|
|
||
|
Views are sequences that do not actually contain data, but instead impart
|
||
|
an alternative presentation over the data from one or more underlying
|
||
|
sequences. Views are proxies. They provide an efficient yet purely
|
||
|
functional way to work on potentially expensive sequence operations. Views
|
||
|
are inherently lazy. Their elements are only computed on demand only when
|
||
|
the elements of the underlying sequence(s) are actually accessed. Views'
|
||
|
lazy nature make them very cheap to copy and be passed around by value.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view.hpp>
|
||
|
|
||
|
[section single_view]
|
||
|
|
||
|
`single_view` is a view into a value as a single element sequence.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/single_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename T>
|
||
|
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<int> view(3);
|
||
|
std::cout << view << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section filter_view]
|
||
|
|
||
|
[heading Description]
|
||
|
|
||
|
`filter_view` is a view into a subset of its underlying sequence's elements
|
||
|
satisfying a given predicate (an __mpl__ metafunction). The `filter_view`
|
||
|
presents only those elements for which its predicate evaluates to
|
||
|
`mpl::true_`.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/filter_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename Sequence, typename Pred>
|
||
|
struct filter_view;
|
||
|
|
||
|
[heading Template parameters]
|
||
|
|
||
|
[table
|
||
|
[[Parameter] [Description] [Default]]
|
||
|
[[`Sequence`] [A __forward_sequence__] []]
|
||
|
[[`Pred`] [Unary Metafunction
|
||
|
returning an `mpl::bool_`] []]
|
||
|
]
|
||
|
|
||
|
[heading Model of]
|
||
|
|
||
|
* __forward_sequence__
|
||
|
|
||
|
[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__<std::string, char, long, bool, double> vector_type;
|
||
|
|
||
|
vector_type v("a-string", '@', 987654, true, 6.6);
|
||
|
filter_view<vector_type const, not_<is_class<_> > > view(v);
|
||
|
std::cout << view << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section iterator_range]
|
||
|
|
||
|
[heading Description]
|
||
|
|
||
|
`iterator_range` presents a sub-range of its underlying sequence delimited
|
||
|
by a pair of iterators.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/iterator_range.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename First, typename Last>
|
||
|
struct iterator_range;
|
||
|
|
||
|
[heading Template parameters]
|
||
|
|
||
|
[table
|
||
|
[[Parameter] [Description] [Default]]
|
||
|
[[`First`] [A fusion __iterator__] []]
|
||
|
[[`Last`] [A fusion __iterator__] []]
|
||
|
]
|
||
|
|
||
|
[heading Model of]
|
||
|
|
||
|
* __forward_sequence__, __bidirectional_sequence__ or
|
||
|
__random_access_sequence__ depending on the traversal characteristics (see
|
||
|
__traversal_concept__) of its underlying sequence.
|
||
|
|
||
|
[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__<int, char, double, char const*> vector_type;
|
||
|
vector_type vec(1, 'x', 3.3, s);
|
||
|
|
||
|
typedef __result_of_begin__<vector_type>::type A;
|
||
|
typedef __result_of_end__<vector_type>::type B;
|
||
|
typedef __result_of_next__<A>::type C;
|
||
|
typedef __result_of_prior__<B>::type D;
|
||
|
|
||
|
C c(vec);
|
||
|
D d(vec);
|
||
|
|
||
|
iterator_range<C, D> range(c, d);
|
||
|
std::cout << range << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section joint_view]
|
||
|
|
||
|
[heading Description]
|
||
|
|
||
|
`joint_view` presents a view which is a concatenation of two sequences.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/joint_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename Sequence1, typename Sequence2>
|
||
|
struct joint_view;
|
||
|
|
||
|
[heading Template parameters]
|
||
|
|
||
|
[table
|
||
|
[[Parameter] [Description] [Default]]
|
||
|
[[`Sequence1`] [A __forward_sequence__] []]
|
||
|
[[`Sequence2`] [A __forward_sequence__] []]
|
||
|
]
|
||
|
|
||
|
[heading Model of]
|
||
|
|
||
|
* __forward_sequence__
|
||
|
|
||
|
[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__<int, char> v1(3, 'x');
|
||
|
__vector__<std::string, int> v2("hello", 123);
|
||
|
joint_view<
|
||
|
__vector__<int, char>
|
||
|
, __vector__<std::string, int>
|
||
|
> view(v1, v2);
|
||
|
std::cout << view << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section zip_view]
|
||
|
|
||
|
[heading Description]
|
||
|
|
||
|
`zip_view` presents a view which iterates over a collection of __sequence__s in parallel. A `zip_view`
|
||
|
is constructed from a __sequence__ of references to the component __sequence__s.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/zip_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename Sequences>
|
||
|
struct zip_view;
|
||
|
|
||
|
[heading Template parameters]
|
||
|
|
||
|
[table
|
||
|
[[Parameter] [Description] [Default]]
|
||
|
[[`Sequences`] [A __forward_sequence__ of references to other Fusion __sequence__s] []]
|
||
|
]
|
||
|
|
||
|
[heading Model of]
|
||
|
|
||
|
* __forward_sequence__, __bidirectional_sequence__ or
|
||
|
__random_access_sequence__ depending on the traversal characteristics (see
|
||
|
__traversal_concept__) of its underlying sequence.
|
||
|
|
||
|
[variablelist Notation
|
||
|
[[`ZV`] [A `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__<int,int> vec1;
|
||
|
typedef __vector__<char,char> vec2;
|
||
|
vec1 v1(1,2);
|
||
|
vec2 v2('a','b');
|
||
|
typedef __vector__<vec1&, vec2&> sequences;
|
||
|
std::cout << zip_view<sequences>(sequences(v1, v2)) << std::endl; // ((1 a) (2 b))
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section transform_view]
|
||
|
|
||
|
The unary version of `transform_view` presents a view of its underlying
|
||
|
sequence given a unary function object or function pointer. The binary
|
||
|
version of `transform_view` presents a view of 2 underlying sequences,
|
||
|
given a binary function object or function pointer. The `transform_view`
|
||
|
inherits the traversal characteristics (see __traversal_concept__) of
|
||
|
its underlying sequence or sequences.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/transform_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
[*Unary Version]
|
||
|
|
||
|
template <typename Sequence, typename F1>
|
||
|
struct transform_view;
|
||
|
|
||
|
[*Binary Version]
|
||
|
|
||
|
template <typename Sequence1, typename Sequence2, typename F2>
|
||
|
struct transform_view;
|
||
|
|
||
|
[heading Template parameters]
|
||
|
|
||
|
[table
|
||
|
[[Parameter] [Description] [Default]]
|
||
|
[[`Sequence`] [A __forward_sequence__] []]
|
||
|
[[`Sequence1`] [A __forward_sequence__] []]
|
||
|
[[`Sequence2`] [A __forward_sequence__] []]
|
||
|
[[`F1`] [A unary function object or function pointer. `__boost_result_of_call__<F1(E)>::type` is the return type of an instance of `F1` when called with a value of each element type `E` in the input sequence.] []]
|
||
|
[[`F2`] [A binary function object or function pointer. `__boost_result_of_call__<F2(E1, E2)>::type` is the return type of an instance of `F2` when called with a value of each corresponding pair of element type `E1` and `E2` in the input sequences.] []]
|
||
|
]
|
||
|
|
||
|
[heading Model of]
|
||
|
|
||
|
* __forward_sequence__, __bidirectional_sequence__ or
|
||
|
__random_access_sequence__ depending on the traversal characteristics (see
|
||
|
__traversal_concept__) of its underlying sequence.
|
||
|
|
||
|
[variablelist Notation
|
||
|
[[`TV`] [A `transform_view` type]]
|
||
|
[[`BTV`] [A binary `transform_view` type]]
|
||
|
[[`UTV`] [A unary `transform_view` type]]
|
||
|
[[`f1`] [An instance of `F1`]]
|
||
|
[[`f2`] [An instance of `F2`]]
|
||
|
[[`s`] [An instance of `Sequence`]]
|
||
|
[[`s1`] [An instance of `Sequence1`]]
|
||
|
[[`s2`] [An instance of `Sequence2`]]
|
||
|
[[`tv`, `tv2`] [Instances of `transform_view`]]
|
||
|
]
|
||
|
|
||
|
[heading Expression Semantics]
|
||
|
|
||
|
Semantics of an expression is defined only where it differs from, or is not
|
||
|
defined in __forward_sequence__, __bidirectional_sequence__ or
|
||
|
__random_access_sequence__ depending on the traversal characteristics (see
|
||
|
__traversal_concept__) of its underlying sequence or sequences.
|
||
|
|
||
|
[table
|
||
|
[[Expression] [Semantics]]
|
||
|
[[`UTV(s, f1)`] [Creates a unary `transform_view` given sequence,
|
||
|
`s` and unary function object or function pointer, `f1`.]]
|
||
|
[[`BTV(s1, s2, f2)`] [Creates a binary `transform_view` given sequences, `s1` and `s2`
|
||
|
and binary function object or function pointer, `f2`.]]
|
||
|
[[`TV(tv)`] [Copy constructs a `transform_view` from another `transform_view`, `tv`.]]
|
||
|
[[`tv = tv2`] [Assigns to a `transform_view`, `tv`, from another `transform_view`, `tv2`.]]
|
||
|
]
|
||
|
|
||
|
[heading Example]
|
||
|
|
||
|
struct square
|
||
|
{
|
||
|
template<typename Sig>
|
||
|
struct result;
|
||
|
|
||
|
template<typename U>
|
||
|
struct result<square(U)>
|
||
|
: remove_reference<U>
|
||
|
{};
|
||
|
|
||
|
template <typename T>
|
||
|
T operator()(T x) const
|
||
|
{
|
||
|
return x * x;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
typedef __vector__<int, short, double> vector_type;
|
||
|
vector_type vec(2, 5, 3.3);
|
||
|
|
||
|
transform_view<vector_type, square> transform(vec, square());
|
||
|
std::cout << transform << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[section reverse_view]
|
||
|
|
||
|
`reverse_view` presents a reversed view of underlying sequence. The first
|
||
|
element will be its last and the last element will be its first.
|
||
|
|
||
|
[heading Header]
|
||
|
|
||
|
#include <boost/fusion/view/reverse_view.hpp>
|
||
|
|
||
|
[heading Synopsis]
|
||
|
|
||
|
template <typename Sequence>
|
||
|
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__<int, short, double> vector_type;
|
||
|
vector_type vec(2, 5, 3.3);
|
||
|
|
||
|
reverse_view<vector_type> reverse(vec);
|
||
|
std::cout << reverse << std::endl;
|
||
|
|
||
|
[endsect]
|
||
|
|
||
|
[endsect]
|