45template<
class K,
class V>
46inline std::list<K>
uUniqueKeys(
const std::multimap<K, V> & mm)
49 typename std::list<K>::reverse_iterator lastValue;
50 for(
typename std::multimap<K, V>::const_iterator iter = mm.begin(); iter!=mm.end(); ++iter)
52 if(iter == mm.begin() || (iter != mm.begin() && *lastValue != iter->first))
54 l.push_back(iter->first);
55 lastValue = l.rbegin();
66template<
class K,
class V>
67inline std::vector<K>
uKeys(
const std::multimap<K, V> & mm)
69 std::vector<K> v(mm.size());
71 for(
typename std::multimap<K, V>::const_iterator iter = mm.begin(); iter!=mm.end(); ++iter)
83template<
class K,
class V>
84inline std::list<K>
uKeysList(
const std::multimap<K, V> & mm)
87 for(
typename std::multimap<K, V>::const_iterator iter = mm.begin(); iter!=mm.end(); ++iter)
89 l.push_back(iter->first);
99template<
class K,
class V>
100inline std::vector<V>
uValues(
const std::multimap<K, V> & mm)
102 std::vector<V> v(mm.size());
104 for(
typename std::multimap<K, V>::const_iterator iter = mm.begin(); iter!=mm.end(); ++iter)
106 v[i++] = iter->second;
116template<
class K,
class V>
120 for(
typename std::multimap<K, V>::const_iterator iter = mm.begin(); iter!=mm.end(); ++iter)
122 l.push_back(iter->second);
133template<
class K,
class V>
134inline std::list<V>
uValues(
const std::multimap<K, V> & mm,
const K & key)
137 std::pair<typename std::multimap<K, V>::const_iterator,
typename std::multimap<K, V>::const_iterator> range;
138 range = mm.equal_range(key);
139 for(
typename std::multimap<K, V>::const_iterator iter = range.first; iter!=range.second; ++iter)
141 l.push_back(iter->second);
151template<
class K,
class V>
152inline std::vector<K>
uKeys(
const std::map<K, V> & m)
154 std::vector<K> v(m.size());
156 for(
typename std::map<K, V>::const_iterator iter = m.begin(); iter!=m.end(); ++iter)
169template<
class K,
class V>
173 for(
typename std::map<K, V>::const_iterator iter = m.begin(); iter!=m.end(); ++iter)
175 l.push_back(iter->first);
185template<
class K,
class V>
186inline std::set<K>
uKeysSet(
const std::map<K, V> & m)
189 for(
typename std::map<K, V>::const_iterator iter = m.begin(); iter!=m.end(); ++iter)
191 s.insert(s.end(), iter->first);
201template<
class K,
class V>
202inline std::vector<V>
uValues(
const std::map<K, V> & m)
204 std::vector<V> v(m.size());
206 for(
typename std::map<K, V>::const_iterator iter = m.begin(); iter!=m.end(); ++iter)
219template<
class K,
class V>
223 for(
typename std::map<K, V>::const_iterator iter = m.begin(); iter!=m.end(); ++iter)
225 l.push_back(iter->second);
237template<
class K,
class V>
238inline V
uValue(
const std::map<K, V> & m,
const K & key,
const V & defaultValue = V())
241 typename std::map<K, V>::const_iterator i = m.find(key);
257template<
class K,
class V>
258inline V
uTake(std::map<K, V> & m,
const K & key,
const V & defaultValue = V())
261 typename std::map<K, V>::iterator i = m.find(key);
282inline typename std::list<V>::iterator
uIteratorAt(std::list<V> & list,
const unsigned int & pos)
284 typename std::list<V>::iterator iter = list.begin();
285 for(
unsigned int i = 0; i<pos && iter != list.end(); ++i )
300inline typename std::list<V>::const_iterator
uIteratorAt(
const std::list<V> & list,
const unsigned int & pos)
302 typename std::list<V>::const_iterator iter = list.begin();
303 for(
unsigned int i = 0; i<pos && iter != list.end(); ++i )
318inline typename std::set<V>::iterator
uIteratorAt(std::set<V> & set,
const unsigned int & pos)
320 typename std::set<V>::iterator iter = set.begin();
321 for(
unsigned int i = 0; i<pos && iter != set.end(); ++i )
336inline typename std::set<V>::const_iterator
uIteratorAt(
const std::set<V> & set,
const unsigned int & pos)
338 typename std::set<V>::const_iterator iter = set.begin();
339 for(
unsigned int i = 0; i<pos && iter != set.end(); ++i )
354inline typename std::vector<V>::iterator
uIteratorAt(std::vector<V> & v,
const unsigned int & pos)
356 return v.begin() + pos;
367inline typename std::vector<V>::const_iterator
uIteratorAt(
const std::vector<V> & v,
const unsigned int & pos)
369 return v.begin() + pos;
380inline V &
uValueAt(std::list<V> & list,
const unsigned int & pos)
382 typename std::list<V>::iterator iter =
uIteratorAt(list, pos);
394inline const V &
uValueAt(
const std::list<V> & list,
const unsigned int & pos)
396 typename std::list<V>::const_iterator iter =
uIteratorAt(list, pos);
407inline bool uContains(
const std::list<V> & list,
const V & value)
409 return std::find(list.begin(), list.end(), value) != list.end();
418template<
class K,
class V>
419inline bool uContains(
const std::map<K, V> & map,
const K & key)
421 return map.find(key) != map.end();
430template<
class K,
class V>
431inline bool uContains(
const std::multimap<K, V> & map,
const K & key)
433 return map.find(key) != map.end();
440template<
class K,
class V>
441inline void uInsert(std::map<K, V> & map,
const std::pair<K, V> & pair)
443 std::pair<typename std::map<K, V>::iterator,
bool> inserted = map.insert(pair);
444 if(inserted.second ==
false)
446 inserted.first->second = pair.second;
454template<
class K,
class V>
455inline void uInsert(std::map<K, V> & map,
const std::map<K, V> & items)
457 for(
typename std::map<K, V>::const_iterator iter=items.begin(); iter!=items.end(); ++iter)
459 std::pair<typename std::map<K, V>::iterator,
bool> inserted = map.insert(*iter);
460 if(inserted.second ==
false)
462 inserted.first->second = iter->second;
475 return std::vector<V>(list.begin(), list.end());
486 return std::list<V>(v.begin(), v.end());
493template<
class K,
class V>
496 return std::map<K, V>(m.begin(), m.end());
502template<
class K,
class V>
505 std::map<K, V> mapOut;
507 for(
typename std::list<K>::const_iterator iter = uniqueKeys.begin(); iter!=uniqueKeys.end(); ++iter)
509 if(m.count(*iter) == 1)
511 typename std::multimap<K, V>::const_iterator jter=m.find(*iter);
512 mapOut.insert(mapOut.end(), std::pair<K,V>(jter->first, jter->second));
524inline void uAppend(std::list<V> & list,
const std::list<V> & newItems)
526 list.insert(list.end(), newItems.begin(), newItems.end());
537inline int uIndexOf(
const std::vector<V> & list,
const V & value)
541 for(
typename std::vector<V>::const_iterator iter = list.begin(); iter!=list.end(); ++iter)
564inline std::list<std::string>
uSplit(
const std::string & str,
char separator =
' ')
566 std::list<std::string> v;
568 for(
unsigned int i=0; i<str.size(); ++i)
570 if(str[i] != separator)
601inline std::string
uJoin(
const std::list<std::string> & strings,
const std::string & separator =
"")
604 for(std::list<std::string>::const_iterator iter = strings.begin(); iter!=strings.end(); ++iter)
606 if(iter!=strings.begin() && !separator.empty())
622 return c >=
'0' && c <=
'9';
630inline bool uIsInteger(
const std::string & str,
bool checkForSign =
true)
632 bool isInteger = str.size()!=0;
633 for(
unsigned int i=0; i<str.size() && isInteger; ++i)
635 isInteger = (checkForSign && i==0 && str[i]==
'-') ||
uIsDigit(str[i]);
647 std::list<std::string> list =
uSplit(str,
'.');
652 else if(list.size() == 2)
672 std::list<std::string> list;
675 for(
unsigned int i=0; i<str.size(); ++i)
679 if(!num && buf.size())
717inline int uStrNumCmp(
const std::string & a,
const std::string & b)
719 std::vector<std::string> listA;
720 std::vector<std::string> listB;
727 for(i=0; i<listA.size() && i<listB.size(); ++i)
732 if(listA[i].at(0) ==
'0' && listB[i].size() < listA[i].size())
734 while(listB[i].size() < listA[i].size())
739 else if(listB[i].at(0) ==
'0' && listA[i].size() < listB[i].size())
741 while(listA[i].size() < listB[i].size())
747 if(listB[i].size() < listA[i].size())
751 else if(listB[i].size() > listA[i].size())
757 result = listA[i].compare(listB[i]);
770 result = listA[i].compare(listB[i]);
785inline bool uStrContains(
const std::string &
string,
const std::string & substring)
787 return string.find(substring) != std::string::npos;
790inline int uCompareVersion(
const std::string & version,
int major,
int minor=-1,
int patch=-1)
795 int vMajor = atoi(v[0].c_str());
796 int vMinor = atoi(v[1].c_str());
797 int vPatch = atoi(v[2].c_str());
799 (vMajor == major && minor!=-1 && vMinor > minor) ||
800 (vMajor == major && minor!=-1 && vMinor == minor && patch!=-1 && vPatch > patch))
804 else if(vMajor == major && (minor == -1 || (vMinor == minor && (patch == -1 || vPatch == patch))))
812inline std::string uPad(
const std::string & title,
int padding = 20)
814 int emptySize = padding - (int)title.size();
817 return title + std::string(emptySize,
' ');
V uValue(const std::map< K, V > &m, const K &key, const V &defaultValue=V())
V & uValueAt(std::list< V > &list, const unsigned int &pos)
std::string uJoin(const std::list< std::string > &strings, const std::string &separator="")
std::list< std::string > uSplitNumChar(const std::string &str)
void uAppend(std::list< V > &list, const std::list< V > &newItems)
bool uContains(const std::list< V > &list, const V &value)
std::list< V > uVectorToList(const std::vector< V > &v)
bool uIsNumber(const std::string &str)
std::list< K > uUniqueKeys(const std::multimap< K, V > &mm)
V uTake(std::map< K, V > &m, const K &key, const V &defaultValue=V())
std::vector< V > uValues(const std::multimap< K, V > &mm)
std::vector< V > uListToVector(const std::list< V > &list)
std::list< V > uValuesList(const std::multimap< K, V > &mm)
std::vector< K > uKeys(const std::multimap< K, V > &mm)
std::list< V >::iterator uIteratorAt(std::list< V > &list, const unsigned int &pos)
std::list< std::string > uSplit(const std::string &str, char separator=' ')
bool uStrContains(const std::string &string, const std::string &substring)
std::map< K, V > uMultimapToMapUnique(const std::multimap< K, V > &m)
void uInsert(std::map< K, V > &map, const std::pair< K, V > &pair)
bool uIsDigit(const char c)
int uIndexOf(const std::vector< V > &list, const V &value)
std::set< K > uKeysSet(const std::map< K, V > &m)
std::list< K > uKeysList(const std::multimap< K, V > &mm)
int uStrNumCmp(const std::string &a, const std::string &b)
std::map< K, V > uMultimapToMap(const std::multimap< K, V > &m)
bool uIsInteger(const std::string &str, bool checkForSign=true)