diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-10-23 17:51:42 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-10-23 17:51:42 +0000 |
commit | 1d5ae1026e831016fc29fd927877c86af904481f (patch) | |
tree | 2cdfd12620fcfa5d9e4a0389f85368e8e36f63f9 /include/llvm/ADT/STLExtras.h | |
parent | e6d1592492a3a379186bfb02bd0f4eda0669c0d5 (diff) |
Notes
Diffstat (limited to 'include/llvm/ADT/STLExtras.h')
-rw-r--r-- | include/llvm/ADT/STLExtras.h | 168 |
1 files changed, 46 insertions, 122 deletions
diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 81dce0168c79..274933bc5204 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -95,18 +95,6 @@ template <class Ty> struct identity { } }; -template <class Ty> struct less_ptr { - bool operator()(const Ty* left, const Ty* right) const { - return *left < *right; - } -}; - -template <class Ty> struct greater_ptr { - bool operator()(const Ty* left, const Ty* right) const { - return *right < *left; - } -}; - /// An efficient, type-erasing, non-owning reference to a callable. This is /// intended for use as the type of a function parameter that is not used /// after the function in question returns. @@ -530,10 +518,6 @@ bool all_of(R &&range, UnaryPredicate P); template <typename R, typename UnaryPredicate> bool any_of(R &&range, UnaryPredicate P); -template <size_t... I> struct index_sequence; - -template <class... Ts> struct index_sequence_for; - namespace detail { using std::declval; @@ -568,38 +552,38 @@ struct zip_common : public zip_traits<ZipType, Iters...> { std::tuple<Iters...> iterators; protected: - template <size_t... Ns> value_type deref(index_sequence<Ns...>) const { + template <size_t... Ns> value_type deref(std::index_sequence<Ns...>) const { return value_type(*std::get<Ns>(iterators)...); } template <size_t... Ns> - decltype(iterators) tup_inc(index_sequence<Ns...>) const { + decltype(iterators) tup_inc(std::index_sequence<Ns...>) const { return std::tuple<Iters...>(std::next(std::get<Ns>(iterators))...); } template <size_t... Ns> - decltype(iterators) tup_dec(index_sequence<Ns...>) const { + decltype(iterators) tup_dec(std::index_sequence<Ns...>) const { return std::tuple<Iters...>(std::prev(std::get<Ns>(iterators))...); } public: zip_common(Iters &&... ts) : iterators(std::forward<Iters>(ts)...) {} - value_type operator*() { return deref(index_sequence_for<Iters...>{}); } + value_type operator*() { return deref(std::index_sequence_for<Iters...>{}); } const value_type operator*() const { - return deref(index_sequence_for<Iters...>{}); + return deref(std::index_sequence_for<Iters...>{}); } ZipType &operator++() { - iterators = tup_inc(index_sequence_for<Iters...>{}); + iterators = tup_inc(std::index_sequence_for<Iters...>{}); return *reinterpret_cast<ZipType *>(this); } ZipType &operator--() { static_assert(Base::IsBidirectional, "All inner iterators must be at least bidirectional."); - iterators = tup_dec(index_sequence_for<Iters...>{}); + iterators = tup_dec(std::index_sequence_for<Iters...>{}); return *reinterpret_cast<ZipType *>(this); } }; @@ -618,7 +602,8 @@ struct zip_first : public zip_common<zip_first<Iters...>, Iters...> { template <typename... Iters> class zip_shortest : public zip_common<zip_shortest<Iters...>, Iters...> { template <size_t... Ns> - bool test(const zip_shortest<Iters...> &other, index_sequence<Ns...>) const { + bool test(const zip_shortest<Iters...> &other, + std::index_sequence<Ns...>) const { return all_of(std::initializer_list<bool>{std::get<Ns>(this->iterators) != std::get<Ns>(other.iterators)...}, identity<bool>{}); @@ -630,7 +615,7 @@ public: zip_shortest(Iters &&... ts) : Base(std::forward<Iters>(ts)...) {} bool operator==(const zip_shortest<Iters...> &other) const { - return !test(other, index_sequence_for<Iters...>{}); + return !test(other, std::index_sequence_for<Iters...>{}); } }; @@ -646,18 +631,21 @@ public: private: std::tuple<Args...> ts; - template <size_t... Ns> iterator begin_impl(index_sequence<Ns...>) const { + template <size_t... Ns> + iterator begin_impl(std::index_sequence<Ns...>) const { return iterator(std::begin(std::get<Ns>(ts))...); } - template <size_t... Ns> iterator end_impl(index_sequence<Ns...>) const { + template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) const { return iterator(std::end(std::get<Ns>(ts))...); } public: zippy(Args &&... ts_) : ts(std::forward<Args>(ts_)...) {} - iterator begin() const { return begin_impl(index_sequence_for<Args...>{}); } - iterator end() const { return end_impl(index_sequence_for<Args...>{}); } + iterator begin() const { + return begin_impl(std::index_sequence_for<Args...>{}); + } + iterator end() const { return end_impl(std::index_sequence_for<Args...>{}); } }; } // end namespace detail @@ -727,20 +715,20 @@ private: template <size_t... Ns> bool test(const zip_longest_iterator<Iters...> &other, - index_sequence<Ns...>) const { + std::index_sequence<Ns...>) const { return llvm::any_of( std::initializer_list<bool>{std::get<Ns>(this->iterators) != std::get<Ns>(other.iterators)...}, identity<bool>{}); } - template <size_t... Ns> value_type deref(index_sequence<Ns...>) const { + template <size_t... Ns> value_type deref(std::index_sequence<Ns...>) const { return value_type( deref_or_none(std::get<Ns>(iterators), std::get<Ns>(end_iterators))...); } template <size_t... Ns> - decltype(iterators) tup_inc(index_sequence<Ns...>) const { + decltype(iterators) tup_inc(std::index_sequence<Ns...>) const { return std::tuple<Iters...>( next_or_end(std::get<Ns>(iterators), std::get<Ns>(end_iterators))...); } @@ -750,17 +738,19 @@ public: : iterators(std::forward<Iters>(ts.first)...), end_iterators(std::forward<Iters>(ts.second)...) {} - value_type operator*() { return deref(index_sequence_for<Iters...>{}); } + value_type operator*() { return deref(std::index_sequence_for<Iters...>{}); } - value_type operator*() const { return deref(index_sequence_for<Iters...>{}); } + value_type operator*() const { + return deref(std::index_sequence_for<Iters...>{}); + } zip_longest_iterator<Iters...> &operator++() { - iterators = tup_inc(index_sequence_for<Iters...>{}); + iterators = tup_inc(std::index_sequence_for<Iters...>{}); return *this; } bool operator==(const zip_longest_iterator<Iters...> &other) const { - return !test(other, index_sequence_for<Iters...>{}); + return !test(other, std::index_sequence_for<Iters...>{}); } }; @@ -777,12 +767,13 @@ public: private: std::tuple<Args...> ts; - template <size_t... Ns> iterator begin_impl(index_sequence<Ns...>) const { + template <size_t... Ns> + iterator begin_impl(std::index_sequence<Ns...>) const { return iterator(std::make_pair(adl_begin(std::get<Ns>(ts)), adl_end(std::get<Ns>(ts)))...); } - template <size_t... Ns> iterator end_impl(index_sequence<Ns...>) const { + template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) const { return iterator(std::make_pair(adl_end(std::get<Ns>(ts)), adl_end(std::get<Ns>(ts)))...); } @@ -790,8 +781,10 @@ private: public: zip_longest_range(Args &&... ts_) : ts(std::forward<Args>(ts_)...) {} - iterator begin() const { return begin_impl(index_sequence_for<Args...>{}); } - iterator end() const { return end_impl(index_sequence_for<Args...>{}); } + iterator begin() const { + return begin_impl(std::index_sequence_for<Args...>{}); + } + iterator end() const { return end_impl(std::index_sequence_for<Args...>{}); } }; } // namespace detail @@ -847,7 +840,7 @@ class concat_iterator /// Increments the first non-end iterator. /// /// It is an error to call this with all iterators at the end. - template <size_t... Ns> void increment(index_sequence<Ns...>) { + template <size_t... Ns> void increment(std::index_sequence<Ns...>) { // Build a sequence of functions to increment each iterator if possible. bool (concat_iterator::*IncrementHelperFns[])() = { &concat_iterator::incrementHelper<Ns>...}; @@ -876,7 +869,7 @@ class concat_iterator /// reference. /// /// It is an error to call this with all iterators at the end. - template <size_t... Ns> ValueT &get(index_sequence<Ns...>) const { + template <size_t... Ns> ValueT &get(std::index_sequence<Ns...>) const { // Build a sequence of functions to get from iterator if possible. ValueT *(concat_iterator::*GetHelperFns[])() const = { &concat_iterator::getHelper<Ns>...}; @@ -901,11 +894,13 @@ public: using BaseT::operator++; concat_iterator &operator++() { - increment(index_sequence_for<IterTs...>()); + increment(std::index_sequence_for<IterTs...>()); return *this; } - ValueT &operator*() const { return get(index_sequence_for<IterTs...>()); } + ValueT &operator*() const { + return get(std::index_sequence_for<IterTs...>()); + } bool operator==(const concat_iterator &RHS) const { return Begins == RHS.Begins && Ends == RHS.Ends; @@ -928,10 +923,10 @@ public: private: std::tuple<RangeTs...> Ranges; - template <size_t... Ns> iterator begin_impl(index_sequence<Ns...>) { + template <size_t... Ns> iterator begin_impl(std::index_sequence<Ns...>) { return iterator(std::get<Ns>(Ranges)...); } - template <size_t... Ns> iterator end_impl(index_sequence<Ns...>) { + template <size_t... Ns> iterator end_impl(std::index_sequence<Ns...>) { return iterator(make_range(std::end(std::get<Ns>(Ranges)), std::end(std::get<Ns>(Ranges)))...); } @@ -940,8 +935,8 @@ public: concat_range(RangeTs &&... Ranges) : Ranges(std::forward<RangeTs>(Ranges)...) {} - iterator begin() { return begin_impl(index_sequence_for<RangeTs...>{}); } - iterator end() { return end_impl(index_sequence_for<RangeTs...>{}); } + iterator begin() { return begin_impl(std::index_sequence_for<RangeTs...>{}); } + iterator end() { return end_impl(std::index_sequence_for<RangeTs...>{}); } }; } // end namespace detail @@ -990,28 +985,6 @@ struct on_first { } }; -// A subset of N3658. More stuff can be added as-needed. - -/// Represents a compile-time sequence of integers. -template <class T, T... I> struct integer_sequence { - using value_type = T; - - static constexpr size_t size() { return sizeof...(I); } -}; - -/// Alias for the common case of a sequence of size_ts. -template <size_t... I> -struct index_sequence : integer_sequence<std::size_t, I...> {}; - -template <std::size_t N, std::size_t... I> -struct build_index_impl : build_index_impl<N - 1, N - 1, I...> {}; -template <std::size_t... I> -struct build_index_impl<0, I...> : index_sequence<I...> {}; - -/// Creates a compile-time integer sequence for a parameter pack. -template <class... Ts> -struct index_sequence_for : build_index_impl<sizeof...(Ts)> {}; - /// Utility type to build an inheritance chain that makes it easy to rank /// overload candidates. template <int N> struct rank : rank<N - 1> {}; @@ -1391,41 +1364,6 @@ void replace(Container &Cont, typename Container::iterator ContIt, // Extra additions to <memory> //===----------------------------------------------------------------------===// -// Implement make_unique according to N3656. - -/// Constructs a `new T()` with the given args and returns a -/// `unique_ptr<T>` which owns the object. -/// -/// Example: -/// -/// auto p = make_unique<int>(); -/// auto p = make_unique<std::tuple<int, int>>(0, 1); -template <class T, class... Args> -typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type -make_unique(Args &&... args) { - return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); -} - -/// Constructs a `new T[n]` with the given args and returns a -/// `unique_ptr<T[]>` which owns the object. -/// -/// \param n size of the new array. -/// -/// Example: -/// -/// auto p = make_unique<int[]>(2); // value-initializes the array with 0's. -template <class T> -typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0, - std::unique_ptr<T>>::type -make_unique(size_t n) { - return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]()); -} - -/// This function isn't used and is only here to provide better compile errors. -template <class T, class... Args> -typename std::enable_if<std::extent<T>::value != 0>::type -make_unique(Args &&...) = delete; - struct FreeDeleter { void operator()(void* v) { ::free(v); @@ -1439,20 +1377,6 @@ struct pair_hash { } }; -/// A functor like C++14's std::less<void> in its absence. -struct less { - template <typename A, typename B> bool operator()(A &&a, B &&b) const { - return std::forward<A>(a) < std::forward<B>(b); - } -}; - -/// A functor like C++14's std::equal<void> in its absence. -struct equal { - template <typename A, typename B> bool operator()(A &&a, B &&b) const { - return std::forward<A>(a) == std::forward<B>(b); - } -}; - /// Binary functor that adapts to any other binary functor after dereferencing /// operands. template <typename T> struct deref { @@ -1580,7 +1504,7 @@ template <typename R> detail::enumerator<R> enumerate(R &&TheRange) { namespace detail { template <typename F, typename Tuple, std::size_t... I> -auto apply_tuple_impl(F &&f, Tuple &&t, index_sequence<I...>) +auto apply_tuple_impl(F &&f, Tuple &&t, std::index_sequence<I...>) -> decltype(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...)) { return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...); } @@ -1593,9 +1517,9 @@ auto apply_tuple_impl(F &&f, Tuple &&t, index_sequence<I...>) template <typename F, typename Tuple> auto apply_tuple(F &&f, Tuple &&t) -> decltype(detail::apply_tuple_impl( std::forward<F>(f), std::forward<Tuple>(t), - build_index_impl< + std::make_index_sequence< std::tuple_size<typename std::decay<Tuple>::type>::value>{})) { - using Indices = build_index_impl< + using Indices = std::make_index_sequence< std::tuple_size<typename std::decay<Tuple>::type>::value>; return detail::apply_tuple_impl(std::forward<F>(f), std::forward<Tuple>(t), |