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