1 // ---------------------------------------------------------------------------- 2 // Copyright (C) 2002-2006 Marcin Kalicinski 3 // Copyright (C) 2009 Sebastian Redl 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // For more information, see www.boost.org 10 // ---------------------------------------------------------------------------- 11 #ifndef BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED 12 #define BOOST_PROPERTY_TREE_PTREE_FWD_HPP_INCLUDED 13 14 #include <boost/config.hpp> 15 #include <boost/optional/optional_fwd.hpp> 16 #include <boost/throw_exception.hpp> 17 #include <functional> // for std::less 18 #include <memory> // for std::allocator 19 #include <string> 20 21 namespace boost { namespace property_tree 22 { 23 namespace detail { 24 template <typename T> struct less_nocase; 25 } 26 27 // Classes 28 29 template < class Key, class Data, class KeyCompare = std::less<Key> > 30 class basic_ptree; 31 32 template <typename T> 33 struct id_translator; 34 35 template <typename String, typename Translator> 36 class string_path; 37 38 // Texas-style concepts for documentation only. 39 #if 0 40 concept PropertyTreePath<class Path> { 41 // The key type for which this path works. 42 typename key_type; 43 // Return the key that the first segment of the path names. 44 // Split the head off the state. 45 key_type Path::reduce(); 46 47 // Return true if the path is empty. 48 bool Path::empty() const; 49 50 // Return true if the path contains a single element. 51 bool Path::single() const; 52 53 // Dump as a std::string, for exception messages. 54 std::string Path::dump() const; 55 } 56 concept PropertyTreeKey<class Key> { 57 PropertyTreePath path; 58 requires SameType<Key, PropertyTreePath<path>::key_type>; 59 } 60 concept PropertyTreeTranslator<class Tr> { 61 typename internal_type; 62 typename external_type; 63 64 boost::optional<external_type> Tr::get_value(internal_type); 65 boost::optional<internal_type> Tr::put_value(external_type); 66 } 67 #endif 68 /// If you want to use a custom key type, specialize this struct for it 69 /// and give it a 'type' typedef that specifies your path type. The path 70 /// type must conform to the Path concept described in the documentation. 71 /// This is already specialized for std::basic_string. 72 template <typename Key> 73 struct path_of; 74 75 /// Specialize this struct to specify a default translator between the data 76 /// in a tree whose data_type is Internal, and the external data_type 77 /// specified in a get_value, get, put_value or put operation. 78 /// This is already specialized for Internal being std::basic_string. 79 template <typename Internal, typename External> 80 struct translator_between; 81 82 class ptree_error; 83 class ptree_bad_data; 84 class ptree_bad_path; 85 86 // Typedefs 87 88 /** Implements a path using a std::string as the key. */ 89 typedef string_path<std::string, id_translator<std::string> > path; 90 91 /** 92 * A property tree with std::string for key and data, and default 93 * comparison. 94 */ 95 typedef basic_ptree<std::string, std::string> ptree; 96 97 /** 98 * A property tree with std::string for key and data, and case-insensitive 99 * comparison. 100 */ 101 typedef basic_ptree<std::string, std::string, 102 detail::less_nocase<std::string> > 103 iptree; 104 105 #ifndef BOOST_NO_STD_WSTRING 106 /** Implements a path using a std::wstring as the key. */ 107 typedef string_path<std::wstring, id_translator<std::wstring> > wpath; 108 109 /** 110 * A property tree with std::wstring for key and data, and default 111 * comparison. 112 * @note The type only exists if the platform supports @c wchar_t. 113 */ 114 typedef basic_ptree<std::wstring, std::wstring> wptree; 115 116 /** 117 * A property tree with std::wstring for key and data, and case-insensitive 118 * comparison. 119 * @note The type only exists if the platform supports @c wchar_t. 120 */ 121 typedef basic_ptree<std::wstring, std::wstring, 122 detail::less_nocase<std::wstring> > 123 wiptree; 124 #endif 125 126 // Free functions 127 128 /** 129 * Swap two property tree instances. 130 */ 131 template<class K, class D, class C> 132 void swap(basic_ptree<K, D, C> &pt1, 133 basic_ptree<K, D, C> &pt2); 134 135 } } 136 137 138 #if !defined(BOOST_PROPERTY_TREE_DOXYGEN_INVOKED) 139 // Throwing macro to avoid no return warnings portably 140 # define BOOST_PROPERTY_TREE_THROW(e) BOOST_THROW_EXCEPTION(e) 141 #endif 142 143 #endif 144