mirror of
https://github.com/boostorg/iterator.git
synced 2025-05-11 13:33:56 +00:00
Removed MPL usage from indirect_iterator.hpp.
This commit is contained in:
parent
dfb1fd9bed
commit
0c2eda4bb8
@ -7,115 +7,107 @@
|
|||||||
#ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
#ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
||||||
#define BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
#define BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_adaptor.hpp>
|
#include <boost/iterator/iterator_adaptor.hpp>
|
||||||
|
|
||||||
#include <boost/pointee.hpp>
|
#include <boost/pointee.hpp>
|
||||||
#include <boost/indirect_reference.hpp>
|
#include <boost/indirect_reference.hpp>
|
||||||
|
|
||||||
#include <boost/detail/indirect_traits.hpp>
|
|
||||||
#include <boost/core/use_default.hpp>
|
#include <boost/core/use_default.hpp>
|
||||||
|
|
||||||
#include <boost/mpl/identity.hpp>
|
|
||||||
#include <boost/mpl/eval_if.hpp>
|
|
||||||
#include <boost/mpl/has_xxx.hpp>
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
template <class Iter, class Value, class Category, class Reference, class Difference>
|
template< typename Iter, typename Value, typename Category, typename Reference, typename Difference >
|
||||||
class indirect_iterator;
|
class indirect_iterator;
|
||||||
|
|
||||||
namespace detail
|
namespace detail {
|
||||||
{
|
|
||||||
template <class Iter, class Value, class Category, class Reference, class Difference>
|
|
||||||
struct indirect_base
|
|
||||||
{
|
|
||||||
typedef typename std::iterator_traits<Iter>::value_type dereferenceable;
|
|
||||||
|
|
||||||
typedef iterator_adaptor<
|
template< typename Iter, typename Value, typename Category, typename Reference, typename Difference >
|
||||||
indirect_iterator<Iter, Value, Category, Reference, Difference>
|
struct indirect_base
|
||||||
, Iter
|
{
|
||||||
, typename ia_dflt_help<
|
using dereferenceable = typename std::iterator_traits< Iter >::value_type;
|
||||||
Value, pointee<dereferenceable>
|
|
||||||
>::type
|
|
||||||
, Category
|
|
||||||
, typename ia_dflt_help<
|
|
||||||
Reference
|
|
||||||
, mpl::eval_if<
|
|
||||||
std::is_same<Value,use_default>
|
|
||||||
, indirect_reference<dereferenceable>
|
|
||||||
, std::add_lvalue_reference<Value>
|
|
||||||
>
|
|
||||||
>::type
|
|
||||||
, Difference
|
|
||||||
> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
using type = iterator_adaptor<
|
||||||
struct indirect_base<int, int, int, int, int> {};
|
indirect_iterator< Iter, Value, Category, Reference, Difference >,
|
||||||
} // namespace detail
|
Iter,
|
||||||
|
detail::ia_dflt_help_t<
|
||||||
|
Value,
|
||||||
|
pointee< dereferenceable >
|
||||||
|
>,
|
||||||
|
Category,
|
||||||
|
detail::ia_dflt_help_t<
|
||||||
|
Reference,
|
||||||
|
detail::ia_eval_if_default<
|
||||||
|
Value,
|
||||||
|
indirect_reference< dereferenceable >,
|
||||||
|
std::add_lvalue_reference< Value >
|
||||||
|
>
|
||||||
|
>,
|
||||||
|
Difference
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
template <
|
template<
|
||||||
class Iterator
|
typename Iterator,
|
||||||
, class Value = use_default
|
typename Value = use_default,
|
||||||
, class Category = use_default
|
typename Category = use_default,
|
||||||
, class Reference = use_default
|
typename Reference = use_default,
|
||||||
, class Difference = use_default
|
typename Difference = use_default
|
||||||
>
|
>
|
||||||
class indirect_iterator
|
class indirect_iterator :
|
||||||
: public detail::indirect_base<
|
public detail::indirect_base<
|
||||||
Iterator, Value, Category, Reference, Difference
|
Iterator, Value, Category, Reference, Difference
|
||||||
>::type
|
>::type
|
||||||
{
|
{
|
||||||
typedef typename detail::indirect_base<
|
using super_t = typename detail::indirect_base<
|
||||||
Iterator, Value, Category, Reference, Difference
|
Iterator, Value, Category, Reference, Difference
|
||||||
>::type super_t;
|
>::type;
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
indirect_iterator() {}
|
indirect_iterator() = default;
|
||||||
|
|
||||||
indirect_iterator(Iterator iter)
|
indirect_iterator(Iterator iter) :
|
||||||
: super_t(iter) {}
|
super_t(iter)
|
||||||
|
{}
|
||||||
|
|
||||||
template <
|
template<
|
||||||
class Iterator2, class Value2, class Category2
|
typename Iterator2,
|
||||||
, class Reference2, class Difference2
|
typename Value2,
|
||||||
>
|
typename Category2,
|
||||||
indirect_iterator(
|
typename Reference2,
|
||||||
indirect_iterator<
|
typename Difference2,
|
||||||
Iterator2, Value2, Category2, Reference2, Difference2
|
typename = typename enable_if_convertible< Iterator2, Iterator >::type
|
||||||
> const& y
|
>
|
||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0
|
indirect_iterator(indirect_iterator< Iterator2, Value2, Category2, Reference2, Difference2 > const& y) :
|
||||||
)
|
super_t(y.base())
|
||||||
: super_t(y.base())
|
{}
|
||||||
{}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const
|
||||||
{
|
{
|
||||||
return **this->base();
|
return **this->base();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Iter>
|
template< typename Iter >
|
||||||
inline
|
inline indirect_iterator< Iter > make_indirect_iterator(Iter x)
|
||||||
indirect_iterator<Iter> make_indirect_iterator(Iter x)
|
{
|
||||||
{
|
return indirect_iterator< Iter >(x);
|
||||||
return indirect_iterator<Iter>(x);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template <class Traits, class Iter>
|
template< typename Value, typename Iter >
|
||||||
inline
|
inline indirect_iterator< Iter, Value > make_indirect_iterator(Iter x)
|
||||||
indirect_iterator<Iter,Traits> make_indirect_iterator(Iter x, Traits* = 0)
|
{
|
||||||
{
|
return indirect_iterator< Iter, Value >(x);
|
||||||
return indirect_iterator<Iter, Traits>(x);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user