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