C++ XML Objects Use: Changing the objects

Previous Next Usage Home Installation Docs

Abstract

Now we have the objects, we just manipulate them like any others.

Description

Move along, there's really nothing to see here except for the manipulation of the vectors and references, which have been defined differently.

When looping through a vector, you need to replace:

for (std::vector<foo *>::iterator i=foos.begin(); i != foos.end(); i++)
	...

With this:

for (ph::xmlobj::xmlobj_typed_vector<foo>::iterator i=foos.begin(); i != foos.end(); i++)
	...

You can even use an algorithm from STL because the iterators are actually real bidrectional ones.

ph::xmlobj::xmlobj_typed_vector<foo>::iterator i=std::find_if(foos.begin(), foos.end(), 
	boost::bind<bool>(std::equal_to<std::string>(),
	boost::bind(&foo::name, _1), "foo_2"));

Which searches for an object with a name of "foo_2".

One thing that's possible now, but not before is that you can define a visitor which will visit every object in your hierarchy like this:

class my_visitor : public ph::common::object_visitor
{
public:
			
	// object_visitor overides.
	virtual bool recurse() { return true; }
	virtual bool visit(const ph::common::object_base *obj);
	virtual bool visit_composite(const ph::common::object_base *obj)
		{ return true; }
};

bool my_visitor::visit(const ph::common::object_base *obj)
{
	... do anything with the object in here. Dynamic cast it to get the
		data or something. And when your finished (even if you 
		are in the middle of the tree) return false and it
		will all terminate ...
}

There are a whole lot of interfaces that you can query off "ph::common::object_base" to manipulate it in some way OTHER than dynamic casting it. Like to get the value of a member with a name, I could query for the object's "persistable_object_base" object, and then use it to get a named member:

if (obj->persistable())
{
	std::string value = obj->persistable()->get("x");
}

Or to see if the parent of my object is a composite, and then add a new object to it:

if (obj->outerable())
{
	ph::common::object_base *outer = obj->outerable()->outer();
	if (outer->composition())
		outer->composition()->add(new MyObj(), true);
}

But we digress...

Previous Next Usage Home Installation Docs


Generated: Wed Apr 5 23:00:19 EST 2006

Copyright (c) 2005; Paul Hamilton; pHamtec P/L.

Use, modification, and distribution is provided free of any limitations.