libebml_ng
src
libebml_ng
masterelement
base.h
Go to the documentation of this file.
1
// #ifndef EBML_NG_MASTERELEMENT_H
2
// #define EBML_NG_MASTERELEMENT_H
3
//
4
// #include "../ebmlElementClass.h"
5
// #include "../element.h"
6
// #include "../exceptions.h"
7
//
8
// #include <unordered_map>
9
// #include <unordered_set>
10
// #include <deque>
11
// #include <list>
12
// #include <vector>
13
// #include <optional>
14
//
15
// namespace ebml {
16
// // Used in the initialization of a new ebmlMasterElementClass (and its c++ subclass) instances.
17
// struct childClassSpecArg_t {
18
// childClassSpecArg_t();
19
// childClassSpecArg_t(const ebmlElementClass*, unsigned long min=0, long max=-1);
20
// const ebmlElementClass* cls;
21
// unsigned long min; // Minimum number of occurrences required.
22
// long max; // Maximum number of occurrences permitted. Negative values interpreted as infinity.
23
// };
24
//
25
// typedef std::list<childClassSpecArg_t> childClassSpecArg_l;
26
// typedef std::initializer_list<childClassSpecArg_t> childClassSpecArg_init_l;
27
//
28
// struct occurSpec_t {
29
// unsigned long min;
30
// long max;
31
// };
32
//
33
// typedef std::unordered_map<ebmlID_t, const ebmlElementClass*> ebmlElementClass_d;
34
// typedef std::unordered_set<const ebmlElementClass*> ebmlElementClass_s;
35
// typedef std::unordered_map<ebmlID_t, occurSpec_t> occurSpec_d;
36
//
37
// // Child element class specification. Used to specify accepted EBML Element types within a parent element.
38
// // Also used to look up EBMLElementClass* instances by ebmlID_t
39
//
40
// class childClassSpec_t {
41
// private:
42
// ebmlElementClass_d _cls_by_ebmlID;
43
// ebmlElementClass_s _clss;
44
// occurSpec_d _occurspec;
45
// void _clear();
46
//
47
// public:
48
// childClassSpec_t();
49
// childClassSpec_t(childClassSpecArg_init_l);
50
// childClassSpec_t(const childClassSpecArg_l&);
51
// childClassSpec_t(const childClassSpec_t&) = default;
52
// childClassSpec_t(childClassSpec_t&&) = default;
53
//
54
// childClassSpec_t& operator=(childClassSpecArg_init_l);
55
// childClassSpec_t& operator=(const childClassSpecArg_l&);
56
// childClassSpec_t& operator=(const childClassSpec_t&) = default;
57
// childClassSpec_t& operator=(childClassSpec_t&&) = default;
58
//
59
// void add(const childClassSpecArg_t&);
60
// void add(const ebmlElementClass*, unsigned long min=0, long max=-1);
61
// void remove(ebmlID_t);
62
//
63
// const ebmlElementClass* operator[](ebmlID_t) const;
64
// size_t count(ebmlID_t) const;
65
// size_t count(const ebmlElementClass*) const;
66
// size_t size() const;
67
//
68
// const occurSpec_d& occurSpec() const;
69
// const occurSpec_t& occurSpec(ebmlID_t) const;
70
// const occurSpec_t& occurSpec(const ebmlElementClass*) const;
71
//
72
// bool isValid(const ebmlElement_sp&) const;
73
//
74
// ebmlElementClass_d::const_iterator begin() const;
75
// ebmlElementClass_d::const_iterator end() const;
76
// };
77
//
78
// class ebmlMasterElement;
79
//
80
// typedef std::vector<ebmlElement_sp> ebmlElement_l;
81
//
82
// class c_ebmlElement_l {
83
// private:
84
// const ebmlElement_l* _items;
85
// public:
86
// c_ebmlElement_l(const ebmlElement_l&);
87
// c_ebmlElement_l(const c_ebmlElement_l&);
88
// #if RAW
89
// const ebmlElement* front() const;
90
// const ebmlElement* back() const;
91
// const ebmlElement* at(size_t) const;
92
// const ebmlElement* operator[](size_t) const;
93
// #else
94
// c_ebmlElement_sp front() const;
95
// c_ebmlElement_sp back() const;
96
// c_ebmlElement_sp at(size_t) const;
97
// c_ebmlElement_sp operator[](size_t) const;
98
// #endif
99
// size_t size() const;
100
// bool empty() const;
101
//
102
// class const_iterator {
103
// private:
104
// ebmlElement_l::const_iterator _iter;
105
//
106
// protected:
107
// const_iterator(const ebmlElement_l::const_iterator&);
108
// const_iterator(ebmlElement_l::const_iterator&&);
109
//
110
// public:
111
// const_iterator(const c_ebmlElement_l&);
112
// const_iterator(const const_iterator&);
113
// const_iterator(const_iterator&&);
114
//
115
// bool operator=(const const_iterator&);
116
// bool operator=(const_iterator&&);
117
//
118
// #if RAW
119
// const ebmlElement* operator*() const;
120
// #else
121
// c_ebmlElement_sp operator*() const;
122
// #endif
123
//
124
// const ebmlElement* operator->() const;
125
// const_iterator& operator++();
126
// const_iterator operator++(int);
127
// bool operator==(const const_iterator&) const;
128
// bool operator!=(const const_iterator&) const;
129
// };
130
//
131
// const_iterator cbegin() const;
132
// const_iterator cend() const;
133
// };
134
//
135
//
136
// // Used to keep track of element count
137
// typedef std::unordered_map<ebmlID_t, unsigned long> occur_d;
138
//
139
// struct sizetree_t {
140
// vintWidth_t ebmlIDWidth;
141
// vintWidth_t sizeWidth;
142
// size_t dataSize;
143
// // std::deque<sizetree_t> children;
144
// std::optional<std::deque<sizetree_t>> children;
145
//
146
// sizetree_t();
147
// sizetree_t(const sizetree_t&);
148
// sizetree_t(sizetree_t&&);
149
// sizetree_t(vintWidth_t _ebmlIDWidth, vintWidth_t _sizeWidth, size_t _dataSize);
150
// sizetree_t& operator=(const sizetree_t&);
151
// sizetree_t& operator=(sizetree_t&&);
152
// size_t outerSize() const;
153
// void append(const sizetree_t&);
154
// void append(sizetree_t&&);
155
// };
156
//
157
// // Base class for EBML Master Element Types.
158
//
159
// class ebmlMasterElementClass : public ClsMixin<ebmlMasterElementClass, ebmlMasterElement> {
160
// friend class ebmlMasterElement;
161
//
162
// protected:
163
// childClassSpec_t _childClasses;
164
//
165
// public:
166
// ebmlMasterElementClass(const char*, const std::wstring&, const childClassSpecArg_l&);
167
// ebmlMasterElementClass(ebmlID_t, const std::wstring&, const childClassSpecArg_l&);
168
// ebmlMasterElementClass(const char*, const std::wstring&, const childClassSpecArg_l&, const seekHelper_t* seekHelper);
169
// ebmlMasterElementClass(ebmlID_t, const std::wstring&, const childClassSpecArg_l&, const seekHelper_t* seekHelper);
170
//
171
// protected:
172
// ebmlMasterElementClass(const char*, const std::wstring&);
173
// ebmlMasterElementClass(ebmlID_t, const std::wstring&);
174
// ebmlMasterElementClass(const char*, const std::wstring&, const seekHelper_t* seekHelper);
175
// ebmlMasterElementClass(ebmlID_t, const std::wstring&, const seekHelper_t* seekHelper);
176
//
177
// // ebmlElement_sp _decode(const parseString&) const override;
178
// // ebmlElement_sp _decode(const parseFile&) const override;
179
// // ebmlElement_sp _cdecode(const parseString&) const override;
180
// // ebmlElement_sp _cdecode(const parseFile&) const override;
181
//
182
// inline ebmlElement* _decodeChild(const parseString&) const;
183
// inline ebmlElement* _decodeChild(const parseFile&) const;
184
// inline ebmlElement* _cdecodeChild(const parseString&) const;
185
// inline ebmlElement* _cdecodeChild(const parseFile&) const;
186
//
187
// // ebmlElement* _decodeChild(const parseString&) const;
188
// // ebmlElement* _decodeChild(const parseFile&) const;
189
// // ebmlElement* _cdecodeChild(const parseString&) const;
190
// // ebmlElement* _cdecodeChild(const parseFile&) const;
191
//
192
// public:
193
// // Offers const accsss to _childClasses member.
194
// inline const childClassSpec_t& childClasses() const {
195
// return _childClasses;
196
// };
197
// };
198
//
199
// // Base class for EBML Master Element instances.
200
// // Implements framework for decode, encode, and public-facing iteration.
201
// // Each subclass must implement its own child element placement and private iteration scheme
202
//
203
// // class ebmlMasterElement : public ebmlElementTmpl<ebmlMasterElementClass, ebmlMasterElement> {
204
// class ebmlMasterElement : public InstMixin<ebmlMasterElementClass, ebmlMasterElement> {
205
// // Constructors
206
// protected:
207
// ebmlMasterElement(const ebmlMasterElementClass*);
208
// void _init(const parseString&);
209
// void _init(const parseFile&);
210
// void _cinit(const parseString&);
211
// void _cinit(const parseFile&);
212
//
213
// ebmlElement* _decodeChild(const parseString&) const;
214
// ebmlElement* _decodeChild(const parseFile&) const;
215
//
216
// ebmlElement* _cdecodeChild(const parseString&) const;
217
// ebmlElement* _cdecodeChild(const parseFile&) const;
218
//
219
// // Reminder: This method should be overriden in every subclass
220
// public:
221
// // virtual const ebmlMasterElementClass* cls() const;
222
//
223
// // dataSize override
224
// size_t dataSize() const;
225
//
226
// // Size Tree methods
227
// public:
228
// sizetree_t sizetree() const;
229
//
230
// // protected:
231
// // sizetree_t _build_sizetree() const;
232
// // void _build_sizetree(sizetree_t&) const;
233
//
234
// // Encode functions.
235
// protected:
236
// // NEW in ebmlMasterElement. Protected _encode that makes use of a sizetree_t
237
// // to avoid redundant calls to outerSize() on all of its decendants.
238
// size_t _encode(char*, const sizetree_t&) const;
239
// size_t _encode(char*) const;
240
// // size_t _encode(char*, size_t) const;
241
//
242
// public:
243
// // Override the default encode to make use of _encode(char*, const sizetree_t&) instead of _encode(char*);
244
// std::string encode() const;
245
// size_t encode(char*) const;
246
// size_t encode(char*, const sizetree_t&) const;
247
// size_t encode(ioBase&) const;
248
// // size_t encode(ioBase&, const sizetree_t&) const;
249
// size_t encode(ioBase&, off_t) const;
250
// // size_t encode(ioBase&, off_t, const sizetree_t&) const;
251
//
252
// protected:
253
// virtual void _clear(); // Clear all children.
254
// virtual void _decodeChildren(parseString::iterator&);
255
// virtual void _cdecodeChildren(parseString::iterator&);
256
// virtual void _scanChildren(parseFile::iterator&); // Decode children from an iterParseFile instance created by _decode.
257
// virtual void _handleParseFile(const parseFile&); // Controls the handling of seek data pointing to a child element.
258
// virtual void _cscanChildren(parseFile::iterator&); // Decode children from an iterParseFile instance created by _decode.
259
// virtual void _chandleParseFile(const parseFile&); // Controls the handling of seek data pointing to a child element.
260
// virtual void _addChild(const ebmlElement_sp&) = 0;
261
// virtual void _addChild(ebmlElement_sp&&) = 0;
262
//
263
// // Iteration
264
// public:
265
// class iterator;
266
//
267
// protected:
268
// class _iterator {
269
// public:
270
// virtual _iterator* copy() const = 0;
271
//
272
// virtual ebmlElement& operator*() const = 0;
273
// virtual _iterator& operator++() = 0;
274
//
275
// virtual _iterator& operator=(const _iterator&) = 0;
276
//
277
// virtual bool operator==(const _iterator&) const = 0;
278
// virtual bool operator!=(const _iterator&) const = 0;
279
//
280
// virtual ~_iterator() {};
281
//
282
// friend class ebmlMasterElement;
283
// friend class ebmlMasterElement::iterator;
284
// };
285
//
286
// virtual ebmlMasterElement::_iterator* _begin() = 0;
287
// virtual ebmlMasterElement::_iterator* _end() = 0;
288
//
289
// public:
290
// class iterator {
291
// private:
292
// // std::shared_ptr<_iterator> _iter;
293
// // iterator(const std::shared_ptr<_iterator>&);
294
//
295
// _iterator* _iter;
296
//
297
// protected:
298
// iterator(_iterator*);
299
//
300
// public:
301
// ebmlElement& operator*() const;
302
// iterator& operator++();
303
//
304
// iterator(const iterator&);
305
// iterator(iterator&&);
306
// iterator& operator=(const iterator&);
307
// iterator& operator=(iterator&&);
308
//
309
// bool operator==(const iterator&) const;
310
// bool operator!=(const iterator&) const;
311
//
312
// ~iterator();
313
//
314
// friend class ebmlMasterElement;
315
// };
316
//
317
// iterator begin();
318
// iterator end();
319
//
320
// // Const Iteration
321
// public:
322
// class const_iterator;
323
//
324
// protected:
325
// class _const_iterator {
326
// public:
327
// virtual _const_iterator* copy() const = 0;
328
// virtual const ebmlElement& operator*() const = 0;
329
// virtual _const_iterator& operator++() = 0;
330
// virtual _const_iterator& operator=(const _const_iterator&) = 0;
331
// virtual bool operator==(const _const_iterator&) const = 0;
332
// virtual bool operator!=(const _const_iterator&) const = 0;
333
// virtual ~_const_iterator() {};
334
//
335
// friend class ebmlMasterElement;
336
// friend class ebmlMasterElement::const_iterator;
337
// };
338
//
339
// virtual ebmlMasterElement::_const_iterator* _cbegin() const = 0;
340
// virtual ebmlMasterElement::_const_iterator* _cend() const = 0;
341
//
342
// public:
343
// class const_iterator {
344
// private:
345
// _const_iterator* _iter;
346
// const_iterator(_const_iterator*);
347
//
348
// public:
349
// virtual const ebmlElement& operator*() const;
350
// virtual const_iterator& operator++();
351
//
352
// const_iterator(const const_iterator&);
353
// const_iterator(const_iterator&&);
354
// virtual const_iterator& operator=(const const_iterator&);
355
// virtual const_iterator& operator=(const_iterator&&);
356
//
357
// virtual bool operator==(const const_iterator&) const;
358
// virtual bool operator!=(const const_iterator&) const;
359
//
360
// ~const_iterator();
361
//
362
// friend class ebmlMasterElement;
363
// };
364
//
365
// const_iterator cbegin() const;
366
// const_iterator cend() const;
367
//
368
// protected:
369
// static iterator make_iter(_iterator*);
370
// static const_iterator make_iter(_const_iterator*);
371
//
372
// // Cloning functions:
373
// protected:
374
// void _clonedata(const ebmlElement*);
375
//
376
// protected:
377
// occur_d ebmlIDCount;
378
// void _attachChild(const ebmlElement_sp& child, bool weak = true);
379
// void _attachChild(const ebmlElement_sp& child, bool weak = true) const;
380
// void _detachChild(const ebmlElement_sp& child) const;
381
//
382
// void _attachChild(ebmlElement& child, bool weak = true);
383
// void _attachChild(ebmlElement& child, bool weak = true) const;
384
// void _detachChild(ebmlElement& child) const;
385
//
386
// void _attachChildren(const ebmlElement_l& elems, bool weak=true);
387
// void _attachChildren(const ebmlElement_l& elems, bool weak=true) const;
388
// void _detachChildren(const ebmlElement_l& elems) const;
389
//
390
// public:
391
// friend class ebmlMasterElementClass;
392
// friend class std::shared_ptr<ebmlMasterElement::_iterator>;
393
// friend class std::shared_ptr<ebmlMasterElement::_const_iterator>;
394
//
395
// template<typename T>
396
// friend class childSlot_t;
397
//
398
// friend std::shared_ptr<ebmlMasterElement::_iterator> std::make_shared<ebmlMasterElement::_iterator>();
399
// friend std::shared_ptr<ebmlMasterElement::_const_iterator> std::make_shared<ebmlMasterElement::_const_iterator>();
400
// };
401
//
402
// inline ebmlElement* ebmlMasterElementClass::_decodeChild(const parseString& parsed) const {
403
// const ebmlElementClass* childcls;
404
//
405
// try {
406
// childcls = this->_childClasses[parsed.ebmlID];
407
// } catch (ebmlNoChildMatch& e) {
408
// e.erroroffset = parsed.offset;
409
// throw;
410
// }
411
//
412
// return childcls->_decode_nocheck(parsed);
413
// }
414
//
415
// inline ebmlElement* ebmlMasterElementClass::_cdecodeChild(const parseString& parsed) const {
416
// const ebmlElementClass* childcls;
417
//
418
// try {
419
// childcls = this->_childClasses[parsed.ebmlID];
420
// } catch (ebmlNoChildMatch& e) {
421
// e.erroroffset = parsed.offset;
422
// throw;
423
// }
424
//
425
// return childcls->_decode_nocheck(parsed);
426
// }
427
//
428
// inline ebmlElement* ebmlMasterElementClass::_decodeChild(const parseFile& parsed) const {
429
// const ebmlElementClass* childcls;
430
//
431
// try {
432
// childcls = this->_childClasses[parsed.ebmlID];
433
// } catch (ebmlNoChildMatch& e) {
434
// e.erroroffset = parsed.offset;
435
// throw;
436
// }
437
//
438
// return childcls->_decode_nocheck(parsed);
439
// }
440
//
441
// inline ebmlElement* ebmlMasterElementClass::_cdecodeChild(const parseFile& parsed) const {
442
// const ebmlElementClass* childcls;
443
//
444
// try {
445
// childcls = this->_childClasses[parsed.ebmlID];
446
// } catch (ebmlNoChildMatch& e) {
447
// e.offset = parsed.offset;
448
// throw;
449
// }
450
//
451
// // return childcls->mcdecode(parsed);
452
// return childcls->_decode_nocheck(parsed);
453
// }
454
//
455
// extern template class ClsMixin<ebmlMasterElementClass, ebmlMasterElement, ebmlElementClass>;
456
// extern template class InstMixin<ebmlMasterElementClass, ebmlMasterElement, ebmlElement>;
457
// extern template class ebml_shared_ptr<ebmlMasterElement>;
458
// extern template class ebml_weak_ptr<ebmlMasterElement>;
459
// }
460
// #endif
Generated by
1.8.14