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 char* string);
NzString& Append(const NzString& 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(char character, int start = 0, nzUInt32 flags = None) const;
bool Contains(const char* string, 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); inline NzString NzNumberToString(long long number, nzUInt8 radix = 10);
template<typename T> T NzRadians(T radians); template<typename T> T NzRadians(T radians);
template<typename T> T NzRadianToDegree(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> #include <Nazara/Math/Basic.inl>

View File

@ -195,7 +195,7 @@ NzString NzNumberToString(long long number, nzUInt8 radix)
if (number == 0) if (number == 0)
return '0'; return '0';
static const char* symbols("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); static const char* symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
bool negative; bool negative;
if (number < 0) if (number < 0)
@ -238,12 +238,16 @@ T NzRadianToDegree(T radians)
return radians * (180.0/M_PI); 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 NAZARA_MATH_SAFE
if (radix < 2 || radix > 36) if (radix < 2 || radix > 36)
{ {
NazaraError("Radix must be between 2 and 36"); NazaraError("Radix must be between 2 and 36");
if (ok)
*ok = false;
return 0; return 0;
} }
#endif #endif
@ -269,11 +273,18 @@ long long NzStringToNumber(NzString str, nzUInt8 radix)
else else
{ {
NazaraError("str is not a valid number"); NazaraError("str is not a valid number");
if (ok)
*ok = false;
return 0; return 0;
} }
} }
while (*++digit); while (*++digit);
if (ok)
*ok = true;
return (negative) ? -static_cast<long long>(total) : total; 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; 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) while(x <= n)
x <<= 1; x <<= 1;
@ -265,8 +266,16 @@ NzString& NzString::Append(const NzString& string)
return *this; return *this;
} }
void NzString::Clear() void NzString::Clear(bool keepBuffer)
{ {
if (keepBuffer)
{
ReleaseString();
m_sharedString->size = 0;
m_sharedString->string = nullptr;
}
else
ReleaseString(); ReleaseString();
} }
@ -3842,7 +3851,7 @@ bool NzString::ToBool(bool* value, nzUInt32 flags) const
bool NzString::ToDouble(double* value) const bool NzString::ToDouble(double* value) const
{ {
if (m_sharedString->size) if (m_sharedString->size == 0)
return false; return false;
if (value) if (value)
@ -3853,13 +3862,15 @@ bool NzString::ToDouble(double* value) const
bool NzString::ToInteger(long long* value, nzUInt8 base) const bool NzString::ToInteger(long long* value, nzUInt8 base) const
{ {
if (!IsNumber(base))
return false;
if (value) 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 NzString NzString::ToLower(nzUInt32 flags) const

View File

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