mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-30 20:47:31 +02:00
[identity_view] Added boost::fusion::identity_view
This commit is contained in:
@ -133,6 +133,7 @@ For any Forward Sequence s the following invariants always hold:
|
|||||||
* __transform_view__
|
* __transform_view__
|
||||||
* __reverse_view__
|
* __reverse_view__
|
||||||
* __zip_view__
|
* __zip_view__
|
||||||
|
* __identity_view__
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
@ -201,6 +202,7 @@ are not defined in __forward_sequence__.
|
|||||||
* __iterator_range__ (where adapted sequence is a Bidirectional Sequence)
|
* __iterator_range__ (where adapted sequence is a Bidirectional Sequence)
|
||||||
* __transform_view__ (where adapted sequence is a Bidirectional Sequence)
|
* __transform_view__ (where adapted sequence is a Bidirectional Sequence)
|
||||||
* __zip_view__ (where adapted sequences are models of Bidirectional Sequence)
|
* __zip_view__ (where adapted sequences are models of Bidirectional Sequence)
|
||||||
|
* __identity_view__ (where adapted sequence is a Bidirectional Sequence)
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
@ -289,6 +291,7 @@ are not defined in __bidirectional_sequence__.
|
|||||||
* __iterator_range__ (where adapted sequence is a Random Access Sequence)
|
* __iterator_range__ (where adapted sequence is a Random Access Sequence)
|
||||||
* __transform_view__ (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 of Random Access Sequence)
|
* __zip_view__ (where adapted sequences are models of Random Access Sequence)
|
||||||
|
* __identity_view__ (where adapted sequence is a Random Access Sequence)
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
@ -361,6 +364,7 @@ you can use `__result_of_value_at_key__<S, K>`.]
|
|||||||
* __joint_view__ (where adapted sequences are __associative_sequence__\ s and __forward_sequence__\ s)
|
* __joint_view__ (where adapted sequences are __associative_sequence__\ s and __forward_sequence__\ s)
|
||||||
* __reverse_view__ (where adapted sequence is an __associative_sequence__ and a __bidirectional_sequence__)
|
* __reverse_view__ (where adapted sequence is an __associative_sequence__ and a __bidirectional_sequence__)
|
||||||
* __transform_view__ (where adapted sequence is an __associative_sequence__ and a __forward_sequence__)
|
* __transform_view__ (where adapted sequence is an __associative_sequence__ and a __forward_sequence__)
|
||||||
|
* __identity_view__ (where adapted sequence is an __associative_sequence__ and a __forward_sequence__)
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
57
doc/view.qbk
57
doc/view.qbk
@ -1,6 +1,7 @@
|
|||||||
[/==============================================================================
|
[/==============================================================================
|
||||||
Copyright (C) 2001-2011 Joel de Guzman
|
Copyright (C) 2001-2011 Joel de Guzman
|
||||||
Copyright (C) 2006 Dan Marsden
|
Copyright (C) 2006 Dan Marsden
|
||||||
|
Copyright (c) 2022 Denis Mikhailov
|
||||||
|
|
||||||
Use, modification and distribution is subject to the Boost Software
|
Use, modification and distribution is subject to the Boost Software
|
||||||
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -664,4 +665,60 @@ defined in __forward_sequence__.
|
|||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
[section identity_view]
|
||||||
|
|
||||||
|
[heading Description]
|
||||||
|
|
||||||
|
`identity_view` presents underlying sequence unchanged.
|
||||||
|
|
||||||
|
[heading Header]
|
||||||
|
|
||||||
|
#include <boost/fusion/view/identity_view.hpp>
|
||||||
|
#include <boost/fusion/include/identity_view.hpp>
|
||||||
|
|
||||||
|
[heading Synopsis]
|
||||||
|
|
||||||
|
template <typename Sequence>
|
||||||
|
struct identity_view;
|
||||||
|
|
||||||
|
[heading Template parameters]
|
||||||
|
|
||||||
|
[table
|
||||||
|
[[Parameter] [Description] [Default]]
|
||||||
|
[[`Sequence`] [A __forward_sequence__] []]
|
||||||
|
]
|
||||||
|
|
||||||
|
[heading Model of]
|
||||||
|
|
||||||
|
* A model of __forward_sequence__ if `Sequence` is a __forward_sequence__ else, __bidirectional_sequence__ if `Sequence` is a __bidirectional_sequence__
|
||||||
|
else, __random_access_sequence__ if `Sequence` is a __random_access_sequence__.
|
||||||
|
* __associative_sequence__ if `Sequence` implements the __associative_sequence__ model.
|
||||||
|
|
||||||
|
[variablelist Notation
|
||||||
|
[[`IV`] [An `identity_view` type]]
|
||||||
|
[[`s`] [An instance of `Sequence`]]
|
||||||
|
[[`iv`, `iv2`] [Instances of `identity_view`]]
|
||||||
|
]
|
||||||
|
|
||||||
|
[heading Expression Semantics]
|
||||||
|
|
||||||
|
Semantics of an expression is defined only where it differs from, or is not
|
||||||
|
defined in the implemented models.
|
||||||
|
|
||||||
|
[table
|
||||||
|
[[Expression] [Semantics]]
|
||||||
|
[[`IV(s)`] [Creates an `identity_view` given sequence, `s`.]]
|
||||||
|
[[`IV(iv)`] [Copy constructs an `identity_view` from another `identity_view`, `iv`.]]
|
||||||
|
[[`iv = iv2`] [Assigns to an `identity_view`, `iv`, from another `identity_view`, `iv2`.]]
|
||||||
|
]
|
||||||
|
|
||||||
|
[heading Example]
|
||||||
|
typedef __vector__<int, short, double> vector_type;
|
||||||
|
vector_type vec(2, 5, 3.3);
|
||||||
|
|
||||||
|
__identity_view__<vector_type> identity(vec);
|
||||||
|
std::cout << identity << std::endl; // (2 5 3.3)
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@ -10,41 +10,18 @@
|
|||||||
#include <boost/fusion/support/config.hpp>
|
#include <boost/fusion/support/config.hpp>
|
||||||
#include <boost/fusion/view/transform_view.hpp>
|
#include <boost/fusion/view/transform_view.hpp>
|
||||||
#include <boost/functional/identity.hpp>
|
#include <boost/functional/identity.hpp>
|
||||||
#include <boost/utility/result_of.hpp>
|
|
||||||
|
|
||||||
namespace boost { namespace fusion {
|
|
||||||
namespace detail {
|
|
||||||
struct identity : boost::identity
|
|
||||||
{
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
template<typename T>
|
|
||||||
struct result_of<fusion::detail::identity(T)>
|
|
||||||
{
|
|
||||||
typedef T type;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable: 4512) // assignment operator could not be generated.
|
|
||||||
#endif
|
|
||||||
namespace boost { namespace fusion {
|
namespace boost { namespace fusion {
|
||||||
template<typename Sequence> struct identity_view
|
template<typename Sequence> struct identity_view
|
||||||
: transform_view<Sequence, detail::identity>
|
: transform_view<Sequence, boost::identity>
|
||||||
{
|
{
|
||||||
typedef transform_view<Sequence, detail::identity> base_type;
|
typedef transform_view<Sequence, boost::identity> base_type;
|
||||||
|
|
||||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||||
identity_view(Sequence& in_seq)
|
identity_view(Sequence& in_seq)
|
||||||
: base_type(in_seq, detail::identity()) {}
|
: base_type(in_seq, boost::identity()) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
}}
|
}}
|
||||||
#ifdef _MSC_VER
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <boost/fusion/container/vector/vector.hpp>
|
#include <boost/fusion/container/vector/vector.hpp>
|
||||||
#include <boost/fusion/container/map/map.hpp>
|
#include <boost/fusion/container/map/map.hpp>
|
||||||
#include <boost/fusion/container/generation/make_map.hpp>
|
#include <boost/fusion/container/generation/make_map.hpp>
|
||||||
#include <boost/fusion/algorithm/auxiliary/copy.hpp>
|
|
||||||
#include <boost/fusion/adapted/mpl.hpp>
|
#include <boost/fusion/adapted/mpl.hpp>
|
||||||
#include <boost/fusion/sequence/io/out.hpp>
|
#include <boost/fusion/sequence/io/out.hpp>
|
||||||
#include <boost/fusion/container/generation/make_vector.hpp>
|
#include <boost/fusion/container/generation/make_vector.hpp>
|
||||||
@ -77,16 +76,7 @@ main()
|
|||||||
|
|
||||||
BOOST_TEST((*boost::fusion::advance_c<3>(boost::fusion::begin(xform)) == 8));
|
BOOST_TEST((*boost::fusion::advance_c<3>(boost::fusion::begin(xform)) == 8));
|
||||||
BOOST_TEST((boost::fusion::at_c<2>(xform) == 7));
|
BOOST_TEST((boost::fusion::at_c<2>(xform) == 7));
|
||||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_c<xform_type, 0>::type, boost::mpl::integral_c<int, 5> >));
|
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_c<xform_type, 0>::type, boost::mpl::integral_c<int, 5>&& >));
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
typedef vector<int, int, int, int, int> sequence_type;
|
|
||||||
sequence_type seq;
|
|
||||||
identity_view<sequence_type> ident(seq);
|
|
||||||
copy(make_vector(1, 2, 3, 4, 5), ident);
|
|
||||||
std::cout << seq << std::endl;
|
|
||||||
BOOST_TEST((seq == make_vector(1, 2, 3, 4, 5)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Associative
|
/// Associative
|
||||||
@ -153,9 +143,10 @@ main()
|
|||||||
typedef boost::fusion::result_of::next<first>::type second;
|
typedef boost::fusion::result_of::next<first>::type second;
|
||||||
typedef boost::fusion::result_of::next<second>::type third;
|
typedef boost::fusion::result_of::next<second>::type third;
|
||||||
|
|
||||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<first>::type, boost::fusion::pair<int, char> >));
|
// TODO: why is a boost::fusion::pair<int, char>&& ??
|
||||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<second>::type, boost::fusion::pair<double, std::string> >));
|
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<first>::type, boost::fusion::pair<int, char>&& >));
|
||||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<third>::type, boost::fusion::pair<abstract, int> >));
|
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<second>::type, boost::fusion::pair<double, std::string>&& >));
|
||||||
|
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_of<third>::type, boost::fusion::pair<abstract, int>&& >));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user