// ---------------------------------------------------------------------------- | |
// Copyright (C) 2002-2006 Marcin Kalicinski | |
// Copyright (C) 2009 Sebastian Redl | |
// | |
// 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 | |
// ---------------------------------------------------------------------------- | |
#ifndef BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED | |
#define BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED | |
#include <boost/config.hpp> | |
#include <boost/optional/optional_fwd.hpp> | |
#include <boost/throw_exception.hpp> | |
#include <functional> // for std::less | |
#include <memory> // for std::allocator | |
#include <string> | |
namespace boost { namespace property_tree | |
{ | |
namespace detail { | |
template <typename T> struct less_nocase; | |
} | |
// Classes | |
template < class Key, class Data, class KeyCompare = std::less<Key> > | |
class basic_ptree; | |
template <typename T> | |
struct id_translator; | |
template <typename String, typename Translator> | |
class string_path; | |
// Texas-style concepts for documentation only. | |
#if 0 | |
concept PropertyTreePath<class Path> { | |
// The key type for which this path works. | |
typename key_type; | |
// Return the key that the first segment of the path names. | |
// Split the head off the state. | |
key_type Path::reduce(); | |
// Return true if the path is empty. | |
bool Path::empty() const; | |
// Return true if the path contains a single element. | |
bool Path::single() const; | |
// Dump as a std::string, for exception messages. | |
std::string Path::dump() const; | |
} | |
concept PropertyTreeKey<class Key> { | |
PropertyTreePath path; | |
requires SameType<Key, PropertyTreePath<path>::key_type>; | |
} | |
concept PropertyTreeTranslator<class Tr> { | |
typename internal_type; | |
typename external_type; | |
boost::optional<external_type> Tr::get_value(internal_type); | |
boost::optional<internal_type> Tr::put_value(external_type); | |
} | |
#endif | |
/// If you want to use a custom key type, specialize this struct for it | |
/// and give it a 'type' typedef that specifies your path type. The path | |
/// type must conform to the Path concept described in the documentation. | |
/// This is already specialized for std::basic_string. | |
template <typename Key> | |
struct path_of; | |
/// Specialize this struct to specify a default translator between the data | |
/// in a tree whose data_type is Internal, and the external data_type | |
/// specified in a get_value, get, put_value or put operation. | |
/// This is already specialized for Internal being std::basic_string. | |
template <typename Internal, typename External> | |
struct translator_between; | |
class ptree_error; | |
class ptree_bad_data; | |
class ptree_bad_path; | |
// Typedefs | |
/** Implements a path using a std::string as the key. */ | |
typedef string_path<std::string, id_translator<std::string> > path; | |
/** | |
* A property tree with std::string for key and data, and default | |
* comparison. | |
*/ | |
typedef basic_ptree<std::string, std::string> ptree; | |
/** | |
* A property tree with std::string for key and data, and case-insensitive | |
* comparison. | |
*/ | |
typedef basic_ptree<std::string, std::string, | |
detail::less_nocase<std::string> > | |
iptree; | |
#ifndef BOOST_NO_STD_WSTRING | |
/** Implements a path using a std::wstring as the key. */ | |
typedef string_path<std::wstring, id_translator<std::wstring> > wpath; | |
/** | |
* A property tree with std::wstring for key and data, and default | |
* comparison. | |
* @note The type only exists if the platform supports @c wchar_t. | |
*/ | |
typedef basic_ptree<std::wstring, std::wstring> wptree; | |
/** | |
* A property tree with std::wstring for key and data, and case-insensitive | |
* comparison. | |
* @note The type only exists if the platform supports @c wchar_t. | |
*/ | |
typedef basic_ptree<std::wstring, std::wstring, | |
detail::less_nocase<std::wstring> > | |
wiptree; | |
#endif | |
// Free functions | |
/** | |
* Swap two property tree instances. | |
*/ | |
template<class K, class D, class C> | |
void swap(basic_ptree<K, D, C> &pt1, | |
basic_ptree<K, D, C> &pt2); | |
} } | |
#if !defined(BOOST_PROPERTY_TREE_DOXYGEN_INVOKED) | |
// Throwing macro to avoid no return warnings portably | |
# define BOOST_PROPERTY_TREE_THROW(e) BOOST_THROW_EXCEPTION(e) | |
#endif | |
#endif |