changeset 14563:9bc562461fcf draft

(svn r19134) -Fix (r16983, r17219): YAPF debug output was quite broken.
author frosch <frosch@openttd.org>
date Sun, 14 Feb 2010 18:33:57 +0000
parents 5ccc732d3142
children 5158a4ab5ef1
files src/misc/blob.hpp src/misc/dbg_helpers.cpp src/misc/str.hpp
diffstat 3 files changed, 39 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc/blob.hpp
+++ b/src/misc/blob.hpp
@@ -64,8 +64,12 @@
 	} 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 @@
 	/** 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 */
--- a/src/misc/dbg_helpers.cpp
+++ b/src/misc/dbg_helpers.cpp
@@ -109,7 +109,9 @@
 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 @@
 }
 
 /** 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}};
--- a/src/misc/str.hpp
+++ b/src/misc/str.hpp
@@ -27,6 +27,12 @@
 	{
 	}
 
+	/** 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 @@
 		}
 	}
 
+	/** 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
 	{