aboutsummaryrefslogtreecommitdiff
path: root/include/yacppdic/detail/factory-impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/yacppdic/detail/factory-impl.hpp')
-rw-r--r--include/yacppdic/detail/factory-impl.hpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/include/yacppdic/detail/factory-impl.hpp b/include/yacppdic/detail/factory-impl.hpp
new file mode 100644
index 0000000..3deede2
--- /dev/null
+++ b/include/yacppdic/detail/factory-impl.hpp
@@ -0,0 +1,70 @@
+#pragma once
+
+#include "yacppdic/factory.hpp"
+
+namespace yacppdic
+{
+
+template <class Return, class... Args>
+Factory<Return(Args...)>::Factory(const Factory &factory) : _functor(factory._functor)
+{
+}
+
+template <class Return, class... Args>
+Factory<Return(Args...)>::Factory(Factory &&factory) noexcept
+ : _functor(std::move(factory._functor))
+{
+}
+
+template <class Return, class... Args>
+auto Factory<Return(Args...)>::operator=(Factory &&factory) noexcept
+ -> Factory<Return(Args...)> &
+{
+ _functor = std::move(factory._functor);
+ return *this;
+}
+
+template <class Return, class... Args>
+auto Factory<Return(Args...)>::operator=(std::nullptr_t) noexcept
+ -> Factory<Return(Args...)> &
+{
+ _functor = nullptr;
+ return *this;
+}
+
+template <class Return, class... Args>
+Factory<Return(Args...)>::~Factory() = default;
+
+template <class Return, class... Args>
+Factory<Return(Args...)>::operator bool() const noexcept
+{
+ return static_cast<bool>(_functor);
+}
+
+template <class Return, class... Args>
+auto Factory<Return(Args...)>::operator()(Args... args) const -> Return
+{
+ return _functor(std::forward<Args>(args)...);
+}
+
+template <class Return, class... Args>
+auto Factory<Return(Args...)>::target_type() const noexcept -> const std::type_info &
+{
+ return _functor.target_type();
+}
+
+template <class Return, class... Args>
+template <typename Tp>
+auto Factory<Return(Args...)>::target() noexcept -> Tp *
+{
+ return static_cast<Tp *>(_functor.template target<Tp>());
+}
+
+template <class Return, class... Args>
+template <typename Tp>
+auto Factory<Return(Args...)>::target() const noexcept -> const Tp *
+{
+ return _functor.template target<Tp>();
+}
+
+}