forked from boostorg/iterator
roll back mistaken changes
[SVN r9062]
This commit is contained in:
@ -658,100 +658,39 @@ struct indirect_iterator_policies : public default_iterator_policies
|
|||||||
{ return **x; }
|
{ return **x; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// This macro definition is only temporary in this file
|
|
||||||
# if !defined(BOOST_MSVC)
|
|
||||||
# define BOOST_ARG_DEPENDENT_TYPENAME typename
|
|
||||||
# else
|
|
||||||
# define BOOST_ARG_DEPENDENT_TYPENAME
|
|
||||||
# endif
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
#if !defined(BOOST_MSVC)
|
|
||||||
template <class T>
|
|
||||||
struct value_type_of_value_type {
|
|
||||||
typedef typename boost::detail::iterator_traits<T>::value_type outer_value;
|
|
||||||
typedef typename boost::detail::iterator_traits<outer_value>::value_type type;
|
|
||||||
};
|
|
||||||
#else // Even this workaround doesn't fly :(
|
|
||||||
template <class Value>
|
|
||||||
struct inner_traits_select {
|
|
||||||
template <class Iter,class Pointer, class Reference>
|
|
||||||
struct rebind {
|
|
||||||
struct traits {
|
|
||||||
typedef typename boost::remove_const<Value>::type value_type;
|
|
||||||
typedef Pointer pointer;
|
|
||||||
typedef Reference reference;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct no_value_type {};
|
|
||||||
template <>
|
|
||||||
struct inner_traits_select<no_value_type> {
|
|
||||||
template <class Iter,class Pointer, class Reference>
|
|
||||||
struct rebind {
|
|
||||||
typedef typename boost::detail::iterator_traits<Iter>::value_type outer_value;
|
|
||||||
typedef typename boost::detail::iterator_traits<outer_value> traits;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class OuterIterator, // Mutable or Immutable, does not matter
|
template <class OuterIterator, // Mutable or Immutable, does not matter
|
||||||
class Value =
|
// Mutable reference and pointer type in traits class -> mutable indirect iterator;
|
||||||
#if !defined(BOOST_MSVC)
|
// Immutable reference and pointer type in traits class -> immutable indirect iterator
|
||||||
BOOST_ARG_DEPENDENT_TYPENAME detail::value_type_of_value_type<OuterIterator>::type,
|
class InnerTraits = boost::detail::iterator_traits<typename boost::detail::iterator_traits<OuterIterator>::value_type>
|
||||||
#else
|
|
||||||
detail::no_value_type,
|
|
||||||
#endif
|
|
||||||
class Pointer = Value*,
|
|
||||||
class Reference = Value&
|
|
||||||
>
|
>
|
||||||
class indirect_iterator_generator
|
class indirect_iterator_generator
|
||||||
{
|
{
|
||||||
typedef boost::detail::iterator_traits<OuterIterator> outer_traits;
|
typedef boost::detail::iterator_traits<OuterIterator> OuterTraits;
|
||||||
typedef typename outer_traits::difference_type difference_type;
|
typedef typename OuterTraits::difference_type difference_type;
|
||||||
typedef typename outer_traits::iterator_category iterator_category;
|
typedef typename OuterTraits::iterator_category iterator_category;
|
||||||
|
|
||||||
#if !defined(BOOST_MSVC)
|
typedef typename InnerTraits::value_type value_type;
|
||||||
typedef typename boost::remove_const<Value>::type value_type;
|
typedef typename InnerTraits::pointer pointer;
|
||||||
typedef Pointer pointer;
|
typedef typename InnerTraits::reference reference;
|
||||||
typedef Reference reference;
|
|
||||||
#else
|
|
||||||
typedef detail::inner_traits_select<Value>::template
|
|
||||||
rebind<OuterIterator,Pointer,Reference> inner_traits;
|
|
||||||
typedef typename inner_traits::value_type value_type;
|
|
||||||
typedef typename inner_traits::pointer pointer;
|
|
||||||
typedef typename inner_traits::reference reference;
|
|
||||||
#endif
|
|
||||||
public:
|
public:
|
||||||
typedef boost::iterator<iterator_category, value_type, difference_type, pointer, reference> indirect_traits;
|
typedef boost::iterator<iterator_category, value_type, difference_type, pointer, reference> indirect_traits;
|
||||||
typedef iterator_adaptor<OuterIterator, indirect_iterator_policies, indirect_traits> type;
|
typedef iterator_adaptor<OuterIterator, indirect_iterator_policies, indirect_traits> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class OuterIterator, // Mutable or Immutable, does not matter
|
template <class OuterIterator, // Mutable or Immutable, does not matter
|
||||||
class Value =
|
class ConstInnerIterator, // Immutable
|
||||||
#if !defined(BOOST_MSVC)
|
class ConstInnerTraits = boost::detail::iterator_traits<ConstInnerIterator>,
|
||||||
BOOST_ARG_DEPENDENT_TYPENAME detail::value_type_of_value_type<OuterIterator>::type,
|
class InnerTraits = boost::detail::iterator_traits<typename boost::detail::iterator_traits<OuterIterator>::value_type>
|
||||||
#else
|
|
||||||
detail::no_value_type,
|
|
||||||
#endif
|
|
||||||
class Pointer = Value*,
|
|
||||||
class Reference = Value&,
|
|
||||||
class ConstPointer = const Value*,
|
|
||||||
class ConstReference = const Value&
|
|
||||||
>
|
>
|
||||||
struct indirect_iterator_pair_generator
|
struct indirect_iterator_pair_generator
|
||||||
{
|
{
|
||||||
typedef typename indirect_iterator_generator<OuterIterator,
|
typedef typename indirect_iterator_generator<OuterIterator,
|
||||||
Value, Pointer, Reference>::type iterator;
|
InnerTraits>::type iterator;
|
||||||
typedef typename indirect_iterator_generator<OuterIterator,
|
typedef typename indirect_iterator_generator<OuterIterator,
|
||||||
Value, ConstPointer, ConstReference>::type const_iterator;
|
ConstInnerTraits>::type const_iterator;
|
||||||
};
|
};
|
||||||
|
|
||||||
# undef BOOST_ARG_DEPENDENT_TYPENAME
|
#ifndef BOOST_NO_STD_ITERATOR_TRAITS
|
||||||
|
|
||||||
# ifndef BOOST_NO_STD_ITERATOR_TRAITS
|
|
||||||
template <class OuterIterator>
|
template <class OuterIterator>
|
||||||
inline typename indirect_iterator_generator<OuterIterator>::type
|
inline typename indirect_iterator_generator<OuterIterator>::type
|
||||||
make_indirect_iterator(OuterIterator base)
|
make_indirect_iterator(OuterIterator base)
|
||||||
@ -760,7 +699,7 @@ make_indirect_iterator(OuterIterator base)
|
|||||||
<OuterIterator>::type result_t;
|
<OuterIterator>::type result_t;
|
||||||
return result_t(base);
|
return result_t(base);
|
||||||
}
|
}
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
// Tried to allow InnerTraits to be provided by explicit template
|
// Tried to allow InnerTraits to be provided by explicit template
|
||||||
// argument to the function, but could not get it to work. -Jeremy Siek
|
// argument to the function, but could not get it to work. -Jeremy Siek
|
||||||
|
Reference in New Issue
Block a user