21#include <shared_mutex>
68template <
typename Map,
typename Key,
typename CreateFn>
70 CreateFn create_fn) ->
71 typename std::remove_reference<
decltype(*map.begin()->second)>::type* {
74 std::shared_lock<std::shared_mutex> read_lock(mutex);
75 auto it = map.find(key);
76 if (it != map.end()) {
77 return it->second.get();
83 std::unique_lock<std::shared_mutex> write_lock(mutex);
134template <
typename Map,
typename Key,
typename CreateFn,
typename InitFn>
136 CreateFn create_fn, InitFn init_fn) ->
137 typename std::remove_reference<
decltype(*map.begin()->second)>::type* {
140 std::shared_lock<std::shared_mutex> read_lock(mutex);
141 auto it = map.find(key);
142 if (it != map.end()) {
143 return it->second.get();
149 std::unique_lock<std::shared_mutex> write_lock(mutex);
152 auto& ptr = map[key];
203template <
typename Map,
typename Key,
typename CreateFn,
typename UpdateFn>
205 CreateFn create_fn, UpdateFn update_fn)
206 ->
decltype(update_fn(*map.begin()->second)) {
208 auto* ptr =
get_or_create(map, mutex, key, std::move(create_fn));
212 return update_fn(*ptr);
auto get_or_create_with_init(Map &map, std::shared_mutex &mutex, const Key &key, CreateFn create_fn, InitFn init_fn) -> typename std::remove_reference< decltype(*map.begin() ->second)>::type *
auto get_or_create_and_update(Map &map, std::shared_mutex &mutex, const Key &key, CreateFn create_fn, UpdateFn update_fn) -> decltype(update_fn(*map.begin() ->second))
auto get_or_create(Map &map, std::shared_mutex &mutex, const Key &key, CreateFn create_fn) -> typename std::remove_reference< decltype(*map.begin() ->second)>::type *