// 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_