]> git.tdb.fi Git - libs/core.git/blob - source/core/maputils.h
Use a self-assignment to copy all members
[libs/core.git] / source / core / maputils.h
1 #ifndef MSP_CORE_MAPUTILS_H_
2 #define MSP_CORE_MAPUTILS_H_
3
4 #include <stdexcept>
5 #include <typeinfo>
6
7 namespace Msp {
8
9 class key_error: public std::runtime_error
10 {
11 public:
12         key_error(const std::type_info &);
13 };
14
15
16 template<typename T>
17 typename T::mapped_type &get_item(T &map, const typename T::key_type &key)
18 {
19         typename T::iterator i = map.find(key);
20         if(i==map.end())
21                 throw key_error(typeid(T));
22
23         return i->second;
24 }
25
26 template<typename T>
27 const typename T::mapped_type &get_item(const T &map, const typename T::key_type &key)
28 {
29         typename T::const_iterator i = map.find(key);
30         if(i==map.end())
31                 throw key_error(typeid(T));
32
33         return i->second;
34 }
35
36 template<typename T>
37 const typename T::iterator insert_unique(T &map, const typename T::key_type &key, const typename T::mapped_type &item)
38 {
39         if(map.count(key))
40                 throw key_error(typeid(T));
41
42         return map.insert(typename T::value_type(key, item)).first;
43 }
44
45 } // namespace Msp
46
47 #endif