]> git.tdb.fi Git - libs/core.git/blob - source/core/maputils.h
Add no-throw destructors to exception classes that were lacking one
[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         ~key_error() throw() { }
14 };
15
16
17 template<typename T>
18 typename T::mapped_type &get_item(T &map, const typename T::key_type &key)
19 {
20         typename T::iterator i = map.find(key);
21         if(i==map.end())
22                 throw key_error(typeid(T));
23
24         return i->second;
25 }
26
27 template<typename T>
28 const typename T::mapped_type &get_item(const T &map, const typename T::key_type &key)
29 {
30         typename T::const_iterator i = map.find(key);
31         if(i==map.end())
32                 throw key_error(typeid(T));
33
34         return i->second;
35 }
36
37 template<typename T>
38 const typename T::iterator insert_unique(T &map, const typename T::key_type &key, const typename T::mapped_type &item)
39 {
40         if(map.count(key))
41                 throw key_error(typeid(T));
42
43         return map.insert(typename T::value_type(key, item)).first;
44 }
45
46 } // namespace Msp
47
48 #endif