00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef LIBMUTH_EXCEPTIONS_H
00020 #define LIBMUTH_EXCEPTIONS_H
00021
00022 #include <stdexcept>
00023
00027 class ThreadExitException : public std::runtime_error {
00028 public:
00029 ThreadExitException() : std::runtime_error("ThreadExit") {}
00030 };
00031
00032 class CleanupHandler {
00033 public:
00034 virtual ~CleanupHandler() {};
00035 };
00036
00037 class CleanupHandler0 : public CleanupHandler {
00038 private:
00039 void (*func)();
00040 public:
00041 CleanupHandler0(void (*f)()) : func(f) {}
00042 ~CleanupHandler0() { this->func(); }
00043 };
00044
00045 template<class T> class CleanupHandler1 : public CleanupHandler {
00046 private:
00047 void (*func)(T);
00048 T arg0;
00049 public:
00050 CleanupHandler1(void (*f)(T), T a0) : func(f), arg0(a0) {}
00051 ~CleanupHandler1() { this->func(arg0); }
00052 };
00053
00054 inline CleanupHandler Finally(void (*func)()) {
00055 return CleanupHandler0(func);
00056 }
00057
00058 template<class T> inline CleanupHandler Finally(void (*func)(T), T arg0) {
00059 return CleanupHandler1<T>(func, arg0);
00060 }
00061
00062 #endif