1 #ifndef EBML_NG_LAZYLOADMASTERELEMENT_H 2 #define EBML_NG_LAZYLOADMASTERELEMENT_H 4 #include <unordered_map> 6 #include <unordered_set> 8 #include <shared_mutex> 13 #include "../seekdata.h" 14 #include "../exceptions.h" 15 #include "../ebmlDataElement.h" 19 typedef std::map<off_t, std::unique_ptr<seekData_t>>
children_m;
42 status_t(
bool,
const std::string&,
const T&);
43 status_t(
bool,
const char*,
const T&);
60 operator bool()
const;
61 operator const T&()
const;
62 const T&
data()
const;
63 operator std::string()
const;
86 operator bool()
const;
89 class prepared_insert_t {
130 prepared_move_t(
bool, off_t, off_t, off_t, off_t, off_t, off_t, off_t, off_t,
const children_m::iterator&,
const children_m::iterator&);
131 prepared_move_t(
bool, off_t, off_t, off_t, off_t, off_t, off_t, off_t, off_t, children_m::iterator&&, children_m::iterator&&);
132 prepared_move_t(
bool,
const std::string&, off_t, off_t, off_t, off_t, off_t, off_t, off_t, off_t);
133 prepared_move_t(
bool, std::string&&, off_t, off_t, off_t, off_t, off_t, off_t, off_t, off_t);
169 std::unique_lock<std::shared_mutex> _lock;
178 std::shared_lock<std::shared_mutex> _glob;
179 std::shared_lock<std::shared_mutex> _loc;
189 std::shared_lock<std::shared_mutex> _glob;
190 std::unique_lock<std::shared_mutex> _loc;
216 class ebmlLazyLoadClass :
public ClsMixin<ebmlLazyLoadClass, ebmlLazyLoad, ebmlMasterElementClass> {
259 class ebmlLazyLoad :
public InstMixin<ebmlLazyLoadClass, ebmlLazyLoad, ebmlMasterElement> {
265 mutable std::shared_mutex
_mutex;
273 std::map<off_t, seekData_t*>
275 std::unordered_map<ebmlID_t, std::unique_ptr<seekMapBase>>
_children_by_key;
302 const std::unordered_map<
304 std::map<off_t, seekData_t*>
306 const std::unordered_map<ebmlID_t, std::unique_ptr<seekMapBase>>&
seeksByKey()
const;
331 template<
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
334 template<
typename T,
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
335 std::enable_if_t<!std::is_same<ebmlElement, T>::value && std::is_base_of<ebmlElement, T>::value,
ebml::ptr<T>>
338 template<
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
341 template<
typename T,
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
342 std::enable_if_t<!std::is_same<const ebmlElement, T>::value && std::is_base_of<const ebmlElement, T>::value,
ebml::ptr<T>>
349 std::vector<seekData_t*>
insert(off_t offset,
const std::vector<std::string>&
data);
352 template<
typename T,
typename... Args>
353 std::enable_if_t<std::is_base_of<ebmlElementClass, T>::value, std::pair<ebmlElement_sp, seekData_t*>>
354 insert(off_t offset,
const T&
cls, Args...);
357 std::enable_if_t<!std::is_base_of<ebmlLazyLoad, T>::value && std::is_base_of<ebmlElement, T>::value,
seekData_t*>
360 void move(off_t src_offset, off_t dest_offset);
365 void remove(off_t offset);
379 off_t findFree(off_t offset,
size_t size);
380 off_t rfindFree(off_t offset,
size_t size);
407 std::wstring
minirepr()
const override;
438 template<
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
441 template<
typename T,
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
442 std::enable_if_t<!std::is_same<ebmlElement, T>::value && std::is_base_of<ebmlElement, T>::value,
ebml::ptr<T>>
445 template<
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
448 template<
typename T,
typename K,
typename H=std::hash<K>,
typename E=std::equal_to<K>>
449 std::enable_if_t<!std::is_same<const ebmlElement, T>::value && std::is_base_of<const ebmlElement, T>::value,
ebml::ptr<T>>
450 _cgetByKey(
ebmlID_t,
const K&)
const;
453 off_t _findBoundary(off_t offset);
454 off_t _rfindBoundary(off_t offset);
462 std::pair<children_m::iterator, children_m::iterator>
_find(off_t offset,
bool left=
true);
463 children_m::iterator
_findNext(off_t offset,
bool strict=
true);
464 children_m::iterator
_findPrev(off_t offset,
bool strict=
true);
499 std::vector<seekData_t*> _insert(off_t offset,
const std::vector<std::string>&
data);
507 std::vector<seekData_t*> _insert(off_t offset,
const ebmlElement_l& children);
513 template<
typename T,
typename... Args>
514 std::enable_if_t<std::is_base_of<ebmlLazyLoadClass, T>::value, std::pair<ebmlElement_sp, seekData_t*>>
517 template<
typename T,
typename... Args>
518 std::enable_if_t<!std::is_base_of<ebmlLazyLoadClass, T>::value && std::is_base_of<ebmlElementClass, T>::value, std::pair<ebmlElement_sp, seekData_t*>>
519 _insert(off_t offset,
const T&
cls, Args... args);
522 std::enable_if_t<!std::is_base_of<ebmlLazyLoad, T>::value && std::is_base_of<ebmlElement, T>::value,
seekData_t*>
525 void _move(off_t src_offset, off_t dest_offset);
526 void _move(off_t src_offset, off_t dest_offset,
const prepared_move_t&);
528 void _resize(
size_t size);
532 void _remove(off_t offset);
533 void _remove(children_m::iterator);
536 virtual void _preremove_hook(
const children_m::iterator&);
548 virtual void _handleSeekData(std::unique_ptr<seekData_t>&&,
const children_m::iterator&);
571 #define DECL_GETBYKEY_MEMBERS(K) \ 572 extern template ebmlElement_sp ebmlLazyLoad::getByKey<K>(ebmlID_t, const K&); \ 573 extern template ebmlElement_sp ebmlLazyLoad::_getByKey<K>(ebmlID_t, const K&); \ 574 extern template c_ebmlElement_sp ebmlLazyLoad::cgetByKey<K>(ebmlID_t, const K&); \ 575 extern template c_ebmlElement_sp ebmlLazyLoad::_cgetByKey<K>(ebmlID_t, const K&); \ 577 #define INST_GETBYKEY_MEMBERS(K) \ 578 template ebmlElement_sp ebmlLazyLoad::getByKey<K>(ebmlID_t, const K&); \ 579 template ebmlElement_sp ebmlLazyLoad::_getByKey<K>(ebmlID_t, const K&); \ 580 template c_ebmlElement_sp ebmlLazyLoad::cgetByKey<K>(ebmlID_t, const K&); \ 581 template c_ebmlElement_sp ebmlLazyLoad::_cgetByKey<K>(ebmlID_t, const K&); \ 583 #define DECL_GETBYKEY_MEMBERS2(T, K) \ 584 extern template ebml::ptr<T> ebmlLazyLoad::getByKey<T, K>(ebmlID_t, const K&); \ 585 extern template ebml::ptr<T> ebmlLazyLoad::_getByKey<T, K>(ebmlID_t, const K&); \ 586 extern template ptr<const T> ebmlLazyLoad::cgetByKey<const T, K>(ebmlID_t, const K&) const; \ 587 extern template ptr<const T> ebmlLazyLoad::_cgetByKey<const T, K>(ebmlID_t, const K&) const; 589 #define INST_GETBYKEY_MEMBERS2(T, K) \ 590 template ebml::ptr<T> ebmlLazyLoad::getByKey<T, K>(ebmlID_t, const K&); \ 591 template ebml::ptr<T> ebmlLazyLoad::_getByKey<T, K>(ebmlID_t, const K&); \ 592 template ptr<const T> ebmlLazyLoad::cgetByKey<const T, K>(ebmlID_t, const K&) const; \ 593 template ptr<const T> ebmlLazyLoad::_cgetByKey<const T, K>(ebmlID_t, const K&) const; 595 #define DECL_GET_MEMBERS(T) \ 596 extern template ebml::ptr<T> ebmlLazyLoad::get<T>(off_t); \ 597 extern template ebml::ptr<T> ebmlLazyLoad::get<T>(ebmlID_t, size_t); \ 598 extern template ebml::ptr<T> ebmlLazyLoad::_get<T>(off_t); \ 599 extern template ebml::ptr<T> ebmlLazyLoad::_get<T>(ebmlID_t, size_t); \ 600 extern template ptr<const T> ebmlLazyLoad::cget<const T>(off_t) const; \ 601 extern template ptr<const T> ebmlLazyLoad::cget<const T>(ebmlID_t, size_t) const; \ 602 extern template ptr<const T> ebmlLazyLoad::_cget<const T>(off_t) const; \ 603 extern template ptr<const T> ebmlLazyLoad::_cget<const T>(ebmlID_t, size_t) const; \ 604 DECL_GETBYKEY_MEMBERS2(T, unsigned long long) \ 605 DECL_GETBYKEY_MEMBERS2(T, long long) \ 606 DECL_GETBYKEY_MEMBERS2(T, std::string) \ 607 DECL_GETBYKEY_MEMBERS2(T, std::wstring) \ 608 DECL_GETBYKEY_MEMBERS2(T, double) 610 #define INST_GET_MEMBERS(T) \ 611 template ebml::ptr<T> ebmlLazyLoad::get<T>(off_t); \ 612 template ebml::ptr<T> ebmlLazyLoad::get<T>(ebmlID_t, size_t); \ 613 template ebml::ptr<T> ebmlLazyLoad::_get<T>(off_t); \ 614 template ebml::ptr<T> ebmlLazyLoad::_get<T>(ebmlID_t, size_t); \ 615 template ptr<const T> ebmlLazyLoad::cget<const T>(off_t) const; \ 616 template ptr<const T> ebmlLazyLoad::cget<const T>(ebmlID_t, size_t) const; \ 617 template ptr<const T> ebmlLazyLoad::_cget<const T>(off_t) const; \ 618 template ptr<const T> ebmlLazyLoad::_cget<const T>(ebmlID_t, size_t) const; \ 619 INST_GETBYKEY_MEMBERS2(T, unsigned long long) \ 620 INST_GETBYKEY_MEMBERS2(T, long long) \ 621 INST_GETBYKEY_MEMBERS2(T, std::string) \ 622 INST_GETBYKEY_MEMBERS2(T, std::wstring) \ 623 INST_GETBYKEY_MEMBERS2(T, double) 632 extern template class ClsMixin<ebmlLazyLoadClass, ebmlLazyLoad, ebmlMasterElementClass>;
633 extern template class InstMixin<ebmlLazyLoadClass, ebmlLazyLoad, ebmlMasterElement>;
635 extern template std::pair<ebmlElement_sp, seekData_t*> ebmlLazyLoad::_insert(off_t,
const ebmlLazyLoadClass&,
vintWidth_t,
size_t);
637 extern template std::pair<ebmlElement_sp, seekData_t*> ebmlLazyLoad::_insert(off_t,
const ebmlLazyLoadClass&,
vintWidth_t,
size_t,
const ebmlElement_l&);
off_t nextSiblingOffset
Definition: prepared.h:139
off_t srcOffset
Definition: prepared.h:84
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
off_t lastChildOffset
Definition: prepared.h:137
T & data(const ebmlElement_sp &elem)
std::enable_if_t<!std::is_base_of< ebmlElement, std::decay_t< K > >::value, ebml::ptr< ebmlElement > > getByKey(ebmlID_t, const K &)
Gets a child element based on a user-defined key.
Definition: ebmlLazyLoad.h:635
status_t< prepared_insert_t > _canInsertRange(off_t offset, size_t size)
virtual void _onBeforeInsert(ebmlLazyLoad &, off_t, const ebmlElement_sp &) const
Definition: childElemHelper_t.cpp:20
off_t nextOffset
Definition: prepared.h:94
prepared_resize_t & operator=(const prepared_move_t &)
status_t< prepared_move_t > canMove(off_t, off_t, const writeLock_t &)
virtual void _onBeforeRemove(ebmlLazyLoad &) const
Definition: childElemHelper_t.cpp:24
off_t srcNextOffset
Definition: prepared.h:85
children_m::iterator _findNext(off_t offset, bool strict=true)
Definition: ebmlLazyLoad.cpp:465
Definition: lazyload.h:167
Definition: childElemHelper_t.h:22
Definition: exceptions.h:134
size_t size(const std::string &value)
Definition: binary.h:8
off_t nextOffset
Definition: prepared.h:23
const std::unordered_map< ebmlID_t, std::unique_ptr< seekMapBase > > & seeksByKey() const
off_t offset
Definition: lazyload.h:93
ebmlMasterElement::_const_iterator * _cbegin() const override
Definition: ebmlLazyLoad.cpp:965
seekData_t * _lastChildSeek() const
std::unique_lock< std::shared_mutex > globalWriteLock_t
Definition: lazyload.h:197
std::unordered_map< ebmlID_t, std::map< off_t, seekData_t * > > _children_by_ebmlID
Definition: ebmlLazyLoad.h:100
status_t< prepared_insert_t > canCollapseRange(off_t offset, size_t size)
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
Definition: ebmlMasterElement.h:269
off_t _findFree(off_t offset, size_t size)
Definition: prepared.h:15
virtual void _onAfterInsert(ebmlLazyLoad &, off_t, const ebmlElement_sp &, seekData_t *) const
Definition: childElemHelper_t.cpp:21
Represents parsed seek data extracted from an EBML element.
Definition: seekdata.h:39
upgradedLock_t upgradeLocal()
localReadLock_t(std::shared_mutex &, std::shared_mutex &)
status_t< prepared_insert_t > canInsertRange(off_t offset, size_t size)
prepared_resize_t()
Definition: prepared_resize_t.cpp:10
void _addChild(const ebmlElement_sp &) override
Attaches a child element (rvalue version).
Definition: ebmlLazyLoad.cpp:959
const childElemHelper_t * _childHelper
Definition: lazyload.h:218
status_t< prepared_insert_t > canPunchHole(off_t offset, size_t size)
Represents a parsed EBML file segment.
Definition: io.h:32
children_m::iterator sourceIter
Definition: prepared.h:95
const children_m & seeksByOffset() const
Definition: ebmlLazyLoad.cpp:105
Definition: prepared.h:133
ebmlLazyLoad(const ebmlLazyLoadType *)
Definition: ebmlLazyLoad.cpp:47
off_t srcPrevEnd
Definition: prepared.h:83
void _punchHole(off_t offset, size_t size)
off_t endOffset
Definition: prepared.h:136
upgradedLock_t(std::shared_lock< std::shared_mutex > &)
ioBase * _file_raw
Definition: ebmlLazyLoad.h:92
seekData_t * _nextChildSeek(off_t offset, bool strict=true) const
seekData_t * nextChild(off_t offset)
void _handleParseFile(const parseFile &) override
Handles the parsing of seek data for a child element.
Definition: ebmlLazyLoad.cpp:123
seekData_t * prevChild(off_t offset)
std::enable_if_t<!std::is_base_of< ebmlElement, std::decay_t< K > >::value, ebml::ptr< const ebmlElement > > cgetByKey(ebmlID_t, const K &) const
sizetree_t sizetree
Definition: lazyload.h:96
seekData_t * seekData
Definition: prepared.h:140
ebmlMasterElement::_iterator * _begin() override
Definition: ebmlLazyLoad.cpp:963
ebmlLazyLoadClass(const char *, const std::wstring &, const childClassSpecArg_l &)
Definition: exceptions.h:150
off_t prevOffset
Definition: prepared.h:87
seekData_t * insert(off_t, const ebml::ptr< ebmlElement > &)
Definition: ebmlLazyLoad.h:693
void _insertRange(off_t offset, size_t size)
status_t< prepared_insert_t > punchHole(off_t offset, size_t size)
ioBase & file() const
Definition: ebmlLazyLoad.cpp:109
ebml::ptr< ebmlElement > _read_elem(seekData_t &seekData)
Definition: ebmlLazyLoad.cpp:327
Definition: basictypes.h:40
off_t prevEnd
Definition: prepared.h:18
Definition: lazyload.h:176
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
const ebmlLazyLoadType & cls() const
Returns a reference to the associated element class.
off_t findBoundary(off_t offset)
std::unordered_map< ebmlID_t, std::unique_ptr< seekMapBase > > _children_by_key
Definition: ebmlLazyLoad.h:101
children_m::iterator insertionHint
Definition: prepared.h:96
children_m _children_by_offset
Definition: ebmlLazyLoad.h:96
Definition: ebmlMasterElement.h:324
Definition: ebmlSchema.h:32
ebmlElement * _clone() const
prepared_insert_t & operator=(const prepared_insert_t &)
virtual void _onAfterRemove(ebmlLazyLoad &) const
Definition: childElemHelper_t.cpp:25
virtual ~prepared_base_t()
localWriteLock_t(std::shared_mutex &, std::shared_mutex &)
seekData_t * firstChild()
Definition: lazyload.h:187
Definition: lazyload.h:216
Definition: lazyload.h:67
off_t _rfindFree(off_t offset, size_t size)
off_t prevOffset
Definition: prepared.h:17
Represents an EBML Master Element with on-disk, transactional child management.
Definition: ebmlLazyLoad.h:85
void throw_exc(const std::string &, const c_ebmlElement_sp &) const
Definition: prepared_insert_t.cpp:28
status_t< prepared_resize_t > canResize(size_t, const writeLock_t &)
localReadLock_t getLocalRLock() const
size_t _initNew(ioBase &, off_t, vintWidth_t, size_t)
Definition: ebmlLazyLoad.cpp:69
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
virtual void _onBeforeMove(ebmlLazyLoad &) const
Definition: childElemHelper_t.cpp:22
prepared_insert_t()
Definition: prepared_insert_t.cpp:10
status_t< prepared_insert_t > _canPunchHole(off_t offset, size_t size)
off_t dest_offset
Definition: lazyload.h:123
status_t< prepared_insert_t > _canCollapseRange(off_t offset, size_t size)
bool sizeSupported(size_t size, const writeLock_t &)
Definition: ebmlLazyLoad.h:818
ebmlMasterElement::_const_iterator * _cend() const override
Definition: ebmlLazyLoad.cpp:966
void throw_exc(const ptr< const ebmlElement > &) const
size_t dataSize() const override
Definition: ebmlLazyLoad.cpp:119
ptr< const ebmlElement > c_ebmlElement_sp
Definition: ptrs.h:843
Structure representing the size tree for an EBML master element.
Definition: sizetree_t.h:15
off_t prevEnd
Definition: prepared.h:88
children_m::iterator _findPrev(off_t offset, bool strict=true)
Definition: ebmlLazyLoad.cpp:473
uint8_t vintWidth_t
Definition: ebmlID_t.h:8
std::wstring minirepr() const override
Definition: ebmlLazyLoad.cpp:954
ebml::ptr< const ebmlElement > cget(off_t) const
Definition: ebmlLazyLoad.h:585
off_t endOffset
Definition: prepared.h:22
std::string reason
Definition: status.h:18
off_t lastChildEnd
Definition: prepared.h:138
virtual void _onAfterMove(ebmlLazyLoad &) const
Definition: childElemHelper_t.cpp:23
T _data
Definition: status.h:20
upgradedLock_t upgradeGlobal()
off_t rfindBoundary(off_t offset)
ebmlLazyLoad_sp operator()(ioBase *) const
std::string reason
Definition: lazyload.h:71
std::shared_mutex _mutex
Definition: ebmlLazyLoad.h:90
void resize(size_t size)
Definition: ebmlLazyLoad.h:831
status_t< prepared_insert_t > canInsert(off_t, sizetree_t &&, const writeLock_t &)
Definition: ebmlLazyLoad.cpp:483
children_m::iterator insertionHint
Definition: prepared.h:25
const std::unordered_map< ebmlID_t, std::map< off_t, seekData_t * > > & seeksByEBMLID() const
prepared_base_t & operator=(const prepared_base_t &)
seekData_t * _firstChildSeek() const
status_t & operator=(const status_t &)
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
ioBase_sp _file
Definition: ebmlLazyLoad.h:91
ebmlMasterElement::_iterator * _end() override
Definition: ebmlLazyLoad.cpp:964
writeLock_t getGlobalLock() const
Definition: ebmlLazyLoad.cpp:297
unsigned char sizeWidth() const
Definition: ebmlElement.cpp:230
std::pair< children_m::iterator, children_m::iterator > _find(off_t offset, bool left=true)
Definition: ebmlLazyLoad.cpp:445
size_t _dataSize
Definition: ebmlLazyLoad.h:93
prepared_resize_t _canResizeChild(off_t, size_t size)
localWriteLock_t getLocalWLock() const
status_t< prepared_insert_t > insertRange(off_t offset, size_t size)
void _handleSeekData(std::unique_ptr< seekData_t > &&)
Definition: ebmlLazyLoad.cpp:145
prepared_move_t & operator=(const prepared_move_t &)
Base class for file-like IO operations.
Definition: io.h:22
bool result
Definition: status.h:16
std::map< off_t, std::unique_ptr< seekData_t > > children_m
Definition: children_m.h:10
std::vector< ebmlElement_sp > ebmlElement_l
Definition: c_ebmlElement_l.h:9
void _collapseRange(off_t offset, size_t size)
off_t endOffset
Definition: lazyload.h:124
bool result
Definition: lazyload.h:69
childElemHelper_t childHelper
Definition: childElemHelper_t.cpp:27
status_t< prepared_insert_t > canResizeChild(const seekData_t &, size_t size)
off_t offset
Definition: prepared.h:135
Definition: prepared.h:81
status_t< prepared_insert_t > collapseRange(off_t offset, size_t size)
upgradedLock_t upgradeGlobal()
seekData_t * _prevChildSeek(off_t offset, bool strict=true) const