From d05cc9ce0c0a9a9784217128c8344ed80dd215eb Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 19 Jan 2014 12:02:59 +0100 Subject: [PATCH] Improved ParameterList interface Made it easier to handle errors and use default value Former-commit-id: 1891efa0b0196b2c6602e52631e5e6cefb529137 --- include/Nazara/Core/ParameterList.hpp | 14 +- src/Nazara/Core/ParameterList.cpp | 248 +++++++++----------------- 2 files changed, 88 insertions(+), 174 deletions(-) diff --git a/include/Nazara/Core/ParameterList.hpp b/include/Nazara/Core/ParameterList.hpp index f77957af0..22eb2c3ae 100644 --- a/include/Nazara/Core/ParameterList.hpp +++ b/include/Nazara/Core/ParameterList.hpp @@ -24,13 +24,13 @@ class NAZARA_API NzParameterList void Clear(); - bool GetBooleanParameter(const NzString& name, bool* succeeded = nullptr) const; - float GetFloatParameter(const NzString& name, bool* succeeded = nullptr) const; - int GetIntegerParameter(const NzString& name, bool* succeeded = nullptr) const; - nzParameterType GetParameterType(const NzString& name, bool* existing = nullptr) const; - void* GetPointerParameter(const NzString& name, bool* succeeded = nullptr) const; - NzString GetStringParameter(const NzString& name, bool* succeeded = nullptr) const; - void* GetUserdataParameter(const NzString& name, bool* succeeded = nullptr) const; + bool GetBooleanParameter(const NzString& name, bool* value) const; + bool GetFloatParameter(const NzString& name, float* value) const; + bool GetIntegerParameter(const NzString& name, int* value) const; + bool GetParameterType(const NzString& name, nzParameterType* type) const; + bool GetPointerParameter(const NzString& name, void** value) const; + bool GetStringParameter(const NzString& name, NzString* value) const; + bool GetUserdataParameter(const NzString& name, void** value) const; bool HasParameter(const NzString& name) const; diff --git a/src/Nazara/Core/ParameterList.cpp b/src/Nazara/Core/ParameterList.cpp index 559db20cc..f934d0926 100644 --- a/src/Nazara/Core/ParameterList.cpp +++ b/src/Nazara/Core/ParameterList.cpp @@ -32,14 +32,11 @@ void NzParameterList::Clear() m_parameters.clear(); } -bool NzParameterList::GetBooleanParameter(const NzString& name, bool* succeeded) const +bool NzParameterList::GetBooleanParameter(const NzString& name, bool* value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); return false; } @@ -47,26 +44,20 @@ bool NzParameterList::GetBooleanParameter(const NzString& name, bool* succeeded) switch (it->second.type) { case nzParameterType_Boolean: - if (succeeded) - *succeeded = true; - - return it->second.value.boolVal; + *value = it->second.value.boolVal; + return true; case nzParameterType_Integer: - if (succeeded) - *succeeded = true; - - return (it->second.value.intVal != 0); + *value = (it->second.value.intVal != 0); + return true; case nzParameterType_String: { - bool value; - if (it->second.value.stringVal.ToBool(&value, NzString::CaseInsensitive)) + bool converted; + if (it->second.value.stringVal.ToBool(&converted, NzString::CaseInsensitive)) { - if (succeeded) - *succeeded = true; - - return value; + *value = converted; + return true; } break; @@ -79,48 +70,36 @@ bool NzParameterList::GetBooleanParameter(const NzString& name, bool* succeeded) break; } - if (succeeded) - *succeeded = false; - NazaraError("Parameter value is not representable as a boolean"); return false; } -float NzParameterList::GetFloatParameter(const NzString& name, bool* succeeded) const +bool NzParameterList::GetFloatParameter(const NzString& name, float* value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); - return std::numeric_limits::quiet_NaN(); + return false; } switch (it->second.type) { case nzParameterType_Float: - if (succeeded) - *succeeded = true; - - return it->second.value.floatVal; + *value = it->second.value.floatVal; + return true; case nzParameterType_Integer: - if (succeeded) - *succeeded = true; - - return it->second.value.intVal; + *value = it->second.value.intVal; + return true; case nzParameterType_String: { - double value; - if (it->second.value.stringVal.ToDouble(&value)) + double converted; + if (it->second.value.stringVal.ToDouble(&converted)) { - if (succeeded) - *succeeded = true; - - return value; + *value = converted; + return true; } break; @@ -133,56 +112,44 @@ float NzParameterList::GetFloatParameter(const NzString& name, bool* succeeded) break; } - if (succeeded) - *succeeded = false; - NazaraError("Parameter value is not representable as a float"); - return std::numeric_limits::quiet_NaN(); + return false; } -int NzParameterList::GetIntegerParameter(const NzString& name, bool* succeeded) const +bool NzParameterList::GetIntegerParameter(const NzString& name, int* value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); - return 0; + return false; } switch (it->second.type) { case nzParameterType_Boolean: - return (it->second.value.boolVal) ? 1 : 0; + *value = (it->second.value.boolVal) ? 1 : 0; + return true; case nzParameterType_Float: - if (succeeded) - *succeeded = true; - - return it->second.value.floatVal; + *value = it->second.value.floatVal; + return true; case nzParameterType_Integer: - if (succeeded) - *succeeded = true; - - return it->second.value.intVal; + *value = it->second.value.intVal; + return false; case nzParameterType_String: { - long long value; - if (it->second.value.stringVal.ToInteger(&value)) + long long converted; + if (it->second.value.stringVal.ToInteger(&converted)) { - if (value <= std::numeric_limits::max() && value >= std::numeric_limits::min()) + if (converted <= std::numeric_limits::max() && converted >= std::numeric_limits::min()) { - if (succeeded) - *succeeded = true; - - return value; + *value = converted; + return true; } } - break; } @@ -192,54 +159,39 @@ int NzParameterList::GetIntegerParameter(const NzString& name, bool* succeeded) break; } - if (succeeded) - *succeeded = false; - NazaraError("Parameter value is not representable as a integer"); - return 0; + return false; } -nzParameterType NzParameterList::GetParameterType(const NzString& name, bool* existing) const +bool NzParameterList::GetParameterType(const NzString& name, nzParameterType* type) const +{ + auto it = m_parameters.find(name); + if (it == m_parameters.end()) + return false; + + *type = it->second.type; + + return true; +} + +bool NzParameterList::GetPointerParameter(const NzString& name, void** value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (existing) - *existing = false; - - return nzParameterType_None; - } - - if (existing) - *existing = true; - - return it->second.type; -} - -void* NzParameterList::GetPointerParameter(const NzString& name, bool* succeeded) const -{ - auto it = m_parameters.find(name); - if (it == m_parameters.end()) - { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); - return nullptr; + return false; } switch (it->second.type) { case nzParameterType_Pointer: - if (succeeded) - *succeeded = true; + *value = it->second.value.ptrVal; + return true; - return it->second.value.ptrVal; case nzParameterType_Userdata: - if (succeeded) - *succeeded = true; - - return it->second.value.userdataVal->ptr; + *value = it->second.value.userdataVal->ptr; + return true; case nzParameterType_Boolean: case nzParameterType_Float: @@ -249,111 +201,73 @@ void* NzParameterList::GetPointerParameter(const NzString& name, bool* succeeded break; } - if (succeeded) - *succeeded = false; - NazaraError("Parameter value is not a pointer"); - return nullptr; + return false; } -NzString NzParameterList::GetStringParameter(const NzString& name, bool* succeeded) const +bool NzParameterList::GetStringParameter(const NzString& name, NzString* value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); - return NzString(); + return false; } switch (it->second.type) { case nzParameterType_Boolean: - if (succeeded) - *succeeded = true; - - return NzString::Boolean(it->second.value.boolVal); + *value = NzString::Boolean(it->second.value.boolVal); + return true; case nzParameterType_Float: - if (succeeded) - *succeeded = true; - - return NzString::Number(it->second.value.floatVal); + *value = NzString::Number(it->second.value.floatVal); + return true; case nzParameterType_Integer: - if (succeeded) - *succeeded = true; - - return NzString::Number(it->second.value.intVal); + *value = NzString::Number(it->second.value.intVal); + return true; case nzParameterType_String: - if (succeeded) - *succeeded = true; - - return it->second.value.stringVal; + *value = it->second.value.stringVal; + return true; case nzParameterType_Pointer: - if (succeeded) - *succeeded = true; - - return NzString::Pointer(it->second.value.ptrVal); + *value = NzString::Pointer(it->second.value.ptrVal); + return true; case nzParameterType_Userdata: - if (succeeded) - *succeeded = true; - - return NzString::Pointer(it->second.value.userdataVal->ptr); + *value = NzString::Pointer(it->second.value.userdataVal->ptr); + return true; case nzParameterType_None: - if (succeeded) - *succeeded = true; - - return NzString(); + *value = NzString(); + return true; } - if (succeeded) - *succeeded = false; - NazaraInternalError("Parameter value is not valid"); - return NzString(); + return false; } -void* NzParameterList::GetUserdataParameter(const NzString& name, bool* succeeded) const +bool NzParameterList::GetUserdataParameter(const NzString& name, void** value) const { auto it = m_parameters.find(name); if (it == m_parameters.end()) { - if (succeeded) - *succeeded = false; - NazaraError("Parameter \"" + name + "\" is not present"); + return false; + } + + if (it->second.type == nzParameterType_Userdata) + { + *value = it->second.value.userdataVal->ptr; + return true; + } + else + { + NazaraError("Parameter value is not an userdata"); return nullptr; } - - switch (it->second.type) - { - case nzParameterType_Userdata: - if (succeeded) - *succeeded = true; - - return it->second.value.userdataVal->ptr; - - case nzParameterType_Boolean: - case nzParameterType_Float: - case nzParameterType_Integer: - case nzParameterType_None: - case nzParameterType_Pointer: - case nzParameterType_String: - break; - } - - if (succeeded) - *succeeded = false; - - NazaraError("Parameter value is not an userdata"); - return nullptr; } bool NzParameterList::HasParameter(const NzString& name) const