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

    #include "../threads.h"
    #include "../algs.h"
    #include "sync_extension_kernel_abstract.h"

    namespace dlib
    {

        template <
            typename base
            >
        class sync_extension_kernel_1 : public base
        {

            rmutex m;
            rsignaler s;

            public:

            sync_extension_kernel_1 () : s(m) {}

            template < typename T >
            sync_extension_kernel_1 (const T& one) : base(one),s(m) {}
            template < typename T, typename U >
            sync_extension_kernel_1 (const T& one, const U& two) : base(one,two),s(m) {}

            const rmutex& get_mutex(
            ) const { return m; }

            void lock (
            ) const { m.lock(); }

            void unlock (
            ) const { m.unlock(); }

            void wait (
            ) const { s.wait(); }

            bool wait_or_timeout (
                unsigned long milliseconds
            ) const { return s.wait_or_timeout(milliseconds); }

            void broadcast (
            ) const { s.broadcast(); }

            void signal (
            ) const { s.signal(); }

        };

        template <
            typename base
            >
        inline void swap (
            sync_extension_kernel_1<base>& a,
            sync_extension_kernel_1<base>& b
        ) { a.swap(b); }

    }

    #endif // DLIB_SYNC_EXTENSION_KERNEl_1_