libebml_ng
ebmlPair.h
Go to the documentation of this file.
1 #ifndef EBML_NG_MASTERELEMENT_PAIR_H
2 #define EBML_NG_MASTERELEMENT_PAIR_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 "../ptrs.h"
11 #include "../ebmlDataElement.h"
12 #include "../ebmlElement.h"
13 
14 #define IS_EBML_TYPE(V) std::is_class<V>::value && std::is_base_of<ebmlElement, V>::value
15 
16 namespace ebml {
17  template<typename K, typename V>
18  class ebmlPair;
19 
20  template<typename K, typename V>
22 
23  template<typename K, typename V>
25 
26  template<typename K>
28 
29  template<typename K>
31 
32  template<typename V>
33  using pair_value_class_t = std::conditional_t<IS_EBML_TYPE(V), ebmlElementType, ebmlDataType<V>>;
34 
35  template<typename V>
36  using pair_value_inst_t = std::conditional_t<IS_EBML_TYPE(V), V, ebmlDataElement<V>>;
37 
38  template<typename V>
40 
41  template<typename V>
42  using pair_value_t = std::conditional_t<IS_EBML_TYPE(V), ebml::ptr<V>, V>;
43 
44  template<typename V>
45  using pair_value_slot_t = std::conditional_t<IS_EBML_TYPE(V), childSlot_t<V>, V&>;
46 
47  template<typename V>
48 #if RAW
49  using pair_const_value_t = std::conditional_t<IS_EBML_TYPE(V), const V*, const V&>;
50 #else
51  using pair_const_value_t = std::conditional_t<IS_EBML_TYPE(V), ebml::ptr<const V>, const V&>;
52 #endif
53 
54  template<
55  typename K,
56  typename V,
57  typename H = std::hash<K>,
58  typename E = std::equal_to<K>,
59  typename A = std::allocator<std::pair<const K, ebml::ptr<ebmlPair<const K, V>>>>,
60  typename B = std::allocator<std::pair<const K, pair_value_t<V>>>
61  >
62  class ebmlMap;
63 
75  template<typename K, typename V>
76  class ebmlPairType : public ebmlTypeCRTP<ebmlPairType<K, V>, ebmlPair<K, V>, ebmlMasterElementType> {
77  public:
78  ebmlPairType(const char*, const std::wstring&, const pair_key_class_t<K>* keycls, const pair_value_class_t<V>* valcls);
79  ebmlPairType(ebmlID_t, const std::wstring&, const pair_key_class_t<K>* keycls, const pair_value_class_t<V>* valcls);
80 
81  const pair_key_class_t<K>& keycls() const;
82  const pair_value_class_t<V>& valcls() const;
83 
84  protected:
86 
87  private:
88  const ebmlDataType<K>* _keycls;
89  const pair_value_class_t<V>* _valcls;
90  friend class ebmlPair<K, V>;
91  };
92 
93  template<typename K, typename V>
94  class ebmlPair : public ebmlElementCRTP<ebmlPairType<K, V>, ebmlPair<K, V>, ebmlMasterElement> {
97 
98  protected:
101  // ebml::ptr<ebmlDataElementType<K>> _key;
102  // ebml::ptr<pair_value_inst_t<V>> _value;
103 
104  protected:
106  ebmlPair(const ebmlPairType<K, V>*, const K&, const pair_value_t<V>&);
107  ebmlPair(const ebmlPairType<K, V>*, const K&, pair_value_t<V>&&);
108  ebmlPair(const ebmlPairType<K, V>*, K&&, const pair_value_t<V>&);
110  ebmlPair(const ebmlPair<K, V>&);
111 
112  void _clear() override;
113  void _setData(const K&, const pair_value_t<V>&);
114  void _setData(const K&, pair_value_t<V>&&);
115  void _setData(K&&, const pair_value_t<V>&);
116  void _setData(K&&, pair_value_t<V>&&);
117 
118  public:
119  std::wstring minirepr() const override;
120  // const ebmlPairType<K, V>* cls() const override;
121 
122  // Element access
123  K& key();
125 
126  // Const element access
127  const K& key() const;
129 
130  // Iteration
131  protected:
133  private:
134  ebmlPair_sp<K, V> _elem;
135  unsigned char _pos;
136 
137  protected:
138  _iterator(const ebmlPair_sp<K, V>& elem, unsigned char pos);
139  _iterator(ebmlPair_sp<K, V>&& elem, unsigned char pos);
140 
141  public:
142  _iterator();
143  virtual ~_iterator();
144 
146  ebmlElement& operator*() const;
149  bool operator==(const ebmlMasterElement::_iterator&) const;
150  bool operator!=(const ebmlMasterElement::_iterator&) const;
151 
152  friend class ebmlPair<K, V>;
154  };
155 
158 
159 
161  private:
162  c_ebmlPair_sp<K, V> _elem;
163  unsigned char _pos;
164 
165  protected:
166  _const_iterator(const c_ebmlPair_sp<K, V>& elem, unsigned char pos);
167  _const_iterator(c_ebmlPair_sp<K, V>&& elem, unsigned char pos);
168 
169  public:
170  _const_iterator();
171  virtual ~_const_iterator();
172 
174  const ebmlElement& operator*() const;
179 
180  friend class ebmlPair<K, V>;
182  };
183 
185  ebmlMasterElement::_const_iterator* _cend() const override;
186 
187  void _addChild(const ebmlElement_sp&) override;
188  void _addChild(ebmlElement_sp&&) override;
189 
190  friend class ebmlPairType<K, V>;
191 
192  template<typename Kp, typename Vp, typename H, typename E, typename A, typename B>
193  // template<typename H, typename E, typename A, typename B>
194  friend class ebmlMap;
195  };
196 
197  // extern template class childSlot_t<ebmlList>;
198  extern template class ebmlPairType<std::string, unsigned long long>;
199  extern template class ebmlPair<std::string, unsigned long long>;
200  // extern template class ebmlPairType<std::string, ebmlList>;
201  // extern template class ebmlPair<std::string, ebmlList>;
202 }
203 #endif
Definition: ebmlPair.h:132
ebmlMasterElement::_const_iterator * copy() const
Definition: ebmlMap.h:67
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
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
ebmlMasterElement::_const_iterator & operator=(const ebmlMasterElement::_const_iterator &)
void _setData(const K &, const pair_value_t< V > &)
Abstract base class for EBML master element instances.This class provides the functionality to manage...
Definition: ebmlMasterElement.h:19
Definition: ebmlMasterElement.h:269
bool operator==(const ebmlMasterElement::_iterator &) const
ebml::ptr< pair_value_inst_t< V > > _value
Definition: ebmlPair.h:100
ebmlMasterElement::_iterator & operator++()
ebmlMasterElement::_const_iterator * _cbegin() const override
const ebmlElement & operator*() const
void _addChild(const ebmlElement_sp &) override
Attaches a child element (rvalue version).
ebmlMasterElement::_iterator & operator=(const ebmlMasterElement::_iterator &)
ebmlMasterElement::_const_iterator & operator++()
bool operator!=(const ebmlMasterElement::_iterator &) const
ebmlPairType(const char *, const std::wstring &, const pair_key_class_t< K > *keycls, const pair_value_class_t< V > *valcls)
Definition: ebmlPair.h:18
A template class representing a key-value pair.
Definition: ebmlPair.h:76
Definition: basictypes.h:40
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
Definition: ebmlMasterElement.h:342
std::conditional_t< std::is_class< V >::value &&std::is_base_of< ebmlElement, V >::value, V, ebmlDataElement< V > > pair_value_inst_t
Definition: ebmlPair.h:36
Definition: ebmlMasterElement.h:324
ebmlMasterElement::_iterator * _end() override
ebmlMasterElement::_const_iterator * _cend() const override
const pair_value_class_t< V > & valcls() const
childTypeSpec_t _valueSpec
Definition: ebmlPair.h:85
ebmlMasterElement::_iterator * copy() const
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
pair_value_slot_t< V > value()
std::wstring minirepr() const override
bool operator==(const ebmlMasterElement::_const_iterator &) const
bool operator!=(const ebmlMasterElement::_const_iterator &) const
ebmlElement & operator*() const
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
void _clear() override
Clears all child elements.
ebml::ptr< ebmlDataElement< K > > _key
Definition: ebmlPair.h:99
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
std::conditional_t< std::is_class< V >::value &&std::is_base_of< ebmlElement, V >::value, ebmlElementType, ebmlDataType< V > > pair_value_class_t
Definition: ebmlPair.h:33
Definition: ebmlPair.h:160
CRTP template for EBML Element instances.
Definition: ebmlElement.h:320
Specifies accepted child element types within a parent element.
Definition: childTypeSpec.h:76
ebmlPair(const ebmlPairType< K, V > *)
ebmlMasterElement::_iterator * _begin() override
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
const pair_key_class_t< K > & keycls() const