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>
56 template <
typename FastListInputIterator>
57 void insert (FastListConstIterator position, FastListInputIterator first,
const FastListInputIterator last);
65 void push_back(
const T& el,
bool unique=
false,
const std::string& objectName=
"element");
75 FastListConstIterator
erase (
const FastListConstIterator position);
76 FastListConstIterator
erase (
const FastListConstIterator first,
const FastListConstIterator last);
83 FastListConstIterator
begin()
const;
84 FastListConstIterator
end()
const;
91 std::map<std::string, T>
getMap()
const;
96 FastListConstIterator
find(std::string name,
unsigned int count=1)
const;
101 FastMapConstIteratorPair
equal_range(std::string name)
const;
111 std::multimap<std::string, FastListIterator>
itsMap;
115 template <
typename T>
116 template <
typename FastListInputIterator>
121 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
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) {
134 template <
typename T>
136 FastMapIteratorPair itPair = equal_range(name);
137 if (itPair.first==itPair.second) {
138 std::cerr<<
"current list doesn't contain element "<< name << std::endl;
142 std::vector<FastListIterator> listIterators;
143 for (FastMapIterator it = itPair.first; it != itPair.second; ++it)
146 listIterators.push_back(listIt);
149 itsMap.insert(std::pair<std::string,FastListIterator>(val.name,it));
153 template <
typename T>
156 if (unique && itsMap.find(el.name) != itsMap.end()) {
157 std::cout <<
"ERROR: " << className <<
" with name \"" << el.name <<
"\" already defined." << std::endl;
162 itsMap.insert(std::pair<std::string,FastListIterator>(el.name,it));
165 template <
typename T>
167 return itsList.size();
170 template <
typename T>
176 template <
typename T>
179 for(;it!=end();++it) {
185 template <
typename T>
186 typename FastList<T>::FastListConstIterator
FastList<T>::erase(
const FastList<T>::FastListConstIterator it) {
189 std::string name = (*it).name;
190 if (itsMap.count(name) == 1) {
194 FastMapIteratorPair ret = itsMap.equal_range(name);
195 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit) {
196 if ((*emit).second == it)
203 return itsList.erase(it);
206 template <
typename T>
207 typename FastList<T>::FastListConstIterator
FastList<T>::erase(
const FastListConstIterator first,
const FastListConstIterator last) {
208 FastListConstIterator it=first;
216 template <
typename T>
218 return itsList.begin();
221 template <
typename T>
223 return itsList.end();
226 template <
typename T>
228 return itsList.begin();
231 template <
typename T>
233 return itsList.end();
236 template <
typename T>
238 return itsMap.equal_range(name);
241 template <
typename T>
243 return itsMap.equal_range(name);
246 template <
typename T>
249 std::map<std::string, T> result;
250 for (
auto kv: itsMap)
251 {result[kv.first] = *(kv.second);}
255 template <
typename T>
256 typename FastList<T>::FastListConstIterator
FastList<T>::find(std::string name,
unsigned int count)
const {
258 FastMapConstIterator emit = itsMap.find(name);
259 if (emit==itsMap.end())
return itsList.end();
260 return (*emit).second;
263 FastMapConstIteratorPair ret = itsMap.equal_range(name);
265 for (FastMapConstIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
267 return (*emit).second;
270 return itsList.end();
274 template <
typename T>
277 FastMapIterator emit = itsMap.find(name);
278 if (emit==itsMap.end())
return itsList.end();
284 FastMapIteratorPair ret = itsMap.equal_range(name);
286 for (FastMapIterator emit = ret.first; emit!=ret.second; ++emit, i++) {
293 return itsList.end();
297 template <
typename T>
299 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.