11 #ifndef EBML_NG_ELEMENT_H 12 #define EBML_NG_ELEMENT_H 20 extern template class flexible_ptr<ebmlElement>;
133 template<
typename T=ebmlElement>
142 template<
typename T=ebmlElement>
143 inline T& as()
const;
178 bool parent_is_const()
const;
219 bool hasParent()
const;
227 unsigned char headSize()
const;
228 unsigned char headSize(
size_t)
const;
229 unsigned char sizeWidth()
const;
230 unsigned char sizeWidth(
size_t)
const;
231 size_t outerSize()
const;
232 size_t outerSize(
size_t)
const;
233 virtual size_t dataSize()
const = 0;
236 off_t offsetInParent()
const;
237 off_t offsetInFile()
const;
238 off_t dataOffsetInParent()
const;
239 off_t dataOffsetInFile()
const;
242 off_t _offsetInParent = -1;
246 size_t _encode_head(
char*,
size_t)
const;
247 virtual size_t _encode(
char*)
const = 0;
261 inline std::string encode()
const;
262 inline size_t encode(
char*)
const;
263 inline size_t encode(
ioBase&)
const;
264 inline size_t encode(
ioBase&, off_t)
const;
277 size_t encode(
char*,
size_t)
const;
293 virtual std::wstring minirepr()
const = 0;
294 virtual std::wstring
repr()
const;
319 template<
typename ebmltype_t,
typename ebmlinst_t,
typename instbase_t=ebmlElement>
327 template<
typename... Args>
328 ebmlElementCRTP(
const ebmltype_t* cls, Args&&... args) : instbase_t(cls, std::forward<Args>(args)...) {}
329 const ebmltype_t& cls()
const;
342 template<
typename ebmlinst_t,
typename parse_t>
343 concept
has_init = requires(ebmlinst_t& instance,
const parse_t& parsed) {
344 { instance._init(parsed) };
347 template<
typename ebmlinst_t,
typename parse_t>
348 concept
has_cinit = requires(ebmlinst_t& instance,
const parse_t& parsed) {
349 { instance._cinit(parsed) };
352 template<
typename ebmlinst_t,
typename... Args>
354 {
new ebmlinst_t(std::forward<Args>(args)...) };
357 template<
typename ebmlinst_t>
359 { instance._clone(orig) };
364 if (
auto recast = dynamic_cast<T*>(
this)) {
368 throw std::bad_cast();
373 if (
auto recast = dynamic_cast<T*>(
this)) {
377 throw std::bad_cast();
396 auto lock = std::unique_lock(
_self.mutex);
398 if (
_self.ctl ==
nullptr) {
400 _self.ctl->weakcount = 1;
404 _self.ctl->valid =
true;
423 auto buffer = std::make_unique<char[]>(_dataSize + 16);
430 auto buffer = std::make_unique<char[]>(_dataSize + 16);
concept has_constructor
Definition: ebmlElement.h:353
friend class ebmlDocument
Definition: ebmlElement.h:80
Abstract base class for EBML Element Type objects.
Definition: ebmlElementType.h:106
virtual size_t dataSize() const =0
Definition: ebmlElement.cpp:226
ebml_shared_ptr< T > ebml_dynamic_pointer_cast(const ebml_shared_ptr< U > &)
Definition: ptrs.h:676
void _validate()
Definition: ebmlElement.h:395
friend class ebmlDataElementClass
Definition: ebmlElement.h:87
friend class ebmlMasterElement
Definition: ebmlElement.h:82
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
concept has_clone_method
Definition: ebmlElement.h:358
Represents parsed seek data extracted from an EBML element.
Definition: seekdata.h:39
ebml::wptr< ebmlElement > wp()
Definition: ebmlElement.cpp:356
friend class ebmlElementType
Definition: ebmlElement.h:81
std::weak_ptr< ebmlDocument > ebmlDocument_wp
Definition: ptrs.h:915
concept has_init
Definition: ebmlElement.h:343
A drop-in replacement for std::weak_ptr tailored for EBML objects.
Definition: ptrs.h:30
ebmlElementCRTP(const ebmltype_t *cls, Args &&... args)
Definition: ebmlElement.h:328
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
size_t outerSize() const
Definition: ebmlElement.cpp:255
const ebmlElementType * _cls
Pointer to the companion element type (an ebmlElementClass subclass).
Definition: ebmlElement.h:105
flexible_ptr< ebmlElement > ebmlElement_fp
Definition: ebmlElement.h:21
std::wstring repr(const std::string &str)
Definition: repr.cpp:36
friend class ebmlLazyLoad
Definition: ebmlElement.h:83
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
std::shared_ptr< ebmlDocument > ebmlDocument_sp
Definition: ptrs.h:909
uint8_t vintWidth_t
Definition: ebmlID_t.h:8
ebml_shared_ptr< T > ebml_static_pointer_cast(const ebml_shared_ptr< U > &)
Definition: ptrs.h:731
wptr< ebmlElement > _self
Custom weak pointer to self (used for shared-from-this semantics).
Definition: ebmlElement.h:107
off_t _offsetInParent
Definition: ebmlElement.h:242
off_t offsetInParent() const
Definition: ebmlElement.h:391
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
std::string encode() const
Encodes the element and returns it as a std::string.
Definition: ebmlElement.h:412
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
Template class for EBML data types.
Definition: ebmlDataElement.h:42
ebmlDocument_wp _document
Definition: ebmlElement.h:213
Base class for file-like IO operations.
Definition: io.h:22
ebml::ptr< ebmlElement > sp()
Returns a shared pointer to the element instance.
Definition: ebmlElement.cpp:348
flexible_ptr< ebmlMasterElement > ebmlMasterElement_fp
Definition: ebmlElement.h:24
T & as()
Dynamically cast the element to the requested type.
Definition: ebmlElement.h:363
size_t write(const char *, size_t)
Definition: io.cpp:23
concept has_cinit
Definition: ebmlElement.h:348