Blackboard.h

00001 
00002 #ifndef BLACK_BOARD_H
00003 #define BLACK_BOARD_H
00004 
00005 #ifdef _MSC_VER
00006 #pragma warning(disable : 4786)
00007 #endif
00008 
00009 #include <omnetpp.h>
00010 #include <vector>
00011 #include <string>
00012 #include "ImNotifiable.h"
00060 class Blackboard : public cSimpleModule
00061 {
00062 protected:
00063 
00065     class Subscriber {
00066     public:
00068         ImNotifiable *client;
00070         int scopeModuleId;
00071         public:
00073         Subscriber(ImNotifiable *c=0, int b=-1) :
00074             client(c), scopeModuleId(b) {};
00075     };
00076 
00079     typedef std::vector<Subscriber> SubscriberVector;
00080     typedef std::vector<SubscriberVector> ClientVector;
00081 
00082     typedef std::vector<const char* > CategoryDescriptions;
00083 
00084     typedef std::vector<int> ParentVector;
00085 
00086     typedef ClientVector::iterator ClientVectorIter;
00087     typedef CategoryDescriptions::iterator DescriptionsIter;
00088     typedef ParentVector::iterator ParentVectorIter;
00091     ClientVector clientVector;
00092     CategoryDescriptions categoryDescriptions;
00093     ParentVector parentVector;
00094 
00095     int nextCategory;
00096 
00097     friend std::ostream& operator<<(std::ostream&, const SubscriberVector&);
00098 
00099     bool coreDebug;
00100 
00101 protected:
00102 
00106     const char* categoryName(int category);
00111     int findAndCreateDescription(bool *isNewEntry, const BBItem *category);
00112 
00118     void fillParentVector(const BBItem *category, int cat);
00119 
00120  public:
00122     void handleMessage(cMessage *msg);
00123 
00125     virtual void initialize(int);
00126 
00127     Blackboard():
00128       nextCategory(0)
00129   {}
00130 
00131     virtual ~Blackboard();
00132 
00133 
00145     int subscribe(ImNotifiable *client, const BBItem *category, int scopeModuleId=-1);
00157     int subscribe(ImNotifiable *client, int category, int scopeModuleId=-1);
00161     void unsubscribe(ImNotifiable *client, int category);
00163 
00188     void publishBBItem(int category, const BBItem* details, int scopeModuleId);
00189 
00194     int  getCategory(const BBItem* details);
00196 
00198     virtual int numInitStages() const {
00199     return 2;
00200   }
00201 };
00202 
00203 #endif
00204