00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef OMNIEVENTS__EVENTQUEUE_H
00025 #define OMNIEVENTS__EVENTQUEUE_H
00026
00027 #ifdef HAVE_CONFIG_H
00028 # include "config.h"
00029 #endif
00030
00031 #include "Orb.h"
00032 #include "Filter.h"
00033
00034 #include <memory>
00035
00036 #ifdef HAVE_STD_STL
00037 using namespace std;
00038 #endif
00039
00040
00041 namespace OmniEvents {
00042
00043
00056 class EventQueue
00057 {
00058 public:
00059 class Reader
00060 {
00061 public:
00062 Reader(EventQueue& eventQueue);
00063 bool moreEvents() const;
00064 CORBA::Any* nextEvent();
00065 private:
00066 EventQueue& _eventQueue;
00067 int _next;
00068 };
00069
00070 EventQueue(long size=1023);
00071 virtual ~EventQueue();
00072 void setFilter(Filter* filter)
00073 {
00074 auto_ptr<Filter> f(filter);
00075 _filter=f;
00076 }
00077
00078 inline void append(CORBA::Any* event)
00079 {
00080 if(!_filter.get() || _filter->keep(*event))
00081 {
00082 delete _queue[_next];
00083 _queue[_next]=event;
00084 _next=(_next+1)%_size;
00085 }
00086 }
00087
00088 private:
00090 long _next;
00091 long _size;
00092 CORBA::Any** _queue;
00093 auto_ptr<Filter> _filter;
00094
00095 friend class Reader;
00096 };
00097
00098 };
00099
00100 #endif // OMNIEVENTS__EVENTQUEUE_H