NzString::Clear now takes an optional argument

Fixed NzString::ToDouble rejecting legal strings
NzString::Clear can now keep the internal buffer to improve performances
NzStringToNumber now takes an optional argument to check if the
conversion went well
Optimized NzString::ToInteger
This commit is contained in:
Lynix 2012-07-01 00:44:53 +02:00
parent d97e4a7f43
commit 7ed9e16664
5 changed files with 37 additions and 13 deletions

View File

@ -46,7 +46,7 @@ class NAZARA_API NzString : public NzHashable
NzString& Append(const char* string);
NzString& Append(const NzString& string);
void Clear();
void Clear(bool keepBuffer = false);
bool Contains(char character, int start = 0, nzUInt32 flags = None) const;
bool Contains(const char* string, int start = 0, nzUInt32 flags = None) const;

View File

@ -40,7 +40,7 @@ template<typename T> bool NzNumberEquals(T a, T b);
inline NzString NzNumberToString(long long number, nzUInt8 radix = 10);
template<typename T> T NzRadians(T radians);
template<typename T> T NzRadianToDegree(T radians);
inline long long NzStringToNumber(NzString str, nzUInt8 radix = 10);
inline long long NzStringToNumber(NzString str, nzUInt8 radix = 10, bool* ok = nullptr);
#include <Nazara/Math/Basic.inl>

View File

@ -195,7 +195,7 @@ NzString NzNumberToString(long long number, nzUInt8 radix)
if (number == 0)
return '0';
static const char* symbols("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
static const char* symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
bool negative;
if (number < 0)
@ -238,12 +238,16 @@ T NzRadianToDegree(T radians)
return radians * (180.0/M_PI);
}
long long NzStringToNumber(NzString str, nzUInt8 radix)
long long NzStringToNumber(NzString str, nzUInt8 radix, bool* ok)
{
#if NAZARA_MATH_SAFE
if (radix < 2 || radix > 36)
{
NazaraError("Radix must be between 2 and 36");
if (ok)
*ok = false;
return 0;
}
#endif
@ -269,11 +273,18 @@ long long NzStringToNumber(NzString str, nzUInt8 radix)
else
{
NazaraError("str is not a valid number");
if (ok)
*ok = false;
return 0;
}
}
while (*++digit);
if (ok)
*ok = true;
return (negative) ? -static_cast<long long>(total) : total;
}

View File

@ -22,6 +22,7 @@ inline unsigned int nzPow2(unsigned int n)
{
unsigned int x = 1;
// Tant que x est plus petit que n, on décale ses bits vers la gauche, ce qui revient à multiplier par deux
while(x <= n)
x <<= 1;
@ -265,9 +266,17 @@ NzString& NzString::Append(const NzString& string)
return *this;
}
void NzString::Clear()
void NzString::Clear(bool keepBuffer)
{
ReleaseString();
if (keepBuffer)
{
ReleaseString();
m_sharedString->size = 0;
m_sharedString->string = nullptr;
}
else
ReleaseString();
}
bool NzString::Contains(char character, int start, nzUInt32 flags) const
@ -3842,7 +3851,7 @@ bool NzString::ToBool(bool* value, nzUInt32 flags) const
bool NzString::ToDouble(double* value) const
{
if (m_sharedString->size)
if (m_sharedString->size == 0)
return false;
if (value)
@ -3853,13 +3862,15 @@ bool NzString::ToDouble(double* value) const
bool NzString::ToInteger(long long* value, nzUInt8 base) const
{
if (!IsNumber(base))
return false;
if (value)
*value = NzStringToNumber(*this, base);
{
bool ok;
*value = NzStringToNumber(*this, base, &ok);
return true;
return ok;
}
else
return IsNumber(base);
}
NzString NzString::ToLower(nzUInt32 flags) const

View File

@ -98,6 +98,7 @@ bool NzGLSLShader::Compile()
glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &length);
if (length > 1)
{
m_log.Clear(true);
m_log.Reserve(length+19-1); // La taille retournée est celle du buffer (Avec caractère de fin)
m_log.Prepend("Linkage error: ");
m_log.Resize(length+19-1); // Extension du buffer d'écriture pour ajouter le log
@ -129,7 +130,7 @@ bool NzGLSLShader::Create()
glBindAttribLocation(m_program, attribIndex[nzElementUsage_Diffuse], "Diffuse");
glBindAttribLocation(m_program, attribIndex[nzElementUsage_Tangent], "Tangent");
NzString uniformName = "TexCoordi";
NzString uniformName = "TexCoord*";
for (unsigned int i = 0; i < 8; ++i)
{
uniformName[8] = '0'+i;
@ -242,6 +243,7 @@ bool NzGLSLShader::Load(nzShaderType type, const NzString& source)
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
if (length > 1)
{
m_log.Clear(true);
m_log.Reserve(length+19-1); // La taille retournée est celle du buffer (Avec caractère de fin)
m_log.Prepend("Compilation error: ");
m_log.Resize(length+19-1); // Extension du buffer d'écriture pour ajouter le log