00001 #ifndef TAGCOLL_HANDLE_MAKER_H
00002 #define TAGCOLL_HANDLE_MAKER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <map>
00025
00026 namespace Tagcoll
00027 {
00028
00029 template <class T>
00030 class HandleMaker
00031 {
00032 std::map<int, T> handles_to_items;
00033 std::map<T, int> items_to_handles;
00034 int handle_seq;
00035
00036 public:
00037 HandleMaker() throw () : handle_seq(0) {}
00038
00039 int getHandle(T item) throw ()
00040 {
00041 typename std::map<T, int>::iterator i = items_to_handles.find(item);
00042 if (i == items_to_handles.end())
00043 {
00044 int res = handle_seq++;
00045 items_to_handles.insert(std::make_pair(item, res));
00046 handles_to_items.insert(std::make_pair(res, item));
00047 return res;
00048 } else
00049 return i->second;
00050 }
00051
00052 T getItem(int handle) const throw ()
00053 {
00054 typename std::map<int, T>::const_iterator i = handles_to_items.find(handle);
00055
00056 return i->second;
00057 }
00058 };
00059
00060 };
00061
00062
00063 #endif