]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Packet.hh
better string encoding in packets
[chaz/yoink] / src / Moof / Packet.hh
index 096f112ca063289f502dc7b5f60395188a1f8d70..00956126ea1185fb64b5e8eb7f2e5cd17edb38f0 100644 (file)
@@ -97,17 +97,31 @@ inline Packet& operator<<(Packet& packet, const char* value)
        return packet;
 }
 
        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 << (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;
 }
 
        return packet;
 }
 
+
 template <class T>
 inline Packet& operator<<(Packet& packet, const std::vector<T>& value)
 {
 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)
        {
        typename std::vector<T>::const_iterator it;
        for (it = value.begin(); it != value.end(); ++it)
        {
@@ -116,26 +130,14 @@ inline Packet& operator<<(Packet& packet, const std::vector<T>& value)
        return packet;
 }
 
        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)
 {
 template <class T>
 inline Packet& operator>>(Packet& packet, std::vector<T>& value)
 {
-       uint8_t size = 0;
+       uint16_t size = 0;
        packet >> size;
 
        value.clear();
        packet >> size;
 
        value.clear();
-       for (uint8_t i = 0; i < size; ++i)
+       for (uint16_t i = 0; i < size; ++i)
        {
                T item;
                packet >> item;
        {
                T item;
                packet >> item;
@@ -145,7 +147,6 @@ inline Packet& operator>>(Packet& packet, std::vector<T>& value)
 }
 
 
 }
 
 
-
 } // namespace Mf
 
 #endif // _MOOF_PACKET_HH_
 } // namespace Mf
 
 #endif // _MOOF_PACKET_HH_
This page took 0.017419 seconds and 4 git commands to generate.