From ef9592a0fd1e569040d03cd3ffee1be5ecee2aaf Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 6 Mar 2014 09:24:38 +0100 Subject: [PATCH] Added repetition constructors Former-commit-id: ee33ef8aa01ec14a89f47b3581f86cfe499299b8 --- include/Nazara/Core/String.hpp | 10 +++- src/Nazara/Core/String.cpp | 99 ++++++++++++++++++++++++++++------ 2 files changed, 92 insertions(+), 17 deletions(-) diff --git a/include/Nazara/Core/String.hpp b/include/Nazara/Core/String.hpp index 75470bea3..73253fa95 100644 --- a/include/Nazara/Core/String.hpp +++ b/include/Nazara/Core/String.hpp @@ -33,7 +33,10 @@ class NAZARA_API NzString : public NzHashable NzString(); explicit NzString(char character); - explicit NzString(unsigned int length, char character); + NzString(unsigned int rep, char character); + NzString(unsigned int rep, const char* string); + NzString(unsigned int rep, const char* string, unsigned int length); + NzString(unsigned int rep, const NzString& string); NzString(const char* string); NzString(const char* string, unsigned int length); NzString(const std::string& string); @@ -125,7 +128,10 @@ class NAZARA_API NzString : public NzHashable NzString Reversed() const; NzString& Set(char character); - NzString& Set(unsigned int length, char character); + NzString& Set(unsigned int rep, char character); + NzString& Set(unsigned int rep, const char* string); + NzString& Set(unsigned int rep, const char* string, unsigned int length); + NzString& Set(unsigned int rep, const NzString& string); NzString& Set(const char* string); NzString& Set(const char* string, unsigned int length); NzString& Set(const std::string& string); diff --git a/src/Nazara/Core/String.cpp b/src/Nazara/Core/String.cpp index b2ea4cd30..b3c1ed821 100644 --- a/src/Nazara/Core/String.cpp +++ b/src/Nazara/Core/String.cpp @@ -90,24 +90,54 @@ NzString::NzString(char character) m_sharedString = &emptyString; } -NzString::NzString(unsigned int length, char character) +NzString::NzString(unsigned int rep, char character) { - if (length > 0) + if (rep > 0) { m_sharedString = new SharedString; - m_sharedString->capacity = length; - m_sharedString->size = length; - m_sharedString->string = new char[length+1]; + m_sharedString->capacity = rep; + m_sharedString->size = rep; + m_sharedString->string = new char[rep+1]; if (character != '\0') - std::memset(m_sharedString->string, character, length); + std::memset(m_sharedString->string, character, rep); - m_sharedString->string[length] = '\0'; + m_sharedString->string[rep] = '\0'; } else m_sharedString = &emptyString; } +NzString::NzString(unsigned int rep, const char* string) : +NzString(rep, string, (string) ? std::strlen(string) : 0) +{ +} + +NzString::NzString(unsigned int rep, const char* string, unsigned int length) +{ + unsigned int totalSize = rep*length; + + if (totalSize > 0) + { + m_sharedString = new SharedString; + m_sharedString->capacity = totalSize; + m_sharedString->size = totalSize; + m_sharedString->string = new char[totalSize+1]; + + for (unsigned int i = 0; i < rep; ++i) + std::memcpy(&m_sharedString->string[i*length], string, length); + + m_sharedString->string[totalSize] = '\0'; + } + else + m_sharedString = &emptyString; +} + +NzString::NzString(unsigned int rep, const NzString& string) : +NzString(rep, string.m_sharedString->string, string.m_sharedString->size) +{ +} + NzString::NzString(const char* string) : NzString(string, (string) ? std::strlen(string) : 0) { @@ -2655,26 +2685,26 @@ NzString& NzString::Set(char character) return *this; } -NzString& NzString::Set(unsigned int length, char character) +NzString& NzString::Set(unsigned int rep, char character) { - if (length > 0) + if (rep > 0) { - if (m_sharedString->capacity >= length) + if (m_sharedString->capacity >= rep) EnsureOwnership(true); else { ReleaseString(); m_sharedString = new SharedString; - m_sharedString->capacity = length; - m_sharedString->string = new char[length+1]; + m_sharedString->capacity = rep; + m_sharedString->string = new char[rep+1]; } - m_sharedString->size = length; + m_sharedString->size = rep; if (character != '\0') - std::memset(m_sharedString->string, character, length); + std::memset(m_sharedString->string, character, rep); - m_sharedString->string[length] = '\0'; + m_sharedString->string[rep] = '\0'; } else ReleaseString(); @@ -2682,6 +2712,45 @@ NzString& NzString::Set(unsigned int length, char character) return *this; } +NzString& NzString::Set(unsigned int rep, const char* string) +{ + return Set(rep, string, (string) ? std::strlen(string) : 0); +} + +NzString& NzString::Set(unsigned int rep, const char* string, unsigned int length) +{ + unsigned int totalSize = rep*length; + + if (totalSize > 0) + { + if (m_sharedString->capacity >= totalSize) + EnsureOwnership(true); + else + { + ReleaseString(); + m_sharedString = new SharedString; + m_sharedString->capacity = totalSize; + m_sharedString->string = new char[totalSize+1]; + } + + m_sharedString->size = totalSize; + + for (unsigned int i = 0; i < rep; ++i) + std::memcpy(&m_sharedString->string[i*length], string, length); + + m_sharedString->string[totalSize] = '\0'; + } + else + ReleaseString(); + + return *this; +} + +NzString& NzString::Set(unsigned int rep, const NzString& string) +{ + return Set(rep, string.m_sharedString->string, string.m_sharedString->size); +} + NzString& NzString::Set(const char* string) { return Set(string, (string) ? std::strlen(string) : 0);