00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MDWQUEUEMANAGER_H
00021 #define MDWQUEUEMANAGER_H
00022
00023 #include <string>
00024 #include <set>
00025
00026 namespace mdw
00027 {
00028 class QueueManager;
00029 class QueueImpl
00030 {
00031 virtual void * dequeue() = 0;
00032 virtual void enqueue (void *) = 0;
00033 virtual int count() = 0;
00034 };
00035
00036 template <class T>
00037 class Queue
00038 {
00039 public:
00040 const std::string &getName()
00041 {
00042 return _name;
00043 }
00044 T* dequeue()
00045 {
00046 return (T*) _impl->dequeue();
00047 }
00048 void enqueue (T& t)
00049 {
00050 return _impl->enqueue ( (void*) &t);
00051 }
00052 int getSize()
00053 {
00054 return _size;
00055 }
00056 int count()
00057 {
00058 return _impl->count();
00059 }
00060 friend class QueueManager;
00061 private:
00062 std::string _name;
00063 int _size;
00064 QueueImpl * _impl;
00065 };
00066
00070 class QueueManager
00071 {
00072 public:
00073 typedef enum { One_e, Several_e } Cardinal_t;
00074 static void initialise();
00075 static QueueManager &getInstance();
00076
00077 template <class T>
00078 Queue<T> createQueue (int size, const std::string &name, Cardinal_t producer,
00079 Cardinal_t consumer, bool lockFree)
00080 {
00081 Queue<T> aQueue;
00082 aQueue.name = name;
00083 aQueue._size = size;
00084 aQueue._impl = createInternal (size, name, producer,
00085 consumer, lockFree);
00086 }
00087 template <class T>
00088 void deleteQueue (Queue<T> &queue)
00089 {
00090 destroyInternal (queue._impl);
00091 }
00092
00093 private:
00094 std::set<QueueImpl *> _queues;
00095 static QueueManager * _instance;
00096 void init();
00097
00098 QueueImpl * createInternal (int size, const std::string &name, Cardinal_t producer,
00099 Cardinal_t consumer, bool lockFree);
00100 void destroyInternal (QueueImpl *queue);
00101
00102 QueueManager();
00103
00104 ~QueueManager();
00105
00106 };
00107
00108 }
00109
00110 #endif