libebml_ng
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