aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/yacppdic/container.hpp53
-rw-r--r--include/yacppdic/detail/container-impl.hpp53
-rw-r--r--include/yacppdic/detail/internal/object_identifier.hpp (renamed from include/yacppdic/object_identifier.hpp)10
3 files changed, 60 insertions, 56 deletions
diff --git a/include/yacppdic/container.hpp b/include/yacppdic/container.hpp
index 6073150..0003520 100644
--- a/include/yacppdic/container.hpp
+++ b/include/yacppdic/container.hpp
@@ -3,8 +3,8 @@
#include "yacppdic/interfaces/wrapper.hpp"
#include "yacppdic/concepts.hpp"
+#include "yacppdic/detail/internal/object_identifier.hpp"
#include "yacppdic/factory.hpp"
-#include "yacppdic/object_identifier.hpp"
#include <concepts>
#include <functional>
@@ -15,30 +15,43 @@
namespace yacppdic
{
+namespace internal
+{
+
+template <typename Type>
+using WrapperPtr = std::shared_ptr<Type>;
+
+using Bindings = std::unordered_map<ObjectIdentifier, WrapperPtr<IGenericWrapper>>;
+
+} // namespace internal
+
class Container;
template <typename Interface>
+class BindingBuilder;
+
+template <typename Interface>
class BindingWhen
{
public:
- explicit BindingWhen(
- Container *container,
- ObjectIdentifier object_identifier
- ) noexcept;
-
void when_tagged(std::string_view tag) noexcept;
private:
- Container *_container;
- ObjectIdentifier _object_identifier;
+ internal::Bindings &_bindings;
+ internal::ObjectIdentifier _object_identifier;
+
+ explicit BindingWhen(
+ internal::Bindings &bindings,
+ internal::ObjectIdentifier object_identifier
+ ) noexcept;
+
+ friend BindingBuilder<Interface>;
};
template <typename Interface>
class BindingBuilder
{
public:
- explicit BindingBuilder(Container *container) noexcept;
-
template <typename Impl>
requires Abstract<Interface> && std::derived_from<Impl, Interface>
auto to() noexcept -> BindingWhen<Interface>;
@@ -48,7 +61,12 @@ public:
auto to_factory(FactoryFunc factory) noexcept -> BindingWhen<Interface>;
private:
- Container *_container;
+ Container &_container;
+ internal::Bindings &_bindings;
+
+ explicit BindingBuilder(Container &container, internal::Bindings &bindings) noexcept;
+
+ friend Container;
};
class Container
@@ -56,9 +74,6 @@ class Container
public:
Container() noexcept = default;
- template <typename Type>
- using WrapperPtr = std::shared_ptr<Type>;
-
template <class Interface>
auto bind() noexcept -> BindingBuilder<Interface>;
@@ -78,16 +93,8 @@ public:
requires IsFactory<AFactory>
auto get_tagged(const char *tag) const noexcept -> AFactory;
- void
- add(const ObjectIdentifier &type,
- const WrapperPtr<IGenericWrapper> &wrapper) noexcept;
-
- void remove(const ObjectIdentifier &type) noexcept;
-
- auto at(const ObjectIdentifier &type) const noexcept -> WrapperPtr<IGenericWrapper>;
-
private:
- std::unordered_map<ObjectIdentifier, WrapperPtr<IGenericWrapper>> _bindings;
+ internal::Bindings _bindings;
};
} // namespace yacppdic
diff --git a/include/yacppdic/detail/container-impl.hpp b/include/yacppdic/detail/container-impl.hpp
index a8f6f7b..7480dee 100644
--- a/include/yacppdic/detail/container-impl.hpp
+++ b/include/yacppdic/detail/container-impl.hpp
@@ -12,28 +12,31 @@ namespace yacppdic
template <typename Interface>
BindingWhen<Interface>::BindingWhen(
- Container *container,
- ObjectIdentifier object_identifier
+ internal::Bindings &bindings,
+ internal::ObjectIdentifier object_identifier
) noexcept
- : _container(container), _object_identifier(std::move(object_identifier))
+ : _bindings(bindings), _object_identifier(std::move(object_identifier))
{
}
template <typename Interface>
void BindingWhen<Interface>::when_tagged(std::string_view tag) noexcept
{
- auto wrapped = _container->at(_object_identifier);
+ auto wrapped = _bindings.at(_object_identifier);
- _container->remove(_object_identifier);
+ _bindings.erase(_object_identifier);
- auto tagged_object_identifier = ObjectIdentifier::create<Interface>(tag);
+ auto tagged_object_identifier = internal::ObjectIdentifier::create<Interface>(tag);
- _container->add(tagged_object_identifier, wrapped);
+ _bindings[tagged_object_identifier] = wrapped;
}
template <typename Interface>
-BindingBuilder<Interface>::BindingBuilder(Container *container) noexcept
- : _container(container)
+BindingBuilder<Interface>::BindingBuilder(
+ Container &container,
+ internal::Bindings &bindings
+) noexcept
+ : _container(container), _bindings(bindings)
{
}
@@ -44,16 +47,13 @@ auto BindingBuilder<Interface>::to() noexcept -> BindingWhen<Interface>
{
using Wrapper = internal::ObjectWrapper<Interface, Impl>;
- auto wrapper = Container::WrapperPtr<Wrapper>(new Wrapper(*_container));
+ auto wrapper = internal::WrapperPtr<Wrapper>(new Wrapper(_container));
- auto object_identifier = ObjectIdentifier::create<Interface>();
+ auto object_identifier = internal::ObjectIdentifier::create<Interface>();
- _container->add(
- object_identifier,
- std::dynamic_pointer_cast<IGenericWrapper>(wrapper)
- );
+ _bindings[object_identifier] = std::dynamic_pointer_cast<IGenericWrapper>(wrapper);
- return BindingWhen<Interface>(_container, object_identifier);
+ return BindingWhen<Interface>(_bindings, object_identifier);
}
template <typename Interface>
@@ -64,29 +64,26 @@ auto BindingBuilder<Interface>::to_factory(FactoryFunc factory) noexcept
{
using Wrapper = internal::FunctionWrapper<Interface>;
- auto wrapper = Container::WrapperPtr<Wrapper>(new Wrapper(factory));
+ auto wrapper = internal::WrapperPtr<Wrapper>(new Wrapper(factory));
- auto object_identifier = ObjectIdentifier::create<Interface>();
+ auto object_identifier = internal::ObjectIdentifier::create<Interface>();
- _container->add(
- object_identifier,
- std::dynamic_pointer_cast<IGenericWrapper>(wrapper)
- );
+ _bindings[object_identifier] = std::dynamic_pointer_cast<IGenericWrapper>(wrapper);
- return BindingWhen<Interface>(_container, object_identifier);
+ return BindingWhen<Interface>(_bindings, object_identifier);
}
template <typename Interface>
auto Container::bind() noexcept -> BindingBuilder<Interface>
{
- return BindingBuilder<Interface>(this);
+ return BindingBuilder<Interface>(*this, _bindings);
}
template <typename Interface>
requires Abstract<Interface>
auto Container::get() const noexcept -> std::unique_ptr<Interface>
{
- auto object_identifier = ObjectIdentifier::create<Interface>();
+ auto object_identifier = internal::ObjectIdentifier::create<Interface>();
if (_bindings.count(object_identifier) == 0)
{
@@ -107,7 +104,7 @@ template <typename AFactory>
requires IsFactory<AFactory>
auto Container::get() const noexcept -> AFactory
{
- auto object_identifier = ObjectIdentifier::create<AFactory>();
+ auto object_identifier = internal::ObjectIdentifier::create<AFactory>();
if (!_bindings.contains(object_identifier))
{
@@ -127,7 +124,7 @@ template <class Interface>
requires Abstract<Interface>
auto Container::get_tagged(const char *tag) const noexcept -> std::unique_ptr<Interface>
{
- auto object_identifier = ObjectIdentifier::create<Interface>(tag);
+ auto object_identifier = internal::ObjectIdentifier::create<Interface>(tag);
if (!_bindings.contains(object_identifier))
{
@@ -149,7 +146,7 @@ template <typename AFactory>
requires IsFactory<AFactory>
auto Container::get_tagged(const char *tag) const noexcept -> AFactory
{
- auto object_identifier = ObjectIdentifier::create<AFactory>(tag);
+ auto object_identifier = internal::ObjectIdentifier::create<AFactory>(tag);
if (!_bindings.contains(object_identifier))
{
diff --git a/include/yacppdic/object_identifier.hpp b/include/yacppdic/detail/internal/object_identifier.hpp
index 812e5c9..c82b3e8 100644
--- a/include/yacppdic/object_identifier.hpp
+++ b/include/yacppdic/detail/internal/object_identifier.hpp
@@ -3,7 +3,7 @@
#include <string_view>
#include <typeinfo>
-namespace yacppdic
+namespace yacppdic::internal
{
class ObjectIdentifier
@@ -41,14 +41,14 @@ private:
const std::string_view _tag;
};
-} // namespace yacppdic
+} // namespace yacppdic::internal
template <>
-class std::hash<yacppdic::ObjectIdentifier>
+class std::hash<yacppdic::internal::ObjectIdentifier>
{
public:
- auto operator()(const yacppdic::ObjectIdentifier &object_identifier) const noexcept
- -> std::size_t
+ auto operator()(const yacppdic::internal::ObjectIdentifier &object_identifier
+ ) const noexcept -> std::size_t
{
return object_identifier.hash();
}