libebml_ng
seekdata.h
Go to the documentation of this file.
1 #ifndef EBML_NG_SEEKDATA_H
2 #define EBML_NG_SEEKDATA_H
3 
4 #include "ptrs.h"
5 #include "ebmlElement.h"
6 // #include "masterelement/ebmlMasterElement.h"
7 #include "ebmlID_t.h"
8 #include "parsing/io.h"
9 #include <sys/types.h>
10 #include "struct/datetime.h"
11 
12 #include <unordered_map>
13 #define SEEKMAPDEFAULTS typename K, typename H=std::hash<K>, typename E=std::equal_to<K>, typename A=std::allocator<std::pair<const K, seekDataWithKey_t<K>*>>
14 
15 namespace ebml {
16  class seekMapBase;
17  class seekData_t;
18 
19  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
20  // class seekDataWithKey_t;
21 
22  template<typename K>
24 
25  template<SEEKMAPDEFAULTS>
26  class seekMap;
27 
39  class seekData_t {
40  public:
44  size_t dataSize;
48 
49  seekData_t(const parseString&);
50  seekData_t(const parseFile&);
52  seekData_t(const ebmlElement&);
53  seekData_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t);
56  seekData_t(seekData_t&&) = default;
57  seekData_t& operator=(seekData_t&&) = default;
58 
59  vintWidth_t headSize() const;
60  size_t outerSize() const;
61  off_t endOffset() const;
62 
63  ebmlElement_sp get();
65 
66  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
67  template<typename K>
69 
70  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
71  template<typename K>
72  const seekDataWithKey_t<K>& withKeyType() const;
73 
74  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
75  template<typename K>
76  K& key();
77 
78  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
79  template<typename K>
80  const K& key() const;
81 
82  virtual std::wstring repr() const;
83 
84  // virtual void add(std::unordered_map<ebmlID_t, std::unique_ptr<seekMapBase>>&);
85  // virtual void rm(std::unordered_map<ebmlID_t, std::unique_ptr<seekMapBase>>&);
86  virtual ~seekData_t();
87  };
88 
94  template<typename K>
95  class seekDataWithKey_t : public seekData_t {
96  public:
97  K key;
99  seekDataWithKey_t(const parseString&, const K&);
100  seekDataWithKey_t(const parseString&, K&&);
102  seekDataWithKey_t(const parseFile&, const K&);
103  seekDataWithKey_t(const parseFile&, K&&);
105  seekDataWithKey_t(ebmlElement&, const K&);
108  seekDataWithKey_t(const ebmlElement&, const K&);
109  seekDataWithKey_t(const ebmlElement&, K&&);
111  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, const K&);
112  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, K&&);
113  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, const K&, const ebmlElement_sp&);
114  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, const K&, const ebmlElement_sp&, const ebmlElement_sp&);
115  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, K&&, const ebmlElement_sp&);
116  seekDataWithKey_t(ebmlID_t, vintWidth_t, off_t, size_t, vintWidth_t, K&&, const ebmlElement_sp&, const ebmlElement_sp&);
117 
118  std::wstring repr() const;
119  };
120 
126  class seekMapBase {
127  public:
128  seekMapBase();
129  virtual ~seekMapBase();
130  virtual std::wstring repr() const;
131 
132  // template<typename K, typename H=std::hash<K>, typename E=std::equal_to<K>>
133  template<SEEKMAPDEFAULTS>
135 
136  template<SEEKMAPDEFAULTS>
137  const seekMap<K, H, E, A>& withKeyType() const;
138 
139  template<SEEKMAPDEFAULTS>
140  seekDataWithKey_t<K>*& operator[](const K&);
141 
142  template<SEEKMAPDEFAULTS>
143  seekDataWithKey_t<K>*& at(const K&);
144 
145  template<SEEKMAPDEFAULTS>
146  seekDataWithKey_t<K>* const& at(const K&) const;
147 
148  template<SEEKMAPDEFAULTS>
149  size_t count(const K&) const;
150 
151  template<SEEKMAPDEFAULTS>
152  size_t erase(const K&);
153 
154  virtual void add(seekData_t*) = 0;
155  virtual void rm(seekData_t*) = 0;
156  };
157 
168  template<typename K, typename H, typename E, typename A>
169  class seekMap : public seekMapBase {
170  protected:
171  // std::unordered_map<K, seekDataWithKey_t<K, H, E>*, H, E> _items;
172  std::unordered_map<K, seekDataWithKey_t<K>*, H, E, A> _items;
173 
174  public:
175  seekMap();
176  // ~seekMap();
177  seekDataWithKey_t<K>*& operator[](const K&);
178  seekDataWithKey_t<K>*& at(const K&);
179  seekDataWithKey_t<K>* const& at(const K&) const;
180  void insert(const std::pair<K, seekDataWithKey_t<K>*>&);
181  void insert(std::pair<K, seekDataWithKey_t<K>*>&&);
182  size_t count(const K&) const;
183  size_t erase(const K&);
184  std::wstring repr() const;
185 
186  void add(seekData_t*) override;
187  void rm(seekData_t*) override;
188  };
189 
195  class seekHelper_t {
196  public:
197  seekHelper_t();
198  seekMapBase* initSeekMap() const;
199  virtual seekData_t* makeSeekData(const parseString& parsed) const;
200  virtual seekData_t* makeSeekData(const parseFile& parsed) const;
201  virtual seekData_t* makeSeekData(ebmlElement& elem) const;
202  virtual seekData_t* makeSeekData(const ebmlElement& elem) const;
203  };
204 
205  extern seekHelper_t seekHelper;
206 
219  template<SEEKMAPDEFAULTS>
221  public:
225  seekData_t* makeSeekData(const parseString& parsed) const;
226  seekData_t* makeSeekData(const parseFile& parsed) const;
227  seekData_t* makeSeekData(ebmlElement& elem) const = 0;
228  seekData_t* makeSeekData(const ebmlElement& elem) const = 0;
229  };
230 
232  // extern template const seekMap<unsigned long long>& seekMapBase::withKeyType() const;
233  //
234  extern template seekMap<long long>& seekMapBase::withKeyType();
235  // extern template const seekMap<long long>& seekMapBase::withKeyType() const;
236  //
237  extern template seekMap<double>& seekMapBase::withKeyType();
238  // extern template const seekMap<double>& seekMapBase::withKeyType() const;
239  //
241  // extern template const seekMap<std::string>& seekMapBase::withKeyType() const;
242  //
244  // extern template const seekMap<std::wstring>& seekMapBase::withKeyType() const;
245  //
246  // extern template class seekMap<unsigned long long>;
247  // extern template class seekMap<long long>;
248  // extern template class seekMap<double>;
249  // extern template class seekMap<std::string>;
250  // extern template class seekMap<std::wstring>;
251  //
252  // extern template class seekHelperByEBMLID<unsigned long long>;
253  // extern template class seekHelperByEBMLID<long long>;
254  // extern template class seekHelperByEBMLID<double>;
255  // extern template class seekHelperByEBMLID<std::string>;
256  // extern template class seekHelperByEBMLID<std::wstring>;
257  // extern template class seekHelperByEBMLID<timepoint_t>;
258 }
259 
260 #endif
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
size_t count(const K &) const
std::wstring repr() const
seekMap< K, H, E, A > * initSeekMap() const
virtual seekData_t * makeSeekData(const parseString &parsed) const
Definition: seekdata.cpp:120
seekDataWithKey_t(const parseString &)
Represents a parsed EBML string segment.
Definition: string.h:37
Represents parsed seek data extracted from an EBML element.
Definition: seekdata.h:39
vintWidth_t headSize() const
Definition: seekdata.cpp:44
seekHelper_t seekHelper
Definition: seekdata.cpp:136
A templated subclass of seekData_t that stores a key of type K.
Definition: seekdata.h:23
seekDataWithKey_t< K > *& at(const K &)
Represents a parsed EBML file segment.
Definition: io.h:32
virtual ~seekData_t()
Definition: seekdata.cpp:112
seekMap< K, H, E, A > & withKeyType()
size_t erase(const K &)
void add(seekData_t *) override
c_ebmlElement_sp cget()
Definition: seekdata.cpp:68
A drop-in replacement for std::weak_ptr tailored for EBML objects.
Definition: ptrs.h:30
void insert(const std::pair< K, seekDataWithKey_t< K > *> &)
virtual void add(seekData_t *)=0
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
void rm(seekData_t *) override
K key
Definition: seekdata.h:97
off_t endOffset() const
Definition: seekdata.cpp:52
seekDataWithKey_t< K > *& operator[](const K &)
std::unordered_map< K, seekDataWithKey_t< K > *, H, E, A > _items
Definition: seekdata.h:172
seekHelperByEBMLID(ebmlID_t ebmlID)
virtual ~seekMapBase()
Definition: seekdata.cpp:139
size_t dataSize
Definition: seekdata.h:44
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
seekData_t * makeSeekData(const parseString &parsed) const
size_t outerSize() const
Definition: seekdata.cpp:48
seekData_t & operator=(seekData_t &&)=default
seekDataWithKey_t< K > *& operator[](const K &)
seekDataWithKey_t< K > *& at(const K &)
vintWidth_t sizeWidth
Definition: seekdata.h:45
uint8_t vintWidth_t
Definition: ebmlID_t.h:8
seekMapBase * initSeekMap() const
Definition: seekdata.cpp:116
ebmlElement_fp ref
Definition: seekdata.h:46
ebmlID_t ebmlID
Definition: seekdata.h:41
std::wstring repr() const
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
seekHelper_t()
Definition: seekdata.cpp:114
Container mapping keys to seek data objects with keys.
Definition: seekdata.h:26
vintWidth_t ebmlIDWidth
Definition: seekdata.h:42
Base class for seek map containers.
Definition: seekdata.h:126
virtual void rm(seekData_t *)=0
Templated helper class for EBML elements that search for key data within child elements.
Definition: seekdata.h:220
ebmlMasterElement_fp parent
Definition: seekdata.h:47
seekMapBase()
Definition: seekdata.cpp:138
virtual std::wstring repr() const
Definition: seekdata.cpp:141
Declaration of the EBML element instance base class and CRTP templates.
off_t offsetInParent
Definition: seekdata.h:43
seekDataWithKey_t< K > & withKeyType()
ebmlID_t ebmlID
Definition: seekdata.h:222
virtual std::wstring repr() const
Definition: seekdata.cpp:80
size_t erase(const K &)
size_t count(const K &) const
seekData_t(const parseString &)
Definition: seekdata.cpp:12