diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | include/yacppdic/container.hpp | 20 | ||||
| -rw-r--r-- | include/yacppdic/detail/container-impl.hpp | 77 | ||||
| -rw-r--r-- | include/yacppdic/object_identifier.hpp | 56 | ||||
| -rw-r--r-- | include/yacppdic/object_type.hpp | 47 | ||||
| -rw-r--r-- | src/container.cpp | 6 | ||||
| -rw-r--r-- | src/object_identifier.cpp | 48 | ||||
| -rw-r--r-- | src/object_type.cpp | 52 | 
8 files changed, 165 insertions, 143 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index af8fc8a..066e0cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ target_sources(  	${PROJECT_NAME}  	PRIVATE  	src/container.cpp -	src/object_type.cpp +	src/object_identifier.cpp  )  target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) diff --git a/include/yacppdic/container.hpp b/include/yacppdic/container.hpp index 0f3a9fc..6073150 100644 --- a/include/yacppdic/container.hpp +++ b/include/yacppdic/container.hpp @@ -4,7 +4,7 @@  #include "yacppdic/concepts.hpp"  #include "yacppdic/factory.hpp" -#include "yacppdic/object_type.hpp" +#include "yacppdic/object_identifier.hpp"  #include <concepts>  #include <functional> @@ -21,13 +21,16 @@ template <typename Interface>  class BindingWhen  {  public: -	explicit BindingWhen(Container *container, ObjectType object_type) noexcept; +	explicit BindingWhen( +		Container *container, +		ObjectIdentifier object_identifier +	) noexcept;  	void when_tagged(std::string_view tag) noexcept;  private:  	Container *_container; -	ObjectType _object_type; +	ObjectIdentifier _object_identifier;  };  template <typename Interface> @@ -75,15 +78,16 @@ public:  	requires IsFactory<AFactory>  	auto get_tagged(const char *tag) const noexcept -> AFactory; -	void add(const ObjectType &type, const WrapperPtr<IGenericWrapper> &wrapper) noexcept; +	void +	add(const ObjectIdentifier &type, +		const WrapperPtr<IGenericWrapper> &wrapper) noexcept; -	void remove(const ObjectType &type) noexcept; +	void remove(const ObjectIdentifier &type) noexcept; -	auto at(const ObjectType &type) const noexcept -> WrapperPtr<IGenericWrapper>; +	auto at(const ObjectIdentifier &type) const noexcept -> WrapperPtr<IGenericWrapper>;  private: -	std::unordered_map<ObjectType, WrapperPtr<IGenericWrapper>, ObjectTypeHasher> -		_bindings; +	std::unordered_map<ObjectIdentifier, WrapperPtr<IGenericWrapper>> _bindings;  };  } // namespace yacppdic diff --git a/include/yacppdic/detail/container-impl.hpp b/include/yacppdic/detail/container-impl.hpp index 720a88b..a8f6f7b 100644 --- a/include/yacppdic/detail/container-impl.hpp +++ b/include/yacppdic/detail/container-impl.hpp @@ -11,21 +11,24 @@ namespace yacppdic  {  template <typename Interface> -BindingWhen<Interface>::BindingWhen(Container *container, ObjectType object_type) noexcept -	: _container(container), _object_type(std::move(object_type)) +BindingWhen<Interface>::BindingWhen( +	Container *container, +	ObjectIdentifier object_identifier +) noexcept +	: _container(container), _object_identifier(std::move(object_identifier))  {  }  template <typename Interface>  void BindingWhen<Interface>::when_tagged(std::string_view tag) noexcept  { -	auto wrapped = _container->at(_object_type); +	auto wrapped = _container->at(_object_identifier); -	_container->remove(_object_type); +	_container->remove(_object_identifier); -	auto type = ObjectType::create<Interface>(tag); +	auto tagged_object_identifier = ObjectIdentifier::create<Interface>(tag); -	_container->add(type, wrapped); +	_container->add(tagged_object_identifier, wrapped);  }  template <typename Interface> @@ -43,11 +46,14 @@ auto BindingBuilder<Interface>::to() noexcept -> BindingWhen<Interface>  	auto wrapper = Container::WrapperPtr<Wrapper>(new Wrapper(*_container)); -	auto type = ObjectType::create<Interface>(); +	auto object_identifier = ObjectIdentifier::create<Interface>(); -	_container->add(type, std::dynamic_pointer_cast<IGenericWrapper>(wrapper)); +	_container->add( +		object_identifier, +		std::dynamic_pointer_cast<IGenericWrapper>(wrapper) +	); -	return BindingWhen<Interface>(_container, type); +	return BindingWhen<Interface>(_container, object_identifier);  }  template <typename Interface> @@ -60,11 +66,14 @@ auto BindingBuilder<Interface>::to_factory(FactoryFunc factory) noexcept  	auto wrapper = Container::WrapperPtr<Wrapper>(new Wrapper(factory)); -	auto type = ObjectType::create<Interface>(); +	auto object_identifier = ObjectIdentifier::create<Interface>(); -	_container->add(type, std::dynamic_pointer_cast<IGenericWrapper>(wrapper)); +	_container->add( +		object_identifier, +		std::dynamic_pointer_cast<IGenericWrapper>(wrapper) +	); -	return BindingWhen<Interface>(_container, type); +	return BindingWhen<Interface>(_container, object_identifier);  }  template <typename Interface> @@ -77,19 +86,19 @@ template <typename Interface>  requires Abstract<Interface>  auto Container::get() const noexcept -> std::unique_ptr<Interface>  { -	auto type = ObjectType::create<Interface>(); +	auto object_identifier = ObjectIdentifier::create<Interface>(); -	if (_bindings.count(type) == 0) +	if (_bindings.count(object_identifier) == 0)  	{  		std::cerr  			<< "Error: Tried to get a item from the container using unbound interface '" -			<< type.name() << "'" << std::endl; +			<< object_identifier.name() << "'" << std::endl;  		exit(EXIT_FAILURE);  	} -	auto wrapper = -		std::dynamic_pointer_cast<IWrapper<std::unique_ptr<Interface>>>(_bindings.at(type) -		); +	auto wrapper = std::dynamic_pointer_cast<IWrapper<std::unique_ptr<Interface>>>( +		_bindings.at(object_identifier) +	);  	return wrapper->get();  } @@ -98,17 +107,18 @@ template <typename AFactory>  requires IsFactory<AFactory>  auto Container::get() const noexcept -> AFactory  { -	auto type = ObjectType::create<AFactory>(); +	auto object_identifier = ObjectIdentifier::create<AFactory>(); -	if (!_bindings.contains(type)) +	if (!_bindings.contains(object_identifier))  	{  		std::cerr  			<< "Error: Tried to get a item from the container using unbound interface '" -			<< type.name() << "'" << std::endl; +			<< object_identifier.name() << "'" << std::endl;  		exit(EXIT_FAILURE);  	} -	auto wrapper = std::dynamic_pointer_cast<IWrapper<AFactory>>(_bindings.at(type)); +	auto wrapper = +		std::dynamic_pointer_cast<IWrapper<AFactory>>(_bindings.at(object_identifier));  	return wrapper->get();  } @@ -117,19 +127,20 @@ template <class Interface>  requires Abstract<Interface>  auto Container::get_tagged(const char *tag) const noexcept -> std::unique_ptr<Interface>  { -	auto type = ObjectType::create<Interface>(tag); +	auto object_identifier = ObjectIdentifier::create<Interface>(tag); -	if (!_bindings.contains(type)) +	if (!_bindings.contains(object_identifier))  	{  		std::cerr  			<< "Error: Tried to get a item from the container using unbound interface '" -			<< type.name() << "' with tag '" << type.tag() << "'" << std::endl; +			<< object_identifier.name() << "' with tag '" << object_identifier.tag() +			<< "'" << std::endl;  		exit(EXIT_FAILURE);  	} -	auto wrapper = -		std::dynamic_pointer_cast<IWrapper<std::unique_ptr<Interface>>>(_bindings.at(type) -		); +	auto wrapper = std::dynamic_pointer_cast<IWrapper<std::unique_ptr<Interface>>>( +		_bindings.at(object_identifier) +	);  	return wrapper->get();  } @@ -138,17 +149,19 @@ template <typename AFactory>  requires IsFactory<AFactory>  auto Container::get_tagged(const char *tag) const noexcept -> AFactory  { -	auto type = ObjectType::create<AFactory>(tag); +	auto object_identifier = ObjectIdentifier::create<AFactory>(tag); -	if (!_bindings.contains(type)) +	if (!_bindings.contains(object_identifier))  	{  		std::cerr  			<< "Error: Tried to get a item from the container using unbound interface '" -			<< type.name() << "' With tag '" << type.tag() << "'" << std::endl; +			<< object_identifier.name() << "' With tag '" << object_identifier.tag() +			<< "'" << std::endl;  		exit(EXIT_FAILURE);  	} -	auto wrapper = std::dynamic_pointer_cast<IWrapper<AFactory>>(_bindings.at(type)); +	auto wrapper = +		std::dynamic_pointer_cast<IWrapper<AFactory>>(_bindings.at(object_identifier));  	return wrapper->get();  } diff --git a/include/yacppdic/object_identifier.hpp b/include/yacppdic/object_identifier.hpp new file mode 100644 index 0000000..812e5c9 --- /dev/null +++ b/include/yacppdic/object_identifier.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include <string_view> +#include <typeinfo> + +namespace yacppdic +{ + +class ObjectIdentifier +{ +public: +	explicit ObjectIdentifier(const std::type_info &type_info) noexcept; + +	explicit ObjectIdentifier( +		const std::type_info &type_info, +		std::string_view tag +	) noexcept; + +	auto operator==(const ObjectIdentifier &object_type) const noexcept -> bool; + +	[[nodiscard]] auto hash() const noexcept -> std::size_t; + +	[[nodiscard]] auto name() const noexcept -> std::string_view; + +	[[nodiscard]] auto tag() const noexcept -> std::string_view; + +	template <typename Type> +	static auto create() noexcept -> ObjectIdentifier +	{ +		return static_cast<ObjectIdentifier>(typeid(Type)); +	} + +	template <typename Type> +	static auto create(std::string_view tag) noexcept -> ObjectIdentifier +	{ +		return ObjectIdentifier(typeid(Type), tag); +	} + +private: +	const std::type_info &_type_info; +	const std::string_view _tag; +}; + +} // namespace yacppdic + +template <> +class std::hash<yacppdic::ObjectIdentifier> +{ +public: +	auto operator()(const yacppdic::ObjectIdentifier &object_identifier) const noexcept +		-> std::size_t +	{ +		return object_identifier.hash(); +	} +}; + diff --git a/include/yacppdic/object_type.hpp b/include/yacppdic/object_type.hpp deleted file mode 100644 index 3a7a639..0000000 --- a/include/yacppdic/object_type.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include <string_view> -#include <typeinfo> - -namespace yacppdic -{ - -class ObjectType -{ -public: -	explicit ObjectType(const std::type_info &type_info) noexcept; - -	explicit ObjectType(const std::type_info &type_info, std::string_view tag) noexcept; - -	auto operator==(const ObjectType &object_type) const noexcept -> bool; - -	[[nodiscard]] auto hash() const noexcept -> std::size_t; - -	[[nodiscard]] auto name() const noexcept -> std::string_view; - -	[[nodiscard]] auto tag() const noexcept -> std::string_view; - -	template <typename Type> -	static auto create() noexcept -> ObjectType -	{ -		return static_cast<ObjectType>(typeid(Type)); -	} - -	template <typename Type> -	static auto create(std::string_view tag) noexcept -> ObjectType -	{ -		return ObjectType(typeid(Type), tag); -	} - -private: -	const std::type_info &_type_info; -	const std::string_view _tag; -}; - -class ObjectTypeHasher -{ -public: -	auto operator()(const ObjectType &object_type) const noexcept -> std::size_t; -}; - -} // namespace yacppdic diff --git a/src/container.cpp b/src/container.cpp index 044d487..f8c4931 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -7,19 +7,19 @@ namespace yacppdic  {  void Container::add( -	const ObjectType &type, +	const ObjectIdentifier &type,  	const WrapperPtr<IGenericWrapper> &wrapper  ) noexcept  {  	_bindings.insert({ type, wrapper });  } -void Container::remove(const ObjectType &type) noexcept +void Container::remove(const ObjectIdentifier &type) noexcept  {  	_bindings.erase(type);  } -auto Container::at(const ObjectType &type) const noexcept +auto Container::at(const ObjectIdentifier &type) const noexcept  	-> Container::WrapperPtr<IGenericWrapper>  {  	return _bindings.at(type); diff --git a/src/object_identifier.cpp b/src/object_identifier.cpp new file mode 100644 index 0000000..a743271 --- /dev/null +++ b/src/object_identifier.cpp @@ -0,0 +1,48 @@ +#include "yacppdic/object_identifier.hpp" + +#include "yacppdic/detail/internal/hash.hpp" + +#include <functional> + +namespace yacppdic +{ + +ObjectIdentifier::ObjectIdentifier(const std::type_info &type_info) noexcept +	: _type_info(type_info) +{ +} + +ObjectIdentifier::ObjectIdentifier( +	const std::type_info &type_info, +	const std::string_view tag +) noexcept +	: _type_info(type_info), _tag(tag) +{ +} + +auto ObjectIdentifier::operator==(const ObjectIdentifier &object_type) const noexcept +	-> bool +{ +	return hash() == object_type.hash(); +} + +auto ObjectIdentifier::hash() const noexcept -> std::size_t +{ +	const auto type_hash = _type_info.hash_code(); + +	return _tag.empty() ? type_hash +						: combine_hashes(type_hash, std::hash<std::string_view>()(_tag)); +} + +auto ObjectIdentifier::name() const noexcept -> std::string_view +{ +	return { _type_info.name() }; +} + +auto ObjectIdentifier::tag() const noexcept -> std::string_view +{ +	return _tag; +} + +} // namespace yacppdic + diff --git a/src/object_type.cpp b/src/object_type.cpp deleted file mode 100644 index 15b798c..0000000 --- a/src/object_type.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "yacppdic/object_type.hpp" - -#include "yacppdic/detail/internal/hash.hpp" - -#include <functional> - -namespace yacppdic -{ - -ObjectType::ObjectType(const std::type_info &type_info) noexcept : _type_info(type_info) -{ -} - -ObjectType::ObjectType( -	const std::type_info &type_info, -	const std::string_view tag -) noexcept -	: _type_info(type_info), _tag(tag) -{ -} - -auto ObjectType::operator==(const ObjectType &object_type) const noexcept -> bool -{ -	return hash() == object_type.hash(); -} - -auto ObjectType::hash() const noexcept -> std::size_t -{ -	const auto type_hash = _type_info.hash_code(); - -	return _tag == "" ? type_hash -					  : combine_hashes(type_hash, std::hash<std::string_view>()(_tag)); -} - -auto ObjectType::name() const noexcept -> std::string_view -{ -	return { _type_info.name() }; -} - -auto ObjectType::tag() const noexcept -> std::string_view -{ -	return _tag; -} - -auto ObjectTypeHasher::operator()(const ObjectType &object_type) const noexcept -	-> std::size_t -{ -	return object_type.hash(); -} - -} // namespace yacppdic - | 
