1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
 * @file MessageQueue.h
 * @author <a href="mailto:xu@informatik.hu-berlin.de">Xu, Yuan</a>
 * 
 * A message queue for communicating
 */

#ifndef _MESSAGE_QUEUE_H_
#define _MESSAGE_QUEUE_H_

#include <string>
#include <queue>

class MessageReader;
class MessageWriter;

class MessageQueue
{
public:
  friend class MessageReader;
  friend class MessageWriter;

  MessageQueue();
  
  virtual ~MessageQueue();
  
protected:
  
  /* write message to the channel */
  virtual void write(const std::string& msg);
  
  /* is there any message in the channel */
  virtual bool empty();
  
  /* read one message from the channel */
  virtual std::string read();
  
  /* clear messages in the channel */
  virtual void clear();
  
  virtual void setReader(MessageReader* reader);
  
  virtual void setWriter(MessageWriter* writer);
  
protected:
  std::queue<std::string> theMsg;
  
  MessageReader* theReader;
  MessageWriter* theWriter;
};

class MessageReader
{
public:
  MessageReader(MessageQueue* msgQueue);
  
  virtual ~MessageReader();
  
  std::string read() { return theMsgQueue->read(); }
  
  bool empty() const { return theMsgQueue->empty(); }
  
private:
  MessageQueue* theMsgQueue;
};

class MessageWriter
{
public:
  MessageWriter(MessageQueue* msgQueue);
  
  virtual ~MessageWriter();
  
  void write(const std::string& msg) { theMsgQueue->write(msg); }
  
private:
  MessageQueue* theMsgQueue;
};

#endif