[sword-devel] Compile problems with new config stuff

Troy A. Griffitts sword-devel@crosswire.org
Thu, 15 Mar 2001 20:56:48 -0700


Joachim,
	Thanks for the fix.  Still works for me, so if you guys are happy, I'm
in.  I don't know if you realize what the new feature is that is causing
the compile troubles of the past few days, but...

It used to be our configurator class SWConfig used a map<string,
map<string, string>> to store INI style entries, and it made for easy
stuff like:

SWConfig myConfig("./myConfig.conf");

myConfig.Sections["Section1"]["Entry1"] = "Value1";

Well, this easy syntax went away when we had to move the structure to:
map<string, multimap<string, string>>.  This was needed because we store
more than entry for some things, e.g.

[KJV]
GlobalOptionsFilter=GBFFootnotes
GlobalOptionsFilter=GBFStrings

multimaps lets this happen, whereas map will overwrite the previous
entry; however, multimap doesn't include nice [] operators, so we had to
use iterator = myConfig.Sections["Section1"].find("Entry1"), and check
for it != to end() and then grab it->second, ugh... Not very nice
looking anymore...


Well, now the new features:

SWConfig now has an operator[](const char *), so you can leave off the
'Sections' part, e.g.

myConfig["Section1"]["Entry1"] = "Value1";

and the BIG one... we now have a multimapwithdefault subclass of
multimap that implements the same behaviour as the map::operator [].  It
merely finds the FIRST entry with the name and returns it (or creates
one if it doesn't exist.  We still have to use find_*(key_type &) for
multi-entries like 'GlobalOptionsFilter', but for the MAJORITY of
entries we can now use the nice syntax like:

myConfig["Section1"]["Entry1"] = "Value1";

or

string entry1 = myConfig["Section1"]["Entry1"];


Hope this explains a little bit of why we changed stuff.

		-Troy.