2
0
mikymod 12 жил өмнө
parent
commit
ed14a289b8

+ 1 - 0
engine/CMakeLists.txt

@@ -189,6 +189,7 @@ set (STRINGS_HEADERS
 	core/strings/StringUtils.h
 	core/strings/StringUtils.h
 	core/strings/StringStream.h
 	core/strings/StringStream.h
 	core/strings/Hash.h
 	core/strings/Hash.h
+	core/strings/DynamicString.h
 )
 )
 
 
 set (MEM_SRC
 set (MEM_SRC

+ 143 - 0
engine/core/strings/DynamicString.h

@@ -0,0 +1,143 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include <cstring>
+
+#include "Allocator.h"
+#include "StringUtils.h"
+#include "List.h"
+
+namespace crown
+{
+
+///
+class DynamicString
+{
+public:
+	///
+						DynamicString(Allocator& allocator);
+	///
+						DynamicString(Allocator& allocator, const char* s);
+	///
+						~DynamicString();
+	///
+	DynamicString&		operator+=(const DynamicString& s);
+	DynamicString&		operator+=(const char* s);
+	DynamicString&		operator+=(const char c);
+	///
+	DynamicString&		operator=(const DynamicString& s);
+	DynamicString&		operator=(const char* s);
+	DynamicString&		operator=(const char c);
+	///
+	const char*			c_str();
+
+private:
+
+	List<char>			m_string;
+};
+
+//-----------------------------------------------------------------------------
+inline DynamicString::DynamicString(Allocator& allocator) :
+	m_string(allocator)
+{
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString::DynamicString(Allocator& allocator, const char* s) :
+	m_string(allocator)
+{
+	m_string.push(s, string::strlen(s));
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString::~DynamicString()
+{
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator+=(const DynamicString& s)
+{
+	const char* tmp = s.m_string.begin();
+
+	return *this += tmp;
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator+=(const char* s)
+{
+	m_string.push(s, string::strlen(s));
+
+	return *this;
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator+=(const char c)
+{
+	m_string.push_back(c);
+
+	return *this;
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator=(const DynamicString& s)
+{
+	const char* tmp = s.m_string.begin();
+
+	return *this = tmp;
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator=(const char* s)
+{
+	m_string.clear();
+
+	m_string.push(s, string::strlen(s));
+
+	return *this;
+}
+
+//-----------------------------------------------------------------------------
+inline DynamicString& DynamicString::operator=(const char c)
+{
+	m_string.clear();
+
+	m_string.push_back(c);
+
+	return *this;
+}
+
+//-----------------------------------------------------------------------------
+inline const char* DynamicString::c_str()
+{
+	m_string.push_back('\0');
+	m_string.pop_back();
+
+	return m_string.begin();
+}
+
+} // namespace crown

+ 4 - 0
engine/tests/CMakeLists.txt

@@ -9,16 +9,20 @@ add_executable(containers containers.cpp)
 add_executable(compressors compressors.cpp)
 add_executable(compressors compressors.cpp)
 add_executable(strings strings.cpp)
 add_executable(strings strings.cpp)
 add_executable(paths paths.cpp)
 add_executable(paths paths.cpp)
+add_executable(dynamic_strings dynamic_strings.cpp)
 
 
 target_link_libraries(allocators crown)
 target_link_libraries(allocators crown)
 target_link_libraries(containers crown)
 target_link_libraries(containers crown)
 target_link_libraries(compressors crown)
 target_link_libraries(compressors crown)
 target_link_libraries(strings crown)
 target_link_libraries(strings crown)
 target_link_libraries(paths crown)
 target_link_libraries(paths crown)
+target_link_libraries(dynamic_strings crown)
 
 
 add_test(allocators-test ${EXECUTABLE_OUTPUT_PATH}/allocators)
 add_test(allocators-test ${EXECUTABLE_OUTPUT_PATH}/allocators)
 add_test(containers-test ${EXECUTABLE_OUTPUT_PATH}/containers)
 add_test(containers-test ${EXECUTABLE_OUTPUT_PATH}/containers)
 add_test(compressors-test ${EXECUTABLE_OUTPUT_PATH}/compressors)
 add_test(compressors-test ${EXECUTABLE_OUTPUT_PATH}/compressors)
 add_test(strings-test ${EXECUTABLE_OUTPUT_PATH}/strings)
 add_test(strings-test ${EXECUTABLE_OUTPUT_PATH}/strings)
 add_test(paths-test ${EXECUTABLE_OUTPUT_PATH}/paths)
 add_test(paths-test ${EXECUTABLE_OUTPUT_PATH}/paths)
+add_test(dynamic_string-test ${EXECUTABLE_OUTPUT_PATH}/dynamic_string)
+
 
 

+ 64 - 0
engine/tests/dynamic_strings.cpp

@@ -0,0 +1,64 @@
+#include "DynamicString.h"
+#include "Log.h"
+#include "Allocator.h"
+
+using namespace crown;
+
+//-----------------------------------------------------------------------------
+void creation_test()
+{
+	DynamicString string(default_allocator(), "Creation Test");
+	Log::i("%s", string.c_str());
+
+	string = "Creation Test OK!";
+	Log::i("%s", string.c_str());
+}
+
+//-----------------------------------------------------------------------------
+void equal_test()
+{
+	DynamicString string(default_allocator(), "Equal Test");
+	Log::i("%s", string.c_str());
+
+	DynamicString string1(default_allocator(), "DynamicString assigned!");	
+
+	string = string1;
+	Log::i("%s", string.c_str());
+
+	string = "C-string assigned";
+	Log::i("%s", string.c_str());
+
+	string = 'C';
+	Log::i("%s", string.c_str());
+
+	string = "Equal Test OK!";
+	Log::i("%s", string.c_str());
+}
+
+//-----------------------------------------------------------------------------
+void plus_equal_test()
+{
+	DynamicString string(default_allocator(), "PlusEqual Test");
+	DynamicString string1(default_allocator(), " DynamicString appended!");
+
+	string += string1;
+	Log::i("%s", string.c_str());
+
+	string += " C-string appended! ";
+	Log::i("%s", string.c_str());
+
+	string += 'C';
+	Log::i("%s", string.c_str());
+
+	string = "PlusEqual Test OK!";
+	Log::i("%s", string.c_str());
+}
+
+int main()
+{
+	creation_test();
+	equal_test();
+	plus_equal_test();
+
+	return 0;
+}