// Copyright (C) 2011  Davis E. King (davis@dlib.net)
// License: Boost Software License   See LICENSE.txt for the full license.
#undef DLIB_MAKE_MFp_ABSTRACT_
#ifdef DLIB_MAKE_MFp_ABSTRACT_

#include "member_function_pointer_kernel_abstract.h"

namespace dlib
{

// ----------------------------------------------------------------------------------------

    template <
        typename T
        >
    member_function_pointer<> make_mfp (
        T& object,
        void (T::*cb)()
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP() will call (object.*cb)()
    !*/

    template <
        typename T
        >
    member_function_pointer<> make_mfp (
        const T& object,
        void (T::*cb)()const
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP() will call (object.*cb)()
    !*/

// ----------------------------------------------------------------------------------------

    template <
        typename T,
        typename A1
        >
    member_function_pointer<A1> make_mfp (
        T& object,
        void (T::*cb)(A1 a1)
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1) will call (object.*cb)(a1)
    !*/

    template <
        typename T,
        typename A1
        >
    member_function_pointer<A1> make_mfp (
        const T& object,
        void (T::*cb)(A1 a1)const
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1) will call (object.*cb)(a1)
    !*/

// ----------------------------------------------------------------------------------------

    template <
        typename T,
        typename A1,
        typename A2
        >
    member_function_pointer<A1,A2> make_mfp (
        T& object,
        void (T::*cb)(A1 a1, A2 a2)
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)
    !*/

    template <
        typename T,
        typename A1,
        typename A2
        >
    member_function_pointer<A1,A2> make_mfp (
        const T& object,
        void (T::*cb)(A1 a1, A2 a2)const
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)
    !*/

// ----------------------------------------------------------------------------------------

    template <
        typename T,
        typename A1,
        typename A2,
        typename A3
        >
    member_function_pointer<A1,A2,A3> make_mfp (
        T& object,
        void (T::*cb)(A1 a1, A2 a2, A3 a3)
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)
    !*/

    template <
        typename T,
        typename A1,
        typename A2,
        typename A3
        >
    member_function_pointer<A1,A2,A3> make_mfp (
        const T& object,
        void (T::*cb)(A1 a1, A2 a2, A3 a3)const
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)
    !*/

// ----------------------------------------------------------------------------------------

    template <
        typename T,
        typename A1,
        typename A2,
        typename A3,
        typename A4
        >
    member_function_pointer<A1,A2,A3,A4> make_mfp (
        T& object,
        void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)
    !*/

    template <
        typename T,
        typename A1,
        typename A2,
        typename A3,
        typename A4
        >
    member_function_pointer<A1,A2,A3,A4> make_mfp (
        const T& object,
        void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)const
    );
    /*!
        requires
            - cb == a valid member function pointer for class T
        ensures
            - returns a member function pointer object MFP such that:
                - MFP.is_set() == true
                - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)
    !*/

// ----------------------------------------------------------------------------------------

}

#endif // DLIB_MAKE_MFp_ABSTRACT_