summaryrefslogtreecommitdiff
path: root/src/maps
diff options
context:
space:
mode:
Diffstat (limited to 'src/maps')
-rw-r--r--src/maps/hashmap.h51
-rw-r--r--src/maps/hashmap.tmpl124
-rw-r--r--src/maps/mtools.h2
-rw-r--r--src/maps/mtools.tmpl5
-rw-r--r--src/maps/nhashmap.h12
-rw-r--r--src/maps/nhashmap.tmpl12
-rw-r--r--src/maps/shashmap.h53
-rw-r--r--src/maps/shashmap.tmpl142
8 files changed, 266 insertions, 135 deletions
diff --git a/src/maps/hashmap.h b/src/maps/hashmap.h
index a748bd8..b3a3212 100644
--- a/src/maps/hashmap.h
+++ b/src/maps/hashmap.h
@@ -2,22 +2,51 @@
#define HASHMAP_H
#include <ext/hash_map>
-#include "hash.h"
using namespace std;
-using __gnu_cxx::hash_map;
+template<class key_type_>
+struct compare_allocator
+{
+ inline bool operator()(key_type_ t_key_1, key_type_ t_key_2) const;
+};
+
+template<class key_type_>
+struct equals_allocator
+{
+ inline bool operator()(key_type_ t_key_1, key_type_ t_key_2) const;
+};
+
+template<class key_type_>
+struct size_hash
+{
+ inline int operator()(key_type_ t_key) const;
+};
+
+template<class key_type_>
+struct self_hash
+{
+ inline int operator()(key_type_ t_key) const;
+};
-template<class obj_type>
-struct hashmap : public hash_map< string, obj_type, hash, hashmap_allocator>
+template
+<
+class obj_type,
+class key_type_ = string,
+class hash_type = size_hash<string>,
+class alloc_type = compare_allocator<string>
+>
+struct hashmap : public __gnu_cxx::hash_map<key_type_, obj_type, hash_type, alloc_type>
{
- virtual inline void set_elem(obj_type t_obj, string s_key);
- virtual inline obj_type get_elem(string s_key);
- virtual inline obj_type get_set_elem(obj_type t_obj, string s_key);
- virtual inline vector<string>* get_key_vector();
- virtual inline bool exists(string s_key);
- virtual inline void run_func( void (*func)(obj_type) );
- virtual inline void run_func( void (*func)(obj_type, void*), void* v_arg );
+ virtual inline void set_elem(obj_type t_obj, key_type_ t_key);
+ virtual inline obj_type get_elem(key_type_ t_key);
+ virtual inline obj_type get_set_elem(obj_type t_obj, key_type_ t_key);
+ virtual inline obj_type get_or_callback_set
+ (obj_type (*func)(void*), void* p_void, key_type_ t_key);
+ virtual inline vector<key_type_>* get_key_vector();
+ virtual inline bool exists(key_type_ t_key);
+ virtual inline void run_func( void (*func)(obj_type) );
+ virtual inline void run_func( void (*func)(obj_type, void*), void* v_arg );
};
#include "hashmap.tmpl"
diff --git a/src/maps/hashmap.tmpl b/src/maps/hashmap.tmpl
index e9da338..9ee2f36 100644
--- a/src/maps/hashmap.tmpl
+++ b/src/maps/hashmap.tmpl
@@ -1,74 +1,126 @@
-template<class obj_type>
+template<class key_type_>
+bool
+compare_allocator<key_type_>::operator()(key_type_ t_key_1, key_type_ t_key_2) const
+{
+ return t_key_1.compare(t_key_2) == 0;
+}
+
+template<class key_type_>
+bool
+equals_allocator<key_type_>::operator()(key_type_ t_key_1, key_type_ t_key_2) const
+{
+ return t_key_1 == t_key_2;
+}
+
+template<class key_type_>
+int
+size_hash<key_type_>::operator()(key_type_ t_key) const
+{
+ int i_hash = 0;
+ int i_size = t_key.size();
+
+ for( size_t i = 0; i < i_size; ++i )
+ i_hash = ( i_hash << 5 ) ^ t_key.at(i) ^ i_hash;
+
+ return i_hash;
+}
+
+template<class key_type_>
+int
+self_hash<key_type_>::operator()(key_type_ t_key) const
+{
+ return t_key;
+}
+
+
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
obj_type
-hashmap<obj_type>::get_set_elem(obj_type t_obj, string s_key)
+hashmap<obj_type, key_type_, hash_type, alloc_type>::get_set_elem(obj_type t_obj, key_type_ t_key)
{
- typename hashmap<obj_type>::iterator iter = this->find(s_key);
-
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter = this->find(t_key);
+
if ( iter == this->end() )
{
- set_elem(t_obj, s_key);
+ set_elem(t_obj, t_key);
return obj_type();
}
- obj_type t_ret = iter->second;
+ obj_type t_ret = iter->second;
iter->second = t_obj;
return t_ret;
-}
+}
+
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+obj_type
+hashmap<obj_type, key_type_, hash_type, alloc_type>::get_or_callback_set
+(obj_type (*func)(void*), void* p_void, key_type_ t_key)
+{
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter = this->find(t_key);
+
+ if ( iter == this->end() )
+ {
+ obj_type t_obj = (*func) (p_void);
+ set_elem(t_obj, t_key);
+ return t_obj;
+ }
+
+ return iter->second;
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-hashmap<obj_type>::set_elem(obj_type t_obj, string s_key)
+hashmap<obj_type, key_type_, hash_type, alloc_type>::set_elem(obj_type t_obj, key_type_ t_key)
{
- (*this)[s_key] = t_obj;
-}
+ (*this)[t_key] = t_obj;
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
obj_type
-hashmap<obj_type>::get_elem(string s_key)
+hashmap<obj_type, key_type_, hash_type, alloc_type>::get_elem(key_type_ t_key)
{
- typename hashmap<obj_type>::iterator iter = this->find(s_key);
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter = this->find(t_key);
- if ( iter != this->end() )
- return iter->second;
+ if ( iter != this->end() )
+ return iter->second;
- return obj_type();
-}
+ return obj_type();
+}
-template<class obj_type>
-vector<string>*
-hashmap<obj_type>::get_key_vector()
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+vector<key_type_>*
+hashmap<obj_type, key_type_, hash_type, alloc_type>::get_key_vector()
{
- vector<string>* p_vec = new vector<string>;
- typename hashmap<obj_type>::iterator iter;
-
+ vector<key_type_>* p_vec = new vector<key_type_>;
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter;
+
for ( iter = this->begin(); iter != this->end(); ++iter )
p_vec->push_back(iter->first);
- return p_vec;
-}
+ return p_vec;
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
bool
-hashmap<obj_type>::exists(string s_key)
+hashmap<obj_type, key_type_, hash_type, alloc_type>::exists(key_type_ t_key)
{
- return this->find(s_key) != this->end();
-}
+ return this->find(t_key) != this->end();
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-hashmap<obj_type>::run_func( void (*func)(obj_type) )
+hashmap<obj_type, key_type_, hash_type, alloc_type>::run_func( void (*func)(obj_type) )
{
- typename hashmap<obj_type>::iterator iter;
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter;
for ( iter = this->begin(); iter != this->end(); ++iter )
( *func ) ( iter->second );
}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-hashmap<obj_type>::run_func( void (*func)(obj_type, void*), void* v_arg )
+hashmap<obj_type, key_type_, hash_type, alloc_type>::run_func( void (*func)(obj_type, void*), void* v_arg )
{
- typename hashmap<obj_type>::iterator iter;
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter;
for ( iter = this->begin(); iter != this->end(); ++iter )
( *func ) ( iter->second, v_arg );
}
diff --git a/src/maps/mtools.h b/src/maps/mtools.h
index 6062191..4ee45b8 100644
--- a/src/maps/mtools.h
+++ b/src/maps/mtools.h
@@ -8,4 +8,4 @@ struct mtools
};
#include "mtools.tmpl"
-#endif
+#endif
diff --git a/src/maps/mtools.tmpl b/src/maps/mtools.tmpl
index dd3f89e..6917131 100644
--- a/src/maps/mtools.tmpl
+++ b/src/maps/mtools.tmpl
@@ -3,9 +3,10 @@
template <class type_>
void
-mtools<type_>::delete_obj( type_ type_obj ) {
+mtools<type_>::delete_obj( type_ type_obj )
+{
if ( type_obj )
- delete type_obj;
+ delete type_obj;
}
#endif
diff --git a/src/maps/nhashmap.h b/src/maps/nhashmap.h
index 75984b5..f440230 100644
--- a/src/maps/nhashmap.h
+++ b/src/maps/nhashmap.h
@@ -5,10 +5,16 @@
using namespace std;
-template<class obj_type>
-struct nhashmap : public shashmap<obj_type>
+template
+<
+class obj_type,
+class key_type_ = string,
+class hash_type = size_hash<string>,
+class alloc_type = compare_allocator<string>
+>
+struct nhashmap : public shashmap<obj_type, key_type_, hash_type, alloc_type>
{
- inline obj_type get_elem(string s_key);
+ inline obj_type get_elem(key_type_ t_key);
};
#include "nhashmap.tmpl"
diff --git a/src/maps/nhashmap.tmpl b/src/maps/nhashmap.tmpl
index 0cba2fd..3ea1934 100644
--- a/src/maps/nhashmap.tmpl
+++ b/src/maps/nhashmap.tmpl
@@ -1,11 +1,11 @@
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
obj_type
-nhashmap<obj_type>::get_elem(string s_key)
+nhashmap<obj_type, key_type_, hash_type, alloc_type>::get_elem(key_type_ t_key)
{
- typename hashmap<obj_type>::iterator iter = this->find(s_key);
+ typename hashmap<obj_type, key_type_, hash_type, alloc_type>::iterator iter = this->find(t_key);
if ( iter != this->end() )
- return iter->second;
+ return iter->second;
- return NULL;
-}
+ return NULL;
+}
diff --git a/src/maps/shashmap.h b/src/maps/shashmap.h
index a87ed9d..f692e32 100644
--- a/src/maps/shashmap.h
+++ b/src/maps/shashmap.h
@@ -4,30 +4,45 @@
#include <pthread.h>
#include "hashmap.h"
+#include "../monitor/dump.h"
+
using namespace std;
-using __gnu_cxx::hash_map;
-template<class obj_type>
-class shashmap : public hashmap<obj_type>
+template
+<
+class obj_type,
+class key_type_ = string,
+class hash_type = size_hash<string>,
+class alloc_type = compare_allocator<string>
+>
+class shashmap : protected hashmap<obj_type, key_type_, hash_type, alloc_type>,
+ public dumpable
{
private:
- pthread_mutex_t mut_shashmap;
+ pthread_mutex_t mut_shashmap;
+
+protected:
+ virtual void dumpit();
+
public:
- explicit shashmap();
- ~shashmap();
- virtual inline void set_elem(obj_type t_obj, string s_key);
- virtual inline obj_type get_set_elem(obj_type t_obj, string s_key);
- virtual inline void add_elem(obj_type t_obj, string s_key);
- virtual inline void add_elem_insecure(obj_type t_obj, string s_key);
- virtual inline obj_type get_elem(string s_key);
- virtual inline void del_elem(string s_key);
- virtual inline void del_elem_insecure(string s_key);
- virtual inline void clear();
- virtual inline int size();
- virtual inline bool exists(string s_key);
- virtual inline vector<string>* get_key_vector();
- virtual inline void run_func( void (*func)(obj_type) );
- virtual inline void run_func( void (*func)(obj_type, void*), void* v_arg );
+ explicit shashmap();
+ ~shashmap();
+ virtual inline void set_elem(obj_type t_obj, key_type_ t_key);
+ virtual inline obj_type get_set_elem(obj_type t_obj, key_type_ t_key);
+ virtual inline obj_type get_or_callback_set
+ (obj_type (*func)(void*), void* p_void, key_type_ t_key);
+ virtual inline void add_elem(obj_type t_obj, key_type_ t_key);
+ virtual inline void add_elem_insecure(obj_type t_obj, key_type_ t_key);
+ virtual inline obj_type get_elem(key_type_ t_key);
+ virtual inline void del_elem(key_type_ t_key);
+ virtual inline void del_elem_insecure(key_type_ t_key);
+ virtual inline void clear();
+ virtual inline int size();
+ virtual inline bool exists(key_type_ t_key);
+ virtual inline vector<key_type_>* get_key_vector();
+ virtual inline void run_func( void (*func)(obj_type) );
+ virtual inline void run_func( void (*func)(obj_type, void*), void* v_arg );
+
};
#include "shashmap.tmpl"
diff --git a/src/maps/shashmap.tmpl b/src/maps/shashmap.tmpl
index 6a70f61..0bd5796 100644
--- a/src/maps/shashmap.tmpl
+++ b/src/maps/shashmap.tmpl
@@ -1,129 +1,157 @@
-template<class obj_type>
-shashmap<obj_type>::shashmap()
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+shashmap<obj_type, key_type_, hash_type, alloc_type>::shashmap()
{
- pthread_mutex_init( &mut_shashmap, NULL );
+ pthread_mutex_init( &mut_shashmap, NULL );
}
-template<class obj_type>
-shashmap<obj_type>::~shashmap()
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+shashmap<obj_type, key_type_, hash_type, alloc_type>::~shashmap()
{
- pthread_mutex_destroy( &mut_shashmap );
+ pthread_mutex_destroy( &mut_shashmap );
}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::add_elem(obj_type t_obj, string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::add_elem(obj_type t_obj, key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- (*this)[s_key] = t_obj;
+ (*this)[t_key] = t_obj;
pthread_mutex_unlock( &mut_shashmap );
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::add_elem_insecure(obj_type t_obj, string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::add_elem_insecure(obj_type t_obj, key_type_ t_key)
+{
+ (*this)[t_key] = t_obj;
+}
+
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+obj_type
+shashmap<obj_type, key_type_, hash_type, alloc_type>::get_set_elem(obj_type t_obj, key_type_ t_key)
{
- (*this)[s_key] = t_obj;
-}
+ pthread_mutex_lock( &mut_shashmap );
+ obj_type t_ret = hashmap<obj_type, key_type_, hash_type, alloc_type>::get_set_elem(t_obj, t_key);
+ pthread_mutex_unlock( &mut_shashmap );
+ return t_ret;
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
obj_type
-shashmap<obj_type>::get_set_elem(obj_type t_obj, string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::get_or_callback_set
+(obj_type (*func)(void*), void* p_void, key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- obj_type t_ret = hashmap<obj_type>::get_set_elem(t_obj, s_key);
+ obj_type t_ret = hashmap<obj_type, key_type_, hash_type, alloc_type>::get_or_callback_set
+ (func, p_void, t_key);
pthread_mutex_unlock( &mut_shashmap );
return t_ret;
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::set_elem(obj_type t_obj, string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::set_elem(obj_type t_obj, key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- (*this)[s_key] = t_obj;
+ (*this)[t_key] = t_obj;
pthread_mutex_unlock( &mut_shashmap );
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
obj_type
-shashmap<obj_type>::get_elem(string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::get_elem(key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- obj_type t_ret = hashmap<obj_type>::get_elem(s_key);
+ obj_type t_ret = hashmap<obj_type, key_type_, hash_type, alloc_type>::get_elem(t_key);
pthread_mutex_unlock( &mut_shashmap );
return t_ret;
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::del_elem(string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::del_elem(key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- hashmap<obj_type>::erase(s_key);
+ hashmap<obj_type, key_type_, hash_type, alloc_type>::erase(t_key);
pthread_mutex_unlock( &mut_shashmap );
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::del_elem_insecure(string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::del_elem_insecure(key_type_ t_key)
{
- hashmap<obj_type>::erase(s_key);
-}
+ hashmap<obj_type, key_type_, hash_type, alloc_type>::erase(t_key);
+}
-template<class obj_type>
-vector<string>*
-shashmap<obj_type>::get_key_vector()
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+vector<key_type_>*
+shashmap<obj_type, key_type_, hash_type, alloc_type>::get_key_vector()
{
pthread_mutex_lock( &mut_shashmap );
- vector<string>* p_vec = hashmap<obj_type>::get_key_vector();
+ vector<key_type_>* p_vec = hashmap<obj_type, key_type_, hash_type, alloc_type>::get_key_vector();
pthread_mutex_unlock( &mut_shashmap );
return p_vec;
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::clear()
+shashmap<obj_type, key_type_, hash_type, alloc_type>::clear()
{
pthread_mutex_lock( &mut_shashmap );
- hashmap<obj_type>::clear();
+ hashmap<obj_type, key_type_, hash_type, alloc_type>::clear();
pthread_mutex_unlock( &mut_shashmap );
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
int
-shashmap<obj_type>::size()
+shashmap<obj_type, key_type_, hash_type, alloc_type>::size()
{
pthread_mutex_lock( &mut_shashmap );
- int i_size = hashmap<obj_type>::size();
+ int i_size = hashmap<obj_type, key_type_, hash_type, alloc_type>::size();
pthread_mutex_unlock( &mut_shashmap );
return i_size;
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
bool
-shashmap<obj_type>::exists(string s_key)
+shashmap<obj_type, key_type_, hash_type, alloc_type>::exists(key_type_ t_key)
{
pthread_mutex_lock( &mut_shashmap );
- bool b_ret = hashmap<obj_type>::exists(s_key);
+ bool b_ret = hashmap<obj_type, key_type_, hash_type, alloc_type>::exists(t_key);
pthread_mutex_unlock( &mut_shashmap );
return b_ret;
-}
+}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::run_func( void (*func)(obj_type) )
+shashmap<obj_type, key_type_, hash_type, alloc_type>::run_func( void (*func)(obj_type) )
{
pthread_mutex_lock( &mut_shashmap );
- hashmap<obj_type>::run_func(func);
+ hashmap<obj_type, key_type_, hash_type, alloc_type>::run_func(func);
pthread_mutex_unlock( &mut_shashmap );
}
-template<class obj_type>
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
void
-shashmap<obj_type>::run_func( void (*func)(obj_type, void*), void* v_arg )
+shashmap<obj_type, key_type_, hash_type, alloc_type>::run_func( void (*func)(obj_type, void*), void* v_arg )
{
pthread_mutex_lock( &mut_shashmap );
- hashmap<obj_type>::run_func(func, v_arg);
+ hashmap<obj_type, key_type_, hash_type, alloc_type>::run_func(func, v_arg);
pthread_mutex_unlock( &mut_shashmap );
}
+
+template<class obj_type, class key_type_, class hash_type, class alloc_type>
+void
+shashmap<obj_type, key_type_, hash_type, alloc_type>::dumpit()
+{
+ dumpable::add
+ ("[shashmap]");
+ vector<key_type_>* p_vec = get_key_vector();
+
+ typename vector<key_type_>::iterator iter;
+ for (iter = p_vec->begin(); iter != p_vec->end(); ++iter)
+ dumpable::add
+ (*iter);
+
+ delete p_vec;
+}