1 #ifndef EBML_NG_MASTERELEMENT_MAP_H 2 #define EBML_NG_MASTERELEMENT_MAP_H 4 #include <unordered_map> 11 #include "../ebmlDataElement.h" 12 #include "../ebmlElement.h" 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>>>
37 class ebmlMapType :
public ebmlTypeCRTP<ebmlMapType<K, V, H, E, A, B>, ebmlMap<K, V, H, E, A, B>, ebmlMasterElementType> {
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>>>>
55 using ebmlMapData = std::unordered_map<K, ebml::ptr<ebmlPair<const K, V>>, H, E, A>;
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>>>
64 using ebmlMapArgs = std::unordered_map<K, pair_value_t<V>, H, E, B>;
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>;
78 ebmlMap(
const ebmlMapType<K, V, H, E, A, B>*,
const ebmlMapArgs<K, V, H, E, B>&);
79 ebmlMap(
const ebmlMapType<K, V, H, E, A, B>*,
ebmlMapArgs<K, V, H, E, B>&&);
97 std::wstring
minirepr()
const override;
106 size_t erase(
const K&);
107 size_t count(
const K&)
const;
121 _iterator(
const ebml::ptr<
ebmlMap<K, V, H, E, A, B>>& elem,
const typename ebmlMapData<K, V, H, E, A>::iterator& iter);
122 _iterator(
ebml::ptr<
ebmlMap<K, V, H, E, A, B>>&& elem,
typename ebmlMapData<K, V, H, E, A>::iterator&& iter);
148 _const_iterator(
const ebml::ptr<
const ebmlMap<K, V, H, E, A, B>>& elem,
const typename ebmlMapData<K, V, H, E, A>::const_iterator& iter);
149 _const_iterator(
ebml::ptr<
const ebmlMap<K, V, H, E, A, B>>&& elem,
typename ebmlMapData<K, V, H, E, A>::const_iterator&& iter);
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> 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> 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> 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> 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__> 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__>
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 >>> &)
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 &)
virtual ~_const_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