File indexing completed on 2026-05-10 08:43:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #ifndef LLVM_ADT_ITERATOR_RANGE_H
0019 #define LLVM_ADT_ITERATOR_RANGE_H
0020
0021 #include "llvm/ADT/ADL.h"
0022 #include <type_traits>
0023 #include <utility>
0024
0025 namespace llvm {
0026
0027 template <typename From, typename To, typename = void>
0028 struct explicitly_convertible : std::false_type {};
0029
0030 template <typename From, typename To>
0031 struct explicitly_convertible<
0032 From, To,
0033 std::void_t<decltype(static_cast<To>(
0034 std::declval<std::add_rvalue_reference_t<From>>()))>> : std::true_type {
0035 };
0036
0037
0038
0039
0040
0041 template <typename IteratorT>
0042 class iterator_range {
0043 IteratorT begin_iterator, end_iterator;
0044
0045 public:
0046 #if defined(__GNUC__) && \
0047 (__GNUC__ == 7 || (__GNUC__ == 8 && __GNUC_MINOR__ < 4))
0048
0049
0050 template <typename Container>
0051 #else
0052 template <
0053 typename Container,
0054 std::enable_if_t<explicitly_convertible<
0055 llvm::detail::IterOfRange<Container>, IteratorT>::value> * = nullptr>
0056 #endif
0057 iterator_range(Container &&c)
0058 : begin_iterator(adl_begin(c)), end_iterator(adl_end(c)) {
0059 }
0060 iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
0061 : begin_iterator(std::move(begin_iterator)),
0062 end_iterator(std::move(end_iterator)) {}
0063
0064 IteratorT begin() const { return begin_iterator; }
0065 IteratorT end() const { return end_iterator; }
0066 bool empty() const { return begin_iterator == end_iterator; }
0067 };
0068
0069 template <typename Container>
0070 iterator_range(Container &&)
0071 -> iterator_range<llvm::detail::IterOfRange<Container>>;
0072
0073
0074
0075
0076
0077 template <class T> iterator_range<T> make_range(T x, T y) {
0078 return iterator_range<T>(std::move(x), std::move(y));
0079 }
0080
0081 template <typename T> iterator_range<T> make_range(std::pair<T, T> p) {
0082 return iterator_range<T>(std::move(p.first), std::move(p.second));
0083 }
0084
0085 }
0086
0087 #endif