libebml_ng
ebmlDataElement.h
Go to the documentation of this file.
1 #ifndef EBML_NG_DATAELEMENT_H
2 #define EBML_NG_DATAELEMENT_H
3 
4 #include "ebmlElementType.h"
5 #include "ebmlElement.h"
6 #include "ebmlElement.tpp"
7 
8 #include "struct/ull.h"
9 #include "struct/ll.h"
10 #include "struct/double.h"
11 #include "struct/binary.h"
12 #include "struct/unicode.h"
13 #include "struct/datetime.h"
14 #include "repr.h"
15 
16 namespace ebml {
17  template<typename T>
19 
20  template<typename T>
21  using ebmlDataElement_sp = std::shared_ptr<ebmlDataElement<T>>;
22 
41  template<typename T>
42  class ebmlDataType : public ebmlTypeCRTP<ebmlDataType<T>, ebmlDataElement<T>> {
43  friend class ebmlDataElement<T>;
44  public:
46  static T defaultdefault;
47 
48  ebmlDataType(const char*, const std::wstring&);
49  ebmlDataType(const char*, const std::wstring&, const T&);
50  ebmlDataType(const char*, const std::wstring&, T&&);
51 
52  ebmlDataType(ebmlID_t, const std::wstring&);
53  ebmlDataType(ebmlID_t, const std::wstring&, const T&);
54  ebmlDataType(ebmlID_t, const std::wstring&, T&&);
55 
56  ebmlDataType(const char*, const std::wstring&, const seekHelper_t*);
57  ebmlDataType(const char*, const std::wstring&, const T&, const seekHelper_t*);
58  ebmlDataType(const char*, const std::wstring&, T&&, const seekHelper_t*);
59 
60  ebmlDataType(ebmlID_t, const std::wstring&, const seekHelper_t*);
61  ebmlDataType(ebmlID_t, const std::wstring&, const T&, const seekHelper_t*);
62  ebmlDataType(ebmlID_t, const std::wstring&, T&&, const seekHelper_t*);
63 
64  // ebmlDataElement_sp<T> operator()() const;
65  // ebmlDataElement_sp<T> operator()(const T&) const;
66  // ebmlDataElement_sp<T> operator()(T&&) const;
67 
68  protected:
69  // ebmlElement* _new() const override;
70  // ebmlElement_sp _decode(const parseString&) const override;
71  // ebmlElement_sp _decode(const parseFile&) const override;
72  };
73 
74  template<typename T>
75  class ebmlDataElement : public ebmlElementCRTP<ebmlDataType<T>, ebmlDataElement<T>> {
76  friend class ebmlDataType<T>;
79 
80  // Constructor/Destructor
81  protected:
83  ebmlDataElement(const ebmlDataType<T>*, const T&);
84  ebmlDataElement(const ebmlDataType<T>*, T&&);
87 
88  public:
89  T data;
90 
91  // Size functions.
92  public:
93  virtual size_t dataSize() const;
94 
95  // Encode functions.
96  protected:
97  virtual size_t _encode(char*) const;
98  // virtual size_t _encode(char*, size_t) const;
99 
100  // // Decode functions:
101  // protected:
102  // virtual void _decode(const parseString&);
103  // virtual void _decode(const parseFile&);
104 
105  // Cloning functions:
106  protected:
107  virtual void _clonedata(const ebmlElement*);
108 
109  public:
110  // Repr function
111  std::wstring minirepr() const;
112  };
113 
114  // Specializations for const T are needed to support move construction.
115 
116  template<typename T>
117  class ebmlDataType<const T> : public ebmlTypeCRTP<ebmlDataType<const T>, ebmlDataElement<const T>> {
118  friend class ebmlDataElement<const T>;
119  public:
120  const T defaultval;
121  static const T defaultdefault;
122 
123  ebmlDataType(const char*, const std::wstring&);
124  ebmlDataType(const char*, const std::wstring&, const T&);
125  ebmlDataType(const char*, const std::wstring&, T&&);
126 
127  ebmlDataType(ebmlID_t, const std::wstring&);
128  ebmlDataType(ebmlID_t, const std::wstring&, const T&);
129  ebmlDataType(ebmlID_t, const std::wstring&, T&&);
130  };
131 
132  template<typename T>
133  // class ebmlDataElement<const T> : public ebmlElementTmpl<ebmlDataType<const T>, ebmlDataElement<const T>> {
134  class ebmlDataElement<const T> : public ebmlElementCRTP<ebmlDataType<const T>, ebmlDataElement<const T>> {
135  friend class ebmlDataType<const T>;
136  friend class ebmlTypeCRTP<ebmlDataType<const T>, ebmlDataElement<const T>>;
137  friend class ebmlElementCRTP<ebmlDataType<const T>, ebmlDataElement<const T>>;
138 
139  // Constructor/Destructor
140  protected:
141  ebmlDataElement(const ebmlDataType<const T>*, const T&);
145 
146  public:
147  T data;
148  // const ebmlDataType<const T>* cls() const;
149 
150  // Size functions.
151  public:
152  virtual size_t dataSize() const;
153 
154  // Encode functions.
155  protected:
156  virtual size_t _encode(char*) const;
157  // virtual size_t _encode(char*, size_t) const;
158 
159  // // Decode functions:
160  // protected:
161  // void _decode(const parseString&);
162  // void _decode(const parseFile&);
163 
164  // Cloning functions:
165  public:
166  ebmlElement_sp clone() const;
167 
168  protected:
169  void _clonedata(const ebmlElement*);
170 
171  public:
172  // Repr function
173  std::wstring minirepr() const;
174  };
175 
176  // Provides easy read-write access to data member of elements.
177  template<typename T>
178  T& data(const ebmlElement_sp& elem);
179 
180  template<typename T>
181  const T& data(const c_ebmlElement_sp& elem);
182 }
183 
184 #define DECL_DATA_CLS(T) \
185  extern template class ebml::ebmlDataType<T>; \
186  extern template class ebml::ebmlDataElement<T>; \
187  extern template T& ebml::data<T>(const ebmlElement_sp&); \
188  extern template const T& ebml::data<T>(const c_ebmlElement_sp&)
189 
190 #define DECL_EBML_ALIAS(T, alias) \
191  typedef ::ebml::ebmlDataType<T> alias##Type; \
192  typedef ::ebml::ebmlDataElement<T> alias;
193 
194 #define INST_EBML_CLS(T, defaultval) \
195  template<> \
196  T ebml::ebmlDataType<T>::defaultdefault = defaultval; \
197  template class ebml::ebmlDataType<T>; \
198  template class ebml::ebmlDataElement<T>; \
199  template T& ebml::data<T>(const ebml::ebmlElement_sp&); \
200  template const T& ebml::data<T>(const ebml::c_ebmlElement_sp&)
201 
202 #define INST_CONST_EBML_CLS(T, defaultval) \
203  template<> \
204  const T ebml::ebmlDataType<const T>::defaultdefault = defaultval; \
205  template class ebml::ebmlDataType<const T>; \
206  template class ebml::ebmlDataElement<const T>; \
207  template const T& ebml::data<const T>(const ebml::c_ebmlElement_sp&);
208 
209 namespace ebml {
215  typedef ebmlDataType<unsigned long long> ebmlUnsignedIntegerType;
216 
222  typedef ebmlDataType<long long> ebmlSignedIntegerType;
223 
229  typedef ebmlDataType<double> ebmlFloatType;
230 
236  typedef ebmlDataType<std::string> ebmlBinaryType;
237 
243  typedef ebmlDataType<std::wstring> ebmlUnicodeType;
244 
250  typedef ebmlDataType<ebml::timepoint_t> ebmlDateTimeType;
251 }
252 
253 DECL_DATA_CLS(unsigned long long);
254 DECL_DATA_CLS(long long);
255 DECL_DATA_CLS(double);
256 DECL_DATA_CLS(std::string);
257 DECL_DATA_CLS(std::wstring);
259 #endif
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
T & data(const ebmlElement_sp &elem)
T defaultval
Definition: ebmlDataElement.h:45
T data
Definition: ebmlDataElement.h:89
Represents a parsed EBML string segment.
Definition: string.h:37
static T defaultdefault
Definition: ebmlDataElement.h:46
Definition: ebmlDataElement.h:134
Definition: ebmlDataElement.h:117
#define DECL_DATA_CLS(T)
Definition: ebmlDataElement.h:184
::ebml::ebmlDataType< double > ebmlFloatType
EBML Float Type.
Definition: basictypes.h:43
ebmlDataElement(const ebmlDataType< T > *)
std::wstring minirepr() const
ebml::ptr< ebmlinst_t > clone() const
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
Declaration of the EBML element type base class and CRTP templates.
::ebml::ebmlDataType< timepoint_t > ebmlDateTimeType
EBML Date Type.
Definition: basictypes.h:46
::ebml::ebmlDataType< long long > ebmlSignedIntegerType
EBML Signed Integer Type.
Definition: basictypes.h:42
std::chrono::time_point< std::chrono::system_clock, std::chrono::nanoseconds > timepoint_t
Definition: datetime.h:10
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
virtual size_t dataSize() const
virtual void _clonedata(const ebmlElement *)
Definition: ebmlDataElement.h:18
static const T defaultdefault
Definition: ebmlDataElement.h:121
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
T data
Definition: ebmlDataElement.h:147
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
Template class for EBML data types.
Definition: ebmlDataElement.h:42
virtual size_t _encode(char *) const
Declaration of the EBML element instance base class and CRTP templates.
const T defaultval
Definition: ebmlDataElement.h:120
ebmlDataType(const char *, const std::wstring &)
::ebml::ebmlDataType< std::wstring > ebmlUnicodeType
EBML Unicode Type.
Definition: basictypes.h:45
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
std::shared_ptr< ebmlDataElement< T > > ebmlDataElement_sp
Definition: ebmlDataElement.h:21
::ebml::ebmlDataType< unsigned long long > ebmlUnsignedIntegerType
EBML Unsigned Integer Type.
Definition: basictypes.h:41
::ebml::ebmlDataType< std::string > ebmlBinaryType
EBML Binary Type.
Definition: basictypes.h:44