bug in RC
[anna.git] / include / anna / core / util / ExclusiveHash.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_util_ExclusiveHash_hpp
10 #define anna_core_util_ExclusiveHash_hpp
11
12 #include <map>
13
14 namespace anna {
15
16 /**
17    Template para calcular de forma univoca valores numericos del tipo de dato T.
18    Un valor T puede tener valores distintos para instancias distintas de ExclusiveHash.
19    La instancia T debe ser capaz de actuar como idice de una map<T,X>.
20
21    \param T Tipo de dato que queremos codificar numericamente.
22 */
23 template < class T, class _K = unsigned long > class ExclusiveHash {
24   typedef std::map <T, _K> container;
25   typedef typename container::value_type value_type;
26
27 public:
28   /**
29      Constructor.
30   */
31   ExclusiveHash() : a_value(0) {;}
32
33   /**
34      Calcula la funcion hash exclusiva para la instancia recibida como parametro.
35      \param t Instancia a la que vamos a calcular un valor numerico.
36   */
37   _K calcule(const T& t)
38   throw() {
39     typename container::iterator ii;
40     _K result = 0;
41
42     if((ii = a_container.find(t)) == a_container.end()) {
43       result = a_value ++;
44       a_container.insert(value_type(t, result));
45     } else
46       result = ii->second;
47
48     return result;
49   }
50
51 private:
52   container a_container;
53   _K a_value;
54 };
55
56 }
57
58 #endif