19 #ifndef EBML_NG_ELEMENTCLS_H 20 #define EBML_NG_ELEMENTCLS_H 400 template<
typename T=ebmlElementType>
417 template<
typename T=ebmlElementType>
418 inline T&
as()
const;
421 virtual std::wstring
minirepr()
const;
422 std::wstring
repr()
const;
453 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t=ebmlElementType>
455 using inst_t = ebmlinst_t;
457 using typebase_t::_decode;
466 template<
typename... Args>
467 inline ebmlTypeCRTP(Args&&... args) : typebase_t(std::forward<Args>(args)...) {}
483 template<
typename... Args>
515 : ebmlID(_ebmlID), name(_name), _seekHelper(
seekHelper) {}
519 throw ebmlNoMatch(
"EBML ID does not match.",
this, 0, 0, 0);
528 if (e.
cls ==
nullptr) {
544 if (parsed.
ebmlID != this->ebmlID) {
558 if (
size > parsed.outerSize()) {
559 throw ebmlDataContinues(
"Data continues past expected end.",
this, 0, parsed.ebmlIDWidth + parsed.sizeWidth, parsed.dataSize);
593 file.
seek(parsed.endOffset());
616 offset = parsed.endOffset();
639 endOffset = parsed.endOffset();
644 return _decode(file, offset, endOffset)->
sp();
651 throw ebmlNoMatch(
"EBML ID does not match.",
this, 0, 0, 0);
660 if (e.
cls ==
nullptr) {
678 if (parsed.
ebmlID != this->ebmlID) {
693 if (
size > parsed.outerSize()) {
694 throw ebmlDataContinues(
"Data continues past expected end.",
this, 0, parsed.ebmlIDWidth + parsed.sizeWidth, parsed.dataSize);
731 file.
seek(parsed.endOffset());
756 offset = parsed.endOffset();
761 const auto elem =
_cdecode(file, offset);
781 endOffset = parsed.endOffset();
786 const auto elem =
_cdecode(file, offset, endOffset);
790 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
792 return static_cast<ebmlinst_t*
>(this->_decode(
data,
size))->sp();
795 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
797 return static_cast<ebmlinst_t*
>(this->_decode(
data))->sp();
805 if (e.
cls ==
nullptr) {
821 if (e.
cls ==
nullptr) {
838 if (e.
cls ==
nullptr) {
854 if (e.
cls ==
nullptr) {
868 if (
auto recast = dynamic_cast<T*>(
this)) {
872 throw std::bad_cast();
877 if (
auto recast = dynamic_cast<T*>(
this)) {
881 throw std::bad_cast();
892 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
893 template<
typename... Args>
895 auto elem =
new ebmlinst_t(static_cast<const ebmltype_t*>(
this), std::forward<Args>(args)...);
916 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
918 return static_cast<ebmlinst_t*
>(this->_decode(parsed))->sp();
921 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
923 return static_cast<ebmlinst_t*
>(this->_decode(parsed))->sp();
941 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
943 return static_cast<ebmlinst_t*
>(this->_decode(file))->sp();
951 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
953 return static_cast<ebmlinst_t*
>(this->_decode(file, offset))->sp();
961 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
963 return static_cast<ebmlinst_t*
>(this->_decode(file, offset, endoffset))->sp();
968 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
970 return static_cast<const ebmlinst_t*
>(this->_cdecode(parsed))->sp();
973 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
975 return static_cast<const ebmlinst_t*
>(this->_cdecode(parsed))->sp();
978 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
980 return static_cast<const ebmlinst_t*
>(this->_cdecode(
data,
size))->sp();
983 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
985 return static_cast<const ebmlinst_t*
>(this->_cdecode(
data))->sp();
993 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
995 return static_cast<const ebmlinst_t*
>(this->_cdecode(file))->sp();
1003 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
1005 return static_cast<const ebmlinst_t*
>(this->_cdecode(file, offset))->sp();
1013 template<
typename ebmltype_t,
typename ebmlinst_t,
typename typebase_t>
1015 return static_cast<const ebmlinst_t*
>(this->_cdecode(file, offset, endoffset))->sp();
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
T & data(const ebmlElement_sp &elem)
const ebmlElementType * cls
Definition: exceptions.h:52
unsigned char headSize
Definition: exceptions.h:50
Abstract base class for EBML Element Type objects.
Definition: ebmlElementType.h:106
virtual ebmlElement * _new() const =0
Create a default instance of an EBML element.
size_t size(const std::string &value)
Definition: binary.h:8
ebmlElement * _decode_nocheck(const parseString &parsed) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:800
ebmlElement * _cdecode_v(const parseString &) const
ebml::ptr< const ebmlinst_t > cdecode(const parseString &parsed) const
Definition: ebmlElementType.h:969
Definition: exceptions.h:61
ebmlElement * _decode_v(const parseString &) const
Represents a parsed EBML string segment.
Definition: string.h:37
off_t offset
Definition: io.h:43
virtual ebmlElement * _cdecode_v(const parseString &) const =0
Represents parsed seek data extracted from an EBML element.
Definition: seekdata.h:39
seekHelper_t seekHelper
Definition: seekdata.cpp:136
seekData_t * makeSeekData(const parseString &) const
Definition: ebmlElementType.cpp:317
Definition: exceptions.h:90
Represents a parsed EBML file segment.
Definition: io.h:32
ebml::ptr< ebmlinst_t > operator()(Args &&... args) const
Creates a new instance of an EBML element.
Definition: ebmlElementType.h:894
ebmlElement * _decode(const parseString &) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:517
ebmlID_t ebmlID
EBML ID associated with this element type.
Definition: ebmlElementType.h:129
vintWidth_t ebmlIDWidth
Definition: string.h:40
off_t parentOffset
Definition: io.h:44
ebmlID_t ebmlID
Definition: io.h:39
vintWidth_t sizeWidth
Definition: string.h:42
A drop-in replacement for std::weak_ptr tailored for EBML objects.
Definition: ptrs.h:30
Definition: basictypes.h:40
ebmlElement * _cdecode(const parseString &) const
Definition: ebmlElementType.h:649
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
virtual std::wstring minirepr() const
Definition: ebmlElementType.cpp:370
ebmlID_t ebmlID
Definition: string.h:39
ebml::ptr< ebmlinst_t > decode(const parseString &parsed) const
Definition: ebmlElementType.h:917
unsigned char sizeWidth
Definition: io.h:42
unsigned char ebmlIDWidth
Definition: io.h:40
T & as()
Definition: ebmlElementType.h:867
ebmlElement * _new() const
unsigned long long unpackVint(const char *data, size_t dataSize, unsigned char &vintw)
Decodes a vint from a byte array of known size.
Definition: vint.cpp:20
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
const seekHelper_t * _seekHelper
Definition: ebmlElementType.h:374
virtual ebmlElement * _decode_v(const parseString &) const =0
off_t _offsetInParent
Definition: ebmlElement.h:242
std::wstring repr() const
Definition: ebmlElementType.cpp:349
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
ebmlElementType(const char *ebmlID, const std::wstring &name)
Constructor taking an EBML ID as a VINT string and an element name.
Definition: ebmlElementType.h:507
ebml::ptr< const ebmlElement > cdecode(const parseString &) const
Definition: ebmlElementType.h:672
ebml::ptr< ebmlElement > operator()() const
Factory operator to create a default EBML element instance.
Definition: ebmlElementType.h:503
Base class for seek map containers.
Definition: seekdata.h:126
std::wstring name
Name (as a wide string) of the element type.
Definition: ebmlElementType.h:131
ebmlTypeCRTP(Args &&... args)
Definition: ebmlElementType.h:467
Base class for file-like IO operations.
Definition: io.h:22
Definition: exceptions.h:46
seekMapBase * initSeekMap() const
Definition: ebmlElementType.cpp:313
ebml::ptr< ebmlElement > sp()
Returns a shared pointer to the element instance.
Definition: ebmlElement.cpp:348
ebmlElement * _cdecode_nocheck(const parseString &parsed) const
Definition: ebmlElementType.h:833
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
off_t seek(off_t, int whence=SEEK_SET)
Definition: io.cpp:9
ebml::ptr< ebmlElement > decode(const parseString &) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:539