summaryrefslogtreecommitdiff
path: root/libs/property_tree/doc/tutorial.qbk
diff options
context:
space:
mode:
Diffstat (limited to 'libs/property_tree/doc/tutorial.qbk')
-rw-r--r--libs/property_tree/doc/tutorial.qbk91
1 files changed, 15 insertions, 76 deletions
diff --git a/libs/property_tree/doc/tutorial.qbk b/libs/property_tree/doc/tutorial.qbk
index 4d374c368..9ef3a922d 100644
--- a/libs/property_tree/doc/tutorial.qbk
+++ b/libs/property_tree/doc/tutorial.qbk
@@ -1,14 +1,16 @@
[/
/ Copyright (c) 2008 Marcin Kalicinski (kalita <at> poczta dot onet dot pl)
- / Copyright (c) 2009 Sebastian Redl (sebastian dot redl <at> getdesigned dot at)
+ / Copyright (c) 2009, 2013 Sebastian Redl (sebastian dot redl <at> getdesigned dot at)
/
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
/]
[section:tutorial Five Minute Tutorial]
+[import ../examples/debug_settings.cpp]
+
This tutorial uses XML. Note that the library is not specifically bound to XML,
and any other supported format (such as INI or JSON) could be used instead.
-XML was chosen because the author thinks that wide range of people is familiar
+XML was chosen because the author thinks that a wide range of people is familiar
with it.
Suppose we are writing a logging system for some application, and need to read
@@ -28,89 +30,26 @@ configuration looks like this:
]
It contains the log filename, a list of modules where logging is enabled, and
-the debug level value. To store the logging configuration in the program we
-created a debug_settings structure:
-
- struct debug_settings
- {
- std::string m_file; // log filename
- int m_level; // debug level
- std::set<string> m_modules; // modules where logging is enabled
- void load(const std::string &filename);
- void save(const std::string &filename);
- };
-
-All that needs to be done now is to write implementations of load() and save()
-member functions. Let's first deal with load(). It contains just 7 lines of
-code, although it does all the necessary things, including error reporting:
+the debug level value.
- #include <boost/property_tree/ptree.hpp>
- #include <boost/property_tree/xml_parser.hpp>
+First we need some includes:
- // Loads debug_settings structure from the specified XML file
- void debug_settings::load(const std::string &filename)
- {
- // Create an empty property tree object
- using boost::property_tree::__ptree__;
- __ptree__ pt;
+[debug_settings_includes]
- // Load the XML file into the property tree. If reading fails
- // (cannot open file, parse error), an exception is thrown.
- __read_xml__(filename, pt);
+To store the logging configuration in the program we create a debug_settings
+structure:
- // Get the filename and store it in the m_file variable.
- // Note that we construct the path to the value by separating
- // the individual keys with dots. If dots appear in the keys,
- // a path type with a different separator can be used.
- // If the debug.filename key is not found, an exception is thrown.
- m_file = pt.__ptree_get__<std::string>("debug.filename");
+[debug_settings_data]
- // Get the debug level and store it in the m_level variable.
- // This is another version of the get method: if the value is
- // not found, the default value (specified by the second
- // parameter) is returned instead. The type of the value
- // extracted is determined by the type of the second parameter,
- // so we can simply write get(...) instead of get<int>(...).
- m_level = pt.__ptree_get__("debug.level", 0);
+All that needs to be done now is to write implementations of load() and save()
+member functions. Let's first deal with load(). It contains just 7 lines of
+code, although it does all the necessary things, including error reporting:
- // Iterate over the debug.modules section and store all found
- // modules in the m_modules set. The get_child() function
- // returns a reference to the child at the specified path; if
- // there is no such child, it throws. Property tree iterators
- // are models of BidirectionalIterator.
- BOOST_FOREACH(__ptree__::__ptree_value_type__ &v,
- pt.__ptree_get_child__("debug.modules"))
- m_modules.__ptree_insert__(v.second.data());
- }
+[debug_settings_load]
Now the save() function. It is also 7 lines of code:
- // Saves the debug_settings structure to the specified XML file
- void debug_settings::save(const std::string &filename)
- {
- // Create an empty property tree object
- using boost::property_tree::__ptree__;
- __ptree__ pt;
-
- // Put log filename in property tree
- pt.__ptree_put__("debug.filename", m_file);
-
- // Put debug level in property tree
- pt.__ptree_put__("debug.level", m_level);
-
- // Iterate over the modules in the set and put them in the
- // property tree. Note that the put function places the new
- // key at the end of the list of keys. This is fine most of
- // the time. If you want to place an item at some other place
- // (i.e. at the front or somewhere in the middle), this can
- // be achieved using a combination of the insert and put_own
- // functions.
- BOOST_FOREACH(const std::string &name, m_modules)
- pt.__ptree_add__("debug.modules.module", name);
-
- // Write the property tree to the XML file.
- __write_xml__(filename, pt);
- }
+[debug_settings_save]
The full program [@boost:/libs/property_tree/examples/debug_settings.cpp debug_settings.cpp] is
included in the examples directory.