mirror of
https://github.com/boostorg/iterator.git
synced 2026-08-28 08:08:13 +02:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
edcea5d276 |
@@ -56,7 +56,9 @@
|
|||||||
# include <boost/type_traits.hpp>
|
# include <boost/type_traits.hpp>
|
||||||
# include <boost/detail/numeric_traits.hpp>
|
# include <boost/detail/numeric_traits.hpp>
|
||||||
# include <boost/static_assert.hpp>
|
# include <boost/static_assert.hpp>
|
||||||
# include <boost/limits.hpp>
|
# ifndef BOOST_NO_LIMITS
|
||||||
|
# include <limits>
|
||||||
|
# endif
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
@@ -133,15 +135,7 @@ namespace detail {
|
|||||||
// For a while, this wasn't true, but we rely on it below. This is a regression assert.
|
// For a while, this wasn't true, but we rely on it below. This is a regression assert.
|
||||||
BOOST_STATIC_ASSERT(::boost::is_integral<char>::value);
|
BOOST_STATIC_ASSERT(::boost::is_integral<char>::value);
|
||||||
# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
|
# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
|
||||||
# if defined(BOOST_HAS_LONG_LONG)
|
BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits<T>::is_specialized);
|
||||||
BOOST_STATIC_CONSTANT(bool,
|
|
||||||
value = (
|
|
||||||
std::numeric_limits<T>::is_specialized
|
|
||||||
| boost::is_same<T,long long>::value
|
|
||||||
| boost::is_same<T,unsigned long long>::value));
|
|
||||||
# else
|
|
||||||
BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits<T>::is_specialized);
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# if !defined(__BORLANDC__)
|
# if !defined(__BORLANDC__)
|
||||||
BOOST_STATIC_CONSTANT(bool, value = (
|
BOOST_STATIC_CONSTANT(bool, value = (
|
||||||
@@ -179,17 +173,14 @@ struct counting_iterator_traits {
|
|||||||
template <class Incrementable>
|
template <class Incrementable>
|
||||||
struct counting_iterator_policies : public default_iterator_policies
|
struct counting_iterator_policies : public default_iterator_policies
|
||||||
{
|
{
|
||||||
template <class IteratorAdaptor>
|
const Incrementable& dereference(type<const Incrementable&>, const Incrementable& i) const
|
||||||
typename IteratorAdaptor::reference dereference(const IteratorAdaptor& i) const
|
{ return i; }
|
||||||
{ return i.base(); }
|
|
||||||
|
template <class Difference, class Iterator1, class Iterator2>
|
||||||
template <class Iterator1, class Iterator2>
|
Difference distance(type<Difference>, const Iterator1& x,
|
||||||
typename Iterator1::difference_type distance(
|
const Iterator2& y) const
|
||||||
const Iterator1& x, const Iterator2& y) const
|
|
||||||
{
|
{
|
||||||
typedef typename Iterator1::difference_type difference_type;
|
return boost::detail::any_distance<Difference>(x, y);//,(Difference*)());
|
||||||
return boost::detail::any_distance<difference_type>(
|
|
||||||
x.base(), y.base());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -197,20 +188,15 @@ struct counting_iterator_policies : public default_iterator_policies
|
|||||||
template <class Incrementable>
|
template <class Incrementable>
|
||||||
struct counting_iterator_generator
|
struct counting_iterator_generator
|
||||||
{
|
{
|
||||||
typedef typename boost::remove_const<
|
typedef counting_iterator_traits<Incrementable> traits;
|
||||||
Incrementable
|
|
||||||
>::type value_type;
|
|
||||||
|
|
||||||
typedef counting_iterator_traits<value_type> traits;
|
typedef iterator_adaptor<Incrementable,
|
||||||
|
counting_iterator_policies<Incrementable>,
|
||||||
typedef iterator_adaptor<
|
Incrementable,
|
||||||
value_type
|
const Incrementable&,
|
||||||
, counting_iterator_policies<value_type>
|
const Incrementable*,
|
||||||
, value_type
|
typename traits::iterator_category,
|
||||||
, value_type const&
|
typename traits::difference_type
|
||||||
, value_type const*
|
|
||||||
, typename traits::iterator_category
|
|
||||||
, typename traits::difference_type
|
|
||||||
> type;
|
> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -99,17 +99,17 @@ struct half_open_range
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
typedef iter_t const_iterator;
|
typedef iter_t const_iterator;
|
||||||
typedef typename iterator::value_type value_type;
|
typedef typename counting_iterator_traits<Incrementable>::value_type value_type;
|
||||||
typedef typename iterator::difference_type difference_type;
|
typedef typename counting_iterator_traits<Incrementable>::difference_type difference_type;
|
||||||
typedef typename iterator::reference reference;
|
typedef typename counting_iterator_traits<Incrementable>::reference reference;
|
||||||
typedef typename iterator::reference const_reference;
|
typedef typename counting_iterator_traits<Incrementable>::reference const_reference;
|
||||||
typedef typename iterator::pointer pointer;
|
typedef typename counting_iterator_traits<Incrementable>::pointer pointer;
|
||||||
typedef typename iterator::pointer const_pointer;
|
typedef typename counting_iterator_traits<Incrementable>::pointer const_pointer;
|
||||||
|
|
||||||
// It would be nice to select an unsigned type, but this is appropriate
|
// It would be nice to select an unsigned type, but this is appropriate
|
||||||
// since the library makes an attempt to select a difference_type which can
|
// since the library makes an attempt to select a difference_type which can
|
||||||
// hold the difference between any two iterators.
|
// hold the difference between any two iterators.
|
||||||
typedef typename iterator::difference_type size_type;
|
typedef typename counting_iterator_traits<Incrementable>::difference_type size_type;
|
||||||
|
|
||||||
half_open_range(Incrementable start, Incrementable finish)
|
half_open_range(Incrementable start, Incrementable finish)
|
||||||
: m_start(start),
|
: m_start(start),
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
# if defined(BOOST_NO_STD_ITERATOR) && !defined(BOOST_MSVC_STD_ITERATOR)
|
# ifdef BOOST_NO_STD_ITERATOR
|
||||||
template <class Category, class T,
|
template <class Category, class T,
|
||||||
class Distance = std::ptrdiff_t,
|
class Distance = std::ptrdiff_t,
|
||||||
class Pointer = T*, class Reference = T&>
|
class Pointer = T*, class Reference = T&>
|
||||||
|
|||||||
+255
-496
File diff suppressed because it is too large
Load Diff
@@ -5,10 +5,6 @@
|
|||||||
// test suite for STL concepts such as iterators and containers.
|
// test suite for STL concepts such as iterators and containers.
|
||||||
//
|
//
|
||||||
// Revision History:
|
// Revision History:
|
||||||
// 28 Apr 2002 Fixed input iterator requirements.
|
|
||||||
// For a == b a++ == b++ is no longer required.
|
|
||||||
// See 24.1.1/3 for details.
|
|
||||||
// (Thomas Witt)
|
|
||||||
// 08 Feb 2001 Fixed bidirectional iterator test so that
|
// 08 Feb 2001 Fixed bidirectional iterator test so that
|
||||||
// --i is no longer a precondition.
|
// --i is no longer a precondition.
|
||||||
// (Jeremy Siek)
|
// (Jeremy Siek)
|
||||||
@@ -78,40 +74,22 @@ void mutable_trivial_iterator_test(const Iterator i, const Iterator j, T val)
|
|||||||
template <class Iterator, class T>
|
template <class Iterator, class T>
|
||||||
void input_iterator_test(Iterator i, T v1, T v2)
|
void input_iterator_test(Iterator i, T v1, T v2)
|
||||||
{
|
{
|
||||||
Iterator i1(i);
|
Iterator i1 = i, i2 = i;
|
||||||
|
|
||||||
assert(i == i1);
|
assert(i == i1++);
|
||||||
assert(!(i != i1));
|
assert(i != ++i2);
|
||||||
|
|
||||||
// I can see no generic way to create an input iterator
|
trivial_iterator_test(i, i1, v1);
|
||||||
// that is in the domain of== of i and != i.
|
trivial_iterator_test(i, i2, v1);
|
||||||
// The following works for istream_iterator but is not
|
|
||||||
// guaranteed to work for arbitrary input iterators.
|
|
||||||
//
|
|
||||||
// Iterator i2;
|
|
||||||
//
|
|
||||||
// assert(i != i2);
|
|
||||||
// assert(!(i == i2));
|
|
||||||
|
|
||||||
assert(*i1 == v1);
|
|
||||||
assert(*i == v1);
|
|
||||||
|
|
||||||
// we cannot test for equivalence of (void)++i & (void)i++
|
|
||||||
// as i is only guaranteed to be single pass.
|
|
||||||
assert(*i++ == v1);
|
|
||||||
|
|
||||||
i1 = i;
|
|
||||||
|
|
||||||
assert(i == i1);
|
|
||||||
assert(!(i != i1));
|
|
||||||
|
|
||||||
assert(*i1 == v2);
|
|
||||||
assert(*i == v2);
|
|
||||||
|
|
||||||
// i is dereferencable, so it must be incrementable.
|
|
||||||
++i;
|
++i;
|
||||||
|
assert(i == i1);
|
||||||
|
assert(i == i2);
|
||||||
|
++i1;
|
||||||
|
++i2;
|
||||||
|
|
||||||
// how to test for operator-> ?
|
trivial_iterator_test(i, i1, v2);
|
||||||
|
trivial_iterator_test(i, i2, v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// how to test output iterator?
|
// how to test output iterator?
|
||||||
@@ -146,23 +124,6 @@ void forward_iterator_test(Iterator i, T v1, T v2)
|
|||||||
{
|
{
|
||||||
input_iterator_test(i, v1, v2);
|
input_iterator_test(i, v1, v2);
|
||||||
|
|
||||||
Iterator i1 = i, i2 = i;
|
|
||||||
|
|
||||||
assert(i == i1++);
|
|
||||||
assert(i != ++i2);
|
|
||||||
|
|
||||||
trivial_iterator_test(i, i1, v1);
|
|
||||||
trivial_iterator_test(i, i2, v1);
|
|
||||||
|
|
||||||
++i;
|
|
||||||
assert(i == i1);
|
|
||||||
assert(i == i2);
|
|
||||||
++i1;
|
|
||||||
++i2;
|
|
||||||
|
|
||||||
trivial_iterator_test(i, i1, v2);
|
|
||||||
trivial_iterator_test(i, i2, v2);
|
|
||||||
|
|
||||||
// borland doesn't allow non-type template parameters
|
// borland doesn't allow non-type template parameters
|
||||||
# if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
|
# if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
|
||||||
lvalue_test<(boost::is_pointer<Iterator>::value)>::check(i);
|
lvalue_test<(boost::is_pointer<Iterator>::value)>::check(i);
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
// (C) Copyright Toon Knapen 2001. Permission to copy, use,
|
|
||||||
// modify, sell and distribute this software is granted provided this
|
|
||||||
// copyright notice appears in all copies. This software is provided
|
|
||||||
// "as is" without express or implied warranty, and with no claim as
|
|
||||||
// to its suitability for any purpose.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef boost_permutation_iterator_hpp
|
|
||||||
#define boost_permutation_iterator_hpp
|
|
||||||
|
|
||||||
#include <boost/iterator_adaptors.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
template < typename IndexIterator >
|
|
||||||
struct permutation_iterator_policies : public default_iterator_policies
|
|
||||||
{
|
|
||||||
permutation_iterator_policies() {}
|
|
||||||
|
|
||||||
permutation_iterator_policies(IndexIterator order_it)
|
|
||||||
: order_it_( order_it )
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class IteratorAdaptor>
|
|
||||||
typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const
|
|
||||||
{ return *(x.base() + *order_it_); }
|
|
||||||
|
|
||||||
template <class IteratorAdaptor>
|
|
||||||
void increment(IteratorAdaptor&)
|
|
||||||
{ ++order_it_; }
|
|
||||||
|
|
||||||
template <class IteratorAdaptor>
|
|
||||||
void decrement(IteratorAdaptor&)
|
|
||||||
{ --order_it_; }
|
|
||||||
|
|
||||||
template <class IteratorAdaptor, class DifferenceType>
|
|
||||||
void advance(IteratorAdaptor& x, DifferenceType n)
|
|
||||||
{ std::advance( order_it_, n ); }
|
|
||||||
|
|
||||||
template <class IteratorAdaptor1, class IteratorAdaptor2>
|
|
||||||
typename IteratorAdaptor1::difference_type
|
|
||||||
distance(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
|
|
||||||
{ return std::distance( x.policies().order_it_, y.policies().order_it_ ); }
|
|
||||||
|
|
||||||
template <class IteratorAdaptor1, class IteratorAdaptor2>
|
|
||||||
bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
|
|
||||||
{ return x.policies().order_it_ == y.policies().order_it_; }
|
|
||||||
|
|
||||||
IndexIterator order_it_;
|
|
||||||
};
|
|
||||||
|
|
||||||
template < typename ElementIterator, typename IndexIterator >
|
|
||||||
struct permutation_iterator_generator
|
|
||||||
{
|
|
||||||
typedef boost::iterator_adaptor
|
|
||||||
< ElementIterator,
|
|
||||||
permutation_iterator_policies< IndexIterator >
|
|
||||||
> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template < class IndexIterator, class ElementIterator >
|
|
||||||
inline typename permutation_iterator_generator< ElementIterator, IndexIterator >::type
|
|
||||||
make_permutation_iterator(ElementIterator base, IndexIterator order)
|
|
||||||
{
|
|
||||||
typedef typename permutation_iterator_generator< ElementIterator, IndexIterator >::type result_t;
|
|
||||||
return result_t( base, order );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // boost_permutation_iterator_hpp
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user