19 #include "proxy_cache_interface.hpp" 22 #include <unordered_map> 40 template <
typename T>
static inline auto upgrade_weak(
const T & ptr) -> decltype(ptr.lock()) {
43 template <
typename T>
static inline T * upgrade_weak(T* ptr) {
return ptr; }
44 template <
typename T>
static inline bool is_expired(
const T & ptr) {
return ptr.expired(); }
45 template <
typename T>
static inline bool is_expired(T* ptr) {
return !ptr; }
68 template <
typename Traits>
70 using Key = std::pair<std::type_index, UnowningImplPointer>;
79 OwningProxyPointer
get(
const std::type_index & tag,
80 const OwningImplPointer & impl,
81 AllocatorFunction * alloc) {
82 std::unique_lock<std::mutex> lock(m_mutex);
83 UnowningImplPointer ptr = get_unowning(impl);
84 auto existing_proxy_iter = m_mapping.find({tag, ptr});
85 if (existing_proxy_iter != m_mapping.end()) {
86 OwningProxyPointer existing_proxy = upgrade_weak(existing_proxy_iter->second);
88 return existing_proxy;
91 m_mapping.erase(existing_proxy_iter);
95 auto alloc_result = alloc(impl);
96 m_mapping.emplace(Key{tag, alloc_result.second}, alloc_result.first);
97 return alloc_result.first;
103 void remove(
const std::type_index & tag,
const UnowningImplPointer & impl_unowning) {
104 std::unique_lock<std::mutex> lock(m_mutex);
105 auto it = m_mapping.find({tag, impl_unowning});
106 if (it != m_mapping.end()) {
116 if (is_expired(it->second)) {
124 std::size_t operator()(
const Key & k)
const {
125 return k.first.hash_code() ^ UnowningImplPointerHash{}(k.second);
130 bool operator()(
const Key & lhs,
const Key & rhs)
const {
131 return lhs.first == rhs.first
132 && UnowningImplPointerEqual{}(lhs.second, rhs.second);
136 std::unordered_map<Key, WeakProxyPointer, KeyHash, KeyEqual> m_mapping;
144 template <
typename Traits>
146 const std::type_index & tag,
147 UnowningImplPointer ptr) {
148 base->remove(tag, ptr);
160 template <
typename Traits>
162 static const std::shared_ptr<Pimpl> instance(
new Pimpl);
168 template <
typename Traits>
170 const OwningImplPointer & impl,
171 AllocatorFunction * alloc)
172 -> OwningProxyPointer {
173 return get_base()->get(tag, impl, alloc);
Definition: proxy_cache_impl.hpp:69
Definition: djinni_support.cpp:27
Definition: proxy_cache_interface.hpp:101