libebml_ng
ebmlSchema.h
Go to the documentation of this file.
1 #ifndef EBML_NG_SCHEMA_H
2 #define EBML_NG_SCHEMA_H
3 
4 #include <string>
5 #include <unordered_map>
6 #include <vector>
7 #include "ptrs.h"
8 #include "ebmlID_t.h"
9 
10 namespace ebml {
11  struct element_t {
12  std::wstring name;
13  std::vector<std::string> path;
15  std::string type;
16  std::string range; // TODO: Implement std::variant
17  std::string def; // TODO: Implement std::any
18  std::unordered_map<std::string, std::string> documentation;
19  std::unordered_map<std::string, std::string> usage;
21  };
22 
23  struct range_t {
24  unsigned long min = 0;
25  long max = -1;
26  unsigned long def = 0;
27  range_t(unsigned long);
28  range_t(unsigned long, long);
29  range_t(unsigned long, long, unsigned long);
30  };
31 
32  class ebmlSchema {
33  private:
34  std::string _doctype;
35  unsigned long _doctypeversion;
36  range_t _maxIDLength;
37  range_t _maxSizeLength;
38  const ebmlElementType* _rootcls;
39  std::unordered_map<std::wstring, ebmlID_t> _ebmlIDMap;
40  std::unordered_map<ebmlID_t, element_t> _elementTypes;
41 
42  protected:
43  virtual ebmlDocument* _new(const ioBase_sp&) const;
44  virtual ebmlDocument* _new(ioBase_sp&&) const;
45 
46  public:
47  ebmlSchema(const std::string&, unsigned long, const ebmlElementType*, const range_t& maxIDLength, const range_t& maxSizeLength);
48 
49  // Open existing document
50  template<typename T=int>
51  ebmlDocument_sp open(const std::string&, bool write=false) const;
52 
53  // Creating new document.
54  template<typename T=int>
55  ebmlDocument_sp create(const std::string&, size_t initSize) const;
56 
57  template<typename T=int>
58  ebmlDocument_sp create(const std::string&, size_t initSize, unsigned long maxIDLength, unsigned long maxSizeLength) const;
59 
60  const ebmlElementType* const& rootcls() const;
61  const std::string& docType() const;
62  const range_t& maxIDLength() const;
63  const range_t& maxSizeLength() const;
64  unsigned long docTypeVersion() const;
65 
66  const ebmlElementType& getElementType(ebmlID_t ebmlID) const;
67  const ebmlElementType& getElementType(const std::wstring& name) const;
68  };
69 
70  extern template ebmlDocument_sp ebmlSchema::open<int>(const std::string&, bool) const;
71  extern template ebmlDocument_sp ebmlSchema::create<int>(const std::string&, size_t) const;
72  extern template ebmlDocument_sp ebmlSchema::create<int>(const std::string&, size_t, unsigned long, unsigned long) const;
73  extern template ebmlDocument_sp ebmlSchema::open<FILE*>(const std::string&, bool) const;
74  extern template ebmlDocument_sp ebmlSchema::create<FILE*>(const std::string&, size_t) const;
75  extern template ebmlDocument_sp ebmlSchema::create<FILE*>(const std::string&, size_t, unsigned long, unsigned long) const;
76 }
77 
78 #endif
ebmlID_t id
Definition: ebmlSchema.h:14
Abstract base class for EBML Element Type objects.
Definition: ebmlElementType.h:106
const range_t & maxIDLength() const
std::string type
Definition: ebmlSchema.h:15
unsigned long def
Definition: ebmlSchema.h:26
unsigned long docTypeVersion() const
Definition: ebmlSchema.h:23
Definition: basictypes.h:40
ebmlDocument_sp open(const std::string &, bool write=false) const
Definition: ebmlSchema.cpp:32
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
std::string range
Definition: ebmlSchema.h:16
std::string def
Definition: ebmlSchema.h:17
unsigned long min
Definition: ebmlSchema.h:24
std::vector< std::string > path
Definition: ebmlSchema.h:13
Definition: ebmlSchema.h:32
long max
Definition: ebmlSchema.h:25
Definition: ebmlDocument.h:10
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
std::shared_ptr< ebmlDocument > ebmlDocument_sp
Definition: ptrs.h:909
virtual ebmlDocument * _new(const ioBase_sp &) const
Definition: ebmlSchema.cpp:23
const ebmlElementType *const & rootcls() const
ebmlSchema(const std::string &, unsigned long, const ebmlElementType *, const range_t &maxIDLength, const range_t &maxSizeLength)
Definition: ebmlSchema.cpp:20
range_t(unsigned long)
Definition: ebmlSchema.cpp:16
const range_t & maxSizeLength() const
std::unordered_map< std::string, std::string > usage
Definition: ebmlSchema.h:19
std::unordered_map< std::string, std::string > documentation
Definition: ebmlSchema.h:18
const ebmlElementType & getElementType(ebmlID_t ebmlID) const
const std::string & docType() const
std::wstring name
Definition: ebmlSchema.h:12
ebmlElementType * elemtype
Definition: ebmlSchema.h:20
ebmlDocument_sp create(const std::string &, size_t initSize) const
Definition: ebmlSchema.cpp:94
Definition: ebmlSchema.h:11