rippled
Loading...
Searching...
No Matches
PropertyStream.h
1#pragma once
2
3#include <xrpl/beast/core/List.h>
4
5#include <mutex>
6#include <sstream>
7#include <string>
8
9namespace beast {
10
11//------------------------------------------------------------------------------
12
15{
16public:
17 class Map;
18 class Set;
19 class Source;
20
21 PropertyStream() = default;
22 virtual ~PropertyStream() = default;
23
24protected:
25 virtual void
26 map_begin() = 0;
27 virtual void
28 map_begin(std::string const& key) = 0;
29 virtual void
30 map_end() = 0;
31
32 virtual void
33 add(std::string const& key, std::string const& value) = 0;
34
35 void
36 add(std::string const& key, char const* value)
37 {
38 add(key, std::string(value));
39 }
40
41 template <typename Value>
42 void
43 lexical_add(std::string const& key, Value value)
44 {
46 ss << value;
47 add(key, ss.str());
48 }
49
50 virtual void
51 add(std::string const& key, bool value);
52 virtual void
53 add(std::string const& key, char value);
54 virtual void
55 add(std::string const& key, signed char value);
56 virtual void
57 add(std::string const& key, unsigned char value);
58 virtual void
59 add(std::string const& key, short value);
60 virtual void
61 add(std::string const& key, unsigned short value);
62 virtual void
63 add(std::string const& key, int value);
64 virtual void
65 add(std::string const& key, unsigned int value);
66 virtual void
67 add(std::string const& key, long value);
68 virtual void
69 add(std::string const& key, unsigned long value);
70 virtual void
71 add(std::string const& key, long long value);
72 virtual void
73 add(std::string const& key, unsigned long long value);
74 virtual void
75 add(std::string const& key, float value);
76 virtual void
77 add(std::string const& key, double value);
78 virtual void
79 add(std::string const& key, long double value);
80
81 virtual void
83 virtual void
84 array_begin(std::string const& key) = 0;
85 virtual void
86 array_end() = 0;
87
88 virtual void
89 add(std::string const& value) = 0;
90
91 void
92 add(char const* value)
93 {
94 add(std::string(value));
95 }
96
97 template <typename Value>
98 void
99 lexical_add(Value value)
100 {
102 ss << value;
103 add(ss.str());
104 }
105
106 virtual void
107 add(bool value);
108 virtual void
109 add(char value);
110 virtual void
111 add(signed char value);
112 virtual void
113 add(unsigned char value);
114 virtual void
115 add(short value);
116 virtual void
117 add(unsigned short value);
118 virtual void
119 add(int value);
120 virtual void
121 add(unsigned int value);
122 virtual void
123 add(long value);
124 virtual void
125 add(unsigned long value);
126 virtual void
127 add(long long value);
128 virtual void
129 add(unsigned long long value);
130 virtual void
131 add(float value);
132 virtual void
133 add(double value);
134 virtual void
135 add(long double value);
136
137private:
138 class Item;
139 class Proxy;
140};
141
142//------------------------------------------------------------------------------
143//
144// Item
145//
146//------------------------------------------------------------------------------
147
148class PropertyStream::Item : public List<Item>::Node
149{
150public:
151 explicit Item(Source* source);
152 Source&
153 source() const;
154 Source*
155 operator->() const;
156 Source&
157 operator*() const;
158
159private:
161};
162
163//------------------------------------------------------------------------------
164//
165// Proxy
166//
167//------------------------------------------------------------------------------
168
170{
171private:
172 Map const* m_map;
175
176public:
177 Proxy(Map const& map, std::string const& key);
178 Proxy(Proxy const& other);
179 ~Proxy();
180
181 template <typename Value>
182 Proxy&
183 operator=(Value value);
184
186 operator<<(std::ostream& manip(std::ostream&)) const;
187
188 template <typename T>
190 operator<<(T const& t) const
191 {
192 return m_ostream << t;
193 }
194};
195
196//------------------------------------------------------------------------------
197//
198// Map
199//
200//------------------------------------------------------------------------------
201
203{
204private:
206
207public:
208 explicit Map(PropertyStream& stream);
209 explicit Map(Set& parent);
210 Map(std::string const& key, Map& parent);
211 Map(std::string const& key, PropertyStream& stream);
212 ~Map();
213
214 Map(Map const&) = delete;
215 Map&
216 operator=(Map const&) = delete;
217
219 stream();
220 PropertyStream const&
221 stream() const;
222
223 template <typename Value>
224 void
225 add(std::string const& key, Value value) const
226 {
227 m_stream.add(key, value);
228 }
229
230 template <typename Key, typename Value>
231 void
232 add(Key key, Value value) const
233 {
235 ss << key;
236 add(ss.str(), value);
237 }
238
239 Proxy
240 operator[](std::string const& key);
241
242 Proxy
243 operator[](char const* key)
244 {
245 return Proxy(*this, key);
246 }
247
248 template <typename Key>
249 Proxy
250 operator[](Key key) const
251 {
253 ss << key;
254 return Proxy(*this, ss.str());
255 }
256};
257
258//--------------------------------------------------------------------------
259
260template <typename Value>
263{
264 m_map->add(m_key, value);
265 return *this;
266}
267
268//--------------------------------------------------------------------------
269//
270// Set
271//
272//------------------------------------------------------------------------------
273
275{
276private:
278
279public:
280 Set(std::string const& key, Map& map);
281 Set(std::string const& key, PropertyStream& stream);
282 ~Set();
283
284 Set(Set const&) = delete;
285 Set&
286 operator=(Set const&) = delete;
287
289 stream();
290 PropertyStream const&
291 stream() const;
292
293 template <typename Value>
294 void
295 add(Value value) const
296 {
297 m_stream.add(value);
298 }
299};
300
301//------------------------------------------------------------------------------
302//
303// Source
304//
305//------------------------------------------------------------------------------
306
309{
310private:
316
317public:
318 explicit Source(std::string const& name);
319 virtual ~Source();
320
321 Source(Source const&) = delete;
322 Source&
323 operator=(Source const&) = delete;
324
326 std::string const&
327 name() const;
328
330 void
331 add(Source& source);
332
336 template <class Derived>
337 Derived*
338 add(Derived* child)
339 {
340 add(*static_cast<Source*>(child));
341 return child;
342 }
343
345 void
346 remove(Source& child);
347
349 void
350 removeAll();
351
353 void
354 write_one(PropertyStream& stream);
355
357 void
358 write(PropertyStream& stream);
359
365 void
366 write(PropertyStream& stream, std::string const& path);
367
384 find(std::string path);
385
386 Source*
387 find_one_deep(std::string const& name);
389 find_path(std::string path);
391 find_one(std::string const& name);
392
393 static bool
394 peel_leading_slash(std::string* path);
395 static bool
396 peel_trailing_slashstar(std::string* path);
397 static std::string
398 peel_name(std::string* path);
399
400 //--------------------------------------------------------------------------
401
405 virtual void
406 onWrite(Map&);
407};
408
409} // namespace beast
Intrusive doubly linked list.
Definition List.h:258
Map(Map const &)=delete
Proxy operator[](Key key) const
Proxy operator[](std::string const &key)
void add(Key key, Value value) const
void add(std::string const &key, Value value) const
Map & operator=(Map const &)=delete
Proxy operator[](char const *key)
std::ostream & operator<<(std::ostream &manip(std::ostream &)) const
Proxy & operator=(Value value)
Set(Set const &)=delete
void add(Value value) const
Set & operator=(Set const &)=delete
Subclasses can be called to write to a stream and have children.
Derived * add(Derived *child)
Add a child source by pointer.
Source(Source const &)=delete
Source & operator=(Source const &)=delete
Abstract stream with RAII containers that produce a property tree.
void add(std::string const &key, char const *value)
virtual void add(std::string const &key, std::string const &value)=0
virtual void array_end()=0
virtual void add(std::string const &value)=0
virtual ~PropertyStream()=default
virtual void map_begin()=0
void lexical_add(Value value)
virtual void array_begin(std::string const &key)=0
virtual void array_begin()=0
virtual void map_begin(std::string const &key)=0
virtual void map_end()=0
void lexical_add(std::string const &key, Value value)
void add(char const *value)
T str(T... args)