LMDBAL 0.6.2
LMDB (Lightning Memory-Mapped Database Manager) Abstraction Layer
Loading...
Searching...
No Matches
operators.hpp
1/*
2 * LMDB Abstraction Layer.
3 * Copyright (C) 2023 Yury Gubich <blue@macaw.me>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#pragma once
20
21#include <map>
22#include <set>
23#include <vector>
24#include <list>
25#include <deque>
26
27#include <QDataStream>
28
29#include "base.h"
30
31template <class K, class V>
32QDataStream& operator << (QDataStream &out, const std::map<K, V>& container) {
33 size_t size = container.size();
34 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
35 throw std::runtime_error("Too many elements in the map");
36
37 out << static_cast<LMDBAL::SizeType>(size);
38 for (const std::pair<const K, V>& pair : container)
39 out << pair;
40
41 return out;
42}
43
44template <class K, class V>
45QDataStream& operator >> (QDataStream &in, std::map<K, V>& container) {
47 in >> size;
48 for (LMDBAL::SizeType i = 0; i < size; ++i) {
49 std::pair<K, V> pair;
50 in >> pair;
51 container.insert(pair);
52 }
53
54 return in;
55}
56
57template <class K, class V>
58QDataStream& operator << (QDataStream &out, const std::multimap<K, V>& container) {
59 size_t size = container.size();
60 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
61 throw std::runtime_error("Too many elements in the multimap");
62
63 out << static_cast<LMDBAL::SizeType>(size);
64 for (const std::pair<const K, V>& pair : container)
65 out << pair;
66
67 return out;
68}
69
70template <class K, class V>
71QDataStream& operator >> (QDataStream &in, std::multimap<K, V>& container) {
73 in >> size;
74 for (LMDBAL::SizeType i = 0; i < size; ++i) {
75 std::pair<K, V> pair;
76 in >> pair;
77 container.insert(pair);
78 }
79
80 return in;
81}
82
83#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
84template <class K, class V>
85QDataStream& operator << (QDataStream &out, const std::pair<K, V>& pair) {
86 out << pair.first;
87 out << pair.second;
88
89 return out;
90}
91
92template <class K, class V>
93QDataStream& operator >> (QDataStream &in, std::pair<K, V>& container) {
94 in >> container.first;
95 in >> container.second;
96
97 return in;
98}
99#endif
100
101template <class K>
102QDataStream& operator << (QDataStream &out, const std::set<K>& container) {
103 size_t size = container.size();
104 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
105 throw std::runtime_error("Too many elements in the set");
106
107 out << static_cast<LMDBAL::SizeType>(size);
108 for (const K& value : container)
109 out << value;
110
111 return out;
112}
113
114template <class K>
115QDataStream& operator >> (QDataStream &in, std::set<K>& container) {
116 LMDBAL::SizeType size;
117 in >> size;
118 for (LMDBAL::SizeType i = 0; i < size; ++i) {
119 K value;
120 in >> value;
121 container.insert(value);
122 }
123
124 return in;
125}
126
127template <class K>
128QDataStream& operator << (QDataStream &out, const std::multiset<K>& container) {
129 size_t size = container.size();
130 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
131 throw std::runtime_error("Too many elements in the multiset");
132
133 out << static_cast<LMDBAL::SizeType>(size);
134 for (const K& value : container)
135 out << value;
136
137 return out;
138}
139
140template <class K>
141QDataStream& operator >> (QDataStream &in, std::multiset<K>& container) {
142 LMDBAL::SizeType size;
143 in >> size;
144 for (LMDBAL::SizeType i = 0; i < size; ++i) {
145 K value;
146 in >> value;
147 container.insert(value);
148 }
149
150 return in;
151}
152
153template <class K>
154QDataStream& operator << (QDataStream &out, const std::vector<K>& container) {
155 size_t size = container.size();
156 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
157 throw std::runtime_error("Too many elements in the vector");
158
159 out << static_cast<LMDBAL::SizeType>(size);
160 for (const K& value : container)
161 out << value;
162
163 return out;
164}
165
166template <class K>
167QDataStream& operator >> (QDataStream &in, std::vector<K>& container) {
168 LMDBAL::SizeType size;
169 in >> size;
170 container.resize(size);
171 for (LMDBAL::SizeType i = 0; i < size; ++i)
172 in >> container[i];
173
174 return in;
175}
176
177template <class K>
178QDataStream& operator << (QDataStream &out, const std::deque<K>& container) {
179 size_t size = container.size();
180 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
181 throw std::runtime_error("Too many elements in the deque");
182
183 out << static_cast<LMDBAL::SizeType>(size);
184 for (const K& value : container)
185 out << value;
186
187 return out;
188}
189
190template <class K>
191QDataStream& operator >> (QDataStream &in, std::deque<K>& container) {
192 LMDBAL::SizeType size;
193 in >> size;
194 container.resize(size);
195 for (LMDBAL::SizeType i = 0; i < size; ++i)
196 in >> container[i];
197
198 return in;
199}
200
201template <class K>
202QDataStream& operator << (QDataStream &out, const std::list<K>& container) {
203 size_t size = container.size();
204 if (size > std::numeric_limits<LMDBAL::SizeType>::max())
205 throw std::runtime_error("Too many elements in the list");
206
207 out << static_cast<LMDBAL::SizeType>(size);
208 for (const K& value : container)
209 out << value;
210
211 return out;
212}
213
214template <class K>
215QDataStream& operator >> (QDataStream &in, std::list<K>& container) {
216 LMDBAL::SizeType size;
217 in >> size;
218 for (LMDBAL::SizeType i = 0; i < size; ++i) {
219 typename std::list<K>::iterator itr = container.emplace(container.end());
220 in >> *itr;
221 }
222
223 return in;
224}
uint32_t SizeType
All LMDBAL sizes are uint32.
Definition base.h:53