diff options
| author | HampusM <hampus@hampusmat.com> | 2022-05-16 22:35:30 +0200 | 
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2022-05-16 22:35:30 +0200 | 
| commit | 7ab695fe570f842ebdff6b6cb80fa643f17a828b (patch) | |
| tree | 69f5ceb9a9086170868426c99d6227d088239ac1 | |
| parent | 3957dfb9361e864f6362e59655c885f52b39371f (diff) | |
refactor: clean up factory & related internal components
15 files changed, 254 insertions, 310 deletions
diff --git a/include/yacppdic/detail/factory-impl.hpp b/include/yacppdic/detail/factory-impl.hpp index c6da207..8ba1234 100644 --- a/include/yacppdic/detail/factory-impl.hpp +++ b/include/yacppdic/detail/factory-impl.hpp @@ -5,90 +5,75 @@  namespace yacppdic  { -template <typename Return, typename... Args> -Factory<Return(Args...)>::Factory(const Factory &factory) noexcept +template <typename Product, typename... Params> +Factory<Product(Params...)>::Factory(std::nullptr_t) noexcept +{ +} + +template <typename Product, typename... Params> +Factory<Product(Params...)>::Factory(const Factory &factory) noexcept  	: _functor(factory._functor)  {  } -template <typename Return, typename... Args> -Factory<Return(Args...)>::Factory(Factory &&factory) noexcept +template <typename Product, typename... Params> +Factory<Product(Params...)>::Factory(Factory &&factory) noexcept  	: _functor(std::move(factory._functor))  {  } -template <typename Return, typename... Args> -auto Factory<Return(Args...)>::operator=(Factory &&factory) noexcept -	-> Factory<Return(Args...)> & +template <typename Product, typename... Params> +auto Factory<Product(Params...)>::operator=(Factory &&factory) noexcept +	-> Factory<Product(Params...)> &  {  	_functor = std::move(factory._functor);  	return *this;  } -template <typename Return, typename... Args> -auto Factory<Return(Args...)>::operator=(std::nullptr_t) noexcept -	-> Factory<Return(Args...)> & +template <typename Product, typename... Params> +auto Factory<Product(Params...)>::operator=(std::nullptr_t) noexcept +	-> Factory<Product(Params...)> &  {  	_functor = nullptr;  	return *this;  } -template <typename Return, typename... Args> -Factory<Return(Args...)>::operator bool() const noexcept +template <typename Product, typename... Params> +Factory<Product(Params...)>::operator bool() const noexcept  {  	return static_cast<bool>(_functor);  } -template <typename Return, typename... Args> -auto Factory<Return(Args...)>::operator()(Args... args) const noexcept -> Return -{ -	return _functor(std::forward<Args>(args)...); -} - -template <typename Return, typename... Args> -auto Factory<Return(Args...)>::target_type() const noexcept -> const std::type_info & -{ -	return _functor.target_type(); -} - -template <typename Return, typename... Args> -template <typename Tp> -auto Factory<Return(Args...)>::target() noexcept -> Tp * -{ -	return static_cast<Tp *>(_functor.template target<Tp>()); -} - -template <typename Return, typename... Args> -template <typename Tp> -auto Factory<Return(Args...)>::target() const noexcept -> const Tp * +template <typename Product, typename... Params> +auto Factory<Product(Params...)>::operator()(Params... args) const noexcept -> Product  { -	return _functor.template target<Tp>(); +	return _functor(std::forward<Params>(args)...);  } -template <typename Return, typename... Args> -inline auto operator==(const Factory<Return(Args...)> &factory, std::nullptr_t) noexcept -	-> bool +template <typename Product, typename... Params> +inline auto +operator==(const Factory<Product(Params...)> &factory, std::nullptr_t) noexcept -> bool  {  	return !factory;  } -template <typename Return, typename... Args> -inline auto operator==(std::nullptr_t, const Factory<Return(Args...)> &factory) noexcept -	-> bool +template <typename Product, typename... Params> +inline auto +operator==(std::nullptr_t, const Factory<Product(Params...)> &factory) noexcept -> bool  {  	return !factory;  } -template <typename Return, typename... Args> -inline auto operator!=(const Factory<Return(Args...)> &factory, std::nullptr_t) noexcept -	-> bool +template <typename Product, typename... Params> +inline auto +operator!=(const Factory<Product(Params...)> &factory, std::nullptr_t) noexcept -> bool  {  	return static_cast<bool>(factory);  } -template <typename Return, typename... Args> -inline auto operator!=(std::nullptr_t, const Factory<Return(Args...)> &factory) noexcept -	-> bool +template <typename Product, typename... Params> +inline auto +operator!=(std::nullptr_t, const Factory<Product(Params...)> &factory) noexcept -> bool  {  	return static_cast<bool>(factory);  } @@ -96,25 +81,25 @@ inline auto operator!=(std::nullptr_t, const Factory<Return(Args...)> &factory)  } // namespace yacppdic  template <typename Function> -constexpr auto not_null(Function const & /*unused*/) -> bool +constexpr auto not_null(Function const & /*unused*/) noexcept -> bool  {  	return true;  }  template <typename Function> -constexpr auto not_null(Function *function_ptr) -> bool +constexpr auto not_null(Function *function_ptr) noexcept -> bool  {  	return function_ptr;  } -template <typename Return, typename Class> -constexpr auto not_null(Return Class::*method_ptr) -> bool +template <typename Product, typename Class> +constexpr auto not_null(Product Class::*method_ptr) noexcept -> bool  {  	return method_ptr;  }  template <typename Function> -constexpr auto not_null(yacppdic::Factory<Function> const &factory) -> bool +constexpr auto not_null(yacppdic::Factory<Function> const &factory) noexcept -> bool  {  	return !!factory;  } diff --git a/include/yacppdic/detail/internal/alloc_destructor-impl.hpp b/include/yacppdic/detail/internal/alloc_destructor-impl.hpp index abcabba..d7eb5eb 100644 --- a/include/yacppdic/detail/internal/alloc_destructor-impl.hpp +++ b/include/yacppdic/detail/internal/alloc_destructor-impl.hpp @@ -17,7 +17,7 @@ AllocDestructor<Allocator>::AllocDestructor(  template <class Allocator>  void AllocDestructor<Allocator>::operator()(Pointer ptr) noexcept  { -	_alloc_traits::deallocate(_allocator, ptr, _size); +	AllocTraits::deallocate(_allocator, ptr, _size);  }  } diff --git a/include/yacppdic/detail/internal/alloc_destructor.hpp b/include/yacppdic/detail/internal/alloc_destructor.hpp index 9160b8b..5462fa5 100644 --- a/include/yacppdic/detail/internal/alloc_destructor.hpp +++ b/include/yacppdic/detail/internal/alloc_destructor.hpp @@ -14,11 +14,12 @@ struct RebindAllocHelper  template <class Allocator>  class AllocDestructor  { -	using _alloc_traits = std::allocator_traits<Allocator>; +private: +	using AllocTraits = std::allocator_traits<Allocator>;  public: -	using Pointer = typename _alloc_traits::pointer; -	using Size = typename _alloc_traits::size_type; +	using Pointer = typename AllocTraits::pointer; +	using Size = typename AllocTraits::size_type;  	using pointer = Pointer;  	using size = Size; diff --git a/include/yacppdic/detail/internal/compressed_pair.hpp b/include/yacppdic/detail/internal/compressed_pair.hpp index 7d98bbd..0ac6fa2 100644 --- a/include/yacppdic/detail/internal/compressed_pair.hpp +++ b/include/yacppdic/detail/internal/compressed_pair.hpp @@ -46,13 +46,13 @@ public:  	{  	} -	template <typename... Args, std::size_t... Indices> +	template <typename... Params, std::size_t... Indices>  	constexpr CompressedPairElement(  		std::piecewise_construct_t /*tag_type*/, -		std::tuple<Args...> args, +		std::tuple<Params...> args,  		TupleIndices<Indices...> /*tuple_indices*/  	) noexcept -		: _value(std::forward<Args>(std::get<Indices>(args))...) +		: _value(std::forward<Params>(std::get<Indices>(args))...)  	{  	} @@ -94,13 +94,13 @@ public:  	{  	} -	template <typename... Args, std::size_t... Indices> +	template <typename... Params, std::size_t... Indices>  	constexpr CompressedPairElement(  		std::piecewise_construct_t /*unused*/, -		std::tuple<Args...> args, +		std::tuple<Params...> args,  		TupleIndices<Indices...> /*unused*/  	) noexcept -		: Value(std::forward<Args>(std::get<Indices>(args))...) +		: Value(std::forward<Params>(std::get<Indices>(args))...)  	{  	} diff --git a/include/yacppdic/detail/internal/factory_base.hpp b/include/yacppdic/detail/internal/factory_base.hpp deleted file mode 100644 index 00c4e4f..0000000 --- a/include/yacppdic/detail/internal/factory_base.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include <functional> - -template <class Return> -class MaybeDeriveFromUnaryFunction -{ -}; - -template <class Return, class Arg> -class MaybeDeriveFromUnaryFunction<Return(Arg)> : public std::unary_function<Arg, Return> -{ -}; - -template <class Return> -struct MaybeDeriveFromBinaryFunction -{ -}; - -template <class Return, class ArgOne, class ArgTwo> -struct MaybeDeriveFromBinaryFunction<Return(ArgOne, ArgTwo)> -	: public std::binary_function<ArgOne, ArgTwo, Return> -{ -}; diff --git a/include/yacppdic/detail/internal/functor/alloc_functor-impl.hpp b/include/yacppdic/detail/internal/functor/alloc_functor-impl.hpp index 55de548..31fe3c0 100644 --- a/include/yacppdic/detail/internal/functor/alloc_functor-impl.hpp +++ b/include/yacppdic/detail/internal/functor/alloc_functor-impl.hpp @@ -8,21 +8,21 @@ namespace yacppdic::internal  {  template <class Return> -template <class... Args> -auto InvokeReturnWrapper<Return>::call(Args &&...args) -> Return +template <class... Params> +auto InvokeReturnWrapper<Return>::call(Params &&...args) noexcept -> Return  { -	return std::invoke(std::forward<Args>(args)...); +	return std::invoke(std::forward<Params>(args)...);  }  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)  #define ALLOC_FUNCTOR_TEMPLATE                                                           \ -	template <class Function, class Allocator, class Return, class... Args> +	template <class Function, class Allocator, class Return, class... Params>  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define ALLOC_FUNCTOR AllocFunctor<Function, Allocator, Return(Args...)> +#define ALLOC_FUNCTOR AllocFunctor<Function, Allocator, Return(Params...)>  ALLOC_FUNCTOR_TEMPLATE -ALLOC_FUNCTOR::AllocFunctor(Target &&function) +ALLOC_FUNCTOR::AllocFunctor(Target &&function) noexcept  	: _function(  		  std::piecewise_construct,  		  std::forward_as_tuple(std::move(function)), @@ -32,7 +32,7 @@ ALLOC_FUNCTOR::AllocFunctor(Target &&function)  }  ALLOC_FUNCTOR_TEMPLATE -ALLOC_FUNCTOR::AllocFunctor(const Target &function, const Alloc &allocator) +ALLOC_FUNCTOR::AllocFunctor(const Target &function, const Alloc &allocator) noexcept  	: _function(  		  std::piecewise_construct,  		  std::forward_as_tuple(function), @@ -42,7 +42,7 @@ ALLOC_FUNCTOR::AllocFunctor(const Target &function, const Alloc &allocator)  }  ALLOC_FUNCTOR_TEMPLATE -ALLOC_FUNCTOR::AllocFunctor(const Target &function, Alloc &&allocator) +ALLOC_FUNCTOR::AllocFunctor(const Target &function, Alloc &&allocator) noexcept  	: _function(  		  std::piecewise_construct,  		  std::forward_as_tuple(function), @@ -52,7 +52,7 @@ ALLOC_FUNCTOR::AllocFunctor(const Target &function, Alloc &&allocator)  }  ALLOC_FUNCTOR_TEMPLATE -ALLOC_FUNCTOR::AllocFunctor(Target &&function, Alloc &&allocator) +ALLOC_FUNCTOR::AllocFunctor(Target &&function, Alloc &&allocator) noexcept  	: _function(  		  std::piecewise_construct,  		  std::forward_as_tuple(std::move(function)), @@ -62,27 +62,27 @@ ALLOC_FUNCTOR::AllocFunctor(Target &&function, Alloc &&allocator)  }  ALLOC_FUNCTOR_TEMPLATE -auto ALLOC_FUNCTOR::operator()(Args &&...args) -> Return +auto ALLOC_FUNCTOR::operator()(Params &&...args) noexcept -> Return  {  	using Invoker = InvokeReturnWrapper<Return>; -	return Invoker::call(_function.first(), std::forward<Args>(args)...); +	return Invoker::call(_function.first(), std::forward<Params>(args)...);  }  ALLOC_FUNCTOR_TEMPLATE -auto ALLOC_FUNCTOR::target() const -> const Target & +auto ALLOC_FUNCTOR::target() const noexcept -> const Target &  {  	return _function.first();  }  ALLOC_FUNCTOR_TEMPLATE -auto ALLOC_FUNCTOR::get_allocator() const -> const Alloc & +auto ALLOC_FUNCTOR::get_allocator() const noexcept -> const Alloc &  {  	return _function.second();  }  ALLOC_FUNCTOR_TEMPLATE -auto ALLOC_FUNCTOR::clone() const -> AllocFunctor * +auto ALLOC_FUNCTOR::clone() const noexcept -> AllocFunctor *  {  	using AllocTraits = std::allocator_traits<Alloc>; @@ -110,7 +110,7 @@ void ALLOC_FUNCTOR::destroy() noexcept  }  ALLOC_FUNCTOR_TEMPLATE -void ALLOC_FUNCTOR::destroy_and_delete(AllocFunctor *functor) +void ALLOC_FUNCTOR::destroy_and_delete(AllocFunctor *functor) noexcept  {  	using AllocTraits = std::allocator_traits<Alloc>; @@ -124,38 +124,39 @@ void ALLOC_FUNCTOR::destroy_and_delete(AllocFunctor *functor)  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)  #define DEFAULT_ALLOC_FUNCTOR_TEMPLATE                                                   \ -	template <class Function, class Return, class... Args> +	template <class Function, class Return, class... Params>  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define DEFAULT_ALLOC_FUNCTOR DefaultAllocFunctor<Function, Return(Args...)> +#define DEFAULT_ALLOC_FUNCTOR DefaultAllocFunctor<Function, Return(Params...)>  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -DEFAULT_ALLOC_FUNCTOR::DefaultAllocFunctor(Target &&function) +DEFAULT_ALLOC_FUNCTOR::DefaultAllocFunctor(Target &&function) noexcept  	: _function(std::move(function))  {  }  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -DEFAULT_ALLOC_FUNCTOR::DefaultAllocFunctor(const Target &function) : _function(function) +DEFAULT_ALLOC_FUNCTOR::DefaultAllocFunctor(const Target &function) noexcept +	: _function(function)  {  }  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -auto DEFAULT_ALLOC_FUNCTOR::operator()(Args &&...args) -> Return +auto DEFAULT_ALLOC_FUNCTOR::operator()(Params &&...args) noexcept -> Return  {  	using Invoker = InvokeReturnWrapper<Return>; -	return Invoker::call(_function, std::forward<Args>(args)...); +	return Invoker::call(_function, std::forward<Params>(args)...);  }  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -auto DEFAULT_ALLOC_FUNCTOR::target() const -> const Target & +auto DEFAULT_ALLOC_FUNCTOR::target() const noexcept -> const Target &  {  	return _function;  }  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -auto DEFAULT_ALLOC_FUNCTOR::clone() const -> DefaultAllocFunctor * +auto DEFAULT_ALLOC_FUNCTOR::clone() const noexcept -> DefaultAllocFunctor *  {  	std::allocator<DefaultAllocFunctor> allocator; @@ -174,7 +175,7 @@ void DEFAULT_ALLOC_FUNCTOR::destroy() noexcept  }  DEFAULT_ALLOC_FUNCTOR_TEMPLATE -void DEFAULT_ALLOC_FUNCTOR::destroy_and_delete(DefaultAllocFunctor *function) +void DEFAULT_ALLOC_FUNCTOR::destroy_and_delete(DefaultAllocFunctor *function) noexcept  {  	function->destroy(); @@ -183,4 +184,4 @@ void DEFAULT_ALLOC_FUNCTOR::destroy_and_delete(DefaultAllocFunctor *function)  	allocator.deallocate(function, 1);  } -} +} // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/functor/alloc_functor.hpp b/include/yacppdic/detail/internal/functor/alloc_functor.hpp index 687f182..ac09f9f 100644 --- a/include/yacppdic/detail/internal/functor/alloc_functor.hpp +++ b/include/yacppdic/detail/internal/functor/alloc_functor.hpp @@ -13,8 +13,8 @@ namespace yacppdic::internal  template <typename Return>  struct InvokeReturnWrapper  { -	template <typename... Args> -	static auto call(Args &&...args) -> Return; +	template <typename... Params> +	static auto call(Params &&...args) noexcept -> Return;  };  /** @@ -23,32 +23,32 @@ struct InvokeReturnWrapper  template <class Function, class Allocator, class FunctionSignature>  class AllocFunctor; -template <class Function, class Allocator, class Return, class... Args> -class AllocFunctor<Function, Allocator, Return(Args...)> +template <class Function, class Allocator, class Return, class... Params> +class AllocFunctor<Function, Allocator, Return(Params...)>  {  public:  	using Target = Function;  	using Alloc = Allocator; -	explicit AllocFunctor(Target &&function); +	explicit AllocFunctor(Target &&function) noexcept; -	explicit AllocFunctor(const Target &function, const Alloc &allocator); +	explicit AllocFunctor(const Target &function, const Alloc &allocator) noexcept; -	explicit AllocFunctor(const Target &function, Alloc &&allocator); +	explicit AllocFunctor(const Target &function, Alloc &&allocator) noexcept; -	explicit AllocFunctor(Target &&function, Alloc &&allocator); +	explicit AllocFunctor(Target &&function, Alloc &&allocator) noexcept; -	auto operator()(Args &&...args) -> Return; +	auto operator()(Params &&...args) noexcept -> Return; -	[[nodiscard]] auto target() const -> const Target &; +	[[nodiscard]] auto target() const noexcept -> const Target &; -	[[nodiscard]] auto get_allocator() const -> const Alloc &; +	[[nodiscard]] auto get_allocator() const noexcept -> const Alloc &; -	[[nodiscard]] auto clone() const -> AllocFunctor *; +	[[nodiscard]] auto clone() const noexcept -> AllocFunctor *;  	void destroy() noexcept; -	static void destroy_and_delete(AllocFunctor *functor); +	static void destroy_and_delete(AllocFunctor *functor) noexcept;  private:  	CompressedPair<Function, Allocator> _function; @@ -60,25 +60,25 @@ private:  template <class Function, class FB>  class DefaultAllocFunctor; -template <class Function, class Return, class... Args> -class DefaultAllocFunctor<Function, Return(Args...)> +template <class Function, class Return, class... Params> +class DefaultAllocFunctor<Function, Return(Params...)>  {  public:  	using Target = Function; -	explicit DefaultAllocFunctor(Target &&function); +	explicit DefaultAllocFunctor(Target &&function) noexcept; -	explicit DefaultAllocFunctor(const Target &function); +	explicit DefaultAllocFunctor(const Target &function) noexcept; -	auto operator()(Args &&...args) -> Return; +	auto operator()(Params &&...args) noexcept -> Return; -	auto target() const -> const Target &; +	auto target() const noexcept -> const Target &; -	auto clone() const -> DefaultAllocFunctor *; +	auto clone() const noexcept -> DefaultAllocFunctor *;  	void destroy() noexcept; -	static void destroy_and_delete(DefaultAllocFunctor *function); +	static void destroy_and_delete(DefaultAllocFunctor *function) noexcept;  private:  	Function _function; diff --git a/include/yacppdic/detail/internal/functor/copyable_functor-impl.hpp b/include/yacppdic/detail/internal/functor/copyable_functor-impl.hpp index 9c51492..a25f2b3 100644 --- a/include/yacppdic/detail/internal/functor/copyable_functor-impl.hpp +++ b/include/yacppdic/detail/internal/functor/copyable_functor-impl.hpp @@ -10,40 +10,49 @@ namespace yacppdic::internal  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)  #define COPYABLE_FUNCTOR_TEMPLATE                                                        \ -	template <class Function, class Allocator, class Return, class... Args> +	template <class Function, class Allocator, class Return, class... Params>  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define COPYABLE_FUNCTOR CopyableFunctor<Function, Allocator, Return(Args...)> +#define COPYABLE_FUNCTOR CopyableFunctor<Function, Allocator, Return(Params...)>  COPYABLE_FUNCTOR_TEMPLATE -COPYABLE_FUNCTOR::CopyableFunctor(Function &&function) : _functor(std::move(function)) {} +COPYABLE_FUNCTOR::CopyableFunctor(Function &&function) noexcept +	: _functor(std::move(function)) +{ +}  COPYABLE_FUNCTOR_TEMPLATE -COPYABLE_FUNCTOR::CopyableFunctor(const Function &function, const Allocator &allocator) +COPYABLE_FUNCTOR::CopyableFunctor( +	const Function &function, +	const Allocator &allocator +) noexcept  	: _functor(function, allocator)  {  }  COPYABLE_FUNCTOR_TEMPLATE -COPYABLE_FUNCTOR::CopyableFunctor(const Function &function, Allocator &&allocator) +COPYABLE_FUNCTOR::CopyableFunctor( +	const Function &function, +	Allocator &&allocator +) noexcept  	: _functor(function, std::move(allocator))  {  }  COPYABLE_FUNCTOR_TEMPLATE -COPYABLE_FUNCTOR::CopyableFunctor(Function &&function, Allocator &&allocator) +COPYABLE_FUNCTOR::CopyableFunctor(Function &&function, Allocator &&allocator) noexcept  	: _functor(std::move(function), std::move(allocator))  {  }  COPYABLE_FUNCTOR_TEMPLATE -auto COPYABLE_FUNCTOR::operator()(Args &&...args) -> Return +auto COPYABLE_FUNCTOR::operator()(Params &&...args) noexcept -> Return  { -	return _functor(std::forward<Args>(args)...); +	return _functor(std::forward<Params>(args)...);  }  COPYABLE_FUNCTOR_TEMPLATE -auto COPYABLE_FUNCTOR::clone() const -> ICopyableFunctor<Return(Args...)> * +auto COPYABLE_FUNCTOR::clone() const noexcept -> ICopyableFunctor<Return(Params...)> *  {  	using AllocTraits = std::allocator_traits<Allocator>; @@ -65,7 +74,7 @@ auto COPYABLE_FUNCTOR::clone() const -> ICopyableFunctor<Return(Args...)> *  }  COPYABLE_FUNCTOR_TEMPLATE -void COPYABLE_FUNCTOR::clone(ICopyableFunctor<Return(Args...)> *functor) const +void COPYABLE_FUNCTOR::clone(ICopyableFunctor<Return(Params...)> *functor) const noexcept  {  	::new (static_cast<void *>(functor))  		CopyableFunctor(_functor.target(), _functor.get_allocator()); @@ -103,10 +112,4 @@ auto COPYABLE_FUNCTOR::target(const std::type_info &type_info) const noexcept ->  	return nullptr;  } -COPYABLE_FUNCTOR_TEMPLATE -auto COPYABLE_FUNCTOR::target_type() const noexcept -> const std::type_info & -{ -	return typeid(Function); -} - -} +} // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/functor/copyable_functor.hpp b/include/yacppdic/detail/internal/functor/copyable_functor.hpp index b305d38..3350781 100644 --- a/include/yacppdic/detail/internal/functor/copyable_functor.hpp +++ b/include/yacppdic/detail/internal/functor/copyable_functor.hpp @@ -15,24 +15,27 @@ namespace yacppdic::internal  template <class Function, class Allocator, class FunctionSignature>  class CopyableFunctor; -template <class Function, class Allocator, class Return, class... Args> -class CopyableFunctor<Function, Allocator, Return(Args...)> -	: public ICopyableFunctor<Return(Args...)> +template <class Function, class Allocator, class Return, class... Params> +class CopyableFunctor<Function, Allocator, Return(Params...)> +	: public ICopyableFunctor<Return(Params...)>  {  public: -	explicit CopyableFunctor(Function &&function); +	explicit CopyableFunctor(Function &&function) noexcept; -	explicit CopyableFunctor(const Function &function, const Allocator &allocator); +	explicit CopyableFunctor( +		const Function &function, +		const Allocator &allocator +	) noexcept; -	explicit CopyableFunctor(const Function &function, Allocator &&allocator); +	explicit CopyableFunctor(const Function &function, Allocator &&allocator) noexcept; -	explicit CopyableFunctor(Function &&function, Allocator &&allocator); +	explicit CopyableFunctor(Function &&function, Allocator &&allocator) noexcept; -	auto operator()(Args &&...args) -> Return override; +	auto operator()(Params &&...args) noexcept -> Return override; -	auto clone() const -> ICopyableFunctor<Return(Args...)> * override; +	auto clone() const noexcept -> ICopyableFunctor<Return(Params...)> * override; -	void clone(ICopyableFunctor<Return(Args...)> *functor) const override; +	void clone(ICopyableFunctor<Return(Params...)> *functor) const noexcept override;  	void destroy() noexcept override; @@ -41,10 +44,8 @@ public:  	[[nodiscard]] auto target(const std::type_info &type_info) const noexcept -> const  		void * override; -	[[nodiscard]] auto target_type() const noexcept -> const std::type_info & override; -  private: -	AllocFunctor<Function, Allocator, Return(Args...)> _functor; +	AllocFunctor<Function, Allocator, Return(Params...)> _functor;  };  } // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/functor/value_functor-impl.hpp b/include/yacppdic/detail/internal/functor/value_functor-impl.hpp index c1030aa..50736da 100644 --- a/include/yacppdic/detail/internal/functor/value_functor-impl.hpp +++ b/include/yacppdic/detail/internal/functor/value_functor-impl.hpp @@ -6,22 +6,22 @@ namespace yacppdic::internal  {  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define VALUE_FUNCTOR_TEMPLATE template <class Return, class... Args> +#define VALUE_FUNCTOR_TEMPLATE template <class Return, class... Params>  // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define VALUE_FUNCTOR ValueFunctor<Return(Args...)> +#define VALUE_FUNCTOR ValueFunctor<Return(Params...)>  VALUE_FUNCTOR_TEMPLATE  VALUE_FUNCTOR::ValueFunctor() noexcept : _functor(nullptr) {}  VALUE_FUNCTOR_TEMPLATE  template <class Function, class Allocator> -VALUE_FUNCTOR::ValueFunctor(Function &&function, const Allocator &allocator) +VALUE_FUNCTOR::ValueFunctor(Function &&function, const Allocator &allocator) noexcept  	: _functor(nullptr)  {  	using AllocTraits = std::allocator_traits<Allocator>; -	using Functor = CopyableFunctor<Function, Allocator, Return(Args...)>; +	using Functor = CopyableFunctor<Function, Allocator, Return(Params...)>;  	using FunctorAlloc = typename RebindAllocHelper<AllocTraits, Functor>::type; @@ -55,7 +55,7 @@ VALUE_FUNCTOR::ValueFunctor(Function &&function, const Allocator &allocator)  }  VALUE_FUNCTOR_TEMPLATE -VALUE_FUNCTOR::ValueFunctor(const ValueFunctor &val_functor) +VALUE_FUNCTOR::ValueFunctor(const ValueFunctor &val_functor) noexcept  {  	if (val_functor._functor == nullptr)  	{ @@ -92,7 +92,7 @@ VALUE_FUNCTOR::ValueFunctor(ValueFunctor &&val_functor) noexcept  }  VALUE_FUNCTOR_TEMPLATE -VALUE_FUNCTOR::~ValueFunctor() +VALUE_FUNCTOR::~ValueFunctor() noexcept  {  	if (static_cast<void *>(_functor) == &_buf)  	{ @@ -128,7 +128,7 @@ auto VALUE_FUNCTOR::operator=(ValueFunctor &&val_functor) noexcept -> ValueFunct  }  VALUE_FUNCTOR_TEMPLATE -auto VALUE_FUNCTOR::operator=(std::nullptr_t) -> ValueFunctor & +auto VALUE_FUNCTOR::operator=(std::nullptr_t) noexcept -> ValueFunctor &  {  	TargetFunctor *old_functor = _functor; @@ -147,14 +147,14 @@ auto VALUE_FUNCTOR::operator=(std::nullptr_t) -> ValueFunctor &  }  VALUE_FUNCTOR_TEMPLATE -auto VALUE_FUNCTOR::operator()(Args &&...args) const -> Return +auto VALUE_FUNCTOR::operator()(Params &&...args) const noexcept -> Return  {  	if (_functor == nullptr)  	{  		std::abort();  	} -	return (*_functor)(std::forward<Args>(args)...); +	return (*_functor)(std::forward<Params>(args)...);  }  VALUE_FUNCTOR_TEMPLATE @@ -164,17 +164,6 @@ VALUE_FUNCTOR::operator bool() const noexcept  }  VALUE_FUNCTOR_TEMPLATE -auto VALUE_FUNCTOR::target_type() const noexcept -> const std::type_info & -{ -	if (_functor == nullptr) -	{ -		return typeid(void); -	} - -	return _functor->target_type(); -} - -VALUE_FUNCTOR_TEMPLATE  template <typename Target>  auto VALUE_FUNCTOR::target() const noexcept -> const Target *  { @@ -187,10 +176,10 @@ auto VALUE_FUNCTOR::target() const noexcept -> const Target *  }  VALUE_FUNCTOR_TEMPLATE -auto VALUE_FUNCTOR::_as_copyable_functor(void *function_ptr) -> TargetFunctor * +auto VALUE_FUNCTOR::_as_copyable_functor(void *function_ptr) noexcept -> TargetFunctor *  {  	// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)  	return reinterpret_cast<TargetFunctor *>(function_ptr);  } -} +} // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/functor/value_functor.hpp b/include/yacppdic/detail/internal/functor/value_functor.hpp index e5cde97..9ed2728 100644 --- a/include/yacppdic/detail/internal/functor/value_functor.hpp +++ b/include/yacppdic/detail/internal/functor/value_functor.hpp @@ -17,52 +17,52 @@ namespace yacppdic::internal  template <class Function>  class ValueFunctor; -template <class Return, class... Args> -class ValueFunctor<Return(Args...)> +template <class Return, class... Params> +class ValueFunctor<Return(Params...)>  { -	using TargetFunctor = ICopyableFunctor<Return(Args...)>; -  public:  	ValueFunctor() noexcept;  	template <class Function>  	requires NotSameAs<std::decay_t<Function>, ValueFunctor>  	// NOLINTNEXTLINE(bugprone-forwarding-reference-overload) -	explicit ValueFunctor(Function &&function) +	explicit ValueFunctor(Function &&function) noexcept  		: ValueFunctor(std::forward<Function>(function), std::allocator<Function>())  	{  	}  	template <class Function, class Allocator> -	ValueFunctor(Function &&function, const Allocator &allocator); +	ValueFunctor(Function &&function, const Allocator &allocator) noexcept; -	ValueFunctor(const ValueFunctor &val_functor); +	ValueFunctor(const ValueFunctor &val_functor) noexcept;  	ValueFunctor(ValueFunctor &&val_functor) noexcept; -	~ValueFunctor(); +	~ValueFunctor() noexcept;  	auto operator=(const ValueFunctor &val_functor) noexcept = delete;  	auto operator=(ValueFunctor &&val_functor) noexcept -> ValueFunctor &; -	auto operator=(std::nullptr_t) -> ValueFunctor &; +	auto operator=(std::nullptr_t) noexcept -> ValueFunctor &; -	auto operator()(Args &&...args) const -> Return; +	auto operator()(Params &&...args) const noexcept -> Return;  	explicit operator bool() const noexcept; -	[[nodiscard]] auto target_type() const noexcept -> const std::type_info &; -  	template <typename Target>  	auto target() const noexcept -> const Target *;  private: -	typename std::aligned_storage<3 * sizeof(void *)>::type _buf{}; +	using Storage = typename std::aligned_storage<3U * sizeof(void *)>::type; + +	using TargetFunctor = ICopyableFunctor<Return(Params...)>; + +	Storage _buf{};  	TargetFunctor *_functor; -	static auto _as_copyable_functor(void *function_ptr) -> TargetFunctor *; +	static auto _as_copyable_functor(void *function_ptr) noexcept -> TargetFunctor *;  };  } // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/interfaces/copyable_functor.hpp b/include/yacppdic/detail/internal/interfaces/copyable_functor.hpp index dadb214..0e80def 100644 --- a/include/yacppdic/detail/internal/interfaces/copyable_functor.hpp +++ b/include/yacppdic/detail/internal/interfaces/copyable_functor.hpp @@ -11,36 +11,34 @@ namespace yacppdic::internal  template <class Function>  class ICopyableFunctor; -template <class Return, class... Args> -class ICopyableFunctor<Return(Args...)> +template <class Return, class... Params> +class ICopyableFunctor<Return(Params...)>  {  public: -	ICopyableFunctor() = default; +	ICopyableFunctor() noexcept = default; -	ICopyableFunctor(const ICopyableFunctor &) = delete; +	ICopyableFunctor(const ICopyableFunctor &) noexcept = delete; -	ICopyableFunctor(ICopyableFunctor &&) = delete; +	ICopyableFunctor(ICopyableFunctor &&) noexcept = delete; -	virtual ~ICopyableFunctor() = default; +	virtual ~ICopyableFunctor() noexcept = default; -	[[nodiscard]] virtual auto clone() const -> ICopyableFunctor * = 0; +	[[nodiscard]] virtual auto clone() const noexcept -> ICopyableFunctor * = 0; -	virtual void clone(ICopyableFunctor *) const = 0; +	virtual void clone(ICopyableFunctor *) const noexcept = 0;  	virtual void destroy() noexcept = 0;  	virtual void destroy_deallocate() noexcept = 0; -	virtual auto operator()(Args &&...) -> Return = 0; +	virtual auto operator()(Params &&...) noexcept -> Return = 0; -	auto operator=(const ICopyableFunctor &) = delete; +	auto operator=(const ICopyableFunctor &) noexcept = delete; -	auto operator=(ICopyableFunctor &&) = delete; +	auto operator=(ICopyableFunctor &&) noexcept = delete;  	[[nodiscard]] virtual auto target(const std::type_info &) const noexcept -> const  		void * = 0; - -	[[nodiscard]] virtual auto target_type() const noexcept -> const std::type_info & = 0;  }; -} +} // namespace yacppdic::internal diff --git a/include/yacppdic/detail/internal/strip_signature.hpp b/include/yacppdic/detail/internal/strip_signature.hpp index 30a2ad0..d770161 100644 --- a/include/yacppdic/detail/internal/strip_signature.hpp +++ b/include/yacppdic/detail/internal/strip_signature.hpp @@ -6,100 +6,100 @@ namespace yacppdic::internal  template <class Function>  struct StripSignature; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...)> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...)>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) volatile> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) volatile>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const volatile> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const volatile>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) &> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) &>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const &> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const &>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) volatile &> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) volatile &>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const volatile &> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const volatile &>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) volatile noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) volatile noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const volatile noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const volatile noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) &noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) &noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const &noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const &noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) volatile &noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) volatile &noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  }; -template <class Return, class Class, class... Args> -struct StripSignature<Return (Class::*)(Args...) const volatile &noexcept> +template <class Return, class Class, class... Params> +struct StripSignature<Return (Class::*)(Params...) const volatile &noexcept>  { -	using type = Return(Args...); +	using type = Return(Params...);  };  template <class Function> diff --git a/include/yacppdic/factory.hpp b/include/yacppdic/factory.hpp index 1eb2dc7..6599146 100644 --- a/include/yacppdic/factory.hpp +++ b/include/yacppdic/factory.hpp @@ -3,7 +3,6 @@  #include "yacppdic/detail/internal/interfaces/copyable_functor.hpp"  #include "yacppdic/detail/internal/alloc_destructor.hpp" -#include "yacppdic/detail/internal/factory_base.hpp"  #include "yacppdic/detail/internal/functor/alloc_functor.hpp"  #include "yacppdic/detail/internal/functor/copyable_functor.hpp"  #include "yacppdic/detail/internal/functor/value_functor.hpp" @@ -20,106 +19,97 @@ namespace yacppdic  template <typename>  class Factory; -template <typename Function, typename Return, typename... Args> +template <typename Function, typename Product, typename... Params>  concept Callable =  	!std::is_same_v<  		internal::UnConstVolatileReferenceT<Function>, -		Factory<Return(Args...)>> && -	std::is_invocable_v<Function, Args...> && -	internal::IsCoreConvertibleV<std::invoke_result_t<Function, Args...>, Return>; +		Factory<Product(Params...)>> && +	std::is_invocable_v<Function, Params...> && +	internal::IsCoreConvertibleV<std::invoke_result_t<Function, Params...>, Product>; -template <typename Return, typename... Args> -class Factory<Return(Args...)> : public MaybeDeriveFromUnaryFunction<Return(Args...)>, -								 public MaybeDeriveFromBinaryFunction<Return(Args...)> +template <typename Product, typename... Params> +class Factory<Product(Params...)>  {  public: -	using Result = Return; +	using Result = Product;  	Factory() noexcept = default; -	explicit Factory(std::nullptr_t) noexcept {} +	explicit Factory(std::nullptr_t) noexcept;  	Factory(const Factory &factory) noexcept;  	Factory(Factory &&factory) noexcept;  	template <typename Function> -	requires Callable<Function, Return, Args...> +	requires Callable<Function, Product, Params...>  	// NOLINTNEXTLINE(google-explicit-constructor)  	Factory(Function function)  	noexcept : _functor(std::move(function)) {} +	~Factory() noexcept = default; +  	auto operator=(const Factory &factory) noexcept = delete;  	auto operator=(Factory &&factory) noexcept -> Factory &;  	auto operator=(std::nullptr_t) noexcept -> Factory &; -	~Factory() noexcept = default; +	auto operator()(Params... args) const noexcept -> Product;  	explicit operator bool() const noexcept; -	// deleted overloads close possible hole in the type system -	template <typename RhsReturn, typename... RhsArgs> -	auto operator==(const Factory<RhsReturn(RhsArgs...)> &) const noexcept +	// Deleted overloads close possible hole in the type system +	template <typename RhsProduct, typename... RhsParams> +	auto operator==(const Factory<RhsProduct(RhsParams...)> &) const noexcept  		-> bool = delete; -	template <typename RhsReturn, typename... RhsArgs> -	auto operator!=(const Factory<RhsReturn(RhsArgs...)> &) const noexcept +	template <typename RhsProduct, typename... RhsParams> +	auto operator!=(const Factory<RhsProduct(RhsParams...)> &) const noexcept  		-> bool = delete; -	auto operator()(Args... args) const noexcept -> Return; - -	[[nodiscard]] auto target_type() const noexcept -> const std::type_info &; - -	template <typename Tp> -	auto target() noexcept -> Tp *; - -	template <typename Tp> -	auto target() const noexcept -> const Tp *; -  private: -	using ValFunctor = internal::ValueFunctor<Return(Args...)>; +	using ValFunctor = internal::ValueFunctor<Product(Params...)>;  	ValFunctor _functor;  }; -template <typename Return, typename... Args> -Factory(Return (*)(Args...)) -> Factory<Return(Args...)>; +template <typename Product, typename... Params> +Factory(Product (*)(Params...)) -> Factory<Product(Params...)>;  template <  	typename Function,  	typename Stripped = internal::StripSignatureT<decltype(&Function::operator())>>  Factory(Function) -> Factory<Stripped>; -template <typename Return, typename... Args> -inline auto operator==(const Factory<Return(Args...)> &factory, std::nullptr_t) noexcept -	-> bool; +template <typename Product, typename... Params> +inline auto +operator==(const Factory<Product(Params...)> &factory, std::nullptr_t) noexcept -> bool; -template <typename Return, typename... Args> -inline auto operator==(std::nullptr_t, const Factory<Return(Args...)> &factory) noexcept -	-> bool; +template <typename Product, typename... Params> +inline auto +operator==(std::nullptr_t, const Factory<Product(Params...)> &factory) noexcept -> bool; -template <typename Return, typename... Args> -inline auto operator!=(const Factory<Return(Args...)> &factory, std::nullptr_t) noexcept -	-> bool; +template <typename Product, typename... Params> +inline auto +operator!=(const Factory<Product(Params...)> &factory, std::nullptr_t) noexcept -> bool; -template <typename Return, typename... Args> -inline auto operator!=(std::nullptr_t, const Factory<Return(Args...)> &factory) noexcept -	-> bool; +template <typename Product, typename... Params> +inline auto +operator!=(std::nullptr_t, const Factory<Product(Params...)> &factory) noexcept -> bool;  } // namespace yacppdic  template <typename Function> -constexpr auto not_null(Function const & /*unused*/) -> bool; +constexpr auto not_null(Function const & /*unused*/) noexcept -> bool;  template <typename Function> -constexpr auto not_null(Function *function_ptr) -> bool; +constexpr auto not_null(Function *function_ptr) noexcept -> bool; -template <typename Return, typename Class> -constexpr auto not_null(Return Class::*method_ptr) -> bool; +template <typename Product, typename Class> +constexpr auto not_null(Product Class::*method_ptr) noexcept -> bool;  template <typename Function> -constexpr auto not_null(yacppdic::Factory<Function> const &factory) -> bool; +constexpr auto not_null(yacppdic::Factory<Function> const &factory) noexcept -> bool;  #include "yacppdic/detail/factory-impl.hpp" diff --git a/include/yacppdic/type_traits.hpp b/include/yacppdic/type_traits.hpp index ab05caa..2c03e78 100644 --- a/include/yacppdic/type_traits.hpp +++ b/include/yacppdic/type_traits.hpp @@ -12,12 +12,12 @@ struct is_factory : public std::false_type // NOLINT(readability-identifier-nami  {  }; -template <typename Return, typename... Args> -struct is_factory<Factory<Return(Args...)>> : public std::true_type +template <typename Return, typename... Params> +struct is_factory<Factory<Return(Params...)>> : public std::true_type  {  };  template <typename PossiblyFunction>  inline constexpr bool is_factory_v = is_factory<PossiblyFunction>::value; -} +} // namespace yacppdic  | 
