diff --git a/include/matador/object/object_proxy.hpp b/include/matador/object/object_proxy.hpp index 4b8691e..81f4788 100644 --- a/include/matador/object/object_proxy.hpp +++ b/include/matador/object/object_proxy.hpp @@ -2,7 +2,6 @@ #define OBJECT_PROXY_HPP #include -#include namespace matador::object { @@ -13,14 +12,43 @@ public: [[nodiscard]] virtual void *get() const = 0; }; +template < typename Type > +class object_proxy; + +template < typename Type > +class object_resolver { +public: + virtual ~object_resolver() = default; + + virtual Type* resolve(const object_proxy &proxy) const = 0; +}; + +template < typename Type > +class simple_object_resolver final : public object_resolver { +public: + simple_object_resolver() = default; + explicit simple_object_resolver(Type* obj) + : obj_(obj) {} + explicit simple_object_resolver(std::unique_ptr obj) + : obj_(std::move(obj)) {} + + Type* resolve(const object_proxy &/*proxy*/) const override { + return obj_.get(); + } + +private: + std::unique_ptr obj_{}; +}; + + template class object_proxy final : public basic_object_proxy { public: object_proxy() = default; explicit object_proxy(Type* obj) - : obj_(obj) {} + : resolver_(std::make_unique>(obj)) {} explicit object_proxy(std::unique_ptr obj) - : obj_(std::move(obj)) {} + : resolver_(std::move(obj)) {} [[nodiscard]] void *get() const override { return static_cast(pointer()); } @@ -33,16 +61,23 @@ public: Type& ref() { return *pointer(); } const Type& ref() const { return *pointer(); } - void reset(Type* obj) { obj_.reset(obj); } - -private: - Type* resolve() const { - return resolver_(*this); + void reset(Type* obj) { + resolver_ = std::make_unique>(obj); + } + void reset(std::unique_ptr obj) { + resolver_ = std::make_unique>(std::move(obj)); + } + void reset(std::unique_ptr> &&resolver) { + resolver_ = std::move(resolver); } private: - std::function resolver_{[](const object_proxy &proxy){ return proxy.obj_.get();}}; - std::unique_ptr obj_{}; + Type* resolve() const { + return resolver_->resolve(*this); + } + +private: + std::unique_ptr> resolver_{std::make_unique>()}; }; } diff --git a/include/matador/sql/internal/query_result_impl.hpp b/include/matador/sql/internal/query_result_impl.hpp index 3230a96..a834ff7 100644 --- a/include/matador/sql/internal/query_result_impl.hpp +++ b/include/matador/sql/internal/query_result_impl.hpp @@ -39,30 +39,28 @@ public: template void on_primary_key(const char *id, ValueType &value, const utils::primary_key_attribute& attr = utils::default_pk_attributes); - void on_revision(const char * /*id*/, unsigned long long &/*rev*/) { ++column_index_; } + void on_revision(const char * /*id*/, unsigned long long &/*rev*/) { + ++column_index_; + } template - void on_attribute(const char * /*id*/, Type &/*x*/, - const utils::field_attributes &/*attr*/ = utils::null_attributes) { ++column_index_; } + void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) { + ++column_index_; + } template void on_belongs_to(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) { ++column_index_; } - template void on_has_one(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/) { ++column_index_; } template - static void on_has_many(const char * /*id*/, ContainerType &, const char * /*join_column*/, - const utils::foreign_attributes &/*attr*/) {} - + static void on_has_many(const char * /*id*/, ContainerType &, const char * /*join_column*/, const utils::foreign_attributes &/*attr*/) {} template - static void on_has_many_to_many(const char *id, ContainerType &c, const char * /*join_column*/, - const char * /*inverse_join_column*/, const utils::foreign_attributes &/*attr*/) {} - + static void on_has_many_to_many(const char *id, ContainerType &c, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes &/*attr*/) {} template static void on_has_many_to_many(const char *id, ContainerType &c, const utils::foreign_attributes &/*attr*/) {} @@ -142,9 +140,6 @@ public: } } - // template - // void on_has_many(const char *, ContainerType &, const utils::foreign_attributes &/*attr*/) {} - template void bind(const Type &obj) { reader_->bind(obj);