X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fprops.cxx;h=fdabb24ca44bd2f5afdd868f93908e6a0e2fcce9;hb=2c4a0dd9985121cbb98c79ea1832360f163f9d4e;hp=b59191271185ea4715ad1b0c1835b80a5d940ceb;hpb=a1bf8d22297416de9524370f4c0d4f0f0c9e89d4;p=simgear.git diff --git a/simgear/misc/props.cxx b/simgear/misc/props.cxx index b5919127..fdabb24c 100644 --- a/simgear/misc/props.cxx +++ b/simgear/misc/props.cxx @@ -264,7 +264,7 @@ SGValue::getBoolValue () const return (getRawDouble() == 0.0 ? false : true); case UNKNOWN: case STRING: - return ((getRawString() == "false" || getIntValue() == 0) ? false : true); + return ((getRawString() == "true" || getIntValue() != 0) ? true : false); } return false; } @@ -389,12 +389,24 @@ SGValue::getStringValue () const bool SGValue::setBoolValue (bool value) { - if (_type == UNKNOWN || _type == BOOL) { - _type = BOOL; + if (_type == UNKNOWN) + _type = INT; + switch (_type) { + case BOOL: return setRawBool(value); - } else { - return false; + case INT: + return setRawInt((int)value); + case FLOAT: + return setRawFloat((float)value); + case DOUBLE: + return setRawDouble((double)value); + case STRING: + if (value) + return setRawString("true"); + else + return setRawString("false"); } + return false; } @@ -406,12 +418,26 @@ SGValue::setBoolValue (bool value) bool SGValue::setIntValue (int value) { - if (_type == UNKNOWN || _type == INT) { + if (_type == UNKNOWN) _type = INT; + switch (_type) { + case BOOL: + if (value == 0) + return setRawBool(false); + else + return setRawBool(true); + case INT: return setRawInt(value); - } else { - return false; + case FLOAT: + return setRawFloat((float)value); + case DOUBLE: + return setRawDouble((double)value); + case STRING: + char buf[128]; + sprintf(buf, "%d", value); + return setRawString(buf); } + return false; } @@ -423,12 +449,26 @@ SGValue::setIntValue (int value) bool SGValue::setFloatValue (float value) { - if (_type == UNKNOWN || _type == FLOAT) { + if (_type == UNKNOWN) _type = FLOAT; + switch (_type) { + case BOOL: + if (value == 0.0) + return setRawBool(false); + else + return setRawBool(true); + case INT: + return setRawInt((int)value); + case FLOAT: return setRawFloat(value); - } else { - return false; + case DOUBLE: + return setRawDouble((double)value); + case STRING: + char buf[128]; + sprintf(buf, "%f", value); + return setRawString(buf); } + return false; } @@ -440,12 +480,26 @@ SGValue::setFloatValue (float value) bool SGValue::setDoubleValue (double value) { - if (_type == UNKNOWN || _type == DOUBLE) { + if (_type == UNKNOWN) _type = DOUBLE; + switch (_type) { + case BOOL: + if (value == 0.0L) + return setRawBool(false); + else + return setRawBool(true); + case INT: + return setRawInt((int)value); + case FLOAT: + return setRawFloat((float)value); + case DOUBLE: return setRawDouble(value); - } else { - return false; + case STRING: + char buf[128]; + sprintf(buf, "%lf", value); + return setRawString(buf); } + return false; } @@ -457,12 +511,25 @@ SGValue::setDoubleValue (double value) bool SGValue::setStringValue (const string &value) { - if (_type == UNKNOWN || _type == STRING) { + if (_type == UNKNOWN) _type = STRING; + + switch (_type) { + case BOOL: + if (value == "true" || atoi(value.c_str()) != 0) + return setRawBool(true); + else + return setRawBool(false); + case INT: + return setRawInt(atoi(value.c_str())); + case FLOAT: + return setRawFloat(atof(value.c_str())); + case DOUBLE: + return setRawDouble(atof(value.c_str())); + case STRING: return setRawString(value); - } else { - return false; } + return false; } @@ -474,11 +541,23 @@ SGValue::setStringValue (const string &value) bool SGValue::setUnknownValue (const string &value) { - if (_type == UNKNOWN || _type == STRING) { + switch (_type) { + case BOOL: + if (value == "true" || atoi(value.c_str()) != 0) + return setRawBool(true); + else + return setRawBool(false); + case INT: + return setRawInt(atoi(value.c_str())); + case FLOAT: + return setRawFloat(atof(value.c_str())); + case DOUBLE: + return setRawDouble(atof(value.c_str())); + case STRING: + case UNKNOWN: return setRawString(value); - } else { - return false; } + return false; } @@ -491,13 +570,13 @@ SGValue::setUnknownValue (const string &value) * Returns true on success (i.e. the value is not currently tied). */ bool -SGValue::tieBool (bool_getter getter, bool_setter setter = 0, - bool useDefault = true) +SGValue::tieBool (bool_getter getter, bool_setter setter, + bool useDefault) { if (_tied) { return false; } else { - if (useDefault && setter && _type != UNKNOWN) + if (useDefault && setter) (*setter)(getBoolValue()); _tied = true; _type = BOOL; @@ -517,13 +596,13 @@ SGValue::tieBool (bool_getter getter, bool_setter setter = 0, * Returns true on success (i.e. the value is not currently tied). */ bool -SGValue::tieInt (int_getter getter, int_setter setter = 0, - bool useDefault = true) +SGValue::tieInt (int_getter getter, int_setter setter, + bool useDefault) { if (_tied) { return false; } else { - if (useDefault && setter && _type != UNKNOWN) + if (useDefault && setter) (*setter)(getIntValue()); _tied = true; _type = INT; @@ -543,13 +622,13 @@ SGValue::tieInt (int_getter getter, int_setter setter = 0, * Returns true on success (i.e. the value is not currently tied). */ bool -SGValue::tieFloat (float_getter getter, float_setter setter = 0, - bool useDefault = true) +SGValue::tieFloat (float_getter getter, float_setter setter, + bool useDefault) { if (_tied) { return false; } else { - if (useDefault && setter && _type != UNKNOWN) + if (useDefault && setter) (*setter)(getFloatValue()); _tied = true; _type = FLOAT; @@ -569,13 +648,13 @@ SGValue::tieFloat (float_getter getter, float_setter setter = 0, * Returns true on success (i.e. the value is not currently tied). */ bool -SGValue::tieDouble (double_getter getter, double_setter setter = 0, - bool useDefault = true) +SGValue::tieDouble (double_getter getter, double_setter setter, + bool useDefault) { if (_tied) { return false; } else { - if (useDefault && setter && _type != UNKNOWN) + if (useDefault && setter) (*setter)(getDoubleValue()); _tied = true; _type = DOUBLE; @@ -595,13 +674,13 @@ SGValue::tieDouble (double_getter getter, double_setter setter = 0, * Returns true on success (i.e. the value is not currently tied). */ bool -SGValue::tieString (string_getter getter, string_setter setter = 0, - bool useDefault = true) +SGValue::tieString (string_getter getter, string_setter setter, + bool useDefault) { if (_tied) { return false; } else { - if (useDefault && setter && _type != UNKNOWN) + if (useDefault && setter) (*setter)(getStringValue()); _tied = true; _type = STRING; @@ -685,6 +764,20 @@ SGPropertyList::~SGPropertyList () } +/** + * Return true if a value is present. + */ +bool +SGPropertyList::hasValue (const string &name) const +{ + const_iterator el = _props.find(name); + if (el == _props.end()) + return false; + else + return true; +} + + /** * Look up the SGValue structure associated with a property. * @@ -693,7 +786,7 @@ SGPropertyList::~SGPropertyList () * and must not end with '/'. */ SGValue * -SGPropertyList::getValue (const string &name, bool create = false) +SGPropertyList::getValue (const string &name, bool create) { const_iterator el = _props.find(name); if (el == _props.end()) { @@ -914,9 +1007,10 @@ bool SGPropertyList::tieBool (const string &name, bool_getter getter, bool_setter setter, - bool useDefault = true) + bool useDefault) { FG_LOG(FG_GENERAL, FG_INFO, "Tying bool property '" << name << '\''); + useDefault = useDefault && hasValue(name); return getValue(name, true)->tieBool(getter, setter, useDefault); } @@ -930,9 +1024,10 @@ bool SGPropertyList::tieInt (const string &name, int_getter getter, int_setter setter, - bool useDefault = true) + bool useDefault) { FG_LOG(FG_GENERAL, FG_INFO, "Tying int property '" << name << '\''); + useDefault = useDefault && hasValue(name); return getValue(name, true)->tieInt(getter, setter, useDefault); } @@ -946,9 +1041,10 @@ bool SGPropertyList::tieFloat (const string &name, float_getter getter, float_setter setter, - bool useDefault = true) + bool useDefault) { FG_LOG(FG_GENERAL, FG_INFO, "Tying float property '" << name << '\''); + useDefault = useDefault && hasValue(name); return getValue(name, true)->tieFloat(getter, setter, useDefault); } @@ -962,9 +1058,10 @@ bool SGPropertyList::tieDouble (const string &name, double_getter getter, double_setter setter, - bool useDefault = true) + bool useDefault) { FG_LOG(FG_GENERAL, FG_INFO, "Tying double property '" << name << '\''); + useDefault = useDefault && hasValue(name); return getValue(name, true)->tieDouble(getter, setter, useDefault); } @@ -978,9 +1075,10 @@ bool SGPropertyList::tieString (const string &name, string_getter getter, string_setter setter, - bool useDefault = true) + bool useDefault) { FG_LOG(FG_GENERAL, FG_INFO, "Tying string property '" << name << '\''); + useDefault = useDefault && hasValue(name); return getValue(name, true)->tieString(getter, setter, useDefault); } @@ -1037,8 +1135,8 @@ get_base (const string &parent, const string &child, /** * Constructor. */ -SGPropertyNode::SGPropertyNode (const string &path = "", - SGPropertyList * props = 0) +SGPropertyNode::SGPropertyNode (const string &path, + SGPropertyList * props) : _props(props), _node(0) { setPath(path); @@ -1198,6 +1296,22 @@ SGPropertyNode::getSubNode (const string &subpath) const } +/** + * Test whether the specified subpath has a value. + */ +bool +SGPropertyNode::hasValue (const string &subpath) const +{ + if (_props == 0) + return false; + + if (subpath.size() == 0) + return _props->hasValue(_path); + else + return _props->hasValue(_path + string("/") + subpath); +} + + /** * Return the value of the current node. * @@ -1209,7 +1323,7 @@ SGPropertyNode::getSubNode (const string &subpath) const SGValue * SGPropertyNode::getValue (const string &subpath) { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return 0; if (subpath.size() == 0) @@ -1225,7 +1339,7 @@ SGPropertyNode::getValue (const string &subpath) bool SGPropertyNode::getBoolValue (const string &subpath, bool defaultValue) const { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return defaultValue; if (subpath == "") @@ -1242,7 +1356,7 @@ SGPropertyNode::getBoolValue (const string &subpath, bool defaultValue) const int SGPropertyNode::getIntValue (const string &subpath, int defaultValue) const { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return defaultValue; if (subpath == "") @@ -1259,7 +1373,7 @@ SGPropertyNode::getIntValue (const string &subpath, int defaultValue) const float SGPropertyNode::getFloatValue (const string &subpath, float defaultValue) const { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return defaultValue; if (subpath == "") @@ -1277,7 +1391,7 @@ double SGPropertyNode::getDoubleValue (const string &subpath, double defaultValue) const { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return defaultValue; if (subpath == "") @@ -1295,7 +1409,7 @@ const string & SGPropertyNode::getStringValue (const string &subpath, const string &defaultValue) const { - if (_props == 0 || _path.size() == 0) + if (_props == 0) return defaultValue; if (subpath == "")