message.hpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef DIST_MESSAGE_HPP
  2. #define DIST_MESSAGE_HPP
  3. #include <iostream>
  4. #include <cassert>
  5. #include <cstdint>
  6. #include <cstring>
  7. #include "task.hpp"
  8. #define MAX_MSG_SIZE 65536
  9. enum MessageType : char{UNKOWN,CODE,STRING,INTEGER,DATA};
  10. using Integer=int64_t;
  11. using namespace std;
  12. struct Data{
  13. char* buffer;
  14. size_t size;
  15. };
  16. class Message{
  17. private:
  18. size_t csize;
  19. public:
  20. char buffer[MAX_MSG_SIZE];
  21. size_t size;
  22. void set_code(char c);
  23. void set_string(string s);
  24. void set_integer(Integer i);
  25. void set_data(const char* buffer,size_t s);
  26. void clear();
  27. bool add(char l);
  28. bool add_to_code(char l);
  29. bool add_to_string(char l);
  30. bool add_to_integer(char l);
  31. bool add_to_data(char l);
  32. MessageType get_type();
  33. char get_code();
  34. string get_string();
  35. Integer get_integer();
  36. size_t get_data_size();
  37. char* get_data_buffer();
  38. };
  39. inline void
  40. Message::set_code(char c){
  41. size=2;
  42. buffer[0]=CODE;
  43. buffer[1]=c;
  44. }
  45. inline void
  46. Message::clear(){
  47. csize=0;
  48. size=0;
  49. }
  50. inline MessageType
  51. Message::get_type(){
  52. return (MessageType)buffer[0];
  53. }
  54. inline char
  55. Message::get_code(){
  56. assert(buffer[0]==CODE);
  57. return buffer[1];
  58. }
  59. inline string
  60. Message::get_string(){
  61. assert(buffer[0]==STRING);
  62. size_t s=size-3;
  63. return string(&buffer[3],s);
  64. }
  65. inline Integer
  66. Message::get_integer(){
  67. assert(buffer[0]==INTEGER);
  68. Integer i;
  69. memcpy(&i,&buffer[1],sizeof(Integer));
  70. return i;
  71. }
  72. #endif