| 151 .arg(toDouble(vec.x)) |
151 .arg(toDouble(vec.x)) |
| 152 .arg(toDouble(vec.y)) |
152 .arg(toDouble(vec.y)) |
| 153 .arg(toDouble(vec.z)) |
153 .arg(toDouble(vec.z)) |
| 154 .arg(toDouble(vec.w)); |
154 .arg(toDouble(vec.w)); |
| 155 } |
155 } |
| |
156 |
| |
157 template<typename K, typename V> |
| |
158 struct KeyValuePair |
| |
159 { |
| |
160 K key; |
| |
161 V value; |
| |
162 }; |
| |
163 |
| |
164 template<typename K, typename V, typename IteratorType> |
| |
165 struct MapItemsIterator : IteratorType |
| |
166 { |
| |
167 template<typename... Ts> |
| |
168 MapItemsIterator(Ts&&... args) : IteratorType{args...} {} |
| |
169 auto operator*() const |
| |
170 { |
| |
171 return KeyValuePair<K, V>{this->key(), this->value()}; |
| |
172 } |
| |
173 }; |
| |
174 |
| |
175 template<typename K, typename V, typename MapType, typename IteratorType> |
| |
176 struct MapItems |
| |
177 { |
| |
178 MapType& map; |
| |
179 IteratorType begin() |
| |
180 { |
| |
181 return IteratorType(this->map.begin()); |
| |
182 } |
| |
183 |
| |
184 IteratorType end() |
| |
185 { |
| |
186 return IteratorType(this->map.end()); |
| |
187 } |
| |
188 }; |
| |
189 |
| |
190 /* |
| |
191 * Python's dict.items for QMap: use in a for loop to iterate a map to |
| |
192 * get both keys and values. Iteration yields KeyValuePairs. |
| |
193 */ |
| |
194 template<typename K, typename V> |
| |
195 auto items(const QMap<K, V>& map) |
| |
196 { |
| |
197 return MapItems< |
| |
198 const K&, |
| |
199 const V&, |
| |
200 const QMap<K, V>, |
| |
201 MapItemsIterator<K, const V, typename QMap<K, V>::const_iterator> |
| |
202 >{map}; |
| |
203 } |
| |
204 |
| |
205 template<typename K, typename V> |
| |
206 auto items(QMap<K, V>& map) |
| |
207 { |
| |
208 return MapItems< |
| |
209 const K&, |
| |
210 V&, |
| |
211 QMap<K, V>, |
| |
212 MapItemsIterator<K, const V, typename QMap<K, V>::iterator> |
| |
213 >{map}; |
| |
214 } |