libebml_ng
ebmlMasterElement.h
Go to the documentation of this file.
1 #ifndef EBML_NG_MASTERELEMENT_H
2 #define EBML_NG_MASTERELEMENT_H
3 
5 #include "../../ebmlElement.h"
6 #include "c_ebmlElement_l.h"
7 
8 namespace ebml {
19  class ebmlMasterElement : public ebmlElementCRTP<ebmlMasterElementType, ebmlMasterElement> {
20  protected:
23 
29  void _init(const parseString&);
30 
36  void _init(const parseFile&);
37 
43  void _cinit(const parseString&);
44 
50  void _cinit(const parseFile&);
51 
58  inline ebmlElement* _decodeChild(const parseString&) const;
59 
66  inline ebmlElement* _decodeChild(const parseFile&) const;
67 
74  inline ebmlElement* _cdecodeChild(const parseString&) const;
75 
82  inline ebmlElement* _cdecodeChild(const parseFile&) const;
83 
84  public:
85  size_t dataSize() const;
86 
87  public:
93  sizetree_t sizetree() const;
94 
95  protected:
96  size_t _encode(char*) const;
97 
98  // NEW in ebmlMasterElement. Protected _encode that makes use of a sizetree_t
99  // to avoid redundant calls to outerSize() on all of its decendants.
107  size_t _encode(char*, const sizetree_t&) const;
108 
109  public:
122  size_t encode(char*) const;
123  std::string encode() const;
124  size_t encode(ioBase&) const;
125  size_t encode(ioBase&, off_t) const;
137  size_t encode(char*, const sizetree_t&) const;
138 
139  protected:
145  virtual void _clear();
146 
154  virtual void _decodeChildren(parseString::iterator&);
155 
165 
174  virtual void _scanChildren(parseFile::iterator&);
175 
184  virtual void _cscanChildren(parseFile::iterator&);
185 
194  virtual void _handleParseFile(const parseFile&);
195 
204  virtual void _chandleParseFile(const parseFile&);
205 
213  virtual void _addChild(const ebmlElement_sp&) = 0;
214 
222  virtual void _addChild(ebmlElement_sp&&) = 0;
223 
233  void _attachChild(const ebmlElement_sp& child, bool weak = true) const;
234 
242  void _detachChild(const ebmlElement_sp& child) const;
243 
252  void _attachChildren(const ebmlElement_l& elems, bool weak=true) const;
253 
261  void _detachChildren(const ebmlElement_l& elems) const;
262 
263  // Iteration
264  public:
265  class iterator;
266 
267  // Abstract base iterator class to be implemented for each different subclass of ebmlMasterElement.
268  protected:
269  class _iterator {
270  public:
271  virtual _iterator* copy() const = 0;
272 
273  virtual ebmlElement& operator*() const = 0;
274  virtual _iterator& operator++() = 0;
275 
276  virtual _iterator& operator=(const _iterator&) = 0;
277 
278  virtual bool operator==(const _iterator&) const = 0;
279  virtual bool operator!=(const _iterator&) const = 0;
280 
281  virtual ~_iterator() {};
282 
283  friend class ebmlMasterElement;
285  };
286 
287  virtual ebmlMasterElement::_iterator* _begin() = 0;
288  virtual ebmlMasterElement::_iterator* _end() = 0;
289 
290  // Public-facing ebml::ebmlMasterElement::iterator that wraps around a pointer to ebml::ebmlMasterElement::_iterator
291  public:
292  class iterator {
293  private:
294  _iterator* _iter;
295 
296  protected:
298 
299  public:
300  ebmlElement& operator*() const;
301  iterator& operator++();
302 
303  iterator(const iterator&);
304  iterator(iterator&&);
305  iterator& operator=(const iterator&);
307 
308  bool operator==(const iterator&) const;
309  bool operator!=(const iterator&) const;
310 
311  ~iterator();
312 
313  friend class ebmlMasterElement;
314  };
315 
316  iterator begin();
317  iterator end();
318 
319  // Const Iteration
320  public:
321  class const_iterator;
322 
323  protected:
325  public:
326  virtual _const_iterator* copy() const = 0;
327  virtual const ebmlElement& operator*() const = 0;
328  virtual _const_iterator& operator++() = 0;
329  virtual _const_iterator& operator=(const _const_iterator&) = 0;
330  virtual bool operator==(const _const_iterator&) const = 0;
331  virtual bool operator!=(const _const_iterator&) const = 0;
332  virtual ~_const_iterator() {};
333 
334  friend class ebmlMasterElement;
336  };
337 
338  virtual ebmlMasterElement::_const_iterator* _cbegin() const = 0;
339  virtual ebmlMasterElement::_const_iterator* _cend() const = 0;
340 
341  public:
343  private:
344  _const_iterator* _iter;
346 
347  public:
348  virtual const ebmlElement& operator*() const;
349  virtual const_iterator& operator++();
350 
353  virtual const_iterator& operator=(const const_iterator&);
355 
356  virtual bool operator==(const const_iterator&) const;
357  virtual bool operator!=(const const_iterator&) const;
358 
359  ~const_iterator();
360 
361  friend class ebmlMasterElement;
362  };
363 
364  const_iterator cbegin() const;
365  const_iterator cend() const;
366 
367  protected:
368  static iterator make_iter(_iterator*);
370 
371  // Cloning functions:
372  protected:
373  void _clonedata(const ebmlElement*);
374 
375  public:
376  friend class ebmlMasterElementType;
377  friend class std::shared_ptr<ebmlMasterElement::_iterator>;
378  friend class std::shared_ptr<ebmlMasterElement::_const_iterator>;
379 
380  template<typename T>
381  friend class childSlot_t;
382 
383  friend std::shared_ptr<ebmlMasterElement::_iterator> std::make_shared<ebmlMasterElement::_iterator>();
384  friend std::shared_ptr<ebmlMasterElement::_const_iterator> std::make_shared<ebmlMasterElement::_const_iterator>();
385  };
386 
387  inline ebmlElement* ebmlMasterElement::_decodeChild(const parseString& parsed) const {
388  return cls()._decodeChild(parsed);
389  }
390 
392  return cls()._cdecodeChild(parsed);
393  }
394 
396  return cls()._decodeChild(parsed);
397  }
398 
400  return cls()._cdecodeChild(parsed);
401  }
402 
404  extern template class ebml_shared_ptr<ebmlMasterElement>;
405  extern template class ebml_weak_ptr<ebmlMasterElement>;
406 }
407 #endif
~iterator()
Definition: ebmlMasterElement.cpp:447
virtual void _handleParseFile(const parseFile &)
Handles the parsing of seek data for a child element.
Definition: ebmlMasterElement.cpp:206
iterator(_iterator *)
Definition: ebmlMasterElement.cpp:402
occur_d ebmlIDCount
Definition: ebmlMasterElement.h:21
Definition: ebmlMasterElement.h:292
void _detachChild(const ebmlElement_sp &child) const
Detaches a child element.
Definition: ebmlMasterElement.cpp:321
friend std::shared_ptr< ebmlMasterElement::_iterator > std::make_shared()
ebmlElement & operator*() const
Definition: ebmlMasterElement.cpp:414
static iterator make_iter(_iterator *)
Definition: ebmlMasterElement.cpp:465
ebmlElement * _decodeChild(const parseString &) const
Definition: ebmlMasterElementType.h:91
virtual ebmlMasterElement::_const_iterator * _cbegin() const =0
virtual bool operator==(const _const_iterator &) const =0
virtual bool operator!=(const _iterator &) const =0
virtual void _chandleParseFile(const parseFile &)
Handles the parsing of seek data for a child element. (const version)
Definition: ebmlMasterElement.cpp:211
virtual const ebmlElement & operator*() const =0
~const_iterator()
Definition: ebmlMasterElement.cpp:518
virtual ebmlMasterElement::_iterator * _begin()=0
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
Definition: ebmlMasterElement.h:269
iterator & operator++()
Definition: ebmlMasterElement.cpp:418
virtual void _scanChildren(parseFile::iterator &)
Scans for child elements from a parseFile iterator.
Definition: ebmlMasterElement.cpp:190
Represents a parsed EBML string segment.
Definition: string.h:37
ebmlElement * _decodeChild(const parseString &) const
Decodes a child element from a parsed string.
Definition: ebmlMasterElement.h:387
virtual _const_iterator * copy() const =0
virtual _const_iterator & operator++()=0
virtual void _clear()
Clears all child elements.
Definition: ebmlMasterElement.cpp:296
virtual ~_const_iterator()
Definition: ebmlMasterElement.h:332
sizetree_t sizetree() const
Generates the size tree for the element hierarchy.
Definition: ebmlMasterElement.cpp:90
Represents a parsed EBML file segment.
Definition: io.h:32
size_t dataSize() const
Definition: ebmlMasterElement.cpp:86
virtual void _addChild(const ebmlElement_sp &)=0
Attaches a child element (rvalue version).
ebmlMasterElement(const ebmlMasterElementType *)
Definition: ebmlMasterElement.cpp:26
ebmlElement * _cdecodeChild(const parseString &) const
Definition: ebmlMasterElementType.h:104
size_t _encode(char *) const
Definition: ebmlMasterElement.cpp:240
Definition: basictypes.h:40
Iterator for parseString objects.
Definition: string.h:130
virtual bool operator==(const _iterator &) const =0
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
Definition: ebmlMasterElement.h:342
virtual ebmlElement & operator*() const =0
const ebmlMasterElementType & cls() const
Returns a reference to the associated element class.
virtual void _decodeChildren(parseString::iterator &)
Decodes child elements from a parseString iterator.
Definition: ebmlMasterElement.cpp:123
void _init(const parseString &)
Initializes the element from a parsed EBML string.
Definition: ebmlMasterElement.cpp:29
void _detachChildren(const ebmlElement_l &elems) const
Detaches multiple child elements.
Definition: ebmlMasterElement.cpp:362
virtual void _cdecodeChildren(parseString::iterator &)
Const version of _decodeChildren.
Definition: ebmlMasterElement.cpp:157
Definition: ebmlMasterElement.h:324
Iterator class for parseFile.
Definition: io.h:89
virtual _const_iterator & operator=(const _const_iterator &)=0
Structure representing the size tree for an EBML master element.
Definition: sizetree_t.h:15
virtual const_iterator & operator=(const const_iterator &)
Definition: ebmlMasterElement.cpp:494
bool operator==(const iterator &) const
Definition: ebmlMasterElement.cpp:439
virtual ebmlMasterElement::_iterator * _end()=0
virtual _iterator * copy() const =0
ebmlElement * _cdecodeChild(const parseString &) const
Const version: Decodes a child element from a parsed string.
Definition: ebmlMasterElement.h:391
virtual const ebmlElement & operator*() const
Definition: ebmlMasterElement.cpp:485
std::string encode() const
Definition: ebmlMasterElement.cpp:216
virtual bool operator!=(const const_iterator &) const
Definition: ebmlMasterElement.cpp:514
void _attachChild(const ebmlElement_sp &child, bool weak=true) const
Attaches a child element to the master element.
Definition: ebmlMasterElement.cpp:300
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
bool operator!=(const iterator &) const
Definition: ebmlMasterElement.cpp:443
virtual _iterator & operator=(const _iterator &)=0
virtual bool operator==(const const_iterator &) const
Definition: ebmlMasterElement.cpp:510
virtual ~_iterator()
Definition: ebmlMasterElement.h:281
const_iterator cend() const
Definition: ebmlMasterElement.cpp:460
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
virtual ebmlMasterElement::_const_iterator * _cend() const =0
std::unordered_map< ebmlID_t, unsigned long > occur_d
Definition: ebmlMasterElementType.h:11
virtual bool operator!=(const _const_iterator &) const =0
void _cinit(const parseString &)
Const initialization from a parsed EBML string.
Definition: ebmlMasterElement.cpp:58
virtual const_iterator & operator++()
Definition: ebmlMasterElement.cpp:489
Base class for file-like IO operations.
Definition: io.h:22
virtual _iterator & operator++()=0
iterator & operator=(const iterator &)
Definition: ebmlMasterElement.cpp:423
void _attachChildren(const ebmlElement_l &elems, bool weak=true) const
Const version of _attachChildren.
Definition: ebmlMasterElement.cpp:336
const_iterator cbegin() const
Definition: ebmlMasterElement.cpp:455
std::vector< ebmlElement_sp > ebmlElement_l
Definition: c_ebmlElement_l.h:9
iterator begin()
Definition: ebmlMasterElement.cpp:392
virtual void _cscanChildren(parseFile::iterator &)
Scans for child elements from a parseFile iterator. (const version)
Definition: ebmlMasterElement.cpp:198
iterator end()
Definition: ebmlMasterElement.cpp:397
void _clonedata(const ebmlElement *)
Definition: ebmlMasterElement.cpp:372
A templated helper class managing a child slot within an EBML master element.
Definition: childSlot_t.h:22