LLVM: include/llvm/ADT/iterator_range.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef LLVM_ADT_ITERATOR_RANGE_H
19#define LLVM_ADT_ITERATOR_RANGE_H
20
22#include <type_traits>
23#include
24
25namespace llvm {
26
27
28
29
30
31template
33 IteratorT begin_iterator, end_iterator;
34
35 template <typename From, typename To>
36 using explicitly_converted_t = decltype(static_cast<To>(
37 std::declval<std::add_rvalue_reference_t>()));
38
39public:
40#if defined(__GNUC__) && \
41 (__GNUC__ == 7 || (__GNUC__ == 8 && __GNUC_MINOR__ < 4))
42
43
44 template
45#else
46 template <typename Container,
47 std::void_t<explicitly_converted_t<
49#endif
53 iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
54 : begin_iterator(std::move(begin_iterator)),
55 end_iterator(std::move(end_iterator)) {}
56
57 IteratorT begin() const { return begin_iterator; }
58 IteratorT end() const { return end_iterator; }
59 bool empty() const { return begin_iterator == end_iterator; }
60};
61
62template
65
66
67
68
69
73
77
78}
79
80#endif
A range adaptor for a pair of iterators.
Definition iterator_range.h:32
bool empty() const
Definition iterator_range.h:59
iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
Definition iterator_range.h:53
IteratorT end() const
Definition iterator_range.h:58
IteratorT begin() const
Definition iterator_range.h:57
iterator_range(Container &&c)
Definition iterator_range.h:50
decltype(adl_begin(std::declval< RangeT & >())) IterOfRange
This is an optimization pass for GlobalISel generic memory operations.
constexpr auto adl_begin(RangeT &&range) -> decltype(adl_detail::begin_impl(std::forward< RangeT >(range)))
Returns the begin iterator to range using std::begin and function found through Argument-Dependent Lo...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
Definition iterator_range.h:70
constexpr auto adl_end(RangeT &&range) -> decltype(adl_detail::end_impl(std::forward< RangeT >(range)))
Returns the end iterator to range using std::end and functions found through Argument-Dependent Looku...
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.