diff --git a/src/misc/blob.hpp b/src/misc/blob.hpp index ed8c52ac64..6c271cdcfd 100644 --- a/src/misc/blob.hpp +++ b/src/misc/blob.hpp @@ -74,6 +74,12 @@ public: /** default constructor - initializes empty blob */ FORCEINLINE ByteBlob() { InitEmpty(); } + /** copy constructor */ + FORCEINLINE ByteBlob(const ByteBlob &src) { + InitEmpty(); + AppendRaw(src); + } + /** move constructor - take ownership of blob data */ FORCEINLINE ByteBlob(BlobHeader * const & src) { @@ -216,6 +222,14 @@ public: } } + /** append bytes from given source blob to the end of existing data bytes - reallocates if necessary */ + FORCEINLINE void AppendRaw(const ByteBlob& src) + { + if (!src.IsEmpty()) { + memcpy(Append(src.Length()), src.Begin(), src.Length()); + } + } + /** Reallocate if there is no free space for num_bytes bytes. * @return pointer to the new data to be added */ FORCEINLINE byte *Prepare(uint num_bytes) diff --git a/src/misc/str.hpp b/src/misc/str.hpp index c0388852bc..44595e9a6b 100644 --- a/src/misc/str.hpp +++ b/src/misc/str.hpp @@ -56,6 +56,15 @@ struct CStrA : public CBlobT } } + /** Append another CStrA. */ + FORCEINLINE void Append(const CStrA &src) + { + if (src.Length() > 0) { + base::AppendRaw(src); + base::FixTail(); + } + } + /** Assignment from C string. */ FORCEINLINE CStrA &operator = (const char *src) {