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

#include "threads_kernel_abstract.h"

namespace dlib
{

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

    class thread_function 
    {
        /*!
            WHAT THIS OBJECT REPRESENTS
                This object represents a thread on a global C++ function or function
                object.  That is, it allows you to run a function in its own thread.
        !*/
    public:

        template <typename F>
        thread_function (
            F funct
        );
        /*!
            ensures
                - #*this is properly initialized
                - the function funct has been started in its own thread
            throws
                - std::bad_alloc
                - dlib::thread_error
                    the constructor may throw this exception if there is a problem 
                    gathering resources to create threading objects.
        !*/

        template <typename F, typename T1>
        thread_function (
            F funct,
            T1 arg1
        );
        /*!
            ensures
                - #*this is properly initialized
                - A thread has been created and it will call funct(arg1)
            throws
                - std::bad_alloc
                - dlib::thread_error
                    the constructor may throw this exception if there is a problem 
                    gathering resources to create threading objects.
        !*/

        template <typename F, typename T1, typename T2>
        thread_function (
            F funct,
            T1 arg1,
            T2 arg2
        );
        /*!
            ensures
                - #*this is properly initialized
                - A thread has been created and it will call funct(arg1, arg2)
            throws
                - std::bad_alloc
                - dlib::thread_error
                    the constructor may throw this exception if there is a problem 
                    gathering resources to create threading objects.
        !*/

        template <typename F, typename T1, typename T2, typename T3>
        thread_function (
            F funct,
            T1 arg1,
            T2 arg2,
            T3 arg3
        );
        /*!
            ensures
                - #*this is properly initialized
                - A thread has been created and it will call funct(arg1, arg2, arg3)
            throws
                - std::bad_alloc
                - dlib::thread_error
                    the constructor may throw this exception if there is a problem 
                    gathering resources to create threading objects.
        !*/

        template <typename F, typename T1, typename T2, typename T3, typename T4>
        thread_function (
            F funct,
            T1 arg1,
            T2 arg2,
            T3 arg3,
            T4 arg4
        );
        /*!
            ensures
                - #*this is properly initialized
                - A thread has been created and it will call funct(arg1, arg2, arg3, arg4)
            throws
                - std::bad_alloc
                - dlib::thread_error
                    the constructor may throw this exception if there is a problem 
                    gathering resources to create threading objects.
        !*/

        ~thread_function (
        );
        /*!
            ensures
                - all resources allocated by *this have been freed.  
                - blocks until is_alive() == false
        !*/

        bool is_alive (
        ) const;
        /*!
            ensures
                - if (this object's thread has yet to terminate) then
                    - returns true
                - else
                    - returns false
        !*/

        void wait (
        ) const;
        /*!
            ensures
                - if (is_alive() == true) then
                    - blocks until this object's thread terminates
        !*/

    private:

        // restricted functions
        thread_function(thread_function&);        // copy constructor
        thread_function& operator=(thread_function&);    // assignment operator
    };

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

}

#endif // DLIB_THREAD_FUNCTIOn_ABSTRACT_