libzed 1.9.9
A general-purpose library for quick and simple data manipulation.
 
Loading...
Searching...
No Matches
memoize.hpp
1#pragma once
2
3#include <functional>
4#include <tuple>
5#include <unordered_map>
6
7namespace z {
8namespace core {
9
10// Hashing helper
11namespace memoization {
12
14template <typename T>
15inline void hash_combine(std::size_t &seed, const T &val) {
16 seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
17}
18
20template <typename tuple, std::size_t index = std::tuple_size<tuple>::value - 1>
21struct tupleHasher {
23 static void apply(std::size_t &seed, const tuple &tup) {
24 tupleHasher<tuple, index - 1>::apply(seed, tup);
25 hash_combine(seed, std::get<index>(tup));
26 }
27};
28
30template <typename tuple>
31struct tupleHasher<tuple, 0> {
33 static void apply(std::size_t &seed, const tuple &tup) {
34 hash_combine(seed, std::get<0>(tup));
35 }
36};
37
39struct tupleHash {
41 template <typename... T>
42 std::size_t operator()(const std::tuple<T...> &t) const {
43 std::size_t seed = 0;
44 tupleHasher<std::tuple<T...>>::apply(seed, t);
45 return seed;
46 }
47};
48} // namespace memoization
49
51template <typename T>
52class memoize;
53
69template <typename R, typename... Args>
70class memoize<R(Args...)> {
71private:
72 std::function<R(Args...)> lambda;
73 std::unordered_map<std::tuple<Args...>, R, memoization::tupleHash> cache;
74
75public:
80 memoize(std::function<R(Args...)> &&lambda) : lambda(lambda) {}
81
89 memoize(R lambda(Args...)) : lambda(lambda) {}
90
91 memoize() = delete;
92
104 auto arg_list = std::make_tuple(args...);
105
106 if (cache.find(arg_list) == cache.end()) {
107 cache[arg_list] = lambda(args...);
108 }
109 return cache[arg_list];
110 }
111
118 void clear() {
119 cache.clear();
120 }
121};
122
123} // namespace core
124} // namespace z
A wrapper for std::vector.
Definition array.hpp:72
void clear()
Clear the data in the array.
Definition array.hpp:884
memoize(R lambda(Args...))
Constructor with a function pointer.
Definition memoize.hpp:89
R operator()(Args... args)
Function call operator.
Definition memoize.hpp:103
void clear()
Clears the cache.
Definition memoize.hpp:118
memoize(std::function< R(Args...)> &&lambda)
Constructor with any function-like object.
Definition memoize.hpp:80