libebml_ng
ebmlStruct.h
Go to the documentation of this file.
1 #ifndef EBML_NG_MASTERELEMENT_MULTSLOT_H
2 #define EBML_NG_MASTERELEMENT_MULTSLOT_H
3 
4 // #include "libebml_ng/base.h"
5 #include <unordered_map>
6 #include <vector>
7 #include <variant>
8 #include <ext/new_allocator.h>
9 
10 #include "base/ebmlMasterElement.h"
12 #include "base/childSlot_t.h"
13 
14 namespace ebml {
15  // Slot specification to be stored in ebmlMultiSlotType.
16 
17  class slotSpec_t {
18  public:
19  std::string name;
20 
21  protected:
23  bool _multi;
24 
25  public:
26  slotSpec_t();
27  slotSpec_t(const std::string&, const childTypeSpecArg_l&, bool multielem=false);
28  slotSpec_t(const slotSpec_t&);
30  ~slotSpec_t();
31 
34 
35  const childTypeSpec_t & childTypes() const;
36  bool multi() const;
37  // const c_ebmlElement_sp& defaultval() const;
38  // const c_ebmlElement_l& defaultvals() const;
39 
40  friend class _slot_t;
41  friend class ebmlStructType;
42  };
43 
44  typedef std::vector<slotSpec_t> slotSpec_l;
45 
46  class slotArg_t;
47  typedef std::list<slotArg_t> slotArg_l;
48  typedef std::unordered_map<std::string, slotArg_t> slotArg_d;
49 
50  class ebmlStruct;
52 
64  class ebmlStructType : public ebmlTypeCRTP<ebmlStructType, ebmlStruct, ebmlMasterElementType> {
65  friend class ebmlStruct;
66 
67  private:
68  std::vector<slotSpec_t> _slotSpecs;
69  std::unordered_map<ebmlID_t, const slotSpec_t*> _slots_by_ebmlID;
70  std::unordered_map<std::string, const slotSpec_t*> _slots_by_name;
71 
72  public:
73  ebmlStructType(const char*, const std::wstring&, const slotSpec_l&);
74  ebmlStructType(ebmlID_t, const std::wstring&, const slotSpec_l&);
75  ebmlStructType(const char*, const std::wstring&, const slotSpec_l&, const seekHelper_t* seekHelper);
76  ebmlStructType(ebmlID_t, const std::wstring&, const slotSpec_l&, const seekHelper_t* seekHelper);
77 
78  // ebmlMultiSlot_sp operator()(const slotArg_l&) const;
79  // ebmlMultiSlot_sp operator()(const slotArg_d&) const;
80  // ebmlMultiSlot_sp operator()(const slotArg_l&, const slotArg_d&) const;
81  //
82  // ebmlMultiSlot_sp operator()(slotArg_l&&) const;
83  // ebmlMultiSlot_sp operator()(slotArg_d&&) const;
84  // ebmlMultiSlot_sp operator()(slotArg_l&&, slotArg_d&&) const;
85  // std::wstring repr() const;
86 
87  protected:
88  // ebmlElement* _new() const override;
89  // ebmlElement_sp _decode(const parseString&) const override;
90  // ebmlElement_sp _decode(const parseFile&) const override;
91  // ebmlElement_sp _cdecode(const parseString&) const override;
92  // ebmlElement_sp _cdecode(const parseFile&) const override;
93 
94  public:
95  const std::vector<slotSpec_t>& slotSpecs() const;
96  const std::unordered_map<std::string, const slotSpec_t*>& slotSpecsByKey() const;
97  const std::unordered_map<ebmlID_t, const slotSpec_t*>& slotSpecsByID() const;
98  const ebmlElementType * typeBySlot(const std::string&) const;
99  const ebmlElementType * typeBySlot(size_t) const;
100  };
101 
102  // Wrapper for ebmlElement_sp or ebmlElement_l object to be passed via std::list<slotArg_t> to construct an ebmlMultiSlot instance.
103  class slotArg_t {
104  private:
105  void _check_single() const;
106  void _check_multi() const;
107  bool _multi;
108  union {
111  };
112 
113  public:
114  slotArg_t();
115  slotArg_t(const std::nullptr_t&);
116  slotArg_t(const ebmlElement_sp&);
117 
118  template<typename T>
120 
121  template<typename T>
123 
125  slotArg_t(const ebmlElement_l&);
127 
128  slotArg_t(const slotArg_t&);
129  slotArg_t(slotArg_t&&);
130 
131  // Copy/move assign
132  slotArg_t& operator=(const slotArg_t&);
134 
135  // Copy/move assign from ebmlElement_sp and ebmlElement_l
138 
141 
142  bool multi() const;
143 
144  operator ebmlElement_sp&();
145  operator const ebmlElement_sp&() const;
146  operator ebmlElement_l&();
147  operator const ebmlElement_l&() const;
148 
149  ~slotArg_t();
150  };
151 
154  class slot_t;
155  class _slot_t;
156 
157  class const_slot_t {
158  private:
159  c_ebmlMultiSlot_sp _parent;
160  const _slot_t* _slot;
161 
162  protected:
165 
166  public:
167  const_slot_t(const slot_t&);
168  const_slot_t(slot_t&&);
169  const_slot_t(const const_slot_t&);
171 
174  const_slot_t& operator=(const slot_t&);
176 
177  // Single-element access
178  operator c_ebmlElement_sp() const;
179 
180  // Multi-element access
181  operator c_ebmlElement_l() const;
182 #if RAW
183  const ebmlElement* operator[](size_t) const;
184 #else
185  c_ebmlElement_sp operator[](size_t) const;
186 #endif
187 
188  class iterator {
189  private:
190  const _slot_t* _slot;
191  union {
192  bool _done;
193  ebmlElement_l::const_iterator _iter;
194  };
195 
196  protected:
197  iterator();
198  iterator(const _slot_t&, bool);
199  iterator(const _slot_t&, const ebmlElement_l::const_iterator&);
200  iterator(const _slot_t&, ebmlElement_l::const_iterator&&);
201  bool multi() const;
202 
203  public:
204  iterator(const iterator&);
205  iterator(iterator&&);
206  iterator& operator=(const iterator&);
208 
209  iterator& operator++();
210  iterator operator++(int);
211  bool operator==(const iterator&) const;
212 
213 #if RAW
214  const ebmlElement* operator*() const;
215 #else
216  c_ebmlElement_sp operator*() const;
217 #endif
218 
219  ~iterator();
220  friend class slot_t;
221  friend class const_slot_t;
222  friend class ebmlStruct;
223  };
224 
227 
228  friend class iterator;
229  friend class ebmlStruct;
230  };
231 
232  template<typename T>
233  T data(const const_slot_t& slot) {
234  c_ebmlElement_sp elem = slot;
235  return data<T>(elem);
236  }
237 
238  // Provides a public view of _slot_t instance
239  class slot_t {
240  protected:
245  // slot_t(ebmlElement_sp&&, _slot_t&);
246 
247  public:
248  slot_t(const slot_t&);
249  slot_t(slot_t&&);
250 
251  slot_t& operator=(const slot_t&);
252  slot_t& operator=(slot_t&&);
253 
254  // Single-element access
257 
258  // operator ebmlElement_sp();
259  operator const ebmlElement_sp&();
260  operator c_ebmlElement_sp() const;
261 
262  // Multi-element access
263  slot_t& operator=(const ebmlElement_l&);
265 
266  operator const ebmlElement_l&();
267  operator c_ebmlElement_l() const;
268 
269  childSlot_t<> operator[](size_t);
270 
271  template<typename T=ebmlElement>
272  childSlot_t<T> at(size_t);
273 
274  template<typename T=ebmlElement>
276 
277  template<typename T=ebmlElement>
279 
280  template<typename T>
281  T& data(size_t);
282 
283  template<typename T>
284  const T& data(size_t) const;
285 
288 
289  size_t size() const;
290 
291 #if RAW
292  const ebmlElement* operator[](size_t) const;
293  const ebmlElement* at(size_t) const;
294  const ebmlElement* front() const;
295  const ebmlElement* back() const;
296 #else
297  c_ebmlElement_sp operator[](size_t) const;
298  c_ebmlElement_sp at(size_t) const;
299  c_ebmlElement_sp front() const;
300  c_ebmlElement_sp back() const;
301 #endif
302 
303  class iterator {
304  private:
305  _slot_t* _slot;
306  union {
307  bool _done;
308  ebmlElement_l::iterator _iter;
309  };
310 
311  protected:
312  iterator();
313  iterator(_slot_t&, bool);
314  iterator(_slot_t&, const ebmlElement_l::iterator&);
315  iterator(_slot_t&, ebmlElement_l::iterator&&);
316  bool multi() const;
317 
318  public:
319  iterator(const iterator&);
320  iterator(iterator&&);
321  iterator& operator=(const iterator&);
323 
324  iterator& operator++();
325  iterator operator++(int);
326  bool operator==(const iterator&) const;
327  const ebmlElement_sp& operator*() const;
328 
329  ~iterator();
330  friend class _slot_t;
331  friend class slot_t;
332  friend class ebmlStruct;
333  };
334 
335  iterator begin();
336  iterator end();
337 
339  const_iterator cbegin() const;
340  const_iterator cend() const;
341 
342  friend class const_slot_t;
343  friend class iterator;
344  // friend class const_iterator;
345  friend class ebmlStruct;
346  };
347 
348  class _slot_t {
349  protected:
351  union {
354  };
355 
356  private:
357  void _check_single() const;
358  void _check_multi() const;
359 
360  protected:
361  _slot_t(const slotSpec_t& spec);
362  _slot_t(const slotSpec_t& spec, const ebmlElement_sp& elem);
363  _slot_t(const slotSpec_t& spec, ebmlElement_sp&& elem);
364  _slot_t(const slotSpec_t& spec, const ebmlElement_l& elems);
365  _slot_t(const slotSpec_t& spec, ebmlElement_l&& elems);
366 
367  public:
368  _slot_t();
369  _slot_t(const _slot_t& other);
370  _slot_t(_slot_t&& other);
371  _slot_t& operator=(const _slot_t& other);
372  _slot_t& operator=(_slot_t&& other);
373  ~_slot_t();
374 
375  private:
376  void _validate(const ebmlElement_sp& elem) const;
377  void _validate(const ebmlElement_l& elems) const;
378 
379  public:
380  void validate(const ebmlElement_sp& elem) const;
381  void validate(const ebmlElement_l& elems) const;
382  const slotSpec_t& slotSpec() const;
383  bool multi() const;
384  size_t size() const;
385 
386  // Single-element access and modification
387  _slot_t& operator=(const ebmlElement_sp& other);
388  _slot_t& operator=(ebmlElement_sp&& other);
389  operator ebmlElement_sp() const;
390  operator ebmlElement_sp&();
391  operator const ebmlElement_sp&() const;
392  operator c_ebmlElement_sp() const;
393 
394  // Mutli-element access and modification
395  operator ebmlElement_l&();
396 
397  protected:
398  operator const ebmlElement_l&() const;
399 
400  public:
401  operator c_ebmlElement_l() const;
402  ebmlElement_sp& operator[](size_t index);
403  ebmlElement_sp& at(size_t index);
405  ebmlElement_sp& back();
406  ebmlElement_sp& insert(size_t index, const ebmlElement_sp& elem);
407  ebmlElement_sp& insert(size_t index, ebmlElement_sp&& elem);
408  void erase(size_t index);
413 #if RAW
414  const ebmlElement* operator[](size_t index) const;
415  const ebmlElement* at(size_t index) const;
416  const ebmlElement* front() const;
417  const ebmlElement* back() const;
418 #else
419  c_ebmlElement_sp operator[](size_t index) const;
420  c_ebmlElement_sp at(size_t index) const;
421  c_ebmlElement_sp front() const;
422  c_ebmlElement_sp back() const;
423 #endif
424  // operator ebmlElement_l();
425  // operator c_ebmlElement_l();
426 
427  // Assign multi-element at once
428  _slot_t& operator=(const ebmlElement_l& other);
429  _slot_t& operator=(ebmlElement_l&& other);
430 
431  std::wstring repr() const;
432 
433  friend class slot_t;
434  friend class slot_t::iterator;
435  friend class const_slot_t;
437  friend class ebmlStruct;
438  };
439 
440  template<typename T>
441  T& data(slot_t& slot) {
442  const ebmlElement_sp& elem = slot;
443  return data<T>(elem);
444  }
445 
446 
447  class ebmlStruct : public ebmlElementCRTP<ebmlStructType, ebmlStruct, ebmlMasterElement> {
448  private:
449  std::vector<_slot_t> _slots;
450  std::unordered_map<std::string, _slot_t*> _slots_by_name;
451  std::unordered_map<ebmlID_t, _slot_t*> _slots_by_ebmlID;
452 
453  protected:
454  ebmlStruct(const ebmlStructType *);
455  ebmlStruct(const ebmlStructType *, const slotArg_l&);
456  ebmlStruct(const ebmlStructType *, slotArg_l&&);
457  ebmlStruct(const ebmlStructType *, const slotArg_d&);
458  ebmlStruct(const ebmlStructType *, slotArg_d&&);
459  ebmlStruct(const ebmlStructType *, const slotArg_l&, const slotArg_d&);
460  ebmlStruct(const ebmlStructType *, slotArg_l&&, const slotArg_d&);
461  ebmlStruct(const ebmlStructType *, const slotArg_l&, slotArg_d&&);
463  ebmlStruct(const ebmlStruct &);
464  void _clear() override;
465 
466  // Check existence of required args and extraneous args
467  void _validateArgs(const slotArg_l& args);
468  void _validateArgs(const slotArg_d& kwargs);
469  void _validateArgs(const slotArg_l& args, const slotArg_d& kwargs);
470 
471  // Check if data can be set by attempting to attach children.
472  void _validateData(const slotArg_l& args);
473  void _validateData(const slotArg_d& args);
474 
475  // Set data, assuming above checks have passed.
476  void _setData(const slotArg_l& args);
477  void _setData(slotArg_l&& args);
478 
479  void _setData(const slotArg_d& kwargs);
480  void _setData(slotArg_d&& kwargs);
481 
482  public:
483  void setData(const slotArg_l&);
484  void setData(slotArg_l&&);
485  void setData(const slotArg_d&);
486  void setData(slotArg_d&&);
487  void setData(const slotArg_l&, const slotArg_d&);
488  void setData(slotArg_l&&, slotArg_d&&);
489  std::wstring minirepr() const override;
490 
491  // Slot access
492  slot_t operator[](size_t);
493  slot_t operator[](const std::string&);
494 
495  const_slot_t operator[](size_t) const;
496  const_slot_t operator[](const std::string&) const;
497 
498  template<typename T>
499  T& data(size_t);
500 
501  template<typename T>
502  T& data(const std::string&);
503 
504  template<typename T>
505  const T& data(size_t) const;
506 
507  template<typename T>
508  const T& data(const std::string&) const;
509 
510  // Iteration
511  protected:
513  private:
514  ebml::ptr<ebmlStruct> _elem;
515  std::vector<_slot_t>::iterator _slotiter;
516  std::vector<_slot_t>::iterator _slotiterend;
517  slot_t::iterator _iter;
518  slot_t::iterator _iterend;
519 
520  protected:
521  _iterator(
522  const ebml::ptr<ebmlStruct>& elem,
523  const std::vector<_slot_t>::iterator& slotiter,
524  const std::vector<_slot_t>::iterator& slotiterend,
525  const slot_t::iterator& iter,
526  const slot_t::iterator& iterend
527  );
528 
529  _iterator(
530  ebml::ptr<ebmlStruct>&& elem,
531  std::vector<_slot_t>::iterator&& slotiter,
532  std::vector<_slot_t>::iterator&& slotiterend,
533  slot_t::iterator&& iter,
534  slot_t::iterator&& iterend
535  );
536 
537  public:
538  _iterator();
539  virtual ~_iterator();
540 
542 
543  ebmlElement& operator*() const;
546  bool operator==(const ebmlMasterElement::_iterator&) const;
547  bool operator!=(const ebmlMasterElement::_iterator&) const;
548 
549  friend class ebmlStruct;
551  // friend class ebml::ptr<_iterator>;
552  };
553 
556 
557 
559  private:
561  std::vector<_slot_t>::const_iterator _slotiter;
562  std::vector<_slot_t>::const_iterator _slotiterend;
564  const_slot_t::iterator _iterend;
565 
566  protected:
568  const ebml::ptr<const ebmlStruct>& elem,
569  const std::vector<_slot_t>::const_iterator& slotiter,
570  const std::vector<_slot_t>::const_iterator& slotiterend,
571  const const_slot_t::iterator& iter,
572  const const_slot_t::iterator& iterend
573  );
576  std::vector<_slot_t>::const_iterator&& slotiter,
577  std::vector<_slot_t>::const_iterator&& slotiterend,
578  const_slot_t::iterator&& iter,
579  const_slot_t::iterator&& iterend
580  );
581 
582  public:
583  _const_iterator();
584  virtual ~_const_iterator();
586  const ebmlElement& operator*() const;
591  friend class ebmlStruct;
593  };
594 
595  // ebml::ptr<ebmlMasterElement::_const_iterator> _cbegin() const override;
596  // ebml::ptr<ebmlMasterElement::_const_iterator> _cend() const override;
597 
599  ebmlMasterElement::_const_iterator* _cend() const override;
600 
601  protected:
602  void _addChild(const ebmlElement_sp&) override;
603  void _addChild(ebmlElement_sp&&) override;
604 
607  friend class slot_t;
608  };
609 
612  extern template class flexible_ptr<ebmlStruct>;
613  extern template class ebml_shared_ptr<ebmlStruct>;
614  extern template class ebml_weak_ptr<ebmlStruct>;
615 }
616 #endif
ebmlElement_sp & push_back(const ebmlElement_sp &elem)
Definition: ebmlStruct.cpp:744
void erase(size_t index)
Definition: ebmlStruct.cpp:739
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
T & data(const ebmlElement_sp &elem)
void _clear() override
Clears all child elements.
Definition: ebmlStruct.cpp:1531
Abstract base class for EBML Element Type objects.
Definition: ebmlElementType.h:106
T & data(size_t)
ebmlElement_l elems
Definition: ebmlStruct.h:110
iterator & operator++()
Definition: ebmlStruct.cpp:1962
ebmlElement_l::iterator _iter
Definition: ebmlStruct.h:308
Definition: ebmlMasterElement.h:292
slotArg_t()
Definition: ebmlStruct.cpp:285
~slotSpec_t()
Definition: ebmlStruct.cpp:39
std::list< childTypeSpecArg_t > childTypeSpecArg_l
Alias for a list of child type specification arguments.
Definition: childTypeSpec.h:39
Definition: ebmlStruct.h:157
Definition: ebmlStruct.h:303
Definition: ebmlStruct.h:348
const_slot_t::iterator cbegin() const
Definition: ebmlStruct.cpp:2229
slotArg_t & operator=(const slotArg_t &)
Definition: ebmlStruct.cpp:325
ebmlElement_l::const_iterator _iter
Definition: ebmlStruct.h:193
childSlot_t< T > front()
const_slot_t::iterator cend() const
Definition: ebmlStruct.cpp:2239
iterator()
Definition: ebmlStruct.cpp:2075
bool operator==(const ebmlMasterElement::_const_iterator &) const
Definition: ebmlStruct.cpp:2419
ebmlElement_l elems
Definition: ebmlStruct.h:353
iterator & operator=(const iterator &)
Definition: ebmlStruct.cpp:2140
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
void setData(const slotArg_l &)
Definition: ebmlStruct.cpp:1485
ebmlMasterElement::_const_iterator & operator=(const ebmlMasterElement::_const_iterator &)
Definition: ebmlStruct.cpp:2404
Definition: ebmlMasterElement.h:269
bool multi() const
Definition: ebmlStruct.cpp:2129
const std::unordered_map< std::string, const slotSpec_t * > & slotSpecsByKey() const
Definition: ebmlStruct.cpp:230
slot_t & operator=(const slot_t &)
Definition: ebmlStruct.cpp:1706
childSlot_t push_back(const ebmlElement_sp &)
Definition: ebmlStruct.cpp:1789
bool operator!=(const ebmlMasterElement::_const_iterator &) const
Definition: ebmlStruct.cpp:2439
seekHelper_t seekHelper
Definition: seekdata.cpp:136
~_slot_t()
Definition: ebmlStruct.cpp:600
ebmlMultiSlot_sp _parent
Definition: ebmlStruct.h:241
iterator begin()
Definition: ebmlStruct.cpp:1997
Definition: ebmlStruct.h:558
bool multi() const
Definition: ebmlStruct.cpp:409
Definition: ebmlStruct.h:512
ebmlElement_sp & emplace_back(const ebmlElement_sp &elem)
Definition: ebmlStruct.cpp:758
bool operator==(const iterator &) const
Definition: ebmlStruct.cpp:2216
ptr< ebmlElement > ebmlElement_sp
Definition: ptrs.h:837
c_ebmlElement_sp operator[](size_t) const
Definition: ebmlStruct.cpp:2069
T & data(size_t)
void _validateArgs(const slotArg_l &args)
Definition: ebmlStruct.cpp:954
slotSpec_t()
Definition: ebmlStruct.cpp:25
ebmlMasterElement::_iterator * _end() override
Definition: ebmlStruct.cpp:1614
Definition: ebmlStruct.h:17
_slot_t & operator=(const _slot_t &other)
Definition: ebmlStruct.cpp:523
const_iterator cend() const
Definition: ebmlStruct.cpp:2257
size_t size() const
Definition: ebmlStruct.cpp:643
c_ebmlElement_sp operator*() const
Definition: ebmlStruct.cpp:2206
const ebmlElement_sp & operator*() const
Definition: ebmlStruct.cpp:1977
childTypeSpec_t _childTypes
Definition: ebmlStruct.h:22
iterator & operator=(const iterator &)
Definition: ebmlStruct.cpp:1919
_iterator()
Definition: ebmlStruct.cpp:2265
Definition: ebmlStruct.h:188
A drop-in replacement for std::weak_ptr tailored for EBML objects.
Definition: ptrs.h:30
Definition: basictypes.h:40
childSlot_t operator[](size_t)
Definition: ebmlStruct.cpp:1784
ebmlMasterElement::_const_iterator & operator++()
Definition: ebmlStruct.cpp:2377
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
virtual ~_iterator()
Definition: ebmlStruct.cpp:2266
Definition: ebmlMasterElement.h:342
std::list< slotArg_t > slotArg_l
Definition: ebmlStruct.h:46
ebmlElement_sp & insert(size_t index, const ebmlElement_sp &elem)
Definition: ebmlStruct.cpp:725
const slotSpec_t & slotSpec() const
Definition: ebmlStruct.cpp:635
void _addChild(const ebmlElement_sp &) override
Attaches a child element (rvalue version).
Definition: ebmlStruct.cpp:1572
Definition: ebmlStruct.h:239
ebmlMasterElement::_iterator * _begin() override
Definition: ebmlStruct.cpp:1596
std::wstring repr() const
Definition: ebmlStruct.cpp:831
bool multi() const
Definition: ebmlStruct.cpp:639
bool _done
Definition: ebmlStruct.h:307
size_t size() const
Definition: ebmlStruct.cpp:1807
Definition: ebmlMasterElement.h:324
~slotArg_t()
Definition: ebmlStruct.cpp:433
const_slot_t(const ebml::ptr< const ebmlStruct > &, const _slot_t &)
Definition: ebmlStruct.cpp:2015
ebmlStructType(const char *, const std::wstring &, const slotSpec_l &)
Definition: ebmlStruct.cpp:78
const_iterator cbegin() const
Definition: ebmlStruct.cpp:2247
ebmlElement_sp & front()
Definition: ebmlStruct.cpp:715
std::wstring minirepr() const override
Definition: ebmlStruct.cpp:1553
ebmlElement_sp & operator[](size_t index)
Definition: ebmlStruct.cpp:705
slot_t(const ebml::ptr< ebmlStruct > &, _slot_t &)
Definition: ebmlStruct.cpp:1701
const std::vector< slotSpec_t > & slotSpecs() const
Definition: ebmlStruct.cpp:226
std::unordered_map< std::string, slotArg_t > slotArg_d
Definition: ebmlStruct.h:48
_slot_t * _slot
Definition: ebmlStruct.h:242
Read-only list wrapper for EBML element shared pointers.
Definition: c_ebmlElement_l.h:16
ebmlElement_sp elem
Definition: ebmlStruct.h:352
const childTypeSpec_t & childTypes() const
Definition: ebmlStruct.cpp:41
ebmlMasterElement::_iterator & operator++()
Definition: ebmlStruct.cpp:2289
void _setData(const slotArg_l &args)
Definition: ebmlStruct.cpp:1349
slotArg_t(const ebml::ptr< T > &ptr)
Definition: ebmlStruct.h:119
~iterator()
Definition: ebmlStruct.cpp:2133
bool multi() const
Definition: ebmlStruct.cpp:1859
const_slot_t::iterator const_iterator
Definition: ebmlStruct.h:338
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
ebmlElement_sp & back()
Definition: ebmlStruct.cpp:720
ebml::ptr< const ebmlStruct > c_ebmlMultiSlot_sp
Definition: ebmlStruct.h:153
A flexible pointer that can store either a strong (shared) or weak pointer.
Definition: flexptr.h:21
~iterator()
Definition: ebmlStruct.cpp:1890
ptr< const ebmlElement > c_ebmlElement_sp
Definition: ptrs.h:843
virtual ~_const_iterator()
Definition: ebmlStruct.cpp:2354
ebmlElement_sp elem
Definition: ebmlStruct.h:109
ebmlStruct(const ebmlStructType *)
Definition: ebmlStruct.cpp:871
ebmlElement & operator*() const
Definition: ebmlStruct.cpp:2285
ebml_shared_ptr< T > ebml_static_pointer_cast(const ebml_shared_ptr< U > &)
Definition: ptrs.h:731
childSlot_t< T > at(size_t)
ebmlElement_sp & at(size_t index)
Definition: ebmlStruct.cpp:710
const std::unordered_map< ebmlID_t, const slotSpec_t * > & slotSpecsByID() const
Definition: ebmlStruct.cpp:234
bool operator==(const iterator &) const
Definition: ebmlStruct.cpp:1984
ebmlMasterElement::_iterator & operator=(const ebmlMasterElement::_iterator &)
Definition: ebmlStruct.cpp:2316
_const_iterator()
Definition: ebmlStruct.cpp:2353
bool multi() const
Definition: ebmlStruct.cpp:59
std::string name
Definition: ebmlStruct.h:19
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
ebmlMasterElement::_const_iterator * _cend() const override
Definition: ebmlStruct.cpp:1648
void _validateData(const slotArg_l &args)
Definition: ebmlStruct.cpp:1297
ebmlMasterElement::_const_iterator * copy() const
Definition: ebmlStruct.cpp:2369
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
ebmlMasterElement::_const_iterator * _cbegin() const override
Definition: ebmlStruct.cpp:1623
iterator()
Definition: ebmlStruct.cpp:1854
bool _multi
Definition: ebmlStruct.h:23
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
slotSpec_t & operator=(const slotSpec_t &)
Definition: ebmlStruct.cpp:45
Specifies accepted child element types within a parent element.
Definition: childTypeSpec.h:76
iterator end()
Definition: ebmlStruct.cpp:2007
Definition: ebmlStruct.h:103
ebml::ptr< ebmlStruct > ebmlMultiSlot_sp
Definition: ebmlStruct.h:50
iterator & operator++()
Definition: ebmlStruct.cpp:2183
const slotSpec_t * _spec
Definition: ebmlStruct.h:350
slotArg_t(ebml::ptr< T > &&ptr)
Definition: ebmlStruct.h:122
Represents a structure-like EBML master element.
Definition: ebmlStruct.h:64
const_slot_t & operator=(const const_slot_t &)
Definition: ebmlStruct.cpp:2026
std::vector< slotSpec_t > slotSpec_l
Definition: ebmlStruct.h:44
Definition: ebmlStruct.h:447
std::vector< ebmlElement_sp > ebmlElement_l
Definition: c_ebmlElement_l.h:9
bool operator==(const ebmlMasterElement::_iterator &) const
Definition: ebmlStruct.cpp:2329
void validate(const ebmlElement_sp &elem) const
Definition: ebmlStruct.cpp:625
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
bool _done
Definition: ebmlStruct.h:192
const ebmlElementType * typeBySlot(const std::string &) const
Definition: ebmlStruct.cpp:238
ebmlMasterElement::_iterator * copy() const
Definition: ebmlStruct.cpp:2281
bool operator!=(const ebmlMasterElement::_iterator &) const
Definition: ebmlStruct.cpp:2349
childSlot_t< T > back()
slot_t operator[](size_t)
Definition: ebmlStruct.cpp:1657
_slot_t()
Definition: ebmlStruct.cpp:500
const ebmlElement & operator*() const
Definition: ebmlStruct.cpp:2373
A templated helper class managing a child slot within an EBML master element.
Definition: childSlot_t.h:22