#ifndef OBJECT_PROXY_HPP #define OBJECT_PROXY_HPP #include #include namespace matador::object { class basic_object_proxy { public: virtual ~basic_object_proxy() = default; [[nodiscard]] virtual void *get() const = 0; }; template class object_proxy final : public basic_object_proxy { public: object_proxy() = default; explicit object_proxy(Type* obj) : obj_(obj) {} explicit object_proxy(std::unique_ptr obj) : obj_(std::move(obj)) {} [[nodiscard]] void *get() const override { return static_cast(pointer()); } Type* operator->() const { return pointer(); } Type& operator*() { return *pointer(); } const Type& operator*() const { return *pointer(); } Type* pointer() const { return resolve(); } Type& ref() { return *pointer(); } const Type& ref() const { return *pointer(); } void reset(Type* obj) { obj_.reset(obj); } private: Type* resolve() const { return resolver_(*this); } private: std::function resolver_{[](const object_proxy &proxy){ return proxy.obj_.get();}}; std::unique_ptr obj_{}; }; } #endif //OBJECT_PROXY_HPP