summaryrefslogtreecommitdiff
path: root/src/misc
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc')
-rw-r--r--src/misc/blob.hpp12
-rw-r--r--src/misc/dbg_helpers.cpp6
-rw-r--r--src/misc/str.hpp28
3 files changed, 39 insertions, 7 deletions
diff --git a/src/misc/blob.hpp b/src/misc/blob.hpp
index d475231b6..e2e130d61 100644
--- a/src/misc/blob.hpp
+++ b/src/misc/blob.hpp
@@ -64,8 +64,12 @@ protected:
} ptr_u;
private:
- /** Just to silence an unsilencable GCC 4.4+ warning */
- static const CHdr hdrEmpty[];
+ /**
+ * Just to silence an unsilencable GCC 4.4+ warning
+ * Note: This cannot be 'const' as we do a lot of 'hdrEmpty[0]->m_size += 0;' and 'hdrEmpty[0]->m_max_size += 0;'
+ * after const_casting.
+ */
+ static CHdr hdrEmpty[];
public:
static const bsize_t Ttail_reserve = 4; ///< four extra bytes will be always allocated and zeroed at the end
@@ -117,13 +121,13 @@ protected:
/** blob header accessor - use it rather than using the pointer arithmetics directly - non-const version */
FORCEINLINE CHdr& Hdr()
{
- return ptr_u.m_pHdr_1[-1];
+ return *(ptr_u.m_pHdr_1 - 1);
}
/** blob header accessor - use it rather than using the pointer arithmetics directly - const version */
FORCEINLINE const CHdr& Hdr() const
{
- return ptr_u.m_pHdr_1[-1];
+ return *(ptr_u.m_pHdr_1 - 1);
}
/** return reference to the actual blob size - used when the size needs to be modified */
diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp
index 6a98680dc..c6018f0ec 100644
--- a/src/misc/dbg_helpers.cpp
+++ b/src/misc/dbg_helpers.cpp
@@ -109,7 +109,9 @@ bool DumpTarget::FindKnownName(size_t type_id, const void *ptr, CStrA &name)
void DumpTarget::WriteIndent()
{
int num_spaces = 2 * m_indent;
- memset(m_out.GrowSizeNC(num_spaces), ' ', num_spaces);
+ if (num_spaces > 0) {
+ memset(m_out.GrowSizeNC(num_spaces), ' ', num_spaces);
+ }
}
/** Write a line with indent at the beginning and <LF> at the end. */
@@ -175,4 +177,4 @@ void DumpTarget::EndStruct()
}
/** Just to silence an unsilencable GCC 4.4+ warning */
-/* static */ const CBlobBaseSimple::CHdr CBlobBaseSimple::hdrEmpty[] = {{0, 0}, {0, 0}};
+/* static */ CBlobBaseSimple::CHdr CBlobBaseSimple::hdrEmpty[] = {{0, 0}, {0, 0}};
diff --git a/src/misc/str.hpp b/src/misc/str.hpp
index 9a4663a6e..9204dbfb7 100644
--- a/src/misc/str.hpp
+++ b/src/misc/str.hpp
@@ -27,6 +27,12 @@ struct CStrA : public CBlobT<char>
{
}
+ /** Copy constructor */
+ FORCEINLINE CStrA(const CStrA &src) : base(src)
+ {
+ base::FixTail();
+ }
+
/** Take over ownership constructor */
FORCEINLINE CStrA(const OnTransfer& ot)
: base(ot)
@@ -50,14 +56,34 @@ struct CStrA : public CBlobT<char>
}
}
+ /** Append another CStrA. */
+ FORCEINLINE void Append(const CStrA &src)
+ {
+ if (src.RawSize() > 0) {
+ base::AppendRaw(src);
+ base::FixTail();
+ }
+ }
+
/** Assignment from C string. */
- FORCEINLINE CStrA& operator = (const char *src)
+ FORCEINLINE CStrA &operator = (const char *src)
{
base::Clear();
AppendStr(src);
return *this;
}
+ /** Assignment from another CStrA. */
+ FORCEINLINE CStrA &operator = (const CStrA &src)
+ {
+ if (&src != this) {
+ base::Clear();
+ base::AppendRaw(src);
+ base::FixTail();
+ }
+ return *this;
+ }
+
/** Lower-than operator (to support stl collections) */
FORCEINLINE bool operator < (const CStrA &other) const
{