00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __libutilxx__sella__util__Task_H__
00010 #define __libutilxx__sella__util__Task_H__
00011
00012 #include "../../common.h"
00013
00014 #include <sys/time.h>
00015 #include <stdexcept>
00016
00017 #include <string>
00018 #include <memory>
00019 #include <vector>
00020 #include <chrono>
00021 #include <functional>
00022
00023 #define SELLA_UTIL_TASK_DELAY_SEC_DEF 1
00024 #define SELLA_UTIL_TASK_DELAY_USEC_DEF 500000
00025
00026 namespace sella {
00027 namespace util {
00028 class Task;
00029 static const timeval delay_def = { SELLA_UTIL_TASK_DELAY_SEC_DEF, SELLA_UTIL_TASK_DELAY_USEC_DEF };
00030 static const timeval notset = { 0, 0 };
00031 }
00032 }
00033
00034 class sella::util::Task {
00035 public:
00036 typedef std::shared_ptr<Task> shared;
00037 typedef Task *ptr;
00038 typedef std::function<void(void)> callback;
00039
00040 typedef struct {
00041 size_t operator()(const shared &a) const {
00042 return (size_t) a.get();
00043 }
00044 } shared_hash;
00045 public:
00046 Task();
00047 Task(Task::callback &callback, void* object = NULL, int priority = 0);
00048 Task(const Task &other);
00049 Task(const Task &&other);
00050 virtual ~Task();
00051 Task& operator=(const Task &other);
00052 Task& operator=(const Task &&other);
00053
00054 void clear(void);
00055
00056 Task& setTimer(const std::chrono::system_clock::time_point &time);
00057 Task& setTimer(timeval &timer);
00058 Task& setTimer(time_t &timer);
00059 Task& setDelay(const std::chrono::system_clock::duration &duration);
00060 Task& setDelay(time_t sec = 0, suseconds_t usec = 0);
00061 Task& setNoDelay(void);
00062 Task& setPriority(int priority);
00063 Task& setCallback(Task::callback &callback, void *object = NULL);
00064 Task& setObject(void *object);
00065 Task& setData(std::vector<void*> &data);
00066 Task& addData(void *data);
00067
00068 const timeval& getTimer(void) const;
00069 const timeval getDelay(void) const;
00070 int getPriority(void) const;
00071 const Task::callback& getCallback(void) const;
00072 void* getObject(void) const;
00073 std::vector<void*> getData(void) const;
00074 void* getData(size_t pos) const throw (std::out_of_range);
00075
00076 void execute(void);
00077
00078 static const Task::shared shared_ptr(void) throw ();
00079 static const Task::shared shared_ptr(Task::callback &callback, void *object = NULL, int priority = 0);
00080
00081 static const timeval getDelay(const shared task, const timeval def = delay_def);
00082 static bool compareTimer(const shared task, const timeval now = notset);
00083
00084 protected:
00085 timeval timer;
00086 int priority;
00087
00088 callback function;
00089 void *object;
00090 std::vector<void*> data;
00091
00092 private:
00093 };
00094
00095 #endif
00096
00097
00098
00099