iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AutoMapImpl.H
Go to the documentation of this file.
1 /*! @file
2  @author Randolph Voorhies
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 
36 #ifndef INCLUDE_NRT_CORE_DESIGN_DETAILS_AUTOMAPIMPL_H
37 #define INCLUDE_NRT_CORE_DESIGN_DETAILS_AUTOMAPIMPL_H
38 
40 
41 template<class KeyType, class ValueType>
42 class nrt::AutoMap<KeyType, ValueType>::KeyNotFoundException : public nrt::exception::Exception
43 {
44  public:
45  KeyNotFoundException(KeyType const & key) throw()
46  try : nrt::exception::Exception("Invalid key"), itsKey(key) { } catch (...) { }
47 
48  virtual ~KeyNotFoundException() throw() { }
49 
50  KeyType itsKey;
51 };
52 
53 // ######################################################################
54 template<class KeyType, class ValueType> inline
56 { }
57 
58 // ######################################################################
59 template<class KeyType, class ValueType> inline
62 { return itsMap.begin(); }
63 
64 // ######################################################################
65 template<class KeyType, class ValueType> inline
68 { return itsMap.end(); }
69 
70 // ######################################################################
71 template<class KeyType, class ValueType> inline
74 { return itsMap.begin(); }
75 
76 // ######################################################################
77 template<class KeyType, class ValueType> inline
80 { return itsMap.end(); }
81 
82 // ######################################################################
83 template<class KeyType, class ValueType> inline
84 ValueType & nrt::AutoMap<KeyType, ValueType>::operator[](KeyType const & key)
85 {
86  // Does this key exist? If not, throw:
87  auto itr = itsMap.find(key); if (itr == itsMap.end()) throw KeyNotFoundException(key);
88 
89  // Return the reference to the data for that key:
90  return itsMap[key];
91 }
92 
93 // ######################################################################
94 template<class KeyType, class ValueType> inline
95 KeyType nrt::AutoMap<KeyType, ValueType>::insert(ValueType const & value)
96 {
97  // Recycle an old key, or generate a new one
98  KeyType key;
99  if (itsRecycleBin.size()) { key = itsRecycleBin.front(); itsRecycleBin.pop(); } else { key = itsMaxKey++; }
100 
101  // Insert the value into our map:
102  itsMap[key] = value;
103 
104  // Return the newly created key:
105  return key;
106 }
107 
108 // ######################################################################
109 template<class KeyType, class ValueType> inline
111 {
112  // Place the key into our recycle bin for future re-use:
113  itsRecycleBin.push(pos->first);
114 
115  // Erase from our map, this may throw some std exception if pos is bogus:
116  itsMap.erase(pos);
117 }
118 
119 // ######################################################################
120 template<class KeyType, class ValueType> inline
122 {
123  // Do we have this key?
124  typename nrt::AutoMap<KeyType, ValueType>::iterator pos = itsMap.find(key);
125  if (pos == itsMap.end()) throw KeyNotFoundException(key);
126 
127  erase(pos);
128 }
129 
130 // ######################################################################
131 template <class KeyType, class ValueType>
133 {
134  itsMap.clear();
135  itsRecycleBin = std::queue<KeyType>();
136  itsMaxKey = KeyType();
137 }
138 
139 #endif // INCLUDE_NRT_CORE_DESIGN_DETAILS_AUTOMAPIMPL_H