messages.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include <unistd.h>
  2. #include <map>
  3. #include "messages.h"
  4. membuf::membuf( size_t size){// may use size max
  5. m_buffer.reserve(size);
  6. reset();
  7. }
  8. void membuf::reset(){
  9. m_cursor=sizeof m_cursor;
  10. m_buffer.resize(m_cursor);
  11. }
  12. membuf::~membuf(){
  13. }
  14. void membuf::write(const char* c,size_t s){
  15. size_t newsize(m_buffer.size()+s);
  16. m_buffer.resize(newsize);
  17. while(m_cursor<newsize){
  18. m_buffer[m_cursor++]=*(c++);
  19. }
  20. m_buffer[0]= (m_cursor>> 24);
  21. m_buffer[1]= (m_cursor>> 16);
  22. m_buffer[2]= (m_cursor>> 8);
  23. m_buffer[3]= (m_cursor);
  24. }
  25. void membuf::read(char*c ,size_t s){
  26. size_t nc(m_cursor+s);
  27. if(nc>m_buffer.size())
  28. return;
  29. while(m_cursor<nc){
  30. *(c++)=m_buffer[m_cursor++];
  31. }
  32. }
  33. const char* membuf::buffer() const{
  34. return m_buffer.data();
  35. }
  36. size_t membuf::size() const {
  37. return m_buffer.size();
  38. }
  39. void membuf::set(const char* i0, const char* i1) {
  40. reset();
  41. m_buffer.insert(m_buffer.begin()+sizeof m_cursor,i0,i1);
  42. }
  43. typedef pipeMessage* (*Factory)(membuf&);//avoid construct of first use issue
  44. static std::map<int,Factory> pipeMessages;
  45. void registerMessage(int id, pipeMessage* (*Factory)(membuf&)){
  46. pipeMessages[id]=Factory;
  47. }
  48. nullMessage::nullMessage():pipeMessage(){
  49. };
  50. nullMessage::~nullMessage(){
  51. };
  52. int nullMessage::id() const { return 0;}
  53. void nullMessage::serialize(membuf& out) const{
  54. }
  55. pipeMessage* nullMessage::create(membuf& in) {
  56. return new nullMessage();
  57. };
  58. pipeMessage* pipeMessage::deserialize(membuf& istr) {
  59. int classId(0);
  60. istr.read(reinterpret_cast<char*>(&classId),sizeof (int));
  61. if(pipeMessages.count(classId)==0) {
  62. return new nullMessage;
  63. }
  64. return pipeMessages[classId](istr);
  65. }
  66. pipeMessage::pipeMessage(){
  67. }
  68. pipeMessage::~pipeMessage(){
  69. }
  70. testMessage::testMessage(double d):pipeMessage(),m_data(d){
  71. };
  72. testMessage::~testMessage(){
  73. };
  74. pipeMessage* testMessage::create(membuf& in) {
  75. double d;
  76. in.read(reinterpret_cast<char*>(&d), sizeof d);
  77. return new testMessage(d);
  78. };
  79. int testMessage::id() const { return m_id;};
  80. void testMessage::serialize(membuf& out) const{
  81. out.write(reinterpret_cast<const char*>(&m_id),sizeof (int));
  82. out.write(reinterpret_cast<const char*>(&m_data),
  83. sizeof m_data);
  84. }
  85. double testMessage::data() const{
  86. return m_data;
  87. }
  88. lastMessage::lastMessage():pipeMessage(){
  89. };
  90. lastMessage::~lastMessage(){
  91. };
  92. pipeMessage* lastMessage::create(membuf& in) {
  93. return new lastMessage();
  94. };
  95. int lastMessage::id() const { return m_id;};
  96. void lastMessage::serialize(membuf& out) const{
  97. out.write(reinterpret_cast<const char*>(&m_id),sizeof (int));
  98. }
  99. int testMessage::m_id=1;
  100. int lastMessage::m_id=2;