: _name(""),
_index(0),
_parent(0),
+ _path_cache(0),
_type(NONE),
_tied(false),
_attr(READ|WRITE)
: _name(node._name),
_index(node._index),
_parent(0), // don't copy the parent
+ _path_cache(0),
_type(node._type),
_tied(node._tied),
_attr(node._attr)
*/
SGPropertyNode::SGPropertyNode (const string &name,
int index, SGPropertyNode * parent)
- : _name(name), _index(index), _parent(parent), _type(NONE),
- _tied(false), _attr(READ|WRITE)
+ : _name(name),
+ _index(index),
+ _parent(parent),
+ _path_cache(0),
+ _type(NONE),
+ _tied(false),
+ _attr(READ|WRITE)
{
}
for (int i = 0; i < (int)_children.size(); i++) {
delete _children[i];
}
+ delete _path_cache;
clear_value();
}
case STRING:
case UNSPECIFIED:
return GET_STRING;
+ case NONE:
+ default:
+ return "";
}
-
- return ""; // if NONE
}
case STRING:
case UNSPECIFIED:
return (GET_STRING == "true" || getDoubleValue() != 0.0L);
+ case NONE:
+ default:
+ return false;
}
-
- return false; // if NONE
}
int
case STRING:
case UNSPECIFIED:
return atoi(GET_STRING.c_str());
+ case NONE:
+ default:
+ return 0;
}
-
- return 0; // if NONE
}
long
case STRING:
case UNSPECIFIED:
return strtol(GET_STRING.c_str(), 0, 0);
+ case NONE:
+ default:
+ return 0L;
}
-
- return 0L; // if NONE
}
float
case STRING:
case UNSPECIFIED:
return atof(GET_STRING.c_str());
+ case NONE:
+ default:
+ return 0.0;
}
-
- return 0.0; // if NONE
}
double
case STRING:
case UNSPECIFIED:
return strtod(GET_STRING.c_str(), 0);
+ case NONE:
+ default:
+ return 0.0L;
}
-
- return 0.0L; // if NONE
}
string
result = SET_DOUBLE(double(value));
break;
case STRING:
+ case UNSPECIFIED:
result = SET_STRING(value ? "true" : "false");
break;
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(BOOL);
case DOUBLE:
result = SET_DOUBLE(double(value));
break;
- case STRING: {
+ case STRING:
+ case UNSPECIFIED: {
char buf[128];
sprintf(buf, "%d", value);
result = SET_STRING(buf);
break;
}
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(INT);
case DOUBLE:
result = SET_DOUBLE(double(value));
break;
- case STRING: {
+ case STRING:
+ case UNSPECIFIED: {
char buf[128];
- sprintf(buf, "%d", value);
+ sprintf(buf, "%ld", value);
result = SET_STRING(buf);
break;
}
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(LONG);
case DOUBLE:
result = SET_DOUBLE(double(value));
break;
- case STRING: {
+ case STRING:
+ case UNSPECIFIED: {
char buf[128];
sprintf(buf, "%f", value);
result = SET_STRING(buf);
break;
}
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(FLOAT);
case DOUBLE:
result = SET_DOUBLE(value);
break;
- case STRING: {
+ case STRING:
+ case UNSPECIFIED: {
char buf[128];
- sprintf(buf, "%lf", value);
+ sprintf(buf, "%f", value);
result = SET_STRING(buf);
break;
}
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(DOUBLE);
result = SET_DOUBLE(strtod(value.c_str(), 0));
break;
case STRING:
+ case UNSPECIFIED:
result = SET_STRING(value);
break;
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(STRING);
case UNSPECIFIED:
result = SET_STRING(value);
break;
+ case NONE:
+ default:
+ break;
}
DO_TRACE_WRITE(UNSPECIFIED);
SET_DOUBLE(val);
break;
}
- case STRING: {
+ case STRING:
+ case UNSPECIFIED: {
string val = getStringValue();
clear_value();
_type = STRING;
SET_STRING(val);
break;
}
+ case NONE:
+ default:
+ break;
}
_tied = false;
SGPropertyNode *
SGPropertyNode::getNode (const string &relative_path, bool create)
+{
+ if (_path_cache == 0)
+ _path_cache = new cache_map;
+
+ SGPropertyNode * result = (*_path_cache)[relative_path];
+ if (result == 0) {
+ vector<PathComponent> components;
+ parse_path(relative_path, components);
+ result = find_node(this, components, 0, create);
+ (*_path_cache)[relative_path] = result;
+ }
+
+ return result;
+}
+
+SGPropertyNode *
+SGPropertyNode::getNode (const string &relative_path, int index, bool create)
{
vector<PathComponent> components;
parse_path(relative_path, components);
+ if (components.size() > 0)
+ components[components.size()-1].index = index;
return find_node(this, components, 0, create);
}
const SGPropertyNode *
SGPropertyNode::getNode (const string &relative_path) const
{
- vector<PathComponent> components;
- parse_path(relative_path, components);
- // FIXME: cast away const
- return find_node((SGPropertyNode *)this, components, 0, false);
+ return ((SGPropertyNode *)this)->getNode(relative_path, false);
}
+const SGPropertyNode *
+SGPropertyNode::getNode (const string &relative_path, int index) const
+{
+ return ((SGPropertyNode *)this)->getNode(relative_path, index, false);
+}
\f
////////////////////////////////////////////////////////////////////////