From b36d072ad7a7b9c6e30fcb25d6bbb001a8393468 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 10 Apr 2022 17:20:49 +0200 Subject: refactor: add factory class & make DI container return unique ptrs --- src/DI/value_functor.hpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/DI/value_functor.hpp (limited to 'src/DI/value_functor.hpp') diff --git a/src/DI/value_functor.hpp b/src/DI/value_functor.hpp new file mode 100644 index 0000000..1553af9 --- /dev/null +++ b/src/DI/value_functor.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "DI/interfaces/copyable_functor.hpp" + +#include "DI/copyable_functor.hpp" +#include "DI/extra_concepts.hpp" + +#include +#include + +/** + * Creates a value-type from a copyable functor. + */ +template +class ValueFunctor; + +template +class ValueFunctor +{ + using TargetFunctor = ICopyableFunctor; + +public: + ValueFunctor() noexcept; + + template + requires NotSameAs, ValueFunctor> + // NOLINTNEXTLINE(bugprone-forwarding-reference-overload) + explicit ValueFunctor(Function &&function) + : ValueFunctor(std::forward(function), std::allocator()) + { + } + + template + ValueFunctor(Function &&function, const Allocator &allocator); + + ValueFunctor(const ValueFunctor &val_functor); + + ValueFunctor(ValueFunctor &&val_functor) noexcept; + + ~ValueFunctor(); + + auto operator=(const ValueFunctor &val_functor) noexcept = delete; + + auto operator=(ValueFunctor &&val_functor) noexcept -> ValueFunctor &; + + auto operator=(std::nullptr_t) -> ValueFunctor &; + + auto operator()(Args &&...args) const -> Return; + + explicit operator bool() const noexcept; + + [[nodiscard]] auto target_type() const noexcept -> const std::type_info &; + + template + auto target() const noexcept -> const Target *; + +private: + typename std::aligned_storage<3 * sizeof(void *)>::type _buf{}; + + TargetFunctor *_functor; + + static auto _as_copyable_functor(void *function_ptr) -> TargetFunctor *; +}; + +#include "value_functor.tpp" -- cgit v1.2.3-18-g5258