diff options
Diffstat (limited to 'include/llvm/ADT/STLExtras.h')
-rw-r--r-- | include/llvm/ADT/STLExtras.h | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index d4360fa8d218d..abd39dacc6713 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -17,7 +17,6 @@ #ifndef LLVM_ADT_STLEXTRAS_H #define LLVM_ADT_STLEXTRAS_H -#include "llvm/Support/Compiler.h" #include <algorithm> // for std::all_of #include <cassert> #include <cstddef> // for std::size_t @@ -27,6 +26,9 @@ #include <memory> #include <utility> // for std::pair +#include "llvm/ADT/iterator_range.h" +#include "llvm/Support/Compiler.h" + namespace llvm { //===----------------------------------------------------------------------===// @@ -117,7 +119,9 @@ public: iterator_category; typedef typename std::iterator_traits<RootIt>::difference_type difference_type; - typedef typename UnaryFunc::result_type value_type; + typedef typename std::result_of< + UnaryFunc(decltype(*std::declval<RootIt>()))> + ::type value_type; typedef void pointer; //typedef typename UnaryFunc::result_type *pointer; @@ -379,6 +383,14 @@ bool any_of(R &&Range, UnaryPredicate &&P) { std::forward<UnaryPredicate>(P)); } +/// Provide wrappers to std::none_of which take ranges instead of having to pass +/// begin/end explicitly. +template <typename R, class UnaryPredicate> +bool none_of(R &&Range, UnaryPredicate &&P) { + return std::none_of(Range.begin(), Range.end(), + std::forward<UnaryPredicate>(P)); +} + /// Provide wrappers to std::find which take ranges instead of having to pass /// begin/end explicitly. template<typename R, class T> @@ -386,6 +398,43 @@ auto find(R &&Range, const T &val) -> decltype(Range.begin()) { return std::find(Range.begin(), Range.end(), val); } +/// Provide wrappers to std::find_if which take ranges instead of having to pass +/// begin/end explicitly. +template <typename R, class T> +auto find_if(R &&Range, const T &Pred) -> decltype(Range.begin()) { + return std::find_if(Range.begin(), Range.end(), Pred); +} + +/// Provide wrappers to std::remove_if which take ranges instead of having to +/// pass begin/end explicitly. +template<typename R, class UnaryPredicate> +auto remove_if(R &&Range, UnaryPredicate &&P) -> decltype(Range.begin()) { + return std::remove_if(Range.begin(), Range.end(), P); +} + +/// Wrapper function around std::find to detect if an element exists +/// in a container. +template <typename R, typename E> +bool is_contained(R &&Range, const E &Element) { + return std::find(Range.begin(), Range.end(), Element) != Range.end(); +} + +/// 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 UnaryPredicate> +auto count_if(R &&Range, UnaryPredicate &&P) + -> typename std::iterator_traits<decltype(Range.begin())>::difference_type { + return std::count_if(Range.begin(), Range.end(), P); +} + +/// Wrapper function around std::transform to apply a function to a range and +/// store the result elsewhere. +template <typename R, class OutputIt, typename UnaryPredicate> +OutputIt transform(R &&Range, OutputIt d_first, UnaryPredicate &&P) { + return std::transform(Range.begin(), Range.end(), d_first, + std::forward<UnaryPredicate>(P)); +} + //===----------------------------------------------------------------------===// // Extra additions to <memory> //===----------------------------------------------------------------------===// |