blob: dbc905fe007edccc9676a1fe0047384ba990f260 [file] [log] [blame]
// ----------------------------------------------------------------------------
// Copyright (C) 2002-2006 Marcin Kalicinski
//
// 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)
//
// For more information, see www.boost.org
// ----------------------------------------------------------------------------
// This example shows what need to be done to customize data_type of ptree.
//
// It creates my_ptree type, which is a basic_ptree having boost::any as its data
// container (instead of std::string that standard ptree has).
#include <boost/property_tree/ptree.hpp>
#include <boost/any.hpp>
#include <list>
#include <string>
#include <iostream>
// Custom translator that works with boost::any instead of std::string
template <class Ext, class Int = boost::any>
struct variant_translator
{
typedef Ext external_type;
typedef Int internal_type;
external_type
get_value(const internal_type &value) const
{
return boost::any_cast<external_type>(value);
}
internal_type
put_value(const external_type &value) const
{
return value;
}
};
int main()
{
using namespace boost::property_tree;
// Property_tree with boost::any as data type
// Key type: std::string
// Data type: boost::any
// Key comparison: default (std::less<std::string>)
typedef basic_ptree<std::string, boost::any> my_ptree;
my_ptree pt;
// Put/get int value
typedef variant_translator<int> int_tran;
pt.put("int value", 3, int_tran());
int int_value = pt.get<int>("int value", int_tran());
std::cout << "Int value: " << int_value << "\n";
// Put/get string value
typedef variant_translator<std::string> string_tran;
pt.put<std::string>("string value", "foo bar", string_tran());
std::string string_value = pt.get<std::string>(
"string value"
, string_tran()
);
std::cout << "String value: " << string_value << "\n";
// Put/get list<int> value
typedef std::list<int> intlist;
typedef variant_translator<intlist> intlist_tran;
int list_data[] = { 1, 2, 3, 4, 5 };
pt.put<intlist>(
"list value"
, intlist(
list_data
, list_data + sizeof(list_data) / sizeof(*list_data)
)
, intlist_tran()
);
intlist list_value = pt.get<intlist>(
"list value"
, intlist_tran()
);
std::cout << "List value: ";
for (intlist::iterator it = list_value.begin(); it != list_value.end(); ++it)
std::cout << *it << ' ';
std::cout << '\n';
}