1 #ifndef SILICIUM_ITERATOR_RANGE_HPP
2 #define SILICIUM_ITERATOR_RANGE_HPP
6 #include <boost/static_assert.hpp>
7 #include <boost/range/begin.hpp>
8 #include <boost/range/end.hpp>
9 #include <boost/utility/addressof.hpp>
18 template <
class Iterator>
21 typedef typename std::remove_reference<decltype(*std::declval<Iterator>())>
::type type;
25 template <
class Iterator>
39 template <
class It1,
class It2>
42 , m_end(
std::forward<It2>(
end))
46 template <
class OtherIterator>
48 : m_begin(other.begin())
53 template <
class OtherIterator>
56 m_begin = other.begin();
61 BOOST_CONSTEXPR Iterator
const &
begin() const BOOST_NOEXCEPT
66 BOOST_CONSTEXPR Iterator
const &
end() const BOOST_NOEXCEPT
71 BOOST_CONSTEXPR
bool empty() const BOOST_NOEXCEPT
73 return m_begin == m_end;
78 BOOST_CONSTEXPR difference_type
size() const BOOST_NOEXCEPT
80 return m_end - m_begin;
97 value_type &
front() const BOOST_NOEXCEPT
104 value_type &
operator[](difference_type index)
const BOOST_NOEXCEPT
106 static_cast<std::random_access_iterator_tag
>(
typename std::iterator_traits<Iterator>::iterator_category{});
107 assert(index <
size());
108 return begin()[index];
113 Iterator m_begin, m_end;
116 template <
class Iterator1,
class Iterator2>
122 template <
class Iterator>
125 return range.
begin();
129 template <
class Iterator>
132 return range.
begin();
135 template <
class Iterator>
141 template <
class Iterator1,
class Iterator2>
143 #if !SILICIUM_COMPILER_HAS_AUTO_RETURN_TYPE
147 typedef typename std::decay<Iterator1>::type iterator_type;
148 BOOST_STATIC_ASSERT((std::is_same<iterator_type,
typename std::decay<Iterator2>::type>::value));
152 template <
class Range>
154 #if !SILICIUM_COMPILER_HAS_AUTO_RETURN_TYPE
163 template <
class ContiguousRange>
165 #if !SILICIUM_COMPILER_HAS_AUTO_RETURN_TYPE
171 auto begin_ =
begin(range);
172 auto end_ =
end(range);
175 typename std::remove_reference<decltype(*begin_)>::type *data =
nullptr;
178 auto *
const data_begin = boost::addressof(*begin_);
179 auto *
const data_end = data_begin + std::distance(begin_, end_);
value_type & front() const BOOST_NOEXCEPT
Definition: iterator_range.hpp:97
Definition: iterator_range.hpp:19
BOOST_STATIC_ASSERT(Si::is_handle< absolute_path >::value)
BOOST_CONSTEXPR Iterator const & range_begin(iterator_range< Iterator > const &range)
Definition: iterator_range.hpp:130
BOOST_CONSTEXPR Iterator const & begin() const BOOST_NOEXCEPT
Definition: iterator_range.hpp:61
Definition: absolute_path.hpp:352
BOOST_CONSTEXPR bool pointing_to_same_subrange(iterator_range< Iterator1 > const &left, iterator_range< Iterator2 > const &right)
Definition: iterator_range.hpp:117
SILICIUM_CXX14_CONSTEXPR void pop_front(difference_type n) BOOST_NOEXCEPT
Definition: iterator_range.hpp:85
Definition: absolute_path.hpp:19
value_type & operator[](difference_type index) const BOOST_NOEXCEPT
This method is only available with random access iterators so that it takes O(1) in time...
Definition: iterator_range.hpp:104
BOOST_CONSTEXPR iterator_range() BOOST_NOEXCEPT
Definition: iterator_range.hpp:33
BOOST_CONSTEXPR Iterator const & end(iterator_range< Iterator > const &range)
Definition: iterator_range.hpp:136
iterator_range(iterator_range< OtherIterator > const &other) BOOST_NOEXCEPT
Definition: iterator_range.hpp:47
Iterator const_iterator
Definition: iterator_range.hpp:31
std::iterator_traits< Iterator >::difference_type difference_type
Definition: iterator_range.hpp:28
detail::actual_value_type< Iterator >::type value_type
Definition: iterator_range.hpp:29
SILICIUM_CXX14_CONSTEXPR void pop_front() BOOST_NOEXCEPT
Definition: iterator_range.hpp:91
BOOST_CONSTEXPR Iterator const & begin(iterator_range< Iterator > const &range)
Definition: iterator_range.hpp:123
Definition: iterator_range.hpp:26
BOOST_CONSTEXPR bool empty() const BOOST_NOEXCEPT
Definition: iterator_range.hpp:71
BOOST_CONSTEXPR auto make_iterator_range(Iterator1 &&begin, Iterator2 &&end) -> iterator_range< typename std::decay< Iterator1 >::type >
Definition: iterator_range.hpp:142
BOOST_CONSTEXPR iterator_range(It1 &&begin, It2 &&end) BOOST_NOEXCEPT
Definition: iterator_range.hpp:40
BOOST_CONSTEXPR Iterator const & end() const BOOST_NOEXCEPT
Definition: iterator_range.hpp:66
Iterator iterator
Definition: iterator_range.hpp:30
iterator_range & operator=(iterator_range< OtherIterator > const &other) BOOST_NOEXCEPT
Definition: iterator_range.hpp:54
std::remove_reference< decltype(*std::declval< Iterator >))>::type type
Definition: iterator_range.hpp:21
auto make_contiguous_range(ContiguousRange &&range) -> decltype(make_iterator_range(boost::addressof(*std::begin(range)), boost::addressof(*std::end(range))))
Definition: iterator_range.hpp:164
#define SILICIUM_CXX14_CONSTEXPR
Definition: config.hpp:151
BOOST_CONSTEXPR difference_type size() const BOOST_NOEXCEPT
Definition: iterator_range.hpp:78