mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-03 07:46:41 +02:00
Compare commits
10 Commits
feature/mo
...
boost-1.69
Author | SHA1 | Date | |
---|---|---|---|
3cc4107d01 | |||
6ab148be01 | |||
06875a754d | |||
b844c8df53 | |||
194087e8ca | |||
b5edc8b64f | |||
44cee00831 | |||
b2adecb951 | |||
e16f2de233 | |||
218dc4baf1 |
@ -77,7 +77,7 @@ namespace iterators {
|
||||
|
||||
} // namespace iterators
|
||||
|
||||
using iterators::advance;
|
||||
using namespace iterators::advance_adl_barrier;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
@ -58,7 +58,7 @@ namespace iterators {
|
||||
|
||||
} // namespace iterators
|
||||
|
||||
using iterators::distance;
|
||||
using namespace iterators::distance_adl_barrier;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
@ -426,15 +426,16 @@ namespace detail
|
||||
>::type iterator_category;
|
||||
|
||||
// Needed for some broken libraries (see below)
|
||||
typedef boost::iterator<
|
||||
iterator_category
|
||||
, Value
|
||||
, typename traversal_archetype_base<
|
||||
struct workaround_iterator_base
|
||||
{
|
||||
typedef typename iterator_archetype_base::iterator_category iterator_category;
|
||||
typedef Value value_type;
|
||||
typedef typename traversal_archetype_base<
|
||||
Value, AccessCategory, TraversalCategory
|
||||
>::difference_type
|
||||
, typename access::pointer
|
||||
, typename access::reference
|
||||
> workaround_iterator_base;
|
||||
>::difference_type difference_type;
|
||||
typedef typename access::pointer pointer;
|
||||
typedef typename access::reference reference;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -59,6 +59,8 @@ test-suite iterator
|
||||
[ run next_prior_test.cpp ]
|
||||
[ run advance_test.cpp ]
|
||||
[ run distance_test.cpp ]
|
||||
[ compile adl_test.cpp ]
|
||||
[ compile range_distance_compat_test.cpp ]
|
||||
|
||||
[ run shared_iterator_test.cpp ]
|
||||
;
|
||||
|
25
test/adl_test.cpp
Normal file
25
test/adl_test.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright (C) 2017 Michel Morin.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <vector>
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/iterator/advance.hpp>
|
||||
#include <boost/iterator/distance.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
// Test that boost::advance/distance are not found by ADL.
|
||||
// (https://github.com/boostorg/iterator/issues/43)
|
||||
|
||||
typedef boost::array<int, 1> boost_type;
|
||||
std::vector<boost_type> std_boost(2);
|
||||
std::vector<boost_type>::iterator it = std_boost.begin();
|
||||
|
||||
advance(it, 2);
|
||||
(void)distance(it, it);
|
||||
|
||||
return 0;
|
||||
}
|
@ -16,8 +16,13 @@ struct new_random_access
|
||||
{};
|
||||
|
||||
struct new_iterator
|
||||
: public std::iterator< new_random_access, int >
|
||||
{
|
||||
typedef new_random_access iterator_category;
|
||||
typedef int value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef int* pointer;
|
||||
typedef int& reference;
|
||||
|
||||
int& operator*() const { return *m_x; }
|
||||
new_iterator& operator++() { return *this; }
|
||||
new_iterator operator++(int) { return *this; }
|
||||
@ -36,8 +41,13 @@ struct new_iterator
|
||||
new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
|
||||
|
||||
struct old_iterator
|
||||
: public std::iterator<std::random_access_iterator_tag, int>
|
||||
{
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
typedef int value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef int* pointer;
|
||||
typedef int& reference;
|
||||
|
||||
int& operator*() const { return *m_x; }
|
||||
old_iterator& operator++() { return *this; }
|
||||
old_iterator operator++(int) { return *this; }
|
||||
|
@ -5,10 +5,10 @@
|
||||
#include <deque>
|
||||
#include <iterator>
|
||||
#include <iostream>
|
||||
#include <cstddef> // std::ptrdiff_t
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/iterator/is_lvalue_iterator.hpp>
|
||||
#include <boost/iterator.hpp>
|
||||
|
||||
// Last, for BOOST_NO_LVALUE_RETURN_DETECTION
|
||||
#include <boost/iterator/detail/config_def.hpp>
|
||||
@ -20,29 +20,36 @@ struct v
|
||||
};
|
||||
|
||||
|
||||
struct value_iterator : boost::iterator<std::input_iterator_tag,v>
|
||||
struct value_iterator
|
||||
{
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
typedef v value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef v* pointer;
|
||||
typedef v& reference;
|
||||
|
||||
v operator*() const;
|
||||
};
|
||||
|
||||
struct noncopyable_iterator : boost::iterator<std::forward_iterator_tag,boost::noncopyable>
|
||||
struct noncopyable_iterator
|
||||
{
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef boost::noncopyable value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef boost::noncopyable* pointer;
|
||||
typedef boost::noncopyable& reference;
|
||||
|
||||
boost::noncopyable const& operator*() const;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct proxy_iterator
|
||||
: boost::iterator<std::output_iterator_tag,T>
|
||||
{
|
||||
typedef T value_type;
|
||||
|
||||
#if BOOST_WORKAROUND(__GNUC__, == 2)
|
||||
typedef boost::iterator<std::input_iterator_tag,value_type> base;
|
||||
typedef base::iterator_category iterator_category;
|
||||
typedef base::difference_type difference_type;
|
||||
typedef base::pointer pointer;
|
||||
typedef base::reference reference;
|
||||
#endif
|
||||
typedef std::output_iterator_tag iterator_category;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef T* pointer;
|
||||
typedef T& reference;
|
||||
|
||||
struct proxy
|
||||
{
|
||||
|
@ -5,10 +5,10 @@
|
||||
#include <deque>
|
||||
#include <iterator>
|
||||
#include <iostream>
|
||||
#include <cstddef> // std::ptrdiff_t
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/iterator/is_readable_iterator.hpp>
|
||||
#include <boost/iterator.hpp>
|
||||
|
||||
// Last, for BOOST_NO_LVALUE_RETURN_DETECTION
|
||||
#include <boost/iterator/detail/config_def.hpp>
|
||||
@ -20,26 +20,35 @@ struct v
|
||||
};
|
||||
|
||||
|
||||
struct value_iterator : boost::iterator<std::input_iterator_tag,v>
|
||||
struct value_iterator
|
||||
{
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
typedef v value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef v* pointer;
|
||||
typedef v& reference;
|
||||
|
||||
v operator*() const;
|
||||
};
|
||||
|
||||
struct noncopyable_iterator : boost::iterator<std::forward_iterator_tag,boost::noncopyable>
|
||||
struct noncopyable_iterator
|
||||
{
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef boost::noncopyable value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef boost::noncopyable* pointer;
|
||||
typedef boost::noncopyable& reference;
|
||||
|
||||
boost::noncopyable const& operator*() const;
|
||||
};
|
||||
|
||||
struct proxy_iterator : boost::iterator<std::output_iterator_tag,v>
|
||||
struct proxy_iterator
|
||||
{
|
||||
#if BOOST_WORKAROUND(__GNUC__, == 2)
|
||||
typedef boost::iterator<std::input_iterator_tag,v> base;
|
||||
typedef base::iterator_category iterator_category;
|
||||
typedef base::value_type value_type;
|
||||
typedef base::difference_type difference_type;
|
||||
typedef base::pointer pointer;
|
||||
typedef base::reference reference;
|
||||
#endif
|
||||
typedef std::output_iterator_tag iterator_category;
|
||||
typedef v value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef v* pointer;
|
||||
typedef v& reference;
|
||||
|
||||
struct proxy
|
||||
{
|
||||
@ -50,16 +59,13 @@ struct proxy_iterator : boost::iterator<std::output_iterator_tag,v>
|
||||
proxy operator*() const;
|
||||
};
|
||||
|
||||
struct proxy_iterator2 : boost::iterator<std::output_iterator_tag,v>
|
||||
struct proxy_iterator2
|
||||
{
|
||||
#if BOOST_WORKAROUND(__GNUC__, == 2)
|
||||
typedef boost::iterator<std::input_iterator_tag,v> base;
|
||||
typedef base::iterator_category iterator_category;
|
||||
typedef base::value_type value_type;
|
||||
typedef base::difference_type difference_type;
|
||||
typedef base::pointer pointer;
|
||||
typedef base::reference reference;
|
||||
#endif
|
||||
typedef std::output_iterator_tag iterator_category;
|
||||
typedef v value_type;
|
||||
typedef std::ptrdiff_t difference_type;
|
||||
typedef v* pointer;
|
||||
typedef v& reference;
|
||||
|
||||
struct proxy
|
||||
{
|
||||
|
22
test/range_distance_compat_test.cpp
Normal file
22
test/range_distance_compat_test.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2018 Andrey Semashev
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/range/distance.hpp>
|
||||
#include <boost/range/iterator_range_core.hpp>
|
||||
#include <boost/iterator/distance.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
// Test that boost::distance from Boost.Range works with boost::distance from Boost.Iterator
|
||||
// (https://github.com/boostorg/iterator/commit/b844c8df530c474ec1856870b9b0de5f487b84d4#commitcomment-30603668)
|
||||
|
||||
typedef boost::iterator_range<const char*> range_type;
|
||||
range_type range;
|
||||
|
||||
(void)boost::distance(range);
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user