#include <string>
#include <vector>
-#include <boost/shared_array.hpp>
+
+#ifndef PAGE_SIZE
+#define PAGE_SIZE 4096
+#endif
namespace Mf {
{
public:
- Packet(size_t size = 1024);
+ Packet(size_t size = PAGE_SIZE);
Packet(const char* data, size_t size);
+ Packet(const Packet& copy);
+ Packet& operator=(const Packet& copy);
+
+ ~Packet();
+
Packet& operator<<(bool value);
Packet& operator<<(int8_t value);
Packet& operator<<(int16_t value);
size_t read(void* bytes, size_t size);
+ void clear();
+
+
const char* bytes() const
{
- return &mBuffer.get()[mR];
+ return mBuffer + mR;
}
size_t size() const
private:
- boost::shared_array<char> mBuffer;
- size_t mSize;
+ char* mBuffer;
+ size_t mSize;
- size_t mR;
- size_t mW;
+ size_t mR;
+ size_t mW;
- size_t mBoolR;
- size_t mBoolW;
- size_t mBoolNumR;
- size_t mBoolNumW;
+ size_t mBoolR;
+ size_t mBoolW;
+ size_t mBoolNumR;
+ size_t mBoolNumW;
};
return packet;
}
-inline Packet& operator<<(Packet& packet, const std::string& value)
+template <class T>
+inline Packet& operator<<(Packet& packet, const std::basic_string<T>& value)
{
packet << (uint16_t)value.length();
- packet.write(value.c_str(), value.length());
+ packet.write(value.data(), value.length() * sizeof(T));
+ return packet;
+}
+
+template <class T>
+inline Packet& operator>>(Packet& packet, std::basic_string<T>& value)
+{
+ uint16_t length = 0;
+ packet >> length;
+
+ T str[length];
+ size_t charsRead = packet.read(str, length * sizeof(T));
+ value.assign(str, charsRead);
return packet;
}
+
template <class T>
inline Packet& operator<<(Packet& packet, const std::vector<T>& value)
{
- packet << (uint8_t)value.size();
+ packet << (uint16_t)value.size();
typename std::vector<T>::const_iterator it;
for (it = value.begin(); it != value.end(); ++it)
{
return packet;
}
-
-inline Packet& operator>>(Packet& packet, std::string& value)
-{
- uint8_t length = 0;
- packet >> length;
-
- char str[256];
- size_t charsRead = packet.read(str, length);
- value.assign(str, charsRead);
- return packet;
-}
-
template <class T>
inline Packet& operator>>(Packet& packet, std::vector<T>& value)
{
- uint8_t size = 0;
+ uint16_t size = 0;
packet >> size;
value.clear();
- for (uint8_t i = 0; i < size; ++i)
+ for (uint16_t i = 0; i < size; ++i)
{
T item;
packet >> item;
}
-
} // namespace Mf
#endif // _MOOF_PACKET_HH_