36 template <
typename T>
static inline auto get_unowning(
const T & ptr) -> decltype(ptr.get()) {
39 template <
typename T>
static inline T * get_unowning(T * ptr) {
return ptr; }
100 template <
typename Traits>
103 using UnowningImplPointer =
typename Traits::UnowningImplPointer;
104 using OwningImplPointer =
typename Traits::OwningImplPointer;
105 using OwningProxyPointer =
typename Traits::OwningProxyPointer;
106 using WeakProxyPointer =
typename Traits::WeakProxyPointer;
107 using UnowningImplPointerHash =
typename Traits::UnowningImplPointerHash;
108 using UnowningImplPointerEqual =
typename Traits::UnowningImplPointerEqual;
130 template <
typename T,
typename TagType = T>
133 template <
typename... Args>
Handle(Args &&... args)
134 : m_cache(get_base()), m_obj(std::forward<Args>(args)...) {}
135 Handle(
const Handle &) =
delete;
136 Handle & operator=(
const Handle &) =
delete;
137 ~Handle() {
if (m_obj) cleanup(m_cache,
typeid(TagType), get_unowning(m_obj)); }
139 void assign(
const T & obj) { m_obj = obj; }
141 const T &
get()
const & noexcept {
return m_obj; }
144 const std::shared_ptr<Pimpl> m_cache;
167 using AllocatorFunction =
168 std::pair<OwningProxyPointer, UnowningImplPointer>(
const OwningImplPointer &);
174 static OwningProxyPointer
get(
const std::type_index &,
175 const OwningImplPointer & impl,
176 AllocatorFunction * alloc);
179 static void cleanup(
const std::shared_ptr<Pimpl> &,
180 const std::type_index &,
181 UnowningImplPointer);
182 static const std::shared_ptr<Pimpl> & get_base();
Definition: proxy_cache_impl.hpp:69
Definition: djinni_support.cpp:27
Definition: proxy_cache_interface.hpp:101
Definition: proxy_cache_interface.hpp:131