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