Improved ParameterList interface

Made it easier to handle errors and use default value


Former-commit-id: 1891efa0b0196b2c6602e52631e5e6cefb529137
This commit is contained in:
Lynix 2014-01-19 12:02:59 +01:00
parent 47959eaaeb
commit d05cc9ce0c
2 changed files with 88 additions and 174 deletions

View File

@ -24,13 +24,13 @@ class NAZARA_API NzParameterList
void Clear(); void Clear();
bool GetBooleanParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetBooleanParameter(const NzString& name, bool* value) const;
float GetFloatParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetFloatParameter(const NzString& name, float* value) const;
int GetIntegerParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetIntegerParameter(const NzString& name, int* value) const;
nzParameterType GetParameterType(const NzString& name, bool* existing = nullptr) const; bool GetParameterType(const NzString& name, nzParameterType* type) const;
void* GetPointerParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetPointerParameter(const NzString& name, void** value) const;
NzString GetStringParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetStringParameter(const NzString& name, NzString* value) const;
void* GetUserdataParameter(const NzString& name, bool* succeeded = nullptr) const; bool GetUserdataParameter(const NzString& name, void** value) const;
bool HasParameter(const NzString& name) const; bool HasParameter(const NzString& name) const;

View File

@ -32,14 +32,11 @@ void NzParameterList::Clear()
m_parameters.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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) if (it == m_parameters.end())
{ {
if (succeeded)
*succeeded = false;
NazaraError("Parameter \"" + name + "\" is not present"); NazaraError("Parameter \"" + name + "\" is not present");
return false; return false;
} }
@ -47,26 +44,20 @@ bool NzParameterList::GetBooleanParameter(const NzString& name, bool* succeeded)
switch (it->second.type) switch (it->second.type)
{ {
case nzParameterType_Boolean: case nzParameterType_Boolean:
if (succeeded) *value = it->second.value.boolVal;
*succeeded = true; return true;
return it->second.value.boolVal;
case nzParameterType_Integer: case nzParameterType_Integer:
if (succeeded) *value = (it->second.value.intVal != 0);
*succeeded = true; return true;
return (it->second.value.intVal != 0);
case nzParameterType_String: case nzParameterType_String:
{ {
bool value; bool converted;
if (it->second.value.stringVal.ToBool(&value, NzString::CaseInsensitive)) if (it->second.value.stringVal.ToBool(&converted, NzString::CaseInsensitive))
{ {
if (succeeded) *value = converted;
*succeeded = true; return true;
return value;
} }
break; break;
@ -79,48 +70,36 @@ bool NzParameterList::GetBooleanParameter(const NzString& name, bool* succeeded)
break; break;
} }
if (succeeded)
*succeeded = false;
NazaraError("Parameter value is not representable as a boolean"); NazaraError("Parameter value is not representable as a boolean");
return false; 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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) if (it == m_parameters.end())
{ {
if (succeeded)
*succeeded = false;
NazaraError("Parameter \"" + name + "\" is not present"); NazaraError("Parameter \"" + name + "\" is not present");
return std::numeric_limits<float>::quiet_NaN(); return false;
} }
switch (it->second.type) switch (it->second.type)
{ {
case nzParameterType_Float: case nzParameterType_Float:
if (succeeded) *value = it->second.value.floatVal;
*succeeded = true; return true;
return it->second.value.floatVal;
case nzParameterType_Integer: case nzParameterType_Integer:
if (succeeded) *value = it->second.value.intVal;
*succeeded = true; return true;
return it->second.value.intVal;
case nzParameterType_String: case nzParameterType_String:
{ {
double value; double converted;
if (it->second.value.stringVal.ToDouble(&value)) if (it->second.value.stringVal.ToDouble(&converted))
{ {
if (succeeded) *value = converted;
*succeeded = true; return true;
return value;
} }
break; break;
@ -133,56 +112,44 @@ float NzParameterList::GetFloatParameter(const NzString& name, bool* succeeded)
break; break;
} }
if (succeeded)
*succeeded = false;
NazaraError("Parameter value is not representable as a float"); NazaraError("Parameter value is not representable as a float");
return std::numeric_limits<float>::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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) if (it == m_parameters.end())
{ {
if (succeeded)
*succeeded = false;
NazaraError("Parameter \"" + name + "\" is not present"); NazaraError("Parameter \"" + name + "\" is not present");
return 0; return false;
} }
switch (it->second.type) switch (it->second.type)
{ {
case nzParameterType_Boolean: case nzParameterType_Boolean:
return (it->second.value.boolVal) ? 1 : 0; *value = (it->second.value.boolVal) ? 1 : 0;
return true;
case nzParameterType_Float: case nzParameterType_Float:
if (succeeded) *value = it->second.value.floatVal;
*succeeded = true; return true;
return it->second.value.floatVal;
case nzParameterType_Integer: case nzParameterType_Integer:
if (succeeded) *value = it->second.value.intVal;
*succeeded = true; return false;
return it->second.value.intVal;
case nzParameterType_String: case nzParameterType_String:
{ {
long long value; long long converted;
if (it->second.value.stringVal.ToInteger(&value)) if (it->second.value.stringVal.ToInteger(&converted))
{ {
if (value <= std::numeric_limits<int>::max() && value >= std::numeric_limits<int>::min()) if (converted <= std::numeric_limits<int>::max() && converted >= std::numeric_limits<int>::min())
{ {
if (succeeded) *value = converted;
*succeeded = true; return true;
return value;
} }
} }
break; break;
} }
@ -192,54 +159,39 @@ int NzParameterList::GetIntegerParameter(const NzString& name, bool* succeeded)
break; break;
} }
if (succeeded)
*succeeded = false;
NazaraError("Parameter value is not representable as a integer"); 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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) 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"); NazaraError("Parameter \"" + name + "\" is not present");
return nullptr; return false;
} }
switch (it->second.type) switch (it->second.type)
{ {
case nzParameterType_Pointer: case nzParameterType_Pointer:
if (succeeded) *value = it->second.value.ptrVal;
*succeeded = true; return true;
return it->second.value.ptrVal;
case nzParameterType_Userdata: case nzParameterType_Userdata:
if (succeeded) *value = it->second.value.userdataVal->ptr;
*succeeded = true; return true;
return it->second.value.userdataVal->ptr;
case nzParameterType_Boolean: case nzParameterType_Boolean:
case nzParameterType_Float: case nzParameterType_Float:
@ -249,111 +201,73 @@ void* NzParameterList::GetPointerParameter(const NzString& name, bool* succeeded
break; break;
} }
if (succeeded)
*succeeded = false;
NazaraError("Parameter value is not a pointer"); 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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) if (it == m_parameters.end())
{ {
if (succeeded)
*succeeded = false;
NazaraError("Parameter \"" + name + "\" is not present"); NazaraError("Parameter \"" + name + "\" is not present");
return NzString(); return false;
} }
switch (it->second.type) switch (it->second.type)
{ {
case nzParameterType_Boolean: case nzParameterType_Boolean:
if (succeeded) *value = NzString::Boolean(it->second.value.boolVal);
*succeeded = true; return true;
return NzString::Boolean(it->second.value.boolVal);
case nzParameterType_Float: case nzParameterType_Float:
if (succeeded) *value = NzString::Number(it->second.value.floatVal);
*succeeded = true; return true;
return NzString::Number(it->second.value.floatVal);
case nzParameterType_Integer: case nzParameterType_Integer:
if (succeeded) *value = NzString::Number(it->second.value.intVal);
*succeeded = true; return true;
return NzString::Number(it->second.value.intVal);
case nzParameterType_String: case nzParameterType_String:
if (succeeded) *value = it->second.value.stringVal;
*succeeded = true; return true;
return it->second.value.stringVal;
case nzParameterType_Pointer: case nzParameterType_Pointer:
if (succeeded) *value = NzString::Pointer(it->second.value.ptrVal);
*succeeded = true; return true;
return NzString::Pointer(it->second.value.ptrVal);
case nzParameterType_Userdata: case nzParameterType_Userdata:
if (succeeded) *value = NzString::Pointer(it->second.value.userdataVal->ptr);
*succeeded = true; return true;
return NzString::Pointer(it->second.value.userdataVal->ptr);
case nzParameterType_None: case nzParameterType_None:
if (succeeded) *value = NzString();
*succeeded = true; return true;
return NzString();
} }
if (succeeded)
*succeeded = false;
NazaraInternalError("Parameter value is not valid"); 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); auto it = m_parameters.find(name);
if (it == m_parameters.end()) if (it == m_parameters.end())
{ {
if (succeeded)
*succeeded = false;
NazaraError("Parameter \"" + name + "\" is not present"); 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; 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 bool NzParameterList::HasParameter(const NzString& name) const