[Scummvm-cvs-logs] SF.net SVN: scummvm:[33246] scummvm/trunk

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Wed Jul 23 18:33:54 CEST 2008


Revision: 33246
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33246&view=rev
Author:   fingolfin
Date:     2008-07-23 16:33:53 +0000 (Wed, 23 Jul 2008)

Log Message:
-----------
Added convenience method String::makeUnique(); simplified String::operator=(char c); extended String unit tests

Modified Paths:
--------------
    scummvm/trunk/common/str.cpp
    scummvm/trunk/common/str.h
    scummvm/trunk/test/common/str.h

Modified: scummvm/trunk/common/str.cpp
===================================================================
--- scummvm/trunk/common/str.cpp	2008-07-23 14:45:14 UTC (rev 33245)
+++ scummvm/trunk/common/str.cpp	2008-07-23 16:33:53 UTC (rev 33246)
@@ -170,7 +170,8 @@
 }
 
 String& String::operator  =(char c) {
-	ensureCapacity(1, false);
+	decRefCount(_extern._refCount);
+	_str = _storage;
 	_len = 1;
 	_str[0] = c;
 	_str[1] = 0;
@@ -256,7 +257,7 @@
 	// Call ensureCapacity to make sure we actually *own* the storage
 	// to which _str points to -- we wouldn't want to modify a storage
 	// which other string objects are sharing, after all.
-	ensureCapacity(_len, true);
+	makeUnique();
 	while (p++ < _len)
 		_str[p-1] = _str[p];
 	_len--;
@@ -273,7 +274,7 @@
 void String::setChar(char c, uint32 p) {
 	assert(p <= _len);
 
-	ensureCapacity(_len, true);
+	makeUnique();
 	_str[p] = c;
 }
 
@@ -289,18 +290,22 @@
 
 void String::toLowercase() {
 	// Ensure that the string is not shared
-	ensureCapacity(_len, true);
+	makeUnique();
 	for (uint32 i = 0; i < _len; ++i)
 		_str[i] = tolower(_str[i]);
 }
 
 void String::toUppercase() {
 	// Ensure that the string is not shared
-	ensureCapacity(_len, true);
+	makeUnique();
 	for (uint32 i = 0; i < _len; ++i)
 		_str[i] = toupper(_str[i]);
 }
 
+void String::makeUnique() {
+	ensureCapacity(_len, true);
+}
+
 /**
  * Ensure that enough storage is available to store at least new_len
  * characters plus a null byte. In addition, if we currently share
@@ -370,7 +375,7 @@
 		return;
 
 	// Ensure that the string is not shared
-	ensureCapacity(_len, true);
+	makeUnique();
 
 	// Trim trailing whitespace
 	while (_len >= 1 && isspace(_str[_len-1]))

Modified: scummvm/trunk/common/str.h
===================================================================
--- scummvm/trunk/common/str.h	2008-07-23 14:45:14 UTC (rev 33245)
+++ scummvm/trunk/common/str.h	2008-07-23 16:33:53 UTC (rev 33246)
@@ -202,6 +202,7 @@
 	}
 
 protected:
+	void makeUnique();
 	void ensureCapacity(uint32 new_len, bool keep_old);
 	void incRefCount() const;
 	void decRefCount(int *oldRefCount);

Modified: scummvm/trunk/test/common/str.h
===================================================================
--- scummvm/trunk/test/common/str.h	2008-07-23 14:45:14 UTC (rev 33245)
+++ scummvm/trunk/test/common/str.h	2008-07-23 16:33:53 UTC (rev 33246)
@@ -61,43 +61,61 @@
 	}
 
 	void test_refCount(void) {
+		// using internal storage
 		Common::String foo1("foo");
-		Common::String foo2("foo");
+		Common::String foo2(foo1);
 		Common::String foo3(foo2);
 		foo3 += 'X';
-		TS_ASSERT_EQUALS(foo2, foo1);
+		TS_ASSERT_EQUALS(foo1, "foo");
 		TS_ASSERT_EQUALS(foo2, "foo");
 		TS_ASSERT_EQUALS(foo3, "foo""X");
+		foo2 = 'x';
+		TS_ASSERT_EQUALS(foo1, "foo");
+		TS_ASSERT_EQUALS(foo2, "x");
+		TS_ASSERT_EQUALS(foo3, "foo""X");
 	}
 
 	void test_refCount2(void) {
+		// using external storage
 		Common::String foo1("fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
-		Common::String foo2("fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
+		Common::String foo2(foo1);
 		Common::String foo3(foo2);
 		foo3 += 'X';
-		TS_ASSERT_EQUALS(foo2, foo1);
+		TS_ASSERT_EQUALS(foo1, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
 		TS_ASSERT_EQUALS(foo2, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
 		TS_ASSERT_EQUALS(foo3, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd""X");
+		foo2 = 'x';
+		TS_ASSERT_EQUALS(foo1, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
+		TS_ASSERT_EQUALS(foo2, "x");
+		TS_ASSERT_EQUALS(foo3, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd""X");
 	}
 
 	void test_refCount3(void) {
 		Common::String foo1("0123456789abcdefghijk");
-		Common::String foo2("0123456789abcdefghijk");
+		Common::String foo2(foo1);
 		Common::String foo3(foo2);
 		foo3 += "0123456789abcdefghijk";
-		TS_ASSERT_EQUALS(foo2, foo1);
+		TS_ASSERT_EQUALS(foo1, foo2);
 		TS_ASSERT_EQUALS(foo2, "0123456789abcdefghijk");
 		TS_ASSERT_EQUALS(foo3, "0123456789abcdefghijk""0123456789abcdefghijk");
+		foo2 = 'x';
+		TS_ASSERT_EQUALS(foo1, "0123456789abcdefghijk");
+		TS_ASSERT_EQUALS(foo2, "x");
+		TS_ASSERT_EQUALS(foo3, "0123456789abcdefghijk""0123456789abcdefghijk");
 	}
 
 	void test_refCount4(void) {
 		Common::String foo1("fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
-		Common::String foo2("fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
+		Common::String foo2(foo1);
 		Common::String foo3(foo2);
 		foo3 += "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd";
-		TS_ASSERT_EQUALS(foo2, foo1);
+		TS_ASSERT_EQUALS(foo1, foo2);
 		TS_ASSERT_EQUALS(foo2, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
 		TS_ASSERT_EQUALS(foo3, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd""fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
+		foo2 = 'x';
+		TS_ASSERT_EQUALS(foo1, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
+		TS_ASSERT_EQUALS(foo2, "x");
+		TS_ASSERT_EQUALS(foo3, "fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd""fooasdkadklasdjklasdjlkasjdlkasjdklasjdlkjasdasd");
 	}
 
 	void test_hasPrefix(void) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list