rippled
STArray.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_PROTOCOL_STARRAY_H_INCLUDED
21 #define RIPPLE_PROTOCOL_STARRAY_H_INCLUDED
22 
23 #include <ripple/basics/CountedObject.h>
24 #include <ripple/protocol/STObject.h>
25 
26 namespace ripple {
27 
28 class STArray final : public STBase, public CountedObject<STArray>
29 {
30 private:
32 
34 
35 public:
37  using size_type = list_type::size_type;
38  using iterator = list_type::iterator;
39  using const_iterator = list_type::const_iterator;
40 
41  STArray() = default;
42  STArray(STArray const&) = default;
43 
44  template <
45  class Iter,
48  STObject>>>
49  explicit STArray(Iter first, Iter last);
50 
51  template <
52  class Iter,
55  STObject>>>
56  STArray(SField const& f, Iter first, Iter last);
57 
58  STArray&
59  operator=(STArray const&) = default;
60  STArray(STArray&&);
61  STArray&
62  operator=(STArray&&);
63 
64  STArray(SField const& f, int n);
65  STArray(SerialIter& sit, SField const& f, int depth = 0);
66  explicit STArray(int n);
67  explicit STArray(SField const& f);
68 
69  STObject&
71 
72  STObject const&
73  operator[](std::size_t j) const;
74 
75  STObject&
76  back();
77 
78  STObject const&
79  back() const;
80 
81  template <class... Args>
82  void
83  emplace_back(Args&&... args);
84 
85  void
86  push_back(STObject const& object);
87 
88  void
89  push_back(STObject&& object);
90 
91  iterator
92  begin();
93 
94  iterator
95  end();
96 
98  begin() const;
99 
101  end() const;
102 
103  size_type
104  size() const;
105 
106  bool
107  empty() const;
108 
109  void
110  clear();
111 
112  void
113  reserve(std::size_t n);
114 
115  void
116  swap(STArray& a) noexcept;
117 
119  getFullText() const override;
120 
122  getText() const override;
123 
125  getJson(JsonOptions index) const override;
126 
127  void
128  add(Serializer& s) const override;
129 
130  void
131  sort(bool (*compare)(const STObject& o1, const STObject& o2));
132 
133  bool
134  operator==(const STArray& s) const;
135 
136  bool
137  operator!=(const STArray& s) const;
138 
139  iterator
140  erase(iterator pos);
141 
142  iterator
143  erase(const_iterator pos);
144 
145  iterator
146  erase(iterator first, iterator last);
147 
148  iterator
149  erase(const_iterator first, const_iterator last);
150 
152  getSType() const override;
153 
154  bool
155  isEquivalent(const STBase& t) const override;
156 
157  bool
158  isDefault() const override;
159 
160 private:
161  STBase*
162  copy(std::size_t n, void* buf) const override;
163  STBase*
164  move(std::size_t n, void* buf) override;
165 
166  friend class detail::STVar;
167 };
168 
169 template <class Iter, class>
170 STArray::STArray(Iter first, Iter last) : v_(first, last)
171 {
172 }
173 
174 template <class Iter, class>
175 STArray::STArray(SField const& f, Iter first, Iter last)
176  : STBase(f), v_(first, last)
177 {
178 }
179 
180 inline STObject&
182 {
183  return v_[j];
184 }
185 
186 inline STObject const&
188 {
189  return v_[j];
190 }
191 
192 inline STObject&
194 {
195  return v_.back();
196 }
197 
198 inline STObject const&
199 STArray::back() const
200 {
201  return v_.back();
202 }
203 
204 template <class... Args>
205 inline void
206 STArray::emplace_back(Args&&... args)
207 {
208  v_.emplace_back(std::forward<Args>(args)...);
209 }
210 
211 inline void
213 {
214  v_.push_back(object);
215 }
216 
217 inline void
219 {
220  v_.push_back(std::move(object));
221 }
222 
223 inline STArray::iterator
225 {
226  return v_.begin();
227 }
228 
229 inline STArray::iterator
231 {
232  return v_.end();
233 }
234 
236 STArray::begin() const
237 {
238  return v_.begin();
239 }
240 
242 STArray::end() const
243 {
244  return v_.end();
245 }
246 
247 inline STArray::size_type
249 {
250  return v_.size();
251 }
252 
253 inline bool
255 {
256  return v_.empty();
257 }
258 
259 inline void
261 {
262  v_.clear();
263 }
264 
265 inline void
267 {
268  v_.reserve(n);
269 }
270 
271 inline void
272 STArray::swap(STArray& a) noexcept
273 {
274  v_.swap(a.v_);
275 }
276 
277 inline bool
279 {
280  return v_ == s.v_;
281 }
282 
283 inline bool
285 {
286  return v_ != s.v_;
287 }
288 
289 inline STArray::iterator
291 {
292  return v_.erase(pos);
293 }
294 
295 inline STArray::iterator
297 {
298  return v_.erase(pos);
299 }
300 
301 inline STArray::iterator
303 {
304  return v_.erase(first, last);
305 }
306 
307 inline STArray::iterator
309 {
310  return v_.erase(first, last);
311 }
312 
313 } // namespace ripple
314 
315 #endif
ripple::STArray::empty
bool empty() const
Definition: STArray.h:254
ripple::STArray::size
size_type size() const
Definition: STArray.h:248
ripple::STArray::operator==
bool operator==(const STArray &s) const
Definition: STArray.h:278
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:124
std::string
STL class.
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
ripple::STArray::iterator
list_type::iterator iterator
Definition: STArray.h:38
std::vector::reserve
T reserve(T... args)
std::vector< STObject >
std::vector::size
T size(T... args)
ripple::STArray::isEquivalent
bool isEquivalent(const STBase &t) const override
Definition: STArray.cpp:175
ripple::STArray::getJson
Json::Value getJson(JsonOptions index) const override
Definition: STArray.cpp:143
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
ripple::STArray::push_back
void push_back(STObject const &object)
Definition: STArray.h:212
ripple::STArray::copy
STBase * copy(std::size_t n, void *buf) const override
Definition: STArray.cpp:93
ripple::STArray::STArray
STArray()=default
std::vector::back
T back(T... args)
ripple::STArray::const_iterator
list_type::const_iterator const_iterator
Definition: STArray.h:39
ripple::STArray::getSType
SerializedTypeID getSType() const override
Definition: STArray.cpp:169
std::vector::clear
T clear(T... args)
std::is_convertible_v
T is_convertible_v
std::vector::push_back
T push_back(T... args)
ripple::STArray::clear
void clear()
Definition: STArray.h:260
std::enable_if_t
ripple::STArray::size_type
list_type::size_type size_type
Definition: STArray.h:37
ripple::STArray::operator!=
bool operator!=(const STArray &s) const
Definition: STArray.h:284
std::iterator_traits
ripple::STArray::isDefault
bool isDefault() const override
Definition: STArray.cpp:182
ripple::STArray
Definition: STArray.h:28
ripple::STArray::operator=
STArray & operator=(STArray const &)=default
ripple::STArray::swap
void swap(STArray &a) noexcept
Definition: STArray.h:272
std::vector::erase
T erase(T... args)
ripple::SerialIter
Definition: Serializer.h:310
ripple::STArray::getFullText
std::string getFullText() const override
Definition: STArray.cpp:105
ripple::STArray::sort
void sort(bool(*compare)(const STObject &o1, const STObject &o2))
Definition: STArray.cpp:188
std::vector::swap
T swap(T... args)
ripple::STArray::getText
std::string getText() const override
Definition: STArray.cpp:124
ripple::STArray::begin
iterator begin()
Definition: STArray.h:224
ripple::Serializer
Definition: Serializer.h:39
ripple::STObject
Definition: STObject.h:51
std::vector::emplace_back
T emplace_back(T... args)
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::STArray::operator[]
STObject & operator[](std::size_t j)
Definition: STArray.h:181
ripple::SField
Identifies fields.
Definition: SField.h:112
ripple::STBase
A type which can be exported to a well known binary format.
Definition: STBase.h:66
ripple::STArray::emplace_back
void emplace_back(Args &&... args)
Definition: STArray.h:206
std::vector::begin
T begin(T... args)
std::vector::empty
T empty(T... args)
ripple::STArray::back
STObject & back()
Definition: STArray.h:193
std::size_t
ripple::STArray::erase
iterator erase(iterator pos)
Definition: STArray.h:290
std::vector::end
T end(T... args)
ripple::STArray::move
STBase * move(std::size_t n, void *buf) override
Definition: STArray.cpp:99
ripple::STArray::v_
list_type v_
Definition: STArray.h:33
ripple::detail::STVar
Definition: STVar.h:49
ripple::STArray::end
iterator end()
Definition: STArray.h:230
ripple::STArray::add
void add(Serializer &s) const override
Definition: STArray.cpp:158
ripple::STArray::reserve
void reserve(std::size_t n)
Definition: STArray.h:266
Json::Value
Represents a JSON value.
Definition: json_value.h:145