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

    #include "member_function_pointer_kernel_1.h"
    #include "make_mfp_abstract.h"

    namespace dlib
    {

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

        template <
            typename T
            >
        member_function_pointer<> make_mfp (
            T& object,
            void (T::*cb)()
        )
        {
            member_function_pointer<> temp;
            temp.set(object, cb);
            return temp;
        }

        template <
            typename T
            >
        member_function_pointer<> make_mfp (
            const T& object,
            void (T::*cb)()const
        )
        {
            member_function_pointer<> temp;
            temp.set(object, cb);
            return temp;
        }

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

        template <
            typename T,
            typename A1
            >
        member_function_pointer<A1> make_mfp (
            T& object,
            void (T::*cb)(A1)
        )
        {
            member_function_pointer<A1> temp;
            temp.set(object, cb);
            return temp;
        }

        template <
            typename T,
            typename A1
            >
        member_function_pointer<A1> make_mfp (
            const T& object,
            void (T::*cb)(A1)const
        )
        {
            member_function_pointer<A1> temp;
            temp.set(object, cb);
            return temp;
        }

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

        template <
            typename T,
            typename A1,
            typename A2
            >
        member_function_pointer<A1,A2> make_mfp (
            T& object,
            void (T::*cb)(A1,A2)
        )
        {
            member_function_pointer<A1,A2> temp;
            temp.set(object, cb);
            return temp;
        }

        template <
            typename T,
            typename A1,
            typename A2
            >
        member_function_pointer<A1,A2> make_mfp (
            const T& object,
            void (T::*cb)(A1,A2)const
        )
        {
            member_function_pointer<A1,A2> temp;
            temp.set(object, cb);
            return temp;
        }

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

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3
            >
        member_function_pointer<A1,A2,A3> make_mfp (
            T& object,
            void (T::*cb)(A1,A2,A3)
        )
        {
            member_function_pointer<A1,A2,A3> temp;
            temp.set(object, cb);
            return temp;
        }

        template <
            typename T,
            typename A1,
            typename A2,
            typename A3
            >
        member_function_pointer<A1,A2,A3> make_mfp (
            const T& object,
            void (T::*cb)(A1,A2,A3)const
        )
        {
            member_function_pointer<A1,A2,A3> temp;
            temp.set(object, cb);
            return temp;
        }

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

        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,A2,A3,A4)
        )
        {
            member_function_pointer<A1,A2,A3,A4> temp;
            temp.set(object, cb);
            return temp;
        }

        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,A2,A3,A4)const
        )
        {
            member_function_pointer<A1,A2,A3,A4> temp;
            temp.set(object, cb);
            return temp;
        }

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

    }

    #endif // DLIB_MAKE_MFp_H_