TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
ttkunsortedmap.h
Go to the documentation of this file.
1 #ifndef TTKUNSORTEDMAP_H
2 #define TTKUNSORTEDMAP_H
3 
4 /***************************************************************************
5  * This file is part of the TTK Library Module project
6  * Copyright (C) 2015 - 2024 Greedysky Studio
7 
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17 
18  * You should have received a copy of the GNU Lesser General Public License along
19  * with this program; If not, see <http://www.gnu.org/licenses/>.
20  ***************************************************************************/
21 
22 #include <vector>
23 
24 #ifndef _CONSTEXPR_CONTAINER
25 # if _HAS_CXX20
26 # define _CONSTEXPR_CONTAINER _CONSTEXPR20_CONTAINER
27 # else
28 # define _CONSTEXPR_CONTAINER inline
29 # endif
30 #endif
31 
32 
36 template <class _Key, class _Value>
38 {
39 public:
40  using key_type = _Key;
41  using mapped_type = _Value;
42  using value_type = std::pair<key_type, _Value>;
43  using reference = _Value&;
44  using const_reference = const _Value&;
45  using _Container = std::vector<value_type>;
46  using size_type = typename _Container::size_type;
47 
48 public:
49  using iterator = typename _Container::iterator;
50  using const_iterator = typename _Container::const_iterator;
51  using reverse_iterator = typename _Container::reverse_iterator;
52  using const_reverse_iterator = typename _Container::const_reverse_iterator;
53 
54 public:
56  _CONSTEXPR_CONTAINER TTKUnsortedMap(const TTKUnsortedMap &_Right) noexcept : m_conatiner(_Right.m_conatiner) {}
58 
59  template <class _Iter>
60  _CONSTEXPR_CONTAINER TTKUnsortedMap(_Iter _First, _Iter _Last) noexcept : TTKUnsortedMap()
61  {
62  insert(_First, _Last);
63  }
64 
66  {
67  m_conatiner = _Right.m_conatiner;
68  return *this;
69  }
70 
72  {
73  m_conatiner = std::move(_Right.m_conatiner);
74  return *this;
75  }
76 
77  _CONSTEXPR_CONTAINER void swap(TTKUnsortedMap &_Right) noexcept
78  {
79  m_conatiner.swap(_Right.m_conatiner);
80  }
81 
82 public:
83  _CONSTEXPR_CONTAINER void clear() noexcept
84  {
85  m_conatiner.clear();
86  }
87 
89  {
90  return m_conatiner.empty();
91  }
92 
94  {
95  return m_conatiner.size();
96  }
97 
98  template <class _Iter = iterator, typename std::enable_if<!std::is_same<_Iter, const_iterator>::value, int>::type = 0>
100  {
101  return m_conatiner.erase(_Where);
102  }
103 
105  {
106  return m_conatiner.erase(_Where);
107  }
108 
110  {
111  return m_conatiner.erase(_First, _Last);
112  }
113 
114  _CONSTEXPR_CONTAINER size_type erase(const key_type &_Keyval) noexcept
115  {
116  const auto &iter = find(_Keyval);
117  if(iter == end())
118  {
119  return 0;
120  }
121 
122  erase(iter);
123  return 1;
124  }
125 
126 public:
128  {
129  return m_conatiner.begin();
130  }
131 
133  {
134  return m_conatiner.begin();
135  }
136 
138  {
139  return m_conatiner.end();
140  }
141 
143  {
144  return m_conatiner.end();
145  }
146 
148  {
149  return m_conatiner.rbegin();
150  }
151 
153  {
154  return m_conatiner.rbegin();
155  }
156 
158  {
159  return m_conatiner.rend();
160  }
161 
163  {
164  return m_conatiner.rend();
165  }
166 
168  {
169  return m_conatiner.cbegin();
170  }
171 
173  {
174  return m_conatiner.cend();
175  }
176 
178  {
179  return m_conatiner.crbegin();
180  }
181 
183  {
184  return m_conatiner.crend();
185  }
186 
187 public:
189  {
190  for(auto &&item : m_conatiner)
191  {
192  if(item.first == _Keyval)
193  {
194  return item.second;
195  }
196  }
197 
198  m_conatiner.emplace_back(std::move(std::make_pair(_Keyval, mapped_type())));
199  return m_conatiner.back().second;
200  }
201 
203  {
204  return const_cast<reference>(static_cast<const TTKUnsortedMap*>(this)->at(_Keyval));
205  }
206 
208  {
209  for(auto &&item : m_conatiner)
210  {
211  if(item.first == _Keyval)
212  {
213  return item.second;
214  }
215  }
216 
217  throw("invalid map<K, T> key");
218  return m_conatiner.end()->second;
219  }
220 
221  _CONSTEXPR_CONTAINER iterator find(const key_type &_Keyval) noexcept
222  {
223  for(auto itr = begin(); itr != end(); ++itr)
224  {
225  if(itr->first == _Keyval)
226  {
227  return itr;
228  }
229  }
230 
231  return end();
232  }
233 
234  _CONSTEXPR_CONTAINER const_iterator find(const key_type &_Keyval) const noexcept
235  {
236  for(auto itr = begin(); itr != end(); ++itr)
237  {
238  if(itr->first == _Keyval)
239  {
240  return itr;
241  }
242  }
243 
244  return end();
245  }
246 
247  _CONSTEXPR_CONTAINER size_type count(const key_type &_Keyval) const noexcept
248  {
249  return find(_Keyval) != end() ? 1 : 0;
250  }
251 
252 #if _HAS_CXX20
253  _CONSTEXPR_CONTAINER bool contains(const key_type &_Keyval) const noexcept
254  {
255  return find(_Keyval) != end();
256  }
257 #endif
258 
260  {
261  return find(_Keyval);
262  }
263 
265  {
266  return find(_Keyval);
267  }
268 
270  {
271  auto iter = find(_Keyval);
272  return iter != end() ? (++iter != end() ? iter : end()) : end();
273  }
274 
276  {
277  auto iter = find(_Keyval);
278  return iter != end() ? (++iter != end() ? iter : end()) : end();
279  }
280 
281  _CONSTEXPR_CONTAINER std::pair<iterator, iterator> equal_range(const key_type &_Keyval) noexcept
282  {
283  const auto &iter = find(_Keyval);
284  if(iter != end())
285  {
286  const auto &next = std::next(iter);
287  if(next != end())
288  {
289  return { iter, next };
290  }
291  else
292  {
293  return { iter, end() };
294  }
295  }
296 
297  return { end(), end() };
298  }
299 
300  _CONSTEXPR_CONTAINER std::pair<const_iterator, const_iterator> equal_range(const key_type &_Keyval) const noexcept
301  {
302  const auto &iter = find(_Keyval);
303  if(iter != end())
304  {
305  const auto &next = std::next(iter);
306  if(next != end())
307  {
308  return { iter, next };
309  }
310  else
311  {
312  return { iter, end() };
313  }
314  }
315 
316  return { end(), end() };
317  }
318 
319 public:
320  template <class... _Valtys>
321  _CONSTEXPR_CONTAINER std::pair<iterator, bool> emplace(_Valtys &&..._Vals)
322  {
323  _Container _container;
324  _container.emplace_back(std::forward<_Valtys>(_Vals)...);
325 
326  const auto &iter = find(_container.begin()->first);
327  if(iter != end())
328  {
329  return { iter, false };
330  }
331 
332  m_conatiner.emplace_back(std::move(_container.front()));
333  return { m_conatiner.end() - 1, true };
334  }
335 
336  template <class... _Valtys>
337  _CONSTEXPR_CONTAINER iterator emplace_hint(const_iterator _Where, _Valtys &&..._Vals) // insert value_type(_Val...) at _Where
338  {
339  _Container _container;
340  _container.emplace_back(std::forward<_Valtys>(_Vals)...);
341 
342  const auto &iter = find(_container.begin()->first);
343  if(iter != end())
344  {
345  return iter;
346  }
347 
348  return m_conatiner.emplace(_Where, std::move(_container.front()));
349  }
350 
351 public:
353  {
354  auto iter = find(_Val.first);
355  if(iter != end())
356  {
357  return iter;
358  }
359 
360  m_conatiner.emplace_back(_Val);
361  return m_conatiner.end() - 1;
362  }
363 
365  {
366  auto iter = find(_Val.first);
367  if(iter != end())
368  {
369  return iter;
370  }
371 
372  m_conatiner.emplace_back(std::move(_Val));
373  return m_conatiner.end() - 1;
374  }
375 
377  {
378  auto iter = find(_Val.first);
379  if(iter != end())
380  {
381  return iter;
382  }
383 
384  return m_conatiner.emplace(_Where, _Val);
385  }
386 
388  {
389  auto iter = find(_Val.first);
390  if(iter != end())
391  {
392  return iter;
393  }
394 
395  return m_conatiner.emplace(_Where, std::move(_Val));
396  }
397 
398  template <class _Iter>
399  _CONSTEXPR_CONTAINER void insert(_Iter _First, _Iter _Last)
400  {
401  _Adl_verify_range(_First, _Last);
402  auto _UFirst = _Get_unwrapped(_First);
403  const auto _ULast = _Get_unwrapped(_Last);
404 
405  for(; _UFirst != _ULast; ++_UFirst)
406  {
407  insert(*_UFirst);
408  }
409  }
410 
411  _CONSTEXPR_CONTAINER void insert(std::initializer_list<value_type> _Ilist)
412  {
413  insert(_Ilist.begin(), _Ilist.end());
414  }
415 
416 private:
418 
419 };
420 
421 
422 // compatiblity for std unsorted_map
423 namespace std
424 {
425 // Non-member functions [unsorted_map.nonmembers]
426 template <class _Key, class _Value>
428 {
429  left.swap(right);
430 }
431 
432 template <class _Key, class _Value>
434 }
435 
436 #endif // TTKUNSORTEDMAP_H
_CONSTEXPR_CONTAINER const_iterator find(const key_type &_Keyval) const noexcept
std::pair< key_type, _Value > value_type
_CONSTEXPR_CONTAINER TTKUnsortedMap(TTKUnsortedMap &&_Right) noexcept
_CONSTEXPR_CONTAINER iterator end() noexcept
_CONSTEXPR_CONTAINER size_type size() const noexcept
_CONSTEXPR_CONTAINER void clear() noexcept
typename _Container::reverse_iterator reverse_iterator
_CONSTEXPR_CONTAINER const_reference at(const key_type &_Keyval) const
typename _Container::size_type size_type
std::vector< value_type > _Container
_CONSTEXPR_CONTAINER iterator insert(const_iterator _Where, value_type &&_Val)
_CONSTEXPR_CONTAINER iterator begin() noexcept
_CONSTEXPR_CONTAINER std::pair< iterator, bool > emplace(_Valtys &&..._Vals)
_CONSTEXPR_CONTAINER iterator upper_bound(const key_type &_Keyval) noexcept
Definition: ttkcompat.h:39
void swap(TTKAny &left, TTKAny &right) noexcept
Definition: ttkany.h:212
_CONSTEXPR_CONTAINER iterator erase(iterator _Where) noexcept
_CONSTEXPR_CONTAINER const_iterator cend() const noexcept
_CONSTEXPR_CONTAINER reverse_iterator rbegin() noexcept
_CONSTEXPR_CONTAINER const_reverse_iterator crend() const noexcept
_CONSTEXPR_CONTAINER TTKUnsortedMap & operator=(const TTKUnsortedMap &_Right) noexcept
_CONSTEXPR_CONTAINER const_reverse_iterator rbegin() const noexcept
_CONSTEXPR_CONTAINER void swap(TTKUnsortedMap &_Right) noexcept
_CONSTEXPR_CONTAINER iterator emplace_hint(const_iterator _Where, _Valtys &&..._Vals)
_CONSTEXPR_CONTAINER const_reverse_iterator crbegin() const noexcept
The class of the ttk unsorted map module.
typename _Container::const_iterator const_iterator
_CONSTEXPR_CONTAINER iterator erase(const_iterator _First, const_iterator _Last) noexcept
typename _Container::const_reverse_iterator const_reverse_iterator
_CONSTEXPR_CONTAINER size_type count(const key_type &_Keyval) const noexcept
_CONSTEXPR_CONTAINER TTKUnsortedMap(const TTKUnsortedMap &_Right) noexcept
_CONSTEXPR_CONTAINER reference at(const key_type &_Keyval)
_CONSTEXPR_CONTAINER const_iterator lower_bound(const key_type &_Keyval) const noexcept
_CONSTEXPR_CONTAINER const_iterator upper_bound(const key_type &_Keyval) const noexcept
_CONSTEXPR_CONTAINER bool empty() const noexcept
_CONSTEXPR_CONTAINER const_reverse_iterator rend() const noexcept
_Container m_conatiner
_Value & reference
_CONSTEXPR_CONTAINER const_iterator cbegin() const noexcept
_CONSTEXPR_CONTAINER iterator erase(const_iterator _Where) noexcept
_CONSTEXPR_CONTAINER iterator find(const key_type &_Keyval) noexcept
_CONSTEXPR_CONTAINER reference operator[](const key_type &_Keyval)
_CONSTEXPR_CONTAINER iterator insert(value_type &&_Val)
const _Value & const_reference
_CONSTEXPR_CONTAINER iterator lower_bound(const key_type &_Keyval) noexcept
_CONSTEXPR_CONTAINER TTKUnsortedMap() noexcept
typename _Container::iterator iterator
_CONSTEXPR_CONTAINER std::pair< const_iterator, const_iterator > equal_range(const key_type &_Keyval) const noexcept
_CONSTEXPR_CONTAINER size_type erase(const key_type &_Keyval) noexcept
#define _CONSTEXPR_CONTAINER
_CONSTEXPR_CONTAINER reverse_iterator rend() noexcept
_CONSTEXPR_CONTAINER const_iterator end() const noexcept
_CONSTEXPR_CONTAINER iterator insert(const value_type &_Val)
_CONSTEXPR_CONTAINER TTKUnsortedMap & operator=(TTKUnsortedMap &&_Right) noexcept
#define const
Definition: zconf.h:233
_CONSTEXPR_CONTAINER void insert(std::initializer_list< value_type > _Ilist)
_CONSTEXPR_CONTAINER void insert(_Iter _First, _Iter _Last)
_CONSTEXPR_CONTAINER std::pair< iterator, iterator > equal_range(const key_type &_Keyval) noexcept
_CONSTEXPR_CONTAINER TTKUnsortedMap(_Iter _First, _Iter _Last) noexcept
_CONSTEXPR_CONTAINER const_iterator begin() const noexcept
_CONSTEXPR_CONTAINER iterator insert(const_iterator _Where, const value_type &_Val)