diff options
Diffstat (limited to 'src/common/container_helpers.h')
-rw-r--r-- | src/common/container_helpers.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/common/container_helpers.h b/src/common/container_helpers.h index 1865bd111..2c526bb4e 100644 --- a/src/common/container_helpers.h +++ b/src/common/container_helpers.h @@ -47,7 +47,14 @@ namespace tools { +/// convert a binary comparison function to a functor +template <typename T, typename ComparisonOpT = bool(const T &a, const T &b)> +inline auto compare_func(const ComparisonOpT &comparison_function) +{ + return [&comparison_function](const T &a, const T &b) -> bool { return comparison_function(a, b); }; +} /// test if a container is sorted and unique according to a comparison criteria (defaults to operator<) +/// NOTE: ComparisonOpT must establish 'strict weak ordering' https://en.cppreference.com/w/cpp/named_req/Compare template <typename T, typename ComparisonOpT = std::less<typename T::value_type>> bool is_sorted_and_unique(const T &container, const ComparisonOpT &ComparisonOp = ComparisonOpT{}) { @@ -65,6 +72,13 @@ bool is_sorted_and_unique(const T &container, const ComparisonOpT &ComparisonOp return true; } +/// specialization for raw function pointers +template <typename T> +bool is_sorted_and_unique(const T &container, + bool (*const ComparisonOpFunc)(const typename T::value_type &a, const typename T::value_type &b)) +{ + return is_sorted_and_unique(container, compare_func<typename T::value_type>(ComparisonOpFunc)); +} /// convenience wrapper for checking if a mapped object is mapped to a key embedded in that object /// example: std::unorderd_map<rct::key, std::pair<rct::key, rct::xmr_amount>> where the map key is supposed to /// reproduce the pair's rct::key; use the predicate to get the pair's rct::key element |