// Copyright (C) 2007 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_TIMEOUT_KERNEl_1_
#define DLIB_TIMEOUT_KERNEl_1_
#include "../threads.h"
#include "../algs.h"
#include "../misc_api.h"
#include "timeout_kernel_abstract.h"
#include "../uintn.h"
#include "../timer.h"
namespace dlib
{
// ----------------------------------------------------------------------------------------
class timeout_kernel_1
{
/*!
INITIAL VALUE
- b == a pointer to some kind of bind object
CONVENTION
- b == a pointer to some kind of bind object
!*/
class bind
{
public:
virtual void go() = 0;
virtual ~bind() {}
};
template <typename T, typename R>
class zero : public bind
{
public:
T* object;
R (T::*callback_function)();
void go() { (object->*callback_function)(); }
};
template <typename T, typename R, typename U>
class one : public bind
{
public:
T* object;
R (T::*callback_function)(U);
U val;
void go() { (object->*callback_function)(val); }
};
public:
template <
typename T
>
timeout_kernel_1 (
T& object,
void (T::*callback_function)(),
unsigned long ms_to_timeout
):
t(*this,&timeout_kernel_1::trigger_timeout)
{
zero<T,void>* B = new zero<T,void>;
b = B;
B->object = &object;
B->callback_function = callback_function;
t.set_delay_time(ms_to_timeout);
t.start();
}
template <
typename T,
typename U
>
timeout_kernel_1 (
T& object,
void (T::*callback_function)(U callback_function_argument),
unsigned long ms_to_timeout,
U callback_function_argument
):
t(*this,&timeout_kernel_1::trigger_timeout)
{
one<T,void,U>* B = new one<T,void,U>;
b = B;
B->object = &object;
B->callback_function = callback_function;
B->val = callback_function_argument;
t.set_delay_time(ms_to_timeout);
t.start();
}
template <
typename T
>
timeout_kernel_1 (
T& object,
int (T::*callback_function)(),
unsigned long ms_to_timeout
):
t(*this,&timeout_kernel_1::trigger_timeout)
{
zero<T,int>* B = new zero<T,int>;
b = B;
B->object = &object;
B->callback_function = callback_function;
t.set_delay_time(ms_to_timeout);
t.start();
}
template <
typename T,
typename U
>
timeout_kernel_1 (
T& object,
int (T::*callback_function)(U callback_function_argument),
unsigned long ms_to_timeout,
U callback_function_argument
):
t(*this,&timeout_kernel_1::trigger_timeout)
{
one<T,int,U>* B = new one<T,int,U>;
b = B;
B->object = &object;
B->callback_function = callback_function;
B->val = callback_function_argument;
t.set_delay_time(ms_to_timeout);
t.start();
}
virtual ~timeout_kernel_1 (
)
{
t.stop_and_wait();
delete b;
}
private:
void trigger_timeout ()
{
b->go();
t.stop();
}
dlib::timer<timeout_kernel_1>::kernel_2a t;
bind* b;
// restricted functions
timeout_kernel_1(const timeout_kernel_1&); // copy constructor
timeout_kernel_1& operator=(const timeout_kernel_1&); // assignment operator
};
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_TIMEOUT_KERNEl_1_