// ---------------------------------------------------------------------------- // 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