diff --git a/modules/beast_core/memory/SharedFunction.h b/modules/beast_core/memory/SharedFunction.h index 0d7b78089..5d8da5f57 100644 --- a/modules/beast_core/memory/SharedFunction.h +++ b/modules/beast_core/memory/SharedFunction.h @@ -20,89 +20,48 @@ #ifndef BEAST_CORE_SHAREDFUNCTION_H_INCLUDED #define BEAST_CORE_SHAREDFUNCTION_H_INCLUDED -/** A reference counted, abstract function object. -*/ +/** A reference counted, abstract function object. */ template > class SharedFunction; //------------------------------------------------------------------------------ -// nullary function -// -template +template class SharedFunction { public: - class Call : public SharedObject - { - public: - virtual R operator() () = 0; - }; + struct Call : SharedObject + { virtual R operator() () = 0; }; template - class CallType : public Call + struct CallType : Call { - public: typedef typename A:: template rebind >::other Allocator; - CallType (BEAST_MOVE_ARG(F) f, A a = A ()) - : m_f (BEAST_MOVE_CAST(F)(f)) - , m_a (a) - { - } - + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } R operator() () - { - return (m_f)(); - } - + { return (m_f)(); } private: F m_f; Allocator m_a; }; - //-------------------------------------------------------------------------- - - SharedFunction () - { - } - + typedef R result_type; template - SharedFunction (F f, A a = A ()) - : m_ptr (new ( - typename CallType ::Allocator (a) - .allocate (sizeof (CallType ))) - CallType (BEAST_MOVE_CAST(F)(f), a)) - { - } - - SharedFunction (SharedFunction const& other) - : m_ptr (other.m_ptr) - { - } - + explicit SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } SharedFunction (SharedFunction const& other, A) : m_ptr (other.m_ptr) - { - } - - SharedFunction& operator= (SharedFunction const& other) - { - m_ptr = other.m_ptr; - return *this; - } - + { } + SharedFunction () + { } bool empty () const - { - return m_ptr == nullptr; - } - + { return m_ptr == nullptr; } R operator() () const - { - bassert (! empty()); - - return (*m_ptr)(); - } + { return (*m_ptr)(); } private: SharedPtr m_ptr; @@ -110,86 +69,266 @@ private: //------------------------------------------------------------------------------ -// unary function (arity 1) -// -template +template class SharedFunction { public: - class Call : public SharedObject - { - public: - virtual R operator() (P1 p1) = 0; - }; + struct Call : public SharedObject + { virtual R operator() (P1 const& p1) = 0; }; template - class CallType : public Call + struct CallType : Call { - public: typedef typename A:: template rebind >::other Allocator; - CallType (BEAST_MOVE_ARG(F) f, A a = A ()) - : m_f (BEAST_MOVE_CAST(F)(f)) - , m_a (a) - { - } - - R operator() (P1 p1) - { - return (m_f)(p1); - } - + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1) + { return (m_f)(p1); } private: F m_f; Allocator m_a; }; - //-------------------------------------------------------------------------- - - SharedFunction () - { - } - + typedef R result_type; template SharedFunction (F f, A a = A ()) - : m_ptr (new ( - typename CallType ::Allocator (a) - .allocate (sizeof (CallType ))) - CallType (BEAST_MOVE_CAST(F)(f), a)) - { - } - - SharedFunction (SharedFunction const& other) - : m_ptr (other.m_ptr) - { - } - + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } SharedFunction (SharedFunction const& other, A) : m_ptr (other.m_ptr) - { - } - - SharedFunction& operator= (SharedFunction const& other) - { - m_ptr = other.m_ptr; - return *this; - } - + { } + SharedFunction () + { } bool empty () const - { - return m_ptr == nullptr; - } - - R operator() (P1 p1) const - { - bassert (! empty()); - - return (*m_ptr)(p1); - } + { return m_ptr == nullptr; } + R operator() (P1 const& p1) const + { return (*m_ptr)(p1); } private: SharedPtr m_ptr; }; +//------------------------------------------------------------------------------ + +template +class SharedFunction +{ +public: + struct Call : public SharedObject + { virtual R operator() (P1 const& p1, P2 const& p2) = 0; }; + + template + struct CallType : Call + { + typedef typename A:: template rebind >::other Allocator; + CallType (BEAST_MOVE_ARG(F) f, A a = A ()) + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1, P2 const& p2) + { return (m_f)(p1, p2); } + private: + F m_f; + Allocator m_a; + }; + + typedef R result_type; + template + SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } + SharedFunction (SharedFunction const& other, A) + : m_ptr (other.m_ptr) + { } + SharedFunction () + { } + bool empty () const + { return m_ptr == nullptr; } + R operator() (P1 const& p1, P2 const& p2) const + { return (*m_ptr)(p1, p2); } + +private: + SharedPtr m_ptr; +}; + +//------------------------------------------------------------------------------ + +template +class SharedFunction +{ +public: + struct Call : public SharedObject + { virtual R operator() (P1 const& p1, P2 const& p2, P3 const& p3) = 0; }; + + template + struct CallType : Call + { + typedef typename A:: template rebind >::other Allocator; + CallType (BEAST_MOVE_ARG(F) f, A a = A ()) + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3) + { return (m_f)(p1, p2, p3); } + private: + F m_f; + Allocator m_a; + }; + + typedef R result_type; + template + SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } + SharedFunction (SharedFunction const& other, A) + : m_ptr (other.m_ptr) + { } + SharedFunction () + { } + bool empty () const + { return m_ptr == nullptr; } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3) const + { return (*m_ptr)(p1, p2, p3); } + +private: + SharedPtr m_ptr; +}; + +//------------------------------------------------------------------------------ + +template +class SharedFunction +{ +public: + struct Call : public SharedObject + { virtual R operator() (P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4) = 0; }; + + template + struct CallType : Call + { + typedef typename A:: template rebind >::other Allocator; + CallType (BEAST_MOVE_ARG(F) f, A a = A ()) + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4) + { return (m_f)(p1, p2, p3, p4); } + private: + F m_f; + Allocator m_a; + }; + + typedef R result_type; + template + SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } + SharedFunction (SharedFunction const& other, A) + : m_ptr (other.m_ptr) + { } + SharedFunction () + { } + bool empty () const + { return m_ptr == nullptr; } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, P4 const& p4) const + { return (*m_ptr)(p1, p2, p3, p4); } + +private: + SharedPtr m_ptr; +}; + +//------------------------------------------------------------------------------ + +template +class SharedFunction +{ +public: + struct Call : public SharedObject + { virtual R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5) = 0; }; + + template + struct CallType : Call + { + typedef typename A:: template rebind >::other Allocator; + CallType (BEAST_MOVE_ARG(F) f, A a = A ()) + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5) + { return (m_f)(p1, p2, p3, p4, p5); } + private: + F m_f; + Allocator m_a; + }; + + typedef R result_type; + template + SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } + SharedFunction (SharedFunction const& other, A) + : m_ptr (other.m_ptr) + { } + SharedFunction () + { } + bool empty () const + { return m_ptr == nullptr; } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5) const + { return (*m_ptr)(p1, p2, p3, p4, p5); } + +private: + SharedPtr m_ptr; +}; + +//------------------------------------------------------------------------------ + +template +class SharedFunction +{ +public: + struct Call : public SharedObject + { virtual R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5, P6 const& p6) = 0; }; + + template + struct CallType : Call + { + typedef typename A:: template rebind >::other Allocator; + CallType (BEAST_MOVE_ARG(F) f, A a = A ()) + : m_f (BEAST_MOVE_CAST(F)(f)), m_a (a) + { } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5, P6 const& p6) + { return (m_f)(p1, p2, p3, p4, p5, p6); } + private: + F m_f; + Allocator m_a; + }; + + typedef R result_type; + template + SharedFunction (F f, A a = A ()) + : m_ptr (new (typename CallType ::Allocator (a).allocate (1)) + CallType (BEAST_MOVE_CAST(F)(f), a)) + { } + SharedFunction (SharedFunction const& other, A) + : m_ptr (other.m_ptr) + { } + SharedFunction () + { } + bool empty () const + { return m_ptr == nullptr; } + R operator() (P1 const& p1, P2 const& p2, P3 const& p3, + P4 const& p4, P5 const& p5, P6 const& p6) const + { return (*m_ptr)(p1, p2, p3, p4, p5, p6); } + +private: + SharedPtr m_ptr; +}; #endif