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>
57 template <
typename FastListInputIterator>
58 void insert (FastListConstIterator position, FastListInputIterator first,
const FastListInputIterator last);
66 void push_back(
const T& el,
bool unique=
false,
const std::string& objectName=
"element");
76 FastListConstIterator
erase (
const FastListConstIterator position);
77 FastListConstIterator
erase (
const FastListConstIterator first,
const FastListConstIterator last);
84 FastListConstIterator
begin()
const;
85 FastListConstIterator
end()
const;
92 std::map<std::string, T>
getMap()
const;
97 FastListConstIterator
find(std::string name,
unsigned int count=1)
const;
102 FastMapConstIteratorPair
equal_range(std::string name)
const;
112 std::multimap<std::string, FastListIterator>
itsMap;
116 template <
typename T>
117 template <
typename FastListInputIterator>
122 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
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) {
135 template <
typename T>
137 FastMapIteratorPair itPair = equal_range(name);
138 if (itPair.first==itPair.second) {
139 std::cerr<<
"current list doesn't contain element "<< name << std::endl;
143 std::vector<FastListIterator> listIterators;
144 for (FastMapIterator it = itPair.first; it != itPair.second; ++it)
147 listIterators.push_back(listIt);
150 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
154 template <
typename T>
157 if (unique && itsMap.find(el.name) != itsMap.end()) {
158 std::cout <<
"ERROR: " << className <<
" with name \"" << el.name <<
"\" already defined." << std::endl;
163 itsMap.insert(std::pair<std::string,FastListIterator>(el.name,it));
166 template <
typename T>
168 return itsList.size();
171 template <
typename T>
177 template <
typename T>
180 for(;it!=end();++it) {
186 template <
typename T>
187 typename FastList<T>::FastListConstIterator
FastList<T>::erase(
const FastList<T>::FastListConstIterator it) {
190 std::string name = (*it).name;
191 if (itsMap.count(name) == 1) {
195 FastMapIteratorPair ret = itsMap.equal_range(name);
196 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit) {
197 if ((*emit).second == it)
204 return itsList.erase(it);
207 template <
typename T>
208 typename FastList<T>::FastListConstIterator
FastList<T>::erase(
const FastListConstIterator first,
const FastListConstIterator last) {
209 FastListConstIterator it=first;
217 template <
typename T>
219 return itsList.begin();
222 template <
typename T>
224 return itsList.end();
227 template <
typename T>
229 return itsList.begin();
232 template <
typename T>
234 return itsList.end();
237 template <
typename T>
239 return itsMap.equal_range(name);
242 template <
typename T>
244 return itsMap.equal_range(name);
247 template <
typename T>
250 std::map<std::string, T> result;
251 for (
auto kv: itsMap)
252 {result[kv.first] = *(kv.second);}
256 template <
typename T>
257 typename FastList<T>::FastListConstIterator
FastList<T>::find(std::string name,
unsigned int count)
const {
259 FastMapConstIterator emit = itsMap.find(name);
260 if (emit==itsMap.end())
return itsList.end();
261 return (*emit).second;
264 FastMapConstIteratorPair ret = itsMap.equal_range(name);
266 for (FastMapConstIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
268 return (*emit).second;
271 return itsList.end();
275 template <
typename T>
278 FastMapIterator emit = itsMap.find(name);
279 if (emit==itsMap.end())
return itsList.end();
285 FastMapIteratorPair ret = itsMap.equal_range(name);
287 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
294 return itsList.end();
298 template <
typename T>
300 for(FastListConstIterator it=begin();it!=end();++it)
List with Efficient Lookup.
FastListConstIterator end() const
FastListIterator find(std::string name, unsigned int count=1)
std::vector< T > getVector() const
Get a vector version of this list.
void print(int ident=0) const
print method
FastListIterator insert(FastListInputIterator position, const T &val)
template definitions need to be in header
FastMapIteratorPair equal_range(std::string name)
void insert(FastListConstIterator position, FastListInputIterator first, const FastListInputIterator last)
template definitions need to be in header
FastListConstIterator erase(const FastListConstIterator position)
erase elements
FastListConstIterator erase(const FastListConstIterator first, const FastListConstIterator last)
erase elements
std::map< std::string, T > getMap() const
Get a map of name to object of this list.
void insert_before(const std::string &name, const T &val)
typename std::list< T >::iterator FastListIterator
for ease of reading
FastListConstIterator begin() const
void erase()
erase elements
void push_back(const T &el, bool unique=false, const std::string &objectName="element")
bool empty() const
Whether the list is empty.
FastListConstIterator find(std::string name, unsigned int count=1) const
std::multimap< std::string, FastListIterator > itsMap
multimap for name lookup
int size() const
size of list
Parser namespace for GMAD language. Combination of Geant4 and MAD.