//  (C) Copyright Gennadiy Rozental 2005-2008.
//  Use, modification, and distribution are subject to the 
//  Boost Software License, Version 1.0. (See accompanying file 
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

//  See http://www.boost.org/libs/test for the library home page.
//
//  File        : $RCSfile$
//
//  Version     : $Revision: 49312 $
//
//  Description : 
// ***************************************************************************

#ifndef BOOST_TEST_CALLBACK_020505GER
#define BOOST_TEST_CALLBACK_020505GER

// Boost
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/shared_ptr.hpp>

#include <boost/test/detail/suppress_warnings.hpp>

#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) || BOOST_WORKAROUND(BOOST_INTEL, <= 700)
#  define BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
#endif

//____________________________________________________________________________//

namespace boost {

namespace unit_test {

namespace ut_detail {

struct unused {};

template<typename R>
struct invoker {
    template<typename Functor>
    R       invoke( Functor& f )                        { return f(); }
    template<typename Functor, typename T1>
    R       invoke( Functor& f, T1 t1 )                 { return f( t1 ); }
    template<typename Functor, typename T1, typename T2>
    R       invoke( Functor& f, T1 t1, T2 t2 )          { return f( t1, t2 ); }
    template<typename Functor, typename T1, typename T2, typename T3>
    R       invoke( Functor& f, T1 t1, T2 t2, T3 t3 )   { return f( t1, t2, t3 ); }
};

//____________________________________________________________________________//

template<>
struct invoker<unused> {
    template<typename Functor>
    unused  invoke( Functor& f )                        { f(); return unused(); }
    template<typename Functor, typename T1>
    unused  invoke( Functor& f, T1 t1 )                 { f( t1 ); return unused(); }
    template<typename Functor, typename T1, typename T2>
    unused  invoke( Functor& f, T1 t1, T2 t2 )          { f( t1, t2 ); return unused(); }
    template<typename Functor, typename T1, typename T2, typename T3>
    unused  invoke( Functor& f, T1 t1, T2 t2, T3 t3 )   { f( t1, t2, t3 ); return unused(); }
};

//____________________________________________________________________________//

} // namespace ut_detail

// ************************************************************************** //
// **************             unit_test::callback0             ************** //
// ************************************************************************** //

namespace ut_detail {

template<typename R>
struct callback0_impl {
    virtual ~callback0_impl() {}

    virtual R invoke() = 0;
};

//____________________________________________________________________________//

template<typename R, typename Functor>
struct callback0_impl_t : callback0_impl<R> {
    // Constructor
    explicit callback0_impl_t( Functor f ) : m_f( f ) {}

    virtual R invoke() { return invoker<R>().invoke( m_f ); }

private:
    // Data members
    Functor m_f;
};

//____________________________________________________________________________//

} // namespace ut_detail

template<typename R = ut_detail::unused>
class callback0 {
public:
    // Constructors
    callback0() {}
#ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
    callback0( callback0 const& rhs ) : m_impl( rhs.m_impl ) {}
#endif

    template<typename Functor>
    callback0( Functor f )
    : m_impl( new ut_detail::callback0_impl_t<R,Functor>( f ) ) {}
    
    void        operator=( callback0 const& rhs ) { m_impl = rhs.m_impl; }

    template<typename Functor>
    void        operator=( Functor f ) { m_impl.reset( new ut_detail::callback0_impl_t<R,Functor>( f ) );  }

    R           operator()() const { return m_impl->invoke(); }

    bool        operator!() const { return !m_impl; }

private:
    // Data members
    boost::shared_ptr<ut_detail::callback0_impl<R> > m_impl;
};

// ************************************************************************** //
// **************             unit_test::callback1             ************** //
// ************************************************************************** //

namespace ut_detail {

template<typename R, typename T1>
struct callback1_impl {
    virtual ~callback1_impl() {}

    virtual R invoke( T1 t1 ) = 0;
};

//____________________________________________________________________________//

template<typename R, typename T1,typename Functor>
struct callback1_impl_t : callback1_impl<R,T1> {
    // Constructor
    explicit callback1_impl_t( Functor f ) : m_f( f ) {}

    virtual R invoke( T1 t1 ) { return invoker<R>().invoke( m_f, t1 ); }

private:
    // Data members
    Functor m_f;
};

//____________________________________________________________________________//

} // namespace ut_detail

template<typename T1,typename R = ut_detail::unused>
class callback1 {
public:
    // Constructors
    callback1() {}
#ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
    callback1( callback1 const& rhs ) : m_impl( rhs.m_impl ) {}
#endif

    template<typename Functor>
    callback1( Functor f )
    : m_impl( new ut_detail::callback1_impl_t<R,T1,Functor>( f ) ) {}

    void        operator=( callback1 const& rhs ) { m_impl = rhs.m_impl; }

    template<typename Functor>
    void        operator=( Functor f ) { m_impl.reset( new ut_detail::callback1_impl_t<R,T1,Functor>( f ) );  }

    R           operator()( T1 t1 ) const { return m_impl->invoke( t1 ); }

    bool        operator!() const { return !m_impl; }

private:
    // Data members
    boost::shared_ptr<ut_detail::callback1_impl<R,T1> > m_impl;
};

// ************************************************************************** //
// **************             unit_test::callback2             ************** //
// ************************************************************************** //

namespace ut_detail {

template<typename R, typename T1,typename T2>
struct callback2_impl {
    virtual ~callback2_impl() {}

    virtual R invoke( T1 t1, T2 t2 ) = 0;
};

//____________________________________________________________________________//

template<typename R, typename T1, typename T2, typename Functor>
struct callback2_impl_t : callback2_impl<R,T1,T2> {
    // Constructor
    explicit callback2_impl_t( Functor f ) : m_f( f ) {}

    virtual R invoke( T1 t1, T2 t2 ) { return invoker<R>().template invoke<Functor,T1,T2>( m_f, t1, t2 ); }

private:
    // Data members
    Functor m_f;
};

//____________________________________________________________________________//

} // namespace ut_detail

template<typename T1,typename T2, typename R = ut_detail::unused>
class callback2 {
public:
    // Constructors
    callback2() {}
#ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
    callback2( callback2 const& rhs ) : m_impl( rhs.m_impl ) {}
#endif

    template<typename Functor>
                callback2( Functor f ) : m_impl( new ut_detail::callback2_impl_t<R,T1,T2,Functor>( f ) ) {}

    void        operator=( callback2 const& rhs ) { m_impl = rhs.m_impl; }

    template<typename Functor>
    void        operator=( Functor f ) { m_impl.reset( new ut_detail::callback2_impl_t<R,T1,T2,Functor>( f ) );  }

    R           operator()( T1 t1, T2 t2 ) const { return m_impl->invoke( t1, t2 ); }

    bool        operator!() const { return !m_impl; }

private:
    // Data members
    boost::shared_ptr<ut_detail::callback2_impl<R,T1,T2> > m_impl;
};

// ************************************************************************** //
// **************             unit_test::callback3             ************** //
// ************************************************************************** //

namespace ut_detail {

template<typename R, typename T1, typename T2, typename T3>
struct callback3_impl {
    virtual ~callback3_impl() {}

    virtual R invoke( T1 t1, T2 t2, T3 t3 ) = 0;
};

//____________________________________________________________________________//

template<typename R, typename T1, typename T2, typename T3, typename Functor>
struct callback3_impl_t : callback3_impl<R,T1,T2,T3> {
    // Constructor
    explicit callback3_impl_t( Functor f ) : m_f( f ) {}

    virtual R invoke( T1 t1, T2 t2, T3 t3 ) { return invoker<R>().invoke( m_f, t1, t2, t3 ); }

private:
    // Data members
    Functor m_f;
};

//____________________________________________________________________________//

} // namespace ut_detail

template<typename T1,typename T2, typename T3, typename R = ut_detail::unused>
class callback3 {
public:
    // Constructors
    callback3() {}
#ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
    callback3( callback3 const& rhs ) : m_impl( rhs.m_impl ) {}
#endif

    template<typename Functor>
    callback3( Functor f )
    : m_impl( new ut_detail::callback3_impl_t<R,T1,T2,T3,Functor>( f ) ) {}

    void        operator=( callback3 const& rhs ) { m_impl = rhs.m_impl; }

    template<typename Functor>
    void        operator=( Functor f ) { m_impl.reset( new ut_detail::callback3_impl_t<R,T1,T2,T3,Functor>( f ) );  }

    R           operator()( T1 t1, T2 t2, T3 t3 ) const { return m_impl->invoke( t1, t2, t3 ); }

    bool        operator!() const { return !m_impl; }

private:
    // Data members
    boost::shared_ptr<ut_detail::callback3_impl<R,T1,T2,T3> > m_impl;
};

} // namespace unit_test

} // namespace boost

#undef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR

//____________________________________________________________________________//

#include <boost/test/detail/enable_warnings.hpp>

#endif // BOOST_TEST_CALLBACK_020505GER
