Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Use, modification, and distribution are subject to the Chris@16: // Boost Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_CALLBACK_020505GER Chris@16: #define BOOST_TEST_CALLBACK_020505GER Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) || BOOST_WORKAROUND(BOOST_INTEL, <= 700) Chris@16: # define BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: #endif Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace unit_test { Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: struct unused {}; Chris@16: Chris@16: template Chris@16: struct invoker { Chris@16: template Chris@16: R invoke( Functor& f ) { return f(); } Chris@16: template Chris@16: R invoke( Functor& f, T1 t1 ) { return f( t1 ); } Chris@16: template Chris@16: R invoke( Functor& f, T1 t1, T2 t2 ) { return f( t1, t2 ); } Chris@16: template Chris@16: R invoke( Functor& f, T1 t1, T2 t2, T3 t3 ) { return f( t1, t2, t3 ); } Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template<> Chris@16: struct invoker { Chris@16: template Chris@16: unused invoke( Functor& f ) { f(); return unused(); } Chris@16: template Chris@16: unused invoke( Functor& f, T1 t1 ) { f( t1 ); return unused(); } Chris@16: template Chris@16: unused invoke( Functor& f, T1 t1, T2 t2 ) { f( t1, t2 ); return unused(); } Chris@16: template Chris@16: unused invoke( Functor& f, T1 t1, T2 t2, T3 t3 ) { f( t1, t2, t3 ); return unused(); } Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** unit_test::callback0 ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: template Chris@16: struct callback0_impl { Chris@16: virtual ~callback0_impl() {} Chris@16: Chris@16: virtual R invoke() = 0; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: struct callback0_impl_t : callback0_impl { Chris@16: // Constructor Chris@16: explicit callback0_impl_t( Functor f ) : m_f( f ) {} Chris@16: Chris@16: virtual R invoke() { return invoker().invoke( m_f ); } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: Functor m_f; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: template Chris@16: class callback0 { Chris@16: public: Chris@16: // Constructors Chris@16: callback0() {} Chris@16: #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: callback0( callback0 const& rhs ) : m_impl( rhs.m_impl ) {} Chris@16: #endif Chris@16: Chris@16: template Chris@16: callback0( Functor f ) Chris@16: : m_impl( new ut_detail::callback0_impl_t( f ) ) {} Chris@16: Chris@16: void operator=( callback0 const& rhs ) { m_impl = rhs.m_impl; } Chris@16: Chris@16: template Chris@16: void operator=( Functor f ) { m_impl.reset( new ut_detail::callback0_impl_t( f ) ); } Chris@16: Chris@16: R operator()() const { return m_impl->invoke(); } Chris@16: Chris@16: bool operator!() const { return !m_impl; } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: boost::shared_ptr > m_impl; Chris@16: }; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** unit_test::callback1 ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: template Chris@16: struct callback1_impl { Chris@16: virtual ~callback1_impl() {} Chris@16: Chris@16: virtual R invoke( T1 t1 ) = 0; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: struct callback1_impl_t : callback1_impl { Chris@16: // Constructor Chris@16: explicit callback1_impl_t( Functor f ) : m_f( f ) {} Chris@16: Chris@16: virtual R invoke( T1 t1 ) { return invoker().invoke( m_f, t1 ); } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: Functor m_f; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: template Chris@16: class callback1 { Chris@16: public: Chris@16: // Constructors Chris@16: callback1() {} Chris@16: #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: callback1( callback1 const& rhs ) : m_impl( rhs.m_impl ) {} Chris@16: #endif Chris@16: Chris@16: template Chris@16: callback1( Functor f ) Chris@16: : m_impl( new ut_detail::callback1_impl_t( f ) ) {} Chris@16: Chris@16: void operator=( callback1 const& rhs ) { m_impl = rhs.m_impl; } Chris@16: Chris@16: template Chris@16: void operator=( Functor f ) { m_impl.reset( new ut_detail::callback1_impl_t( f ) ); } Chris@16: Chris@16: R operator()( T1 t1 ) const { return m_impl->invoke( t1 ); } Chris@16: Chris@16: bool operator!() const { return !m_impl; } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: boost::shared_ptr > m_impl; Chris@16: }; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** unit_test::callback2 ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: template Chris@16: struct callback2_impl { Chris@16: virtual ~callback2_impl() {} Chris@16: Chris@16: virtual R invoke( T1 t1, T2 t2 ) = 0; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: struct callback2_impl_t : callback2_impl { Chris@16: // Constructor Chris@16: explicit callback2_impl_t( Functor f ) : m_f( f ) {} Chris@16: Chris@16: virtual R invoke( T1 t1, T2 t2 ) { return invoker().template invoke( m_f, t1, t2 ); } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: Functor m_f; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: template Chris@16: class callback2 { Chris@16: public: Chris@16: // Constructors Chris@16: callback2() {} Chris@16: #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: callback2( callback2 const& rhs ) : m_impl( rhs.m_impl ) {} Chris@16: #endif Chris@16: Chris@16: template Chris@16: callback2( Functor f ) : m_impl( new ut_detail::callback2_impl_t( f ) ) {} Chris@16: Chris@16: void operator=( callback2 const& rhs ) { m_impl = rhs.m_impl; } Chris@16: Chris@16: template Chris@16: void operator=( Functor f ) { m_impl.reset( new ut_detail::callback2_impl_t( f ) ); } Chris@16: Chris@16: R operator()( T1 t1, T2 t2 ) const { return m_impl->invoke( t1, t2 ); } Chris@16: Chris@16: bool operator!() const { return !m_impl; } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: boost::shared_ptr > m_impl; Chris@16: }; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** unit_test::callback3 ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace ut_detail { Chris@16: Chris@16: template Chris@16: struct callback3_impl { Chris@16: virtual ~callback3_impl() {} Chris@16: Chris@16: virtual R invoke( T1 t1, T2 t2, T3 t3 ) = 0; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: struct callback3_impl_t : callback3_impl { Chris@16: // Constructor Chris@16: explicit callback3_impl_t( Functor f ) : m_f( f ) {} Chris@16: Chris@16: virtual R invoke( T1 t1, T2 t2, T3 t3 ) { return invoker().invoke( m_f, t1, t2, t3 ); } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: Functor m_f; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace ut_detail Chris@16: Chris@16: template Chris@16: class callback3 { Chris@16: public: Chris@16: // Constructors Chris@16: callback3() {} Chris@16: #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: callback3( callback3 const& rhs ) : m_impl( rhs.m_impl ) {} Chris@16: #endif Chris@16: Chris@16: template Chris@16: callback3( Functor f ) Chris@16: : m_impl( new ut_detail::callback3_impl_t( f ) ) {} Chris@16: Chris@16: void operator=( callback3 const& rhs ) { m_impl = rhs.m_impl; } Chris@16: Chris@16: template Chris@16: void operator=( Functor f ) { m_impl.reset( new ut_detail::callback3_impl_t( f ) ); } Chris@16: Chris@16: R operator()( T1 t1, T2 t2, T3 t3 ) const { return m_impl->invoke( t1, t2, t3 ); } Chris@16: Chris@16: bool operator!() const { return !m_impl; } Chris@16: Chris@16: private: Chris@16: // Data members Chris@16: boost::shared_ptr > m_impl; Chris@16: }; Chris@16: Chris@16: } // namespace unit_test Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #undef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_CALLBACK_020505GER