فهرست منبع

Refactored string<>bytebuffer conversions to functions in StringUtils and marked todo's for optimizing them.

Lasse Öörni 12 سال پیش
والد
کامیت
3eb3c1dc66
6فایلهای تغییر یافته به همراه39 افزوده شده و 24 حذف شده
  1. 2 2
      Engine/Container/Vector.h
  2. 25 0
      Engine/Core/StringUtils.cpp
  3. 6 0
      Engine/Core/StringUtils.h
  4. 2 10
      Engine/Core/Variant.cpp
  5. 2 2
      Engine/IO/MemoryBuffer.cpp
  6. 2 10
      Engine/Resource/XMLElement.cpp

+ 2 - 2
Engine/Container/Vector.h

@@ -351,9 +351,9 @@ public:
     /// Return const iterator to the end.
     ConstIterator End() const { return ConstIterator(Buffer() + size_); }
     /// Return first element.
-    T& Front() { return Buffer()[0]; }
+    T& Front() { assert(size_); return Buffer()[0]; }
     /// Return const first element.
-    const T& Front() const { return Buffer()[0]; }
+    const T& Front() const { assert(size_); return Buffer()[0]; }
     /// Return last element.
     T& Back() { assert(size_); return Buffer()[size_ - 1]; }
     /// Return const last element.

+ 25 - 0
Engine/Core/StringUtils.cpp

@@ -356,6 +356,31 @@ String ToStringHex(unsigned value)
     return String(tempBuffer);
 }
 
+void BufferToString(String& dest, const void* data, unsigned size)
+{
+    /// \todo Optimize, resize the string only once
+    const unsigned char* bytes = (const unsigned char*)data;
+    dest.Clear();
+    
+    for (unsigned i = 0; i < size; ++i)
+        dest += String((unsigned)bytes[i]) + " ";
+}
+
+void StringToBuffer(PODVector<unsigned char>& dest, const String& source)
+{
+    StringToBuffer(dest, source.CString());
+}
+
+void StringToBuffer(PODVector<unsigned char>& dest, const char* source)
+{
+    /// \todo Optimize, parse the string in-place without splitting
+    Vector<String> bytes = String::Split(source, ' ');
+    
+    dest.Resize(bytes.Size());
+    for (unsigned i = 0; i < bytes.Size(); ++i)
+        dest[i] = ToInt(bytes[i]);
+}
+
 unsigned GetStringListIndex(const String& value, const String* strings, unsigned defaultIndex, bool caseSensitive)
 {
     return GetStringListIndex(value.CString(), strings, defaultIndex, caseSensitive);

+ 6 - 0
Engine/Core/StringUtils.h

@@ -83,6 +83,12 @@ Vector4 ToVector4(const char* source, bool allowMissingCoords = false);
 String ToString(void* value);
 /// Convert an unsigned integer to string as hexadecimal.
 String ToStringHex(unsigned value);
+/// Convert a byte buffer to a string.
+void BufferToString(String& dest, const void* data, unsigned size);
+/// Convert a string to a byte buffer.
+void StringToBuffer(PODVector<unsigned char>& dest, const String& source);
+/// Convert a C string to a byte buffer.
+void StringToBuffer(PODVector<unsigned char>& dest, const char* source);
 /// Return an index to a string list corresponding to the given string, or a default value if not found. The string list must be empty-terminated.
 unsigned GetStringListIndex(const String& value, const String* strings, unsigned defaultIndex, bool caseSensitive = false);
 /// Return an index to a string list corresponding to the given C string, or a default value if not found. The string list must be empty-terminated.

+ 2 - 10
Engine/Core/Variant.cpp

@@ -216,10 +216,7 @@ void Variant::FromString(VariantType type, const char* value)
         {
             SetType(VAR_BUFFER);
             PODVector<unsigned char>& buffer = *(reinterpret_cast<PODVector<unsigned char>*>(&value_));
-            Vector<String> values = String::Split(value, ' ');
-            buffer.Resize(values.Size());
-            for (unsigned i = 0; i < values.Size(); ++i)
-                buffer[i] = ToInt(values[i]);
+            StringToBuffer(buffer, value);
         }
         break;
 
@@ -320,12 +317,7 @@ String Variant::ToString() const
         {
             const PODVector<unsigned char>& buffer = *(reinterpret_cast<const PODVector<unsigned char>*>(&value_));
             String ret;
-            for (PODVector<unsigned char>::ConstIterator i = buffer.Begin(); i != buffer.End(); ++i)
-            {
-                if (i != buffer.Begin())
-                    ret += " ";
-                ret += String((unsigned)*i);
-            }
+            BufferToString(ret, buffer.Begin().ptr_, buffer.Size());
             return ret;
         }
 

+ 2 - 2
Engine/IO/MemoryBuffer.cpp

@@ -50,14 +50,14 @@ MemoryBuffer::MemoryBuffer(const void* data, unsigned size) :
 
 MemoryBuffer::MemoryBuffer(PODVector<unsigned char>& data) :
     Deserializer(data.Size()),
-    buffer_(data.Size() ? &data[0] : 0),
+    buffer_(data.Begin().ptr_),
     readOnly_(false)
 {
 }
 
 MemoryBuffer::MemoryBuffer(const PODVector<unsigned char>& data) :
     Deserializer(data.Size()),
-    buffer_(data.Size() ? const_cast<unsigned char*>(&data[0]) : 0),
+    buffer_(data.Begin().ptr_),
     readOnly_(true)
 {
 }

+ 2 - 10
Engine/Resource/XMLElement.cpp

@@ -270,11 +270,7 @@ bool XMLElement::SetBoundingBox(const BoundingBox& value)
 bool XMLElement::SetBuffer(const String& name, const void* data, unsigned size)
 {
     String dataStr;
-    const unsigned char* bytes = (const unsigned char*)data;
-
-    for (unsigned i = 0; i < size; ++i)
-        dataStr += String((unsigned)bytes[i]) + " ";
-
+    BufferToString(dataStr, data, size);
     return SetAttribute(name, dataStr);
 }
 
@@ -635,11 +631,7 @@ BoundingBox XMLElement::GetBoundingBox() const
 PODVector<unsigned char> XMLElement::GetBuffer(const String& name) const
 {
     PODVector<unsigned char> ret;
-    Vector<String> bytes = GetAttribute(name).Split(' ');
-
-    ret.Resize(bytes.Size());
-    for (unsigned i = 0; i < bytes.Size(); ++i)
-        ret[i] = ToInt(bytes[i]);
+    StringToBuffer(ret, GetAttribute(name));
     return ret;
 }