mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-18 15:12:13 +02:00
Moved pure_traversal_tag to public namespace.
Also added an import into the boost::detail namespace for backward compatibility with Boost.Range. Added a pure_iterator_traversal metafunction that automatically converts iterator category as well.
This commit is contained in:
@ -98,35 +98,8 @@ namespace detail
|
|||||||
>
|
>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
template <class Traversal>
|
|
||||||
struct pure_traversal_tag
|
|
||||||
: mpl::eval_if<
|
|
||||||
is_convertible<Traversal,random_access_traversal_tag>
|
|
||||||
, mpl::identity<random_access_traversal_tag>
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_convertible<Traversal,bidirectional_traversal_tag>
|
|
||||||
, mpl::identity<bidirectional_traversal_tag>
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_convertible<Traversal,forward_traversal_tag>
|
|
||||||
, mpl::identity<forward_traversal_tag>
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_convertible<Traversal,single_pass_traversal_tag>
|
|
||||||
, mpl::identity<single_pass_traversal_tag>
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_convertible<Traversal,incrementable_traversal_tag>
|
|
||||||
, mpl::identity<incrementable_traversal_tag>
|
|
||||||
, void
|
|
||||||
>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert an iterator category into a traversal tag
|
// Convert an iterator category into a traversal tag
|
||||||
//
|
//
|
||||||
@ -166,6 +139,57 @@ struct iterator_traversal<mpl::_>
|
|||||||
{};
|
{};
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert an iterator traversal to one of the traversal tags.
|
||||||
|
//
|
||||||
|
template <class Traversal>
|
||||||
|
struct pure_traversal_tag
|
||||||
|
: mpl::eval_if<
|
||||||
|
is_convertible<Traversal,random_access_traversal_tag>
|
||||||
|
, mpl::identity<random_access_traversal_tag>
|
||||||
|
, mpl::eval_if<
|
||||||
|
is_convertible<Traversal,bidirectional_traversal_tag>
|
||||||
|
, mpl::identity<bidirectional_traversal_tag>
|
||||||
|
, mpl::eval_if<
|
||||||
|
is_convertible<Traversal,forward_traversal_tag>
|
||||||
|
, mpl::identity<forward_traversal_tag>
|
||||||
|
, mpl::eval_if<
|
||||||
|
is_convertible<Traversal,single_pass_traversal_tag>
|
||||||
|
, mpl::identity<single_pass_traversal_tag>
|
||||||
|
, mpl::eval_if<
|
||||||
|
is_convertible<Traversal,incrementable_traversal_tag>
|
||||||
|
, mpl::identity<incrementable_traversal_tag>
|
||||||
|
, void
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Trait to retrieve one of the iterator traversal tags from the iterator category or traversal.
|
||||||
|
//
|
||||||
|
template <class Iterator = mpl::_1>
|
||||||
|
struct pure_iterator_traversal
|
||||||
|
: pure_traversal_tag<typename iterator_traversal<Iterator>::type>
|
||||||
|
{};
|
||||||
|
|
||||||
|
# ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
|
||||||
|
template <>
|
||||||
|
struct pure_iterator_traversal<mpl::_1>
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct apply : pure_iterator_traversal<T>
|
||||||
|
{};
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct pure_iterator_traversal<mpl::_>
|
||||||
|
: pure_iterator_traversal<mpl::_1>
|
||||||
|
{};
|
||||||
|
# endif
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
|
|
||||||
using iterators::no_traversal_tag;
|
using iterators::no_traversal_tag;
|
||||||
@ -177,6 +201,13 @@ using iterators::random_access_traversal_tag;
|
|||||||
using iterators::iterator_category_to_traversal;
|
using iterators::iterator_category_to_traversal;
|
||||||
using iterators::iterator_traversal;
|
using iterators::iterator_traversal;
|
||||||
|
|
||||||
|
// This import is needed for backward compatibility with Boost.Range:
|
||||||
|
// boost/range/detail/demote_iterator_traversal_tag.hpp
|
||||||
|
// It should be removed when that header is fixed.
|
||||||
|
namespace detail {
|
||||||
|
using iterators::pure_traversal_tag;
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_undef.hpp>
|
#include <boost/iterator/detail/config_undef.hpp>
|
||||||
|
@ -248,17 +248,8 @@ namespace boost_concepts
|
|||||||
BOOST_concept(InteroperableIterator,(Iterator)(ConstIterator))
|
BOOST_concept(InteroperableIterator,(Iterator)(ConstIterator))
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
typedef typename boost::iterators::detail::pure_traversal_tag<
|
typedef typename boost::iterators::pure_iterator_traversal<Iterator>::type traversal_category;
|
||||||
typename boost::iterator_traversal<
|
typedef typename boost::iterators::pure_iterator_traversal<ConstIterator>::type const_traversal_category;
|
||||||
Iterator
|
|
||||||
>::type
|
|
||||||
>::type traversal_category;
|
|
||||||
|
|
||||||
typedef typename boost::iterators::detail::pure_traversal_tag<
|
|
||||||
typename boost::iterator_traversal<
|
|
||||||
ConstIterator
|
|
||||||
>::type
|
|
||||||
>::type const_traversal_category;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOST_CONCEPT_ASSERT((SinglePassIterator<Iterator>));
|
BOOST_CONCEPT_ASSERT((SinglePassIterator<Iterator>));
|
||||||
|
@ -55,13 +55,6 @@
|
|||||||
#include <boost/detail/workaround.hpp>
|
#include <boost/detail/workaround.hpp>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
template <class It>
|
|
||||||
struct pure_traversal
|
|
||||||
: boost::iterators::detail::pure_traversal_tag<
|
|
||||||
typename boost::iterator_traversal<It>::type
|
|
||||||
>
|
|
||||||
{};
|
|
||||||
|
|
||||||
|
|
||||||
/// Tests for https://svn.boost.org/trac/boost/ticket/1517
|
/// Tests for https://svn.boost.org/trac/boost/ticket/1517
|
||||||
int to_value(int const &v)
|
int to_value(int const &v)
|
||||||
|
Reference in New Issue
Block a user