Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/vpair is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_vpair
0005 #define tools_vpair
0006 
0007 #include <vector>
0008 
0009 namespace tools {
0010 
0011 template <class K,class V>
0012 inline void add(std::vector< std::pair<K,V> >& a_vec,const K& a_key,const V& a_value) {
0013   typedef typename std::vector< std::pair<K,V> >::iterator it_t;
0014   it_t it;
0015   for(it=a_vec.begin();it!=a_vec.end();++it) {
0016     if((*it).first==a_key) {
0017       (*it).second = a_value; //override.
0018       return;
0019     }
0020   }
0021   //not found, add a new pair :
0022   a_vec.push_back(std::pair<K,V>(a_key,a_value));
0023 }
0024 
0025 template <class K,class V>
0026 inline bool find(const std::vector< std::pair<K,V> >& a_vec,const K& a_key,V& a_value) {
0027   typedef typename std::vector< std::pair<K,V> >::const_iterator it_t;
0028   it_t it;
0029   for(it=a_vec.begin();it!=a_vec.end();++it) {
0030     if((*it).first==a_key) {
0031       a_value = (*it).second;
0032       return true;
0033     }
0034   }
0035   a_value = V();
0036   return false;
0037 }
0038 
0039 template <class K,class V>
0040 inline bool rfind(const std::vector< std::pair<K,V> >& a_vec,const K& a_key,V& a_value) {
0041   typedef typename std::vector< std::pair<K,V> >::const_reverse_iterator it_t;
0042   it_t it;
0043   for(it=a_vec.rbegin();it!=a_vec.rend();++it) {
0044     if((*it).first==a_key) {
0045       a_value = (*it).second;
0046       return true;
0047     }
0048   }
0049   a_value = V();
0050   return false;
0051 }
0052 
0053 template <class K,class V>
0054 inline bool is_key(const std::vector< std::pair<K,V> >& a_vec,const K& a_key) {
0055   typedef typename std::vector< std::pair<K,V> >::const_iterator it_t;
0056   it_t it;
0057   for(it=a_vec.begin();it!=a_vec.end();++it) {
0058     if((*it).first==a_key) return true;
0059   }
0060   return false;
0061 }
0062 
0063 template <class K,class V>
0064 inline bool find_key(const std::vector< std::pair<K,V> >& a_vec,const V& a_value,K& a_key) {
0065   typedef typename std::vector< std::pair<K,V> >::const_iterator it_t;
0066   it_t it;
0067   for(it=a_vec.begin();it!=a_vec.end();++it) {
0068     if((*it).second==a_value) {
0069       a_key = (*it).first;
0070       return true;
0071     }
0072   }
0073   a_key = K();
0074   return false;
0075 }
0076 
0077 template <class K,class V>
0078 inline void sort_by_second(std::vector< std::pair<K,V> >& a_vec){
0079   //sort according V
0080 
0081   //brute force.
0082   std::vector< std::pair<K,V> > v;
0083   typedef typename std::vector< std::pair<K,V> >::iterator it_t;
0084 
0085   it_t it;
0086   for(it=a_vec.begin();it!=a_vec.end();++it) {
0087     const V& val = (*it).second;
0088 
0089     bool done = false;
0090     it_t it2;
0091     for(it2=v.begin();it2!=v.end();++it2) {
0092       if(val<(*it2).second) {
0093         v.insert(it2,*it);
0094         done = true;
0095         break;
0096       }
0097     }
0098     if(!done) {
0099       v.push_back(*it);
0100     }
0101   }
0102 
0103   a_vec = v;
0104 }
0105 
0106 template <class K,class V>
0107 inline bool remove(std::vector< std::pair<K,V> >& a_vec,const K& a_key) {
0108   typedef typename std::vector< std::pair<K,V> >::iterator it_t;
0109   it_t it;
0110   for(it=a_vec.begin();it!=a_vec.end();++it) {
0111     if((*it).first==a_key) {
0112       a_vec.erase(it);
0113       return true;
0114     }
0115   }
0116   return false;
0117 }
0118 
0119 template <class K,class V>
0120 inline bool remove(std::vector< std::pair<K,V> >& a_vec,const K& a_key,bool a_delete) {
0121   typedef typename std::vector< std::pair<K,V> >::iterator it_t;
0122   it_t it;
0123   for(it=a_vec.begin();it!=a_vec.end();++it) {
0124     if((*it).first==a_key) {
0125       V val = (*it).second;
0126       a_vec.erase(it);
0127       if(a_delete) delete val;
0128       return true;
0129     }
0130   }
0131   return false;
0132 }
0133 
0134 }
0135 
0136 #endif