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