Advertisement
Patasuss

Data

Sep 8th, 2017
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 KB | None | 0 0
  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4. #include <list>
  5. #include <vector>
  6. #include <stdexcept>
  7. #include <cstring>
  8. #include <memory>
  9.  
  10. void log(std::string location, std::string message) {
  11.     std::cout << "[" << location << "] " << message << std::endl;
  12. }
  13.  
  14. struct DataPacket {
  15.     DataPacket(const unsigned int packetSize) {data=new char[packetSize];}
  16.     ~DataPacket() {delete[] data;}
  17.     char* data;
  18. };
  19.  
  20. template<typename T>
  21. struct DataView {
  22.     DataView(T* pData, std::size_t pDataSize) : data(pData), dataSize(pDataSize) {}
  23.    
  24.     T& operator[](std::size_t pIndex) {
  25.         if(pIndex>=dataSize) {
  26.             throw std::runtime_error("DataView: Index out of bounds!");
  27.         }
  28.         return &data[pIndex];
  29.     }
  30.    
  31.     const T* data;
  32.     const std::size_t dataSize;
  33. };
  34.  
  35. class DataReader {
  36. public:
  37.     DataReader(DataView<char> pDataView) : dataView(pDataView), currentIndex(0) {}
  38.    
  39.     void resetIndex(std::size_t pNewIndex=0) {
  40.         currentIndex=pNewIndex;
  41.         if(currentIndex>=dataView.dataSize) {
  42.             throw std::runtime_error("DataReader: Set index out of DataView bounds!");
  43.         }
  44.     }
  45.     void advanceIndex(std::size_t pOffset) {currentIndex+=pOffset;}
  46.     bool hasMoreData() {return currentIndex<dataView.dataSize;}
  47.    
  48.    
  49.     template<typename T>
  50.     T read() {
  51.         T result = *(reinterpret_cast<T*>(&dataView[currentIndex]));
  52.         advanceIndex(sizeof(T));
  53.         return result;
  54.     }
  55.    
  56. private:
  57.     DataView<char> dataView;
  58.     std::size_t currentIndex;
  59. };
  60.  
  61. class DataWriter {
  62. public:
  63.     DataWriter(DataView<char> pDataView) : dataView(pDataView), currentIndex(0) {}
  64.    
  65.     void resetIndex(std::size_t pNewIndex=0) {
  66.         currentIndex=pNewIndex;
  67.         if(currentIndex>=dataView.dataSize) {
  68.             throw std::runtime_error("DataWriter: Set index out of DataView bounds!");
  69.         }
  70.     }
  71.     void advanceIndex(std::size_t pOffset) {currentIndex+=pOffset;}
  72.     bool hasMoreSpace() {return currentIndex<dataView.dataSize;}
  73.    
  74.     void writeBytes(const char* pData, std::size_t pNumBytes) {
  75.         for(std::size_t byteIndex=0; byteIndex<pNumBytes; ++byteIndex) {
  76.             dataView[currentIndex+byteIndex] = pData[byteIndex];
  77.         }
  78.         advanceIndex(pNumBytes);
  79.     }
  80.    
  81.     template<typename T>
  82.     void write(T pData) {
  83.         writeBytes(reinterpret_cast<char*>(&pData), sizeof(T));
  84.     }
  85.    
  86.     void write(std::string pStr) {
  87.         writeBytes(pStr.c_str(), pStr.size());
  88.     }
  89.    
  90. private:
  91.     DataView<char> dataView;
  92.     std::size_t currentIndex;
  93. };
  94.  
  95. using ListenerId_t = unsigned int;
  96. class NetworkListener {
  97. public:
  98.     NetworkListener(ListenerId_t pId) : id(pId) {}
  99.     virtual void receiveMessage(DataPacket* pPacket) = 0;
  100.    
  101.     const ListenerId_t id;
  102. };
  103.  
  104. class Network {
  105. public:
  106.     void addListener(NetworkListener* pListener) {listeners.push_back(pListener);}
  107.     void sendMessage(ListenerId_t pId, DataPacket* pPacket) {
  108.         for(auto listener : listeners) {
  109.             if(listener->id==pId) {
  110.                 listener->receiveMessage(pPacket);
  111.                 return;
  112.             }
  113.         }
  114.     }
  115.  
  116. private:
  117.     std::list<NetworkListener*> listeners;
  118. };
  119.  
  120. class Server : public NetworkListener {
  121.     Server(ListenerId_t pId) : NetworkListener(pId) {}
  122.    
  123.     void receiveMessage(DataPacket* pPacket) override  {
  124.         log("Server/receiveMessage", "Received Message!");
  125.     }
  126. };
  127.  
  128. class Client : public NetworkListener {
  129.     Client(ListenerId_t pId) : NetworkListener(pId) {}
  130.    
  131.     void receiveMessage(DataPacket* pPacket) override {
  132.         log("Client/receiveMessage", "Received Message!");
  133.     }
  134. };
  135.  
  136. void application() {
  137.     constexpr std::size_t bufferSize = 1000;
  138.     char buffer[bufferSize];
  139.     std::memset(buffer, 0, bufferSize);
  140.     DataView<char> bufferView(buffer, bufferSize);
  141.    
  142. }
  143.  
  144. int main()
  145. {
  146.     try {
  147.         application();
  148.     } catch(std::exception& e) {
  149.         log("Exception: ", e.what());
  150.     }
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement