LLVM 20.0.0git
|
This file contains some templates that are useful if you are working with the STL at all. More...
#include "llvm/ADT/ADL.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/iterator.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Config/abi-breaking.h"
#include "llvm/Support/ErrorHandling.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <functional>
#include <initializer_list>
#include <iterator>
#include <limits>
#include <memory>
#include <optional>
#include <tuple>
#include <type_traits>
#include <utility>
Go to the source code of this file.
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. | |
namespace | llvm::detail |
These are wrappers over isa* function that allow them to be used in generic algorithms such as llvm:all_of , llvm::none_of , etc. | |
namespace | llvm::callable_detail |
namespace | std |
Implement std::hash so that hash_code can be used in STL containers. | |
Typedefs | |
template<template< class... > class Op, class... Args> | |
using | llvm::is_detected = typename detail::detector< void, Op, Args... >::value_t |
Detects if a given trait holds for some set of arguments 'Args'. | |
template<typename T , typename... Ts> | |
using | llvm::is_one_of = std::disjunction< std::is_same< T, Ts >... > |
traits class for checking whether type T is one of any of the given types in the variadic list. | |
template<typename T , typename... Ts> | |
using | llvm::are_base_of = std::conjunction< std::is_base_of< T, Ts >... > |
traits class for checking whether type T is a base class for all the given types in the variadic list. | |
template<size_t I, typename... Ts> | |
using | llvm::TypeAtIndex = std::tuple_element_t< I, std::tuple< Ts... > > |
Find the type at a given index in a list of types. | |
template<typename Range > | |
using | llvm::detail::check_has_free_function_rbegin = decltype(adl_rbegin(std::declval< Range & >())) |
template<typename WrappedIteratorT , typename PredicateT > | |
using | llvm::filter_iterator = filter_iterator_impl< WrappedIteratorT, PredicateT, typename detail::fwd_or_bidi_tag< WrappedIteratorT >::type > |
Defines filter_iterator to a suitable specialization of filter_iterator_impl, based on the underlying iterator's category. | |
template<typename ZipType , typename ReferenceTupleType , typename... Iters> | |
using | llvm::detail::zip_traits = iterator_facade_base< ZipType, std::common_type_t< std::bidirectional_iterator_tag, typename std::iterator_traits< Iters >::iterator_category... >, ReferenceTupleType, typename std::iterator_traits< std::tuple_element_t< 0, std::tuple< Iters... > > >::difference_type, ReferenceTupleType *, ReferenceTupleType > |
template<typename T > | |
using | llvm::detail::sort_trivially_copyable = std::conjunction< std::is_pointer< T >, std::is_trivially_copyable< typename std::iterator_traits< T >::value_type > > |
template<typename Range > | |
using | llvm::detail::check_has_free_function_size = decltype(adl_size(std::declval< Range & >())) |
template<typename Range , typename Element > | |
using | llvm::detail::check_has_member_contains_t = decltype(std::declval< Range & >().contains(std::declval< const Element & >())) |
template<typename Range , typename Element > | |
using | llvm::detail::check_has_member_find_t = decltype(std::declval< Range & >().find(std::declval< const Element & >()) !=std::declval< Range & >().end()) |
template<typename... Iters> | |
using | llvm::detail::EnumeratorTupleType = enumerator_result< decltype(*declval< Iters >())... > |
template<typename T > | |
using | llvm::detail::has_sizeof = decltype(sizeof(T)) |
Functions | |
template<typename EnumTy1 , typename EnumTy2 , typename UT1 = std::enable_if_t<std::is_enum<EnumTy1>::value, std::underlying_type_t<EnumTy1>>, typename UT2 = std::enable_if_t<std::is_enum<EnumTy2>::value, std::underlying_type_t<EnumTy2>>> | |
constexpr auto | llvm::addEnumValues (EnumTy1 LHS, EnumTy2 RHS) |
Helper which adds two underlying types of enumeration type. | |
template<typename ContainerTy > | |
bool | llvm::hasSingleElement (ContainerTy &&C) |
Returns true if the given container only contains a single element. | |
template<typename T > | |
auto | llvm::drop_begin (T &&RangeOrContainer, size_t N=1) |
Return a range covering RangeOrContainer with the first N elements excluded. | |
template<typename T > | |
auto | llvm::drop_end (T &&RangeOrContainer, size_t N=1) |
Return a range covering RangeOrContainer with the last N elements excluded. | |
template<class ItTy , class FuncTy > | |
mapped_iterator< ItTy, FuncTy > | llvm::map_iterator (ItTy I, FuncTy F) |
template<class ContainerTy , class FuncTy > | |
auto | llvm::map_range (ContainerTy &&C, FuncTy F) |
template<typename ContainerTy > | |
auto | llvm::reverse (ContainerTy &&C) |
template<typename RangeT , typename PredicateT > | |
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > | llvm::make_filter_range (RangeT &&Range, PredicateT Pred) |
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator range. | |
template<typename RangeT > | |
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > | llvm::make_early_inc_range (RangeT &&Range) |
Make a range that does early increment to allow mutation of the underlying range without disrupting iteration. | |
template<typename R , typename UnaryPredicate > | |
bool | llvm::all_of (R &&Range, UnaryPredicate P) |
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename UnaryPredicate > | |
bool | llvm::any_of (R &&Range, UnaryPredicate P) |
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly. | |
template<typename T > | |
bool | llvm::all_equal (std::initializer_list< T > Values) |
Returns true if all Values in the initializer lists are equal or the list. | |
template<typename R > | |
constexpr size_t | llvm::range_size (R &&Range) |
Returns the size of the Range , i.e., the number of elements. | |
template<typename T , typename U , typename... Args> | |
detail::zippy< detail::zip_shortest, T, U, Args... > | llvm::zip (T &&t, U &&u, Args &&...args) |
zip iterator for two or more iteratable types. | |
template<typename T , typename U , typename... Args> | |
detail::zippy< detail::zip_first, T, U, Args... > | llvm::zip_equal (T &&t, U &&u, Args &&...args) |
zip iterator that assumes that all iteratees have the same length. | |
template<typename T , typename U , typename... Args> | |
detail::zippy< detail::zip_first, T, U, Args... > | llvm::zip_first (T &&t, U &&u, Args &&...args) |
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest. | |
template<typename Iter > | |
Iter | llvm::detail::next_or_end (const Iter &I, const Iter &End) |
template<typename Iter > | |
auto | llvm::detail::deref_or_none (const Iter &I, const Iter &End) -> std::optional< std::remove_const_t< std::remove_reference_t< decltype(*I)> > > |
template<typename T , typename U , typename... Args> | |
detail::zip_longest_range< T, U, Args... > | llvm::zip_longest (T &&t, U &&u, Args &&... args) |
Iterate over two or more iterators at the same time. | |
template<typename ValueT , typename... RangeTs> | |
detail::concat_range< ValueT, RangeTs... > | llvm::concat (RangeTs &&... Ranges) |
Concatenated range across two or more ranges. | |
template<typename OtherT , typename DerivedT , typename BaseT , typename T , typename PointerT , typename ReferenceT > | |
bool | llvm::detail::operator== (const indexed_accessor_range_base< DerivedT, BaseT, T, PointerT, ReferenceT > &lhs, const OtherT &rhs) |
Compare this range with another. | |
template<typename OtherT , typename DerivedT , typename BaseT , typename T , typename PointerT , typename ReferenceT > | |
bool | llvm::detail::operator!= (const indexed_accessor_range_base< DerivedT, BaseT, T, PointerT, ReferenceT > &lhs, const OtherT &rhs) |
template<typename ContainerTy > | |
auto | llvm::make_first_range (ContainerTy &&c) |
Given a container of pairs, return a range over the first elements. | |
template<typename ContainerTy > | |
auto | llvm::make_second_range (ContainerTy &&c) |
Given a container of pairs, return a range over the second elements. | |
template<typename... CallableTs> | |
constexpr decltype(auto) | llvm::makeVisitor (CallableTs &&...Callables) |
Returns an opaquely-typed Callable object whose operator() overload set is the sum of the operator() overload sets of each CallableT in CallableTs. | |
template<class Iterator , class RNG > | |
void | llvm::shuffle (Iterator first, Iterator last, RNG &&g) |
template<typename T > | |
int | llvm::array_pod_sort_comparator (const void *P1, const void *P2) |
Adapt std::less<T> for array_pod_sort. | |
template<class IteratorTy > | |
void | llvm::array_pod_sort (IteratorTy Start, IteratorTy End) |
array_pod_sort - This sorts an array with the specified start and end extent. | |
template<class IteratorTy > | |
void | llvm::array_pod_sort (IteratorTy Start, IteratorTy End, int(*Compare)(const typename std::iterator_traits< IteratorTy >::value_type *, const typename std::iterator_traits< IteratorTy >::value_type *)) |
template<typename IteratorTy > | |
void | llvm::sort (IteratorTy Start, IteratorTy End) |
template<typename Container > | |
void | llvm::sort (Container &&C) |
template<typename IteratorTy , typename Compare > | |
void | llvm::sort (IteratorTy Start, IteratorTy End, Compare Comp) |
template<typename Container , typename Compare > | |
void | llvm::sort (Container &&C, Compare Comp) |
template<typename R > | |
auto | llvm::size (R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr) |
Get the size of a range. | |
template<typename R , typename UnaryFunction > | |
UnaryFunction | llvm::for_each (R &&Range, UnaryFunction F) |
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename UnaryPredicate > | |
bool | llvm::none_of (R &&Range, UnaryPredicate P) |
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T > | |
auto | llvm::find (R &&Range, const T &Val) |
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename UnaryPredicate > | |
auto | llvm::find_if (R &&Range, UnaryPredicate P) |
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename UnaryPredicate > | |
auto | llvm::find_if_not (R &&Range, UnaryPredicate P) |
template<typename R , typename UnaryPredicate > | |
auto | llvm::remove_if (R &&Range, UnaryPredicate P) |
Provide wrappers to std::remove_if which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename OutputIt , typename UnaryPredicate > | |
OutputIt | llvm::copy_if (R &&Range, OutputIt Out, UnaryPredicate P) |
Provide wrappers to std::copy_if which take ranges instead of having to pass begin/end explicitly. | |
template<typename T , typename R , typename Predicate > | |
T * | llvm::find_singleton (R &&Range, Predicate P, bool AllowRepeats=false) |
Return the single value in Range that satisfies P (<member of Range> *, AllowRepeats)->T * returning nullptr when no values or multiple values were found. | |
template<typename T , typename R , typename Predicate > | |
std::pair< T *, bool > | llvm::find_singleton_nested (R &&Range, Predicate P, bool AllowRepeats=false) |
Return a pair consisting of the single value in Range that satisfies P (<member of Range> *, AllowRepeats)->std::pair<T*, bool> returning nullptr when no values or multiple values were found, and a bool indicating whether multiple values were found to cause the nullptr. | |
template<typename R , typename OutputIt > | |
OutputIt | llvm::copy (R &&Range, OutputIt Out) |
template<typename R , typename OutputIt , typename UnaryPredicate , typename T > | |
OutputIt | llvm::replace_copy_if (R &&Range, OutputIt Out, UnaryPredicate P, const T &NewValue) |
Provide wrappers to std::replace_copy_if which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename OutputIt , typename T > | |
OutputIt | llvm::replace_copy (R &&Range, OutputIt Out, const T &OldValue, const T &NewValue) |
Provide wrappers to std::replace_copy which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T > | |
void | llvm::replace (R &&Range, const T &OldValue, const T &NewValue) |
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename OutputIt > | |
OutputIt | llvm::move (R &&Range, OutputIt Out) |
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename E > | |
bool | llvm::is_contained (R &&Range, const E &Element) |
Returns true if Element is found in Range . | |
template<typename T , typename E > | |
constexpr bool | llvm::is_contained (std::initializer_list< T > Set, const E &Element) |
Returns true iff Element exists in Set . | |
template<typename R , typename Compare > | |
bool | llvm::is_sorted (R &&Range, Compare C) |
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a comparator C . | |
template<typename R > | |
bool | llvm::is_sorted (R &&Range) |
Wrapper function around std::is_sorted to check if elements in a range R are sorted in non-descending order. | |
template<typename R , typename E > | |
auto | llvm::count (R &&Range, const E &Element) |
Wrapper function around std::count to count the number of times an element Element occurs in the given range Range . | |
template<typename R , typename UnaryPredicate > | |
auto | llvm::count_if (R &&Range, UnaryPredicate P) |
Wrapper function around std::count_if to count the number of times an element satisfying a given predicate occurs in a range. | |
template<typename R , typename OutputIt , typename UnaryFunction > | |
OutputIt | llvm::transform (R &&Range, OutputIt d_first, UnaryFunction F) |
Wrapper function around std::transform to apply a function to a range and store the result elsewhere. | |
template<typename R , typename UnaryPredicate > | |
auto | llvm::partition (R &&Range, UnaryPredicate P) |
Provide wrappers to std::partition which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T > | |
auto | llvm::binary_search (R &&Range, T &&Value) |
Provide wrappers to std::binary_search which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T , typename Compare > | |
auto | llvm::binary_search (R &&Range, T &&Value, Compare C) |
template<typename R , typename T > | |
auto | llvm::lower_bound (R &&Range, T &&Value) |
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T , typename Compare > | |
auto | llvm::lower_bound (R &&Range, T &&Value, Compare C) |
template<typename R , typename T > | |
auto | llvm::upper_bound (R &&Range, T &&Value) |
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename T , typename Compare > | |
auto | llvm::upper_bound (R &&Range, T &&Value, Compare C) |
template<typename R > | |
auto | llvm::min_element (R &&Range) |
Provide wrappers to std::min_element which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename Compare > | |
auto | llvm::min_element (R &&Range, Compare C) |
template<typename R > | |
auto | llvm::max_element (R &&Range) |
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly. | |
template<typename R , typename Compare > | |
auto | llvm::max_element (R &&Range, Compare C) |
template<typename R1 , typename R2 > | |
auto | llvm::mismatch (R1 &&Range1, R2 &&Range2) |
Provide wrappers to std::mismatch which take ranges instead of having to pass begin/end explicitly. | |
template<typename R > | |
void | llvm::stable_sort (R &&Range) |
template<typename R , typename Compare > | |
void | llvm::stable_sort (R &&Range, Compare C) |
template<typename R , typename Predicate , typename Val = decltype(*adl_begin(std::declval<R>()))> | |
auto | llvm::partition_point (R &&Range, Predicate P) |
Binary search for the first iterator in a range where a predicate is false. | |
template<typename Range , typename Predicate > | |
auto | llvm::unique (Range &&R, Predicate P) |
template<typename Range > | |
auto | llvm::unique (Range &&R) |
Wrapper function around std::unique to allow calling unique on a container without having to specify the begin/end iterators. | |
template<typename L , typename R > | |
bool | llvm::equal (L &&LRange, R &&RRange) |
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same. | |
template<typename L , typename R , typename BinaryPredicate > | |
bool | llvm::equal (L &&LRange, R &&RRange, BinaryPredicate P) |
template<typename R > | |
bool | llvm::all_equal (R &&Range) |
Returns true if all elements in Range are equal or when the Range is empty. | |
template<typename Container , typename UnaryPredicate > | |
void | llvm::erase_if (Container &C, UnaryPredicate P) |
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent to: | |
template<typename Container , typename ValueType > | |
void | llvm::erase (Container &C, ValueType V) |
Wrapper function to remove a value from a container: | |
template<typename Container , typename Range > | |
void | llvm::append_range (Container &C, Range &&R) |
Wrapper function to append range R to container C . | |
template<typename Container , typename... Args> | |
void | llvm::append_values (Container &C, Args &&...Values) |
Appends all Values to container C . | |
template<typename Container , typename RandomAccessIterator > | |
void | llvm::replace (Container &Cont, typename Container::iterator ContIt, typename Container::iterator ContEnd, RandomAccessIterator ValIt, RandomAccessIterator ValEnd) |
Given a sequence container Cont, replace the range [ContIt, ContEnd) with the range [ValIt, ValEnd) (which is not from the same container). | |
template<typename Container , typename Range = std::initializer_list< typename Container::value_type>> | |
void | llvm::replace (Container &Cont, typename Container::iterator ContIt, typename Container::iterator ContEnd, Range R) |
Given a sequence container Cont, replace the range [ContIt, ContEnd) with the range R. | |
template<typename ForwardIterator , typename UnaryFunctor , typename NullaryFunctor , typename = std::enable_if_t< !std::is_constructible<StringRef, UnaryFunctor>::value && !std::is_constructible<StringRef, NullaryFunctor>::value>> | |
void | llvm::interleave (ForwardIterator begin, ForwardIterator end, UnaryFunctor each_fn, NullaryFunctor between_fn) |
An STL-style algorithm similar to std::for_each that applies a second functor between every pair of elements. | |
template<typename Container , typename UnaryFunctor , typename NullaryFunctor , typename = std::enable_if_t< !std::is_constructible<StringRef, UnaryFunctor>::value && !std::is_constructible<StringRef, NullaryFunctor>::value>> | |
void | llvm::interleave (const Container &c, UnaryFunctor each_fn, NullaryFunctor between_fn) |
template<typename Container , typename UnaryFunctor , typename StreamT , typename T = detail::ValueOfRange<Container>> | |
void | llvm::interleave (const Container &c, StreamT &os, UnaryFunctor each_fn, const StringRef &separator) |
Overload of interleave for the common case of string separator. | |
template<typename Container , typename StreamT , typename T = detail::ValueOfRange<Container>> | |
void | llvm::interleave (const Container &c, StreamT &os, const StringRef &separator) |
template<typename Container , typename UnaryFunctor , typename StreamT , typename T = detail::ValueOfRange<Container>> | |
void | llvm::interleaveComma (const Container &c, StreamT &os, UnaryFunctor each_fn) |
template<typename Container , typename StreamT , typename T = detail::ValueOfRange<Container>> | |
void | llvm::interleaveComma (const Container &c, StreamT &os) |
template<typename FirstRange , typename... RestRanges> | |
auto | llvm::enumerate (FirstRange &&First, RestRanges &&...Rest) |
Given two or more input ranges, returns a new range whose values are tuples (A, B, C, ...), such that A is the 0-based index of the item in the sequence, and B, C, ..., are the values from the original input ranges. | |
template<typename Predicate , typename... Args> | |
bool | llvm::detail::all_of_zip_predicate_first (Predicate &&P, Args &&...args) |
template<typename... ArgsThenPredicate, size_t... InputIndexes> | |
bool | llvm::detail::all_of_zip_predicate_last (std::tuple< ArgsThenPredicate... > argsThenPredicate, std::index_sequence< InputIndexes... >) |
template<typename... ArgsAndPredicate> | |
bool | llvm::all_of_zip (ArgsAndPredicate &&...argsAndPredicate) |
Compare two zipped ranges using the provided predicate (as last argument). | |
template<typename IterTy , typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)> | |
bool | llvm::hasNItems (IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;}, std::enable_if_t< !std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< std::remove_reference_t< decltype(Begin)> >::iterator_category >::value, void > *=nullptr) |
Return true if the sequence [Begin, End) has exactly N items. | |
template<typename IterTy , typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)> | |
bool | llvm::hasNItemsOrMore (IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;}, std::enable_if_t< !std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< std::remove_reference_t< decltype(Begin)> >::iterator_category >::value, void > *=nullptr) |
Return true if the sequence [Begin, End) has N or more items. | |
template<typename IterTy , typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)> | |
bool | llvm::hasNItemsOrLess (IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;}) |
Returns true if the sequence [Begin, End) has N or less items. | |
template<typename ContainerTy > | |
bool | llvm::hasNItems (ContainerTy &&C, unsigned N) |
Returns true if the given container has exactly N items. | |
template<typename ContainerTy > | |
bool | llvm::hasNItemsOrMore (ContainerTy &&C, unsigned N) |
Returns true if the given container has N or more items. | |
template<typename ContainerTy > | |
bool | llvm::hasNItemsOrLess (ContainerTy &&C, unsigned N) |
Returns true if the given container has N or less items. | |
template<class Ptr > | |
auto | llvm::to_address (const Ptr &P) |
Returns a raw pointer that represents the same address as the argument. | |
template<class T > | |
constexpr T * | llvm::to_address (T *P) |
Variables | |
template<typename Range > | |
static constexpr bool | llvm::detail::HasFreeFunctionRBegin |
template<typename T > | |
int(*)(const void *, const void *) | llvm::get_array_pod_sort_comparator (const T &) |
get_array_pod_sort_comparator - This is an internal helper function used to get type deduction of T right. | |
template<typename Range > | |
static constexpr bool | llvm::detail::HasFreeFunctionSize |
template<typename Range , typename Element > | |
static constexpr bool | llvm::detail::HasMemberContains |
template<typename Range , typename Element > | |
static constexpr bool | llvm::detail::HasMemberFind |
template<typename T > | |
constexpr bool | llvm::is_incomplete_v = !is_detected<detail::has_sizeof, T>::value |
Detects when type T is incomplete. | |
This file contains some templates that are useful if you are working with the STL at all.
No library is required when using these functions.
Definition in file STLExtras.h.