You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
concurrentqueue/benchmarks/dlib/threads/thread_function_extension.h

216 lines
4.6 KiB
C++

// Copyright (C) 2007 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_THREAD_FUNCTIOn_
#define DLIB_THREAD_FUNCTIOn_
#include <memory>
#include "thread_function_extension_abstract.h"
#include "threads_kernel.h"
#include "auto_mutex_extension.h"
#include "threaded_object_extension.h"
namespace dlib
{
// ----------------------------------------------------------------------------------------
class thread_function : private threaded_object
{
class base_funct
{
public:
virtual void go() = 0;
virtual ~base_funct() {}
};
template <typename F, typename T1, typename T2, typename T3, typename T4>
class super_funct_4 : public base_funct
{
public:
super_funct_4 ( F funct, T1 arg1, T2 arg2, T3 arg3, T4 arg4) :
f(funct),
a1(arg1),
a2(arg2),
a3(arg3),
a4(arg4)
{
}
void go() { f(a1, a2, a3, a4); }
F f;
T1 a1;
T2 a2;
T3 a3;
T4 a4;
};
template <typename F, typename T1, typename T2, typename T3>
class super_funct_3 : public base_funct
{
public:
super_funct_3 ( F funct, T1 arg1, T2 arg2, T3 arg3):
f(funct),
a1(arg1),
a2(arg2),
a3(arg3)
{
}
void go() { f(a1, a2, a3); }
F f;
T1 a1;
T2 a2;
T3 a3;
};
template <typename F, typename T1, typename T2>
class super_funct_2 : public base_funct
{
public:
super_funct_2 ( F funct, T1 arg1, T2 arg2) :
f(funct),
a1(arg1),
a2(arg2)
{
}
void go() { f(a1, a2); }
F f;
T1 a1;
T2 a2;
};
template <typename F, typename T>
class super_funct_1 : public base_funct
{
public:
super_funct_1 ( F funct, T arg) : f(funct), a(arg)
{
}
void go() { f(a); }
F f;
T a;
};
template <typename F>
class super_funct_0 : public base_funct
{
public:
super_funct_0 ( F funct) : f(funct)
{
}
void go() { f(); }
F f;
};
public:
template <typename F>
thread_function (
F funct
)
{
f.reset(new super_funct_0<F>(funct));
start();
}
template <typename F, typename T>
thread_function (
F funct,
T arg
)
{
f.reset(new super_funct_1<F,T>(funct,arg));
start();
}
template <typename F, typename T1, typename T2>
thread_function (
F funct,
T1 arg1,
T2 arg2
)
{
f.reset(new super_funct_2<F,T1,T2>(funct, arg1, arg2));
start();
}
template <typename F, typename T1, typename T2, typename T3>
thread_function (
F funct,
T1 arg1,
T2 arg2,
T3 arg3
)
{
f.reset(new super_funct_3<F,T1,T2,T3>(funct, arg1, arg2, arg3));
start();
}
template <typename F, typename T1, typename T2, typename T3, typename T4>
thread_function (
F funct,
T1 arg1,
T2 arg2,
T3 arg3,
T4 arg4
)
{
f.reset(new super_funct_4<F,T1,T2,T3,T4>(funct, arg1, arg2, arg3, arg4));
start();
}
~thread_function (
)
{
threaded_object::wait();
}
bool is_alive (
) const
{
return threaded_object::is_alive();
}
void wait (
) const
{
threaded_object::wait();
}
private:
void thread ()
{
f->go();
}
std::unique_ptr<base_funct> f;
// restricted functions
thread_function(thread_function&); // copy constructor
thread_function& operator=(thread_function&); // assignment operator
};
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_THREAD_FUNCTIOn_