#ifndef SHADOW_SCHEMA_HPP #define SHADOW_SCHEMA_HPP #include "matador/object/basic_object_info.hpp" #include "matador/utils/result.hpp" #include "matador/utils/error.hpp" #include #include namespace matador::object { class repository; class repository_node; class object; } namespace matador::object::internal { class shadow_repository { private: using node_ptr = std::shared_ptr; public: explicit shadow_repository(repository& s); [[nodiscard]] repository& repo() const; [[nodiscard]] bool contains(const std::type_index& ti) const; [[nodiscard]] utils::result basic_info(const std::type_index& ti) const; [[nodiscard]] utils::result find_node(const std::type_index &type_index) const; [[nodiscard]] utils::result find_node(const std::string &name) const; [[nodiscard]] utils::result attach_node(const std::shared_ptr &node) const; [[nodiscard]] utils::result detach_node(const std::shared_ptr &node) const; [[nodiscard]] bool expecting_relation_node(const std::string &name) const; void expect_relation_node(const std::string &name, const std::type_index &ti) const; void remove_expected_relation_node(const std::string &name) const; [[nodiscard]] std::shared_ptr provide_object_in_advance(const std::type_index &ti, const std::shared_ptr& obj) const; [[nodiscard]] bool has_object_for_type(const std::type_index &ti) const; [[nodiscard]] std::shared_ptr object_for_type(const std::type_index &ti) const; void remove_object_for_type(const std::type_index &ti) const; [[nodiscard]] bool is_node_announced(const std::type_index &ti) const; void push_announce_node(const std::type_index &ti, const node_ptr &node) const; [[nodiscard]] node_ptr announce_node(const std::type_index &ti) const; [[nodiscard]] node_ptr pop_announce_node(const std::type_index &ti) const; private: repository& repo_; }; } #endif //SHADOW_SCHEMA_HPP