BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
fastlist.h
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2024.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#ifndef FASTLIST_H
20#define FASTLIST_H
21
22#include <cstdlib>
23#include <iostream>
24#include <list>
25#include <map>
26#include <string>
27#include <vector>
28
29namespace GMAD
30{
41 template<typename T>
42 class FastList {
43
44 public:
46 using FastListIterator = typename std::list<T>::iterator;
47 using FastListConstIterator = typename std::list<T>::const_iterator;
48 using FastMapIterator = typename std::multimap<std::string, FastListIterator>::iterator;
49 using FastMapConstIterator = typename std::multimap<std::string, FastListIterator>::const_iterator;
50 using FastMapIteratorPair = std::pair<FastMapIterator,FastMapIterator>;
51 using FastMapConstIteratorPair = std::pair<FastMapConstIterator,FastMapConstIterator>;
55 template <typename FastListInputIterator>
56 FastListIterator insert(FastListInputIterator position, const T& val);
57 template <typename FastListInputIterator>
58 void insert (FastListConstIterator position, FastListInputIterator first, const FastListInputIterator last);
62 void insert_before(const std::string& name, const T& val);
63
66 void push_back(const T& el, bool unique=false, const std::string& objectName="element");
67
68 inline bool empty() const {return itsList.empty();}
69
71 int size()const;
73 void clear();
75 void erase();
76 FastListConstIterator erase (const FastListConstIterator position);
77 FastListConstIterator erase (const FastListConstIterator first, const FastListConstIterator last);
84 FastListConstIterator begin()const;
85 FastListConstIterator end()const;
87
89 std::vector<T> getVector() const {return std::vector<T>(begin(), end());}
90
92 std::map<std::string, T> getMap() const;
93
97 FastListConstIterator find(std::string name,unsigned int count=1)const;
98 FastListIterator find(std::string name,unsigned int count=1);
101 FastMapIteratorPair equal_range(std::string name);
102 FastMapConstIteratorPair equal_range(std::string name)const;
103
105 void print(int ident=0)const;
106
107 private:
110 typename std::list<T> itsList;
112 std::multimap<std::string, FastListIterator> itsMap;
113 };
114
116 template <typename T>
117 template <typename FastListInputIterator>
118 typename FastList<T>::FastListIterator FastList<T>::insert(FastListInputIterator position, const T& val) {
119 // insert in list
120 FastListIterator it = itsList.insert(position,val);
121 // insert iterator in map with key name
122 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
123 return it;
124 }
125
126 template <typename T>
127 template <typename FastListInputIterator>
128 void FastList<T>::insert(FastListConstIterator position, FastListInputIterator first, const FastListInputIterator last) {
129 for (;first!=last; ++first) {
130 // insert one by one before position
131 FastList<T>::insert(position,*first);
132 }
133 }
134
135 template <typename T>
136 void FastList<T>::insert_before(const std::string& name, const T& val) {
137 FastMapIteratorPair itPair = equal_range(name);
138 if (itPair.first==itPair.second) {
139 std::cerr<<"current list doesn't contain element "<< name << std::endl;
140 exit(1);
141 }
142 // first insert into list and only then into map, otherwise map iterators are invalidated(!)
143 std::vector<FastListIterator> listIterators;
144 for (FastMapIterator it = itPair.first; it != itPair.second; ++it)
145 {
146 FastListIterator listIt = itsList.insert(it->second,val);
147 listIterators.push_back(listIt);
148 }
149 for (FastListIterator it : listIterators) {
150 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
151 }
152 }
153
154 template <typename T>
155 void FastList<T>::push_back(const T& el, bool unique, const std::string& className) {
156 // better to search in map (faster)
157 if (unique && itsMap.find(el.name) != itsMap.end()) {
158 std::cout << "ERROR: " << className << " with name \"" << el.name << "\" already defined." << std::endl;
159 exit(1);
160 }
161 // insert at back of list (insert() instead of push_back() to get iterator for map):
162 FastListIterator it = itsList.insert(end(),el);
163 itsMap.insert(std::pair<std::string,FastListIterator>(el.name,it));
164 }
165
166 template <typename T>
167 int FastList<T>::size()const {
168 return itsList.size();
169 }
170
171 template <typename T>
173 itsList.clear();
174 itsMap.clear();
175 }
176
177 template <typename T>
179 FastListIterator it = begin();
180 for(;it!=end();++it) {
181 delete (*it).lst;
182 }
183 clear();
184 }
185
186 template <typename T>
187 typename FastList<T>::FastListConstIterator FastList<T>::erase(const FastList<T>::FastListConstIterator it) {
188
189 // find entry in map to erase:
190 std::string name = (*it).name;
191 if (itsMap.count(name) == 1) {
192 itsMap.erase(name);
193 }
194 else { // more than one entry with same name
195 FastMapIteratorPair ret = itsMap.equal_range(name);
196 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit) {
197 if ((*emit).second == it) // valid comparison? if not, how to find correct element?
198 {
199 itsMap.erase(emit);
200 break;
201 }
202 }
203 }
204 return itsList.erase(it);
205 }
206
207 template <typename T>
208 typename FastList<T>::FastListConstIterator FastList<T>::erase(const FastListConstIterator first, const FastListConstIterator last) {
209 FastListConstIterator it=first;
210 while (it!=last) {
211 // erase one by one
212 it = erase(it);
213 }
214 return it;
215 }
216
217 template <typename T>
219 return itsList.begin();
220 }
221
222 template <typename T>
224 return itsList.end();
225 }
226
227 template <typename T>
228 typename FastList<T>::FastListConstIterator FastList<T>::begin()const {
229 return itsList.begin();
230 }
231
232 template <typename T>
233 typename FastList<T>::FastListConstIterator FastList<T>::end()const {
234 return itsList.end();
235 }
236
237 template <typename T>
238 typename FastList<T>::FastMapIteratorPair FastList<T>::equal_range(std::string name) {
239 return itsMap.equal_range(name);
240 }
241
242 template <typename T>
243 typename FastList<T>::FastMapConstIteratorPair FastList<T>::equal_range(std::string name) const {
244 return itsMap.equal_range(name);
245 }
246
247 template <typename T>
248 std::map<std::string, T> FastList<T>::getMap() const
249 {
250 std::map<std::string, T> result;
251 for (auto kv: itsMap)
252 {result[kv.first] = *(kv.second);}
253 return result;
254 }
255
256 template <typename T>
257 typename FastList<T>::FastListConstIterator FastList<T>::find(std::string name,unsigned int count)const {
258 if (count==1) {
259 FastMapConstIterator emit = itsMap.find(name);
260 if (emit==itsMap.end()) return itsList.end();
261 return (*emit).second;
262 } else {
263 // if count > 1
264 FastMapConstIteratorPair ret = itsMap.equal_range(name);
265 unsigned int i=1;
266 for (FastMapConstIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
267 if (i==count) {
268 return (*emit).second;
269 }
270 }
271 return itsList.end();
272 }
273 }
274
275 template <typename T>
276 typename FastList<T>::FastListIterator FastList<T>::find(std::string name,unsigned int count) {
277 if (count==1) {
278 FastMapIterator emit = itsMap.find(name);
279 if (emit==itsMap.end()) return itsList.end();
280 // remove constness trick, call erase with empty range
281 FastListIterator it = itsList.erase((*emit).second, (*emit).second);
282 return it;
283 } else {
284 // if count > 1
285 FastMapIteratorPair ret = itsMap.equal_range(name);
286 unsigned int i=1;
287 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
288 if (i==count) {
289 // remove constness trick, call erase with empty range
290 FastListIterator it = itsList.erase((*emit).second, (*emit).second);
291 return it;
292 }
293 }
294 return itsList.end();
295 }
296 }
297
298 template <typename T>
299 void FastList<T>::print(int ident)const {
300 for(FastListConstIterator it=begin();it!=end();++it)
301 {
302 (*it).print(ident);
303 }
304 }
305}
306
307#endif
List with Efficient Lookup.
Definition fastlist.h:42
FastListIterator begin()
Definition fastlist.h:218
FastListConstIterator end() const
Definition fastlist.h:233
FastListIterator find(std::string name, unsigned int count=1)
Definition fastlist.h:276
std::vector< T > getVector() const
Get a vector version of this list.
Definition fastlist.h:89
void print(int ident=0) const
print method
Definition fastlist.h:299
FastListIterator insert(FastListInputIterator position, const T &val)
template definitions need to be in header
Definition fastlist.h:118
FastMapIteratorPair equal_range(std::string name)
Definition fastlist.h:238
void insert(FastListConstIterator position, FastListInputIterator first, const FastListInputIterator last)
template definitions need to be in header
Definition fastlist.h:128
FastListIterator end()
Definition fastlist.h:223
FastListConstIterator erase(const FastListConstIterator position)
erase elements
FastListConstIterator erase(const FastListConstIterator first, const FastListConstIterator last)
erase elements
Definition fastlist.h:208
std::map< std::string, T > getMap() const
Get a map of name to object of this list.
Definition fastlist.h:248
void insert_before(const std::string &name, const T &val)
Definition fastlist.h:136
typename std::list< T >::iterator FastListIterator
for ease of reading
Definition fastlist.h:46
FastListConstIterator begin() const
Definition fastlist.h:228
void clear()
empty lists
Definition fastlist.h:172
void erase()
erase elements
Definition fastlist.h:178
void push_back(const T &el, bool unique=false, const std::string &objectName="element")
Definition fastlist.h:155
std::list< T > itsList
Definition fastlist.h:110
bool empty() const
Whether the list is empty.
Definition fastlist.h:68
FastListConstIterator find(std::string name, unsigned int count=1) const
Definition fastlist.h:257
std::multimap< std::string, FastListIterator > itsMap
multimap for name lookup
Definition fastlist.h:112
int size() const
size of list
Definition fastlist.h:167
Parser namespace for GMAD language. Combination of Geant4 and MAD.