mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add functional map and fold generic functions
This commit is contained in:
@@ -34,6 +34,7 @@
|
||||
#include <set>
|
||||
#include <functional>
|
||||
#include <utility>
|
||||
#include <type_traits>
|
||||
|
||||
/// Operators need to stay in the global namespace.
|
||||
|
||||
@@ -141,6 +142,36 @@ inline std::multiset<T...>& operator-=(std::multiset<T...>& _a, C const& _b)
|
||||
namespace solidity::util
|
||||
{
|
||||
|
||||
/// Functional map.
|
||||
/// Returns a container _oc applying @param _op to each element in @param _c.
|
||||
/// By default _oc is a vector.
|
||||
/// If another return type is desired, an empty contained of that type
|
||||
/// is given as @param _oc.
|
||||
template<class Container, class Callable, class OutputContainer =
|
||||
std::vector<std::invoke_result_t<
|
||||
Callable,
|
||||
decltype(*std::begin(std::declval<Container>()))
|
||||
>>>
|
||||
auto applyMap(Container const& _c, Callable&& _op, OutputContainer _oc = OutputContainer{})
|
||||
{
|
||||
std::transform(std::begin(_c), std::end(_c), std::inserter(_oc, std::end(_oc)), _op);
|
||||
return _oc;
|
||||
}
|
||||
|
||||
/// Functional fold.
|
||||
/// Given a container @param _c, an initial value @param _acc,
|
||||
/// and a binary operator @param _binaryOp(T, U), accumulate
|
||||
/// the elements of _c over _acc.
|
||||
/// Note that <numeric> has a similar function `accumulate` which
|
||||
/// until C++20 does *not* std::move the partial accumulated.
|
||||
template<class C, class T, class Callable>
|
||||
auto fold(C const& _c, T _acc, Callable&& _binaryOp)
|
||||
{
|
||||
for (auto const& e: _c)
|
||||
_acc = _binaryOp(std::move(_acc), e);
|
||||
return _acc;
|
||||
}
|
||||
|
||||
template <class T, class U>
|
||||
T convertContainer(U const& _from)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user