Atoms Crowd  7.0.0
Map.impl.h
1 #pragma once
2 
3 namespace ToolchefsSTL
4 {
5  template<typename T, typename K>
6  Map<T,K>::Map(Allocator* allocator) noexcept:
7  m_data(allocator)
8  {
9 
10  }
11 
12  template<typename T, typename K>
13  Map<T, K>::~Map() noexcept
14  {
15  clear();
16  }
17 
18  template<typename T, typename K>
19  Map<T, K>::Map(const Map& rhs) noexcept :
20  m_data(rhs.m_data)
21  {
22 
23  }
24 
25  template<typename T, typename K>
26  Map<T, K>& Map<T, K>::operator=(const Map& rhs) noexcept
27  {
28  m_data = rhs.m_data;
29  return *this;
30  }
31 
32  template<typename T, typename K>
33  Map<T, K>::Map(Map&& rhs) noexcept :
34  m_data(std::move(rhs.m_data))
35  {
36  }
37 
38  template<typename T, typename K>
39  Map<T, K>& Map<T, K>::operator=(Map&& rhs) noexcept
40  {
41  m_data = std::move(rhs.m_data);
42  return *this;
43  }
44 
45  template<typename T, typename K>
46  bool Map<T, K>::operator==(const Map& rhs) const noexcept
47  {
48  if (rhs.m_data.length() != m_data.length()) return false;
49  for (size_t i = 0; i < m_data.length(); ++i)
50  {
51  auto& item = m_data[i];
52  auto& rhs_item = rhs.m_data[i];
53  if (item.first != rhs_item.first || item.second != rhs_item.second) return false;
54  }
55  return true;
56  }
57 
58  template<typename T, typename K>
59  void Map<T, K>::clear() noexcept
60  {
61  m_data.clear();
62  }
63 
64  template<typename T, typename K>
65  size_t Map<T, K>::size() const noexcept
66  {
67  return m_data.length();
68  }
69 
70  template<typename T, typename K>
71  size_t Map<T, K>::length() const noexcept
72  {
73  return m_data.length();
74  }
75 
76  template<typename T, typename K>
77  size_t Map<T, K>::capacity() const noexcept
78  {
79  return m_data.capacity();
80  }
81 
82  template<typename T, typename K>
83  void Map<T, K>::reserve(size_t new_capacity) noexcept
84  {
85  return m_data.reserve(new_capacity);
86  }
87 
88  template<typename T, typename K>
89  typename Map<T, K >::iterator Map<T, K>::find(const T& key) noexcept
90  {
91  auto end_it = end();
92  for (auto it = begin(); it != end_it; ++it)
93  {
94  if (it->first == key) return it;
95  }
96  return end_it;
97  }
98 
99  template<typename T, typename K>
100  typename Map<T, K >::const_iterator Map<T, K>::find(const T& key) const noexcept
101  {
102  auto end_it = cend();
103  for (auto it = cbegin(); it != end_it; ++it)
104  {
105  if (it->first == key) return it;
106  }
107  return end_it;
108  }
109 
110  template<typename T, typename K>
111  constexpr K& Map<T, K>::operator[](const T& key) noexcept
112  {
113  auto it = find(key);
114  if (it != end())
115  return it->second;
116 
117  m_data.emplace_back(key, K());
118  return m_data.back().second;
119  }
120 
121  template<typename T, typename K>
122  constexpr K& Map<T, K>::operator[](T&& key) noexcept
123  {
124  auto it = find(key);
125  if (it != end())
126  return it->second;
127 
128  m_data.emplace_back(key, K());
129  return m_data.back().second;
130  }
131 
132  template<typename T, typename K>
133  typename Map<T, K>::iterator Map<T, K>::emplace(T&& key, K&& value) noexcept
134  {
135  auto it = find(key);
136  if (it != end())
137  return it;
138  m_data.emplace_back(key, value);
139  return m_data.begin() + (m_data.length() - 1);
140  }
141 
142  template<typename T, typename K>
143  typename Map<T, K>::iterator Map<T, K>::emplace(const T& key, const K& value) noexcept
144  {
145  auto it = find(key);
146  if (it != end())
147  return it;
148  m_data.emplace_back(key, value);
149  return m_data.begin() + (m_data.length() - 1);
150  }
151 
152  template<typename T, typename K>
153  typename Map<T, K>::iterator Map<T, K>::begin() noexcept
154  {
155  return m_data.begin();
156  }
157 
158  template<typename T, typename K>
159  typename Map<T, K>::iterator Map<T, K>::end() noexcept
160  {
161  return m_data.end();
162  }
163 
164  template<typename T, typename K>
165  typename Map<T, K>::const_iterator Map<T, K>::cbegin() const noexcept
166  {
167  return m_data.cbegin();
168  }
169 
170  template<typename T, typename K>
171  typename Map<T, K>::const_iterator Map<T, K>::cend() const noexcept
172  {
173  return m_data.cend();
174  }
175 
176  template<typename T, typename K>
177  typename Map<T, K>::reverse_iterator Map<T, K>::rbegin() noexcept
178  {
179  return reverse_iterator(&m_data.back());
180  }
181 
182  template<typename T, typename K>
183  typename Map<T, K>::reverse_iterator Map<T, K>::rend() noexcept
184  {
185  Entry* front_ptr = &m_data.front();
186  return reverse_iterator(--front_ptr);
187  }
188 
189  template<typename T, typename K>
190  typename Map<T, K>::const_reverse_iterator Map<T, K>::crbegin() const noexcept
191  {
192  return const_reverse_iterator(&m_data.back());
193  }
194 
195  template<typename T, typename K>
196  typename Map<T, K>::const_reverse_iterator Map<T, K>::crend() const noexcept
197  {
198  Entry* front_ptr = const_cast<Entry*>(&m_data.front());
199  return const_reverse_iterator(--front_ptr);
200  }
201 
202  template<typename T, typename K>
203  typename Map<T, K>::iterator Map<T, K>::erase(iterator it) noexcept
204  {
205  if (it == end()) return it;
206  auto index = it - begin();
207  m_data.erase(index);
208  return begin() + index;
209  }
210 
211  template<typename T, typename K>
212  void Map<T, K>::erase(const T& key) noexcept
213  {
214  auto it = find(key);
215  if (it != end())
216  erase(it);
217  }
218 
219 
220 }
Definition: Map.h:10
iterator begin() noexcept
Iterators.
Definition: Map.impl.h:153