Added repetition constructors

Former-commit-id: ee33ef8aa01ec14a89f47b3581f86cfe499299b8
This commit is contained in:
Lynix 2014-03-06 09:24:38 +01:00
parent 24be314b86
commit ef9592a0fd
2 changed files with 92 additions and 17 deletions

View File

@ -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);

View File

@ -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);