xrpld
Loading...
Searching...
No Matches
PropertyStream.h
1#pragma once
2
3#include <xrpl/beast/core/List.h>
4
5#include <mutex>
6#include <ostream>
7#include <sstream>
8#include <string>
9#include <utility>
10
11namespace beast {
12
13//------------------------------------------------------------------------------
14
19{
20public:
21 class Map;
22 class Set;
23 class Source;
24
25 PropertyStream() = default;
26 virtual ~PropertyStream() = default;
27
28protected:
29 virtual void
30 mapBegin() = 0;
31 virtual void
32 mapBegin(std::string const& key) = 0;
33 virtual void
34 mapEnd() = 0;
35
36 virtual void
37 add(std::string const& key, std::string const& value) = 0;
38
39 void
40 add(std::string const& key, char const* value)
41 {
42 add(key, std::string(value));
43 }
44
45 template <typename Value>
46 void
47 lexicalAdd(std::string const& key, Value value)
48 {
50 ss << value;
51 add(key, ss.str());
52 }
53
54 virtual void
55 add(std::string const& key, bool value);
56 virtual void
57 add(std::string const& key, char value);
58 virtual void
59 add(std::string const& key, signed char value);
60 virtual void
61 add(std::string const& key, unsigned char value);
62 virtual void
63 add(std::string const& key, short value);
64 virtual void
65 add(std::string const& key, unsigned short value);
66 virtual void
67 add(std::string const& key, int value);
68 virtual void
69 add(std::string const& key, unsigned int value);
70 virtual void
71 add(std::string const& key, long value);
72 virtual void
73 add(std::string const& key, unsigned long value);
74 virtual void
75 add(std::string const& key, long long value);
76 virtual void
77 add(std::string const& key, unsigned long long value);
78 virtual void
79 add(std::string const& key, float value);
80 virtual void
81 add(std::string const& key, double value);
82 virtual void
83 add(std::string const& key, long double value);
84
85 virtual void
87 virtual void
88 arrayBegin(std::string const& key) = 0;
89 virtual void
90 arrayEnd() = 0;
91
92 virtual void
93 add(std::string const& value) = 0;
94
95 void
96 add(char const* value)
97 {
98 add(std::string(value));
99 }
100
101 template <typename Value>
102 void
103 lexicalAdd(Value value)
104 {
106 ss << value;
107 add(ss.str());
108 }
109
110 virtual void
111 add(bool value);
112 virtual void
113 add(char value);
114 virtual void
115 add(signed char value);
116 virtual void
117 add(unsigned char value);
118 virtual void
119 add(short value);
120 virtual void
121 add(unsigned short value);
122 virtual void
123 add(int value);
124 virtual void
125 add(unsigned int value);
126 virtual void
127 add(long value);
128 virtual void
129 add(unsigned long value);
130 virtual void
131 add(long long value);
132 virtual void
133 add(unsigned long long value);
134 virtual void
135 add(float value);
136 virtual void
137 add(double value);
138 virtual void
139 add(long double value);
140
141private:
142 class Item;
143 class Proxy;
144};
145
146//------------------------------------------------------------------------------
147//
148// Item
149//
150//------------------------------------------------------------------------------
151
152class PropertyStream::Item : public List<Item>::Node
153{
154public:
155 explicit Item(Source* source);
156 [[nodiscard]] Source&
157 source() const;
158 Source*
159 operator->() const;
160 Source&
161 operator*() const;
162
163private:
165};
166
167//------------------------------------------------------------------------------
168//
169// Proxy
170//
171//------------------------------------------------------------------------------
172
174{
175private:
176 Map const* map_;
179
180public:
181 Proxy(Map const& map, std::string key);
182 Proxy(Proxy const& other);
183 ~Proxy();
184
185 template <typename Value>
186 Proxy&
187 operator=(Value value);
188
190 operator<<(std::ostream& manip(std::ostream&)) const;
191
192 template <typename T>
194 operator<<(T const& t) const
195 {
196 return ostream_ << t;
197 }
198};
199
200//------------------------------------------------------------------------------
201//
202// Map
203//
204//------------------------------------------------------------------------------
205
207{
208private:
210
211public:
212 explicit Map(PropertyStream& stream);
213 explicit Map(Set& parent);
214 Map(std::string const& key, Map& parent);
215 Map(std::string const& key, PropertyStream& stream);
216 ~Map();
217
218 Map(Map const&) = delete;
219 Map&
220 operator=(Map const&) = delete;
221
223 stream();
224 [[nodiscard]] PropertyStream const&
225 stream() const;
226
227 template <typename Value>
228 void
229 add(std::string const& key, Value value) const
230 {
231 stream_.add(key, value);
232 }
233
234 template <typename Key, typename Value>
235 void
236 add(Key key, Value value) const
237 {
239 ss << key;
240 add(ss.str(), value);
241 }
242
243 Proxy
244 operator[](std::string const& key);
245
246 Proxy
247 operator[](char const* key)
248 {
249 return Proxy(*this, key);
250 }
251
252 template <typename Key>
253 Proxy
254 operator[](Key key) const
255 {
257 ss << key;
258 return Proxy(*this, ss.str());
259 }
260};
261
262//--------------------------------------------------------------------------
263
264template <typename Value>
267{
268 map_->add(key_, value);
269 return *this;
270}
271
272//--------------------------------------------------------------------------
273//
274// Set
275//
276//------------------------------------------------------------------------------
277
279{
280private:
282
283public:
284 Set(std::string const& key, Map& map);
285 Set(std::string const& key, PropertyStream& stream);
286 ~Set();
287
288 Set(Set const&) = delete;
289 Set&
290 operator=(Set const&) = delete;
291
293 stream();
294 [[nodiscard]] PropertyStream const&
295 stream() const;
296
297 template <typename Value>
298 void
299 add(Value value) const
300 {
301 stream_.add(value);
302 }
303};
304
305//------------------------------------------------------------------------------
306//
307// Source
308//
309//------------------------------------------------------------------------------
310
315{
316private:
320 Source* parent_{nullptr};
322
323public:
324 explicit Source(std::string name);
325 virtual ~Source();
326
327 Source(Source const&) = delete;
328 Source&
329 operator=(Source const&) = delete;
330
334 [[nodiscard]] std::string const&
335 name() const;
336
340 void
341 add(Source& source);
342
347 template <class Derived>
348 Derived*
349 add(Derived* child)
350 {
351 add(*static_cast<Source*>(child));
352 return child;
353 }
354
358 void
359 remove(Source& child);
360
364 void
365 removeAll();
366
370 void
371 writeOne(PropertyStream& stream);
372
376 void
377 write(PropertyStream& stream);
378
385 void
386 write(PropertyStream& stream, std::string const& path);
387
405 find(std::string path);
406
407 Source*
408 findOneDeep(std::string const& name);
410 findPath(std::string path);
412 findOne(std::string const& name);
413
414 static bool
415 peelLeadingSlash(std::string* path);
416 static bool
417 peelTrailingSlashstar(std::string* path);
418 static std::string
419 peelName(std::string* path);
420
421 //--------------------------------------------------------------------------
422
427 virtual void
428 onWrite(Map&);
429};
430
431} // 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)
Proxy(Map const &map, std::string key)
std::ostream & operator<<(std::ostream &manip(std::ostream &)) const
Proxy & operator=(Value value)
Set(Set const &)=delete
void add(Value value) const
Set(std::string const &key, Map &map)
Set & operator=(Set const &)=delete
Subclasses can be called to write to a stream and have children.
std::string const & name() const
Returns the name of this source.
void add(Source &source)
Add a child source.
Derived * add(Derived *child)
Add a child source by pointer.
Source(Source const &)=delete
Source & operator=(Source const &)=delete
void lexicalAdd(Value value)
void add(std::string const &key, char const *value)
virtual void mapEnd()=0
virtual void add(std::string const &key, std::string const &value)=0
virtual void add(std::string const &value)=0
virtual void arrayEnd()=0
virtual void mapBegin()=0
virtual ~PropertyStream()=default
void lexicalAdd(std::string const &key, Value value)
virtual void arrayBegin(std::string const &key)=0
virtual void arrayBegin()=0
void add(char const *value)
virtual void mapBegin(std::string const &key)=0
T str(T... args)