libebml_ng
ebmlMap.h
Go to the documentation of this file.
1 #ifndef EBML_NG_MASTERELEMENT_MAP_H
2 #define EBML_NG_MASTERELEMENT_MAP_H
3 
4 #include <unordered_map>
5 #include <vector>
6 #include <exception>
7 
8 // #include "base.h"
9 #include "base/childSlot_t.h"
10 #include "ebmlPair.h"
11 #include "../ebmlDataElement.h"
12 #include "../ebmlElement.h"
13 
14 #include "ebmlList.h"
15 
16 namespace ebml {
29  template<
30  typename K,
31  typename V,
32  typename H=std::hash<K>,
33  typename E = std::equal_to<K>,
34  typename A = std::allocator<std::pair<const K, ebml::ptr<ebmlPair<const K, V>>>>,
35  typename B = std::allocator<std::pair<const K, pair_value_t<V>>>
36  >
37  class ebmlMapType : public ebmlTypeCRTP<ebmlMapType<K, V, H, E, A, B>, ebmlMap<K, V, H, E, A, B>, ebmlMasterElementType> {
38  public:
39  ebmlMapType(const char*, const std::wstring&, const ebmlPairType<const K, V>* paircls);
40  ebmlMapType(ebmlID_t, const std::wstring&, const ebmlPairType<const K, V>* paircls);
41  const ebmlPairType<const K, V>& paircls() const;
42 
43  private:
44  const ebmlPairType<const K, V>* _paircls;
45  friend class ebmlMap<K, V, H, E, A>;
46  };
47 
48  template<
49  typename K,
50  typename V,
51  typename H = std::hash<K>,
52  typename E = std::equal_to<K>,
53  typename A = std::allocator<std::pair<const K, ebml::ptr<ebmlPair<const K, V>>>>
54  >
55  using ebmlMapData = std::unordered_map<K, ebml::ptr<ebmlPair<const K, V>>, H, E, A>;
56 
57  template<
58  typename K,
59  typename V,
60  typename H = std::hash<K>,
61  typename E = std::equal_to<K>,
62  typename B = std::allocator<std::pair<const K, pair_value_t<V>>>
63  >
64  using ebmlMapArgs = std::unordered_map<K, pair_value_t<V>, H, E, B>;
65 
66  template<typename K, typename V, typename H, typename E, typename A, typename B>
67  class ebmlMap : public ebmlElementCRTP<ebmlMapType<K, V, H, E, A, B>, ebmlMap<K, V, H, E, A, B>, ebmlMasterElement> {
68  friend class ebmlTypeCRTP<ebmlMapType<K, V, H, E, A, B>, ebmlMap<K, V, H, E, A, B>, ebmlMasterElementType>;
69  friend class ebmlElementCRTP<ebmlMapType<K, V, H, E, A, B>, ebmlMap<K, V, H, E, A, B>, ebmlMasterElement>;
70 
71  private:
73 
74  protected:
76  ebmlMap(const ebmlMapType<K, V, H, E, A, B>*, const std::vector<std::pair<K, pair_value_t<V>>>&);
77  ebmlMap(const ebmlMapType<K, V, H, E, A, B>*, std::vector<std::pair<K, pair_value_t<V>>>&&);
81  void _clear() override;
82 
83  std::vector<ebml::ptr<ebmlPair<const K, V>>> _prepareData(const std::vector<std::pair<K, pair_value_t<V>>>&);
84  std::vector<ebml::ptr<ebmlPair<const K, V>>> _prepareData(std::vector<std::pair<K, pair_value_t<V>>>&&);
87 
88  void _setData(std::vector<ebml::ptr<ebml::ebmlPair<const K, V>>>&& items);
89 
90  public:
91  // void setData(std::initializer_list<std::pair<K, pair_value_t<V>>>);
92  void setData(const std::vector<std::pair<K, pair_value_t<V>>>&);
93  void setData(std::vector<std::pair<K, pair_value_t<V>>>&&);
96 
97  std::wstring minirepr() const override;
98 
99  // Element access
101  pair_value_slot_t<V> at(const K&);
102 
103  std::pair<ebmlMasterElement::iterator, bool> insert(const std::pair<K, pair_value_t<V>>& value);
104  std::pair<ebmlMasterElement::iterator, bool> insert(std::pair<K, pair_value_t<V>>&& value);
105 
106  size_t erase(const K&);
107  size_t count(const K&) const;
108 
109  // Const element access
110  pair_const_value_t<V> at(const K&) const;
111 
112  // Iteration
113  protected:
115  private:
118  mutable ebml::ptr<ebmlElement> _current;
119 
120  protected:
123 
124  public:
125  _iterator();
126  virtual ~_iterator();
127 
129 
130  ebmlElement& operator*() const;
133  bool operator==(const ebmlMasterElement::_iterator&) const;
134  bool operator!=(const ebmlMasterElement::_iterator&) const;
135  friend class ebmlMap<K, V, H, E, A>;
137  };
138 
141 
143  private:
146 
147  protected:
150 
151  public:
152  _const_iterator();
153  virtual ~_const_iterator();
154 
156  const ebmlElement& operator*() const;
161 
162  friend class ebmlMap<K, V, H, E, A, B>;
164  };
165 
167  ebmlMasterElement::_const_iterator* _cend() const override;
168 
169  void _addChild(const ebmlElement_sp&) override;
170  void _addChild(ebmlElement_sp&&) override;
171 
172  friend class ebmlMapType<K, V, H, E, A, B>;
173  };
174 }
175 
176 #define EXTERN_MAP_TYPE(KEYTYPE) \
177  extern template class ebml::ebmlPairType<const KEYTYPE>; \
178  extern template class ebml::ebmlPair<const KEYTYPE>; \
179  extern template class ebml::ebmlMapType<KEYTYPE>; \
180  extern template class ebml::ebmlMap<KEYTYPE>
181 
182 #define EXTERN_DATAMAP_TYPE(KEYTYPE, VALTYPE) \
183  extern template class ebml::ebmlPairType<const KEYTYPE, VALTYPE>; \
184  extern template class ebml::ebmlPair<const KEYTYPE, VALTYPE>; \
185  extern template class ebml::ebmlMapType<KEYTYPE, VALTYPE>; \
186  extern template class ebml::ebmlMap<KEYTYPE, VALTYPE>
187 
188 #define INST_MAP_TYPE(KEYTYPE) \
189  template class ebml::ebmlPairType<const KEYTYPE>; \
190  template class ebml::ebmlPair<const KEYTYPE>; \
191  template class ebml::ebmlMapType<KEYTYPE>; \
192  template class ebml::ebmlMap<KEYTYPE>
193 
194 #define INST_DATAMAP_TYPE(KEYTYPE, VALTYPE) \
195  template class ebml::ebmlPairType<const KEYTYPE, VALTYPE>; \
196  template class ebml::ebmlPair<const KEYTYPE, VALTYPE>; \
197  template class ebml::ebmlMapType<KEYTYPE, VALTYPE>; \
198  template class ebml::ebmlMap<KEYTYPE, VALTYPE>
199 
200 #define EXTERN_MAP_TYPE_EXT(KEYTYPE, ...) \
201  extern template class ebml::ebmlPairType<const KEYTYPE>; \
202  extern template class ebml::ebmlPair<const KEYTYPE>; \
203  extern template class ebml::ebmlMapType<KEYTYPE, ##__VA_ARGS__>; \
204  extern template class ebml::ebmlMap<KEYTYPE, ##__VA_ARGS__>
205 
206 #define INST_MAP_TYPE_EXT(KEYTYPE, ...) \
207  template class ebml::ebmlPairType<const KEYTYPE>; \
208  template class ebml::ebmlPair<const KEYTYPE>; \
209  template class ebml::ebmlMapType<KEYTYPE, ##__VA_ARGS__>; \
210  template class ebml::ebmlMap<KEYTYPE, ##__VA_ARGS__>
211 
212 #endif
Definition: ebmlMap.h:67
std::vector< ebml::ptr< ebmlPair< const K, V > > > _prepareData(const std::vector< std::pair< K, pair_value_t< V >>> &)
std::conditional_t< std::is_class< V >::value &&std::is_base_of< ebmlElement, V >::value, ebml::ptr< const V >, const V & > pair_const_value_t
Definition: ebmlPair.h:51
Definition: ebmlMasterElement.h:292
size_t count(const K &) const
void _clear() override
Clears all child elements.
ebmlMasterElement::_const_iterator & operator++()
bool operator!=(const ebmlMasterElement::_const_iterator &) const
std::conditional_t< std::is_class< V >::value &&std::is_base_of< ebmlElement, V >::value, childSlot_t< V >, V & > pair_value_slot_t
Definition: ebmlPair.h:45
Definition: ebmlMap.h:142
std::pair< ebmlMasterElement::iterator, bool > insert(const std::pair< K, pair_value_t< V >> &value)
bool operator==(const ebmlMasterElement::_iterator &) const
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
Definition: ebmlMasterElement.h:269
pair_value_slot_t< V > at(const K &)
bool operator!=(const ebmlMasterElement::_iterator &) const
ebmlMasterElement::_const_iterator * copy() const
ebmlElement & operator*() const
ebmlMasterElement::_iterator * _end() override
void setData(const std::vector< std::pair< K, pair_value_t< V >>> &)
size_t erase(const K &)
ebmlMap(const ebmlMapType< K, V, H, E, A, B > *)
ebmlMasterElement::_iterator * _begin() override
Definition: ebmlPair.h:18
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
Definition: ebmlMasterElement.h:342
Definition: ebmlMasterElement.h:324
ebmlMasterElement::_iterator * copy() const
bool operator==(const ebmlMasterElement::_const_iterator &) const
const ebmlPairType< const K, V > & paircls() const
ebmlMasterElement::_const_iterator * _cend() const override
std::unordered_map< K, pair_value_t< V >, H, E, B > ebmlMapArgs
Definition: ebmlMap.h:64
const ebmlElement & operator*() const
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
A template class representing a map-like EBML element type.
Definition: ebmlMap.h:37
ebmlMasterElement::_const_iterator & operator=(const ebmlMasterElement::_const_iterator &)
pair_value_slot_t< V > operator[](const K &)
std::conditional_t< std::is_class< V >::value &&std::is_base_of< ebmlElement, V >::value, ebml::ptr< V >, V > pair_value_t
Definition: ebmlPair.h:42
Definition: ebmlMap.h:114
std::wstring minirepr() const override
ebmlMasterElement::_iterator & operator++()
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
ebmlMapType(const char *, const std::wstring &, const ebmlPairType< const K, V > *paircls)
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
ebmlMasterElement::_iterator & operator=(const ebmlMasterElement::_iterator &)
ebmlMasterElement::_const_iterator * _cbegin() const override
void _addChild(const ebmlElement_sp &) override
Attaches a child element (rvalue version).
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
void _setData(std::vector< ebml::ptr< ebml::ebmlPair< const K, V >>> &&items)
std::unordered_map< K, ebml::ptr< ebmlPair< const K, V > >, H, E, A > ebmlMapData
Definition: ebmlMap.h:55