[Pkg-voip-commits] [bctoolbox] 28/57: Create bctbx_map_cchar_t and the corresponding functions

daniel at gnoutcheff.name daniel at gnoutcheff.name
Thu Mar 30 04:31:33 UTC 2017


This is an automated email from the git hooks/post-receive script.

gnoutchd-guest pushed a commit to branch debian/sid
in repository bctoolbox.

commit c3e9e78a6a603a29ca01eee9cf986787ed0f8c12
Author: Benjamin Reis <benjamin.reis at belledonne-communications.com>
Date:   Thu Jan 19 15:01:27 2017 +0100

    Create bctbx_map_cchar_t and the corresponding functions
---
 include/bctoolbox/map.h |  76 +++++++++-----
 src/containers/map.cc   | 261 +++++++++++++++++++++++++++++++++++++-----------
 tester/containers.cc    | 135 ++++++++++++++++++++-----
 3 files changed, 363 insertions(+), 109 deletions(-)

diff --git a/include/bctoolbox/map.h b/include/bctoolbox/map.h
index 4fcf99a..0b08e84 100644
--- a/include/bctoolbox/map.h
+++ b/include/bctoolbox/map.h
@@ -29,49 +29,77 @@ typedef struct _bctbx_map_t bctbx_map_t;
 typedef struct _bctbx_pair_t bctbx_pair_t;
 typedef struct _bctbx_iterator_t bctbx_iterator_t;
 
-
-
 typedef struct _bctbx_mmap_ullong_t bctbx_mmap_ullong_t;
+typedef struct _bctbx_mmap_cchar_t bctbx_mmap_cchar_t;
 /*map*/
 BCTBX_PUBLIC bctbx_map_t *bctbx_mmap_ullong_new(void);
+BCTBX_PUBLIC bctbx_map_t *bctbx_mmap_cchar_new(void);
 BCTBX_PUBLIC void bctbx_mmap_ullong_delete(bctbx_map_t *mmap);
-BCTBX_PUBLIC void bctbx_map_insert(bctbx_map_t *map,const bctbx_pair_t *pair);
+BCTBX_PUBLIC void bctbx_mmap_cchar_delete(bctbx_map_t *mmap);
+#define bctbx_map_insert bctbx_map_ullong_insert
+BCTBX_PUBLIC void bctbx_map_ullong_insert(bctbx_map_t *map,const bctbx_pair_t *pair);
+BCTBX_PUBLIC void bctbx_map_cchar_insert(bctbx_map_t *map,const bctbx_pair_t *pair);
 /*same as insert, but also deleting pair*/
-BCTBX_PUBLIC void bctbx_map_insert_and_delete(bctbx_map_t *map,bctbx_pair_t *pair);
+#define bctbx_map_insert_and_delete bctbx_map_ullong_insert_and_delete
+BCTBX_PUBLIC void bctbx_map_ullong_insert_and_delete(bctbx_map_t *map,bctbx_pair_t *pair);
+BCTBX_PUBLIC void bctbx_map_cchar_insert_and_delete(bctbx_map_t *map,bctbx_pair_t *pair);
 /*same as insert and deleting pair with a newly allocated it returned */
-BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_insert_and_delete_with_returned_it(bctbx_map_t *map,bctbx_pair_t *pair);
-
+#define bctbx_map_insert_and_delete_with_returned_it bctbx_map_ullong_insert_and_delete_with_returned_it
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_insert_and_delete_with_returned_it(bctbx_map_t *map,bctbx_pair_t *pair);
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_insert_and_delete_with_returned_it(bctbx_map_t *map,bctbx_pair_t *pair);
 /*at return, it point to the next element*/
-BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_erase(bctbx_map_t *map,bctbx_iterator_t *it);
+#define bctbx_map_erase bctbx_map_ullong_erase
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_erase(bctbx_map_t *map,bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_erase(bctbx_map_t *map,bctbx_iterator_t *it);
 /*return a new allocated iterator*/
-BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_begin(const bctbx_map_t *map);
+#define bctbx_map_begin bctbx_map_ullong_begin
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_begin(const bctbx_map_t *map);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_begin(const bctbx_map_t *map);
 /*return a new allocated iterator*/
-BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_end(const bctbx_map_t *map);
+#define bctbx_map_end bctbx_map_ullong_end
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_end(const bctbx_map_t *map);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_end(const bctbx_map_t *map);
 /*return a new allocated iterator or null*/
-BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data);
+#define bctbx_map_find_custom bctbx_map_ullong_find_custom
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data);
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data);
+/*return the iterator associated to the key in the map or Null*/
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_find_key(bctbx_map_t *map, unsigned long long key);
+	BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_find_key(bctbx_map_t *map, const char * key);
+/* return the size of the map*/
+#define bctbx_map_size bctbx_map_ullong_size
+BCTBX_PUBLIC size_t bctbx_map_ullong_size(const bctbx_map_t *map);
+BCTBX_PUBLIC size_t bctbx_map_cchar_size(const bctbx_map_t *map);
 
-BCTBX_PUBLIC size_t bctbx_map_size(const bctbx_map_t *map);
-
-		
-	
 /*iterator*/
-BCTBX_PUBLIC bctbx_pair_t *bctbx_iterator_get_pair(const bctbx_iterator_t *it);
+#define bctbx_iterator_get_pair bctbx_iterator_ullong_get_pair
+BCTBX_PUBLIC bctbx_pair_t *bctbx_iterator_ullong_get_pair(const bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_pair_t *bctbx_iterator_cchar_get_pair(const bctbx_iterator_t *it);
 /*return same pointer but pointing to next*/
-BCTBX_PUBLIC bctbx_iterator_t *bctbx_iterator_get_next(bctbx_iterator_t *it);
-BCTBX_PUBLIC  bool_t bctbx_iterator_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b);
+#define bctbx_iterator_get_next bctbx_iterator_ullong_get_next
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_iterator_ullong_get_next(bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_iterator_cchar_get_next(bctbx_iterator_t *it);
+#define bctbx_iterator_equals bctbx_iterator_ullong_equals
+BCTBX_PUBLIC  bool_t bctbx_iterator_ullong_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b);
+BCTBX_PUBLIC  bool_t bctbx_iterator_cchar_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b);
+#define bctbx_iterator_delete bctbx_iterator_ullong_delete
+BCTBX_PUBLIC void bctbx_iterator_ullong_delete(bctbx_iterator_t *it);
+BCTBX_PUBLIC void bctbx_iterator_cchar_delete(bctbx_iterator_t *it);
 	
-	
-
-BCTBX_PUBLIC void bctbx_iterator_delete(bctbx_iterator_t *it);
-
 /*pair*/	
 typedef struct _bctbx_pair_ullong_t bctbx_pair_ullong_t; /*inherite from bctbx_pair_t*/
 BCTBX_PUBLIC bctbx_pair_ullong_t * bctbx_pair_ullong_new(unsigned long long key,void *value);
+typedef struct _bctbx_pair_cchar_t bctbx_pair_cchar_t; /*inherite from bctbx_pair_t*/
+BCTBX_PUBLIC bctbx_pair_cchar_t * bctbx_pair_cchar_new(const char * key,void *value);
 
-BCTBX_PUBLIC void* bctbx_pair_get_second(const bctbx_pair_t * pair);
+#define bctbx_pair_get_second bctbx_pair_ullong_get_second
+BCTBX_PUBLIC void* bctbx_pair_ullong_get_second(const bctbx_pair_t * pair);
+BCTBX_PUBLIC void* bctbx_pair_cchar_get_second(const bctbx_pair_t * pair);
 BCTBX_PUBLIC unsigned long long bctbx_pair_ullong_get_first(const bctbx_pair_ullong_t * pair);
-BCTBX_PUBLIC void bctbx_pair_delete(bctbx_pair_t * pair);
-
+BCTBX_PUBLIC const char * bctbx_pair_cchar_get_first(const bctbx_pair_cchar_t * pair);
+#define bctbx_pair_delete bctbx_pair_ullong_delete
+BCTBX_PUBLIC void bctbx_pair_ullong_delete(bctbx_pair_t * pair);
+BCTBX_PUBLIC void bctbx_pair_cchar_delete(bctbx_pair_t * pair);
 
 #ifdef __cplusplus
 }
diff --git a/src/containers/map.cc b/src/containers/map.cc
index 07bb246..c58ef87 100644
--- a/src/containers/map.cc
+++ b/src/containers/map.cc
@@ -25,106 +25,245 @@
 typedef std::multimap<unsigned long long, void*> mmap_ullong_t;
 typedef mmap_ullong_t::value_type pair_ullong_t;
 
+typedef std::multimap<std::string, void*> mmap_cchar_t;
+typedef mmap_cchar_t::value_type pair_cchar_t;
 
+template<typename T> bctbx_map_t * bctbx_mmap_new(void) {
+	return (bctbx_map_t *) new T;
+}
 extern "C" bctbx_map_t *bctbx_mmap_ullong_new(void) {
-	return (bctbx_map_t *) new mmap_ullong_t();
+	return bctbx_mmap_new<mmap_ullong_t>();
+}
+extern "C" bctbx_map_t *bctbx_mmap_cchar_new(void) {
+	return bctbx_mmap_new<mmap_cchar_t>();
+}
+
+template<typename T> void bctbx_mmap_delete(bctbx_map_t *mmap) {
+	delete (T *)mmap;
 }
 extern "C" void bctbx_mmap_ullong_delete(bctbx_map_t *mmap) {
-	delete (mmap_ullong_t *)mmap;
+	bctbx_mmap_delete<mmap_ullong_t>(mmap);
 }
-static bctbx_iterator_t * bctbx_map_insert_base(bctbx_map_t *map,const bctbx_pair_t *pair,bool_t returns_it) {
-	mmap_ullong_t::iterator it;
-	if (typeid((pair_ullong_t*)pair) != typeid(pair_ullong_t*)) {
-		BCTBX_SLOGE(LOG_DOMAIN) << "Cannot insert pair ["<< pair << "] on map [" << map <<"] , wrong type";
-		return NULL;
-	} else {
-		it = ((mmap_ullong_t *)map)->insert(*((pair_ullong_t*)pair));
-	}
+extern "C" void bctbx_mmap_cchar_delete(bctbx_map_t *mmap) {
+	bctbx_mmap_delete<mmap_cchar_t>(mmap);
+}
+
+template<typename T> bctbx_iterator_t *bctbx_map_insert_base(bctbx_map_t *map,const bctbx_pair_t *pair,bool_t returns_it) {
+	typename T::iterator it;
+	it = ((T *)map)->insert(*((typename T::value_type *)pair));
 	if (returns_it) {
-		return (bctbx_iterator_t *) new mmap_ullong_t::iterator(it);
+		return (bctbx_iterator_t *) new typename T::iterator(it);
 	} else
 		return NULL;
 }
-
-extern "C" void bctbx_map_insert(bctbx_map_t *map,const bctbx_pair_t *pair) {
-	bctbx_map_insert_base(map,pair,FALSE);
+static bctbx_iterator_t * bctbx_map_ullong_insert_base(bctbx_map_t *map,const bctbx_pair_t *pair,bool_t returns_it) {
+		return bctbx_map_insert_base<mmap_ullong_t>(map, pair, returns_it);
 }
-
-extern "C" void bctbx_map_insert_and_delete(bctbx_map_t *map, bctbx_pair_t *pair) {
-	bctbx_map_insert(map,pair);
-	bctbx_pair_delete(pair);
+extern "C" void bctbx_map_ullong_insert(bctbx_map_t *map,const bctbx_pair_t *pair) {
+	bctbx_map_ullong_insert_base(map,pair,FALSE);
 }
-
-extern "C" bctbx_iterator_t * bctbx_map_insert_and_delete_with_returned_it(bctbx_map_t *map, bctbx_pair_t *pair) {
-	bctbx_iterator_t * it = bctbx_map_insert_base(map,pair,TRUE);
-	bctbx_pair_delete(pair);
+static bctbx_iterator_t * bctbx_map_cchar_insert_base(bctbx_map_t *map,const bctbx_pair_t *pair,bool_t returns_it) {
+	return bctbx_map_insert_base<mmap_cchar_t>(map, pair, returns_it);
+}
+extern "C" void bctbx_map_cchar_insert(bctbx_map_t *map,const bctbx_pair_t *pair) {
+	bctbx_map_cchar_insert_base(map,pair,FALSE);
+}
+extern "C" void bctbx_map_ullong_insert_and_delete(bctbx_map_t *map, bctbx_pair_t *pair) {
+	bctbx_map_ullong_insert(map,pair);
+	bctbx_pair_ullong_delete(pair);
+}
+extern "C" bctbx_iterator_t * bctbx_map_ullong_insert_and_delete_with_returned_it(bctbx_map_t *map, bctbx_pair_t *pair) {
+	bctbx_iterator_t * it = bctbx_map_ullong_insert_base(map,pair,TRUE);
+	bctbx_pair_ullong_delete(pair);
+	return it;
+}
+extern "C" void bctbx_map_cchar_insert_and_delete(bctbx_map_t *map, bctbx_pair_t *pair) {
+	bctbx_map_cchar_insert(map,pair);
+	bctbx_pair_cchar_delete(pair);
+}
+extern "C" bctbx_iterator_t * bctbx_map_cchar_insert_and_delete_with_returned_it(bctbx_map_t *map, bctbx_pair_t *pair) {
+	bctbx_iterator_t * it = bctbx_map_cchar_insert_base(map,pair,TRUE);
+	bctbx_pair_cchar_delete(pair);
 	return it;
 }
 
-extern "C" bctbx_iterator_t *bctbx_map_erase(bctbx_map_t *map,bctbx_iterator_t *it) {
+template<typename T> bctbx_iterator_t *bctbx_map_erase_type(bctbx_map_t *map,bctbx_iterator_t *it) {
 	//bctbx_iterator_t *  next = (bctbx_iterator_t *) new mmap_ullong_t::iterator((*(mmap_ullong_t::iterator*)it));
 	//next = bctbx_iterator_get_next(next);
-	((mmap_ullong_t *)map)->erase((*(mmap_ullong_t::iterator*)it)++);
+	((T *)map)->erase((*(typename T::iterator*)it)++);
 	//bctbx_iterator_delete(it);
 	return it;
 }
-extern "C" bctbx_iterator_t *bctbx_map_begin(const bctbx_map_t *map) {
-	return (bctbx_iterator_t *) new mmap_ullong_t::iterator(((mmap_ullong_t *)map)->begin());
+extern "C" bctbx_iterator_t *bctbx_map_ullong_erase(bctbx_map_t *map,bctbx_iterator_t *it) {
+	return bctbx_map_erase_type<mmap_ullong_t>(map, it);
 }
-extern "C" bctbx_iterator_t * bctbx_map_end(const bctbx_map_t *map) {
-	return (bctbx_iterator_t *) new mmap_ullong_t::iterator(((mmap_ullong_t *)map)->end());
+extern "C" bctbx_iterator_t *bctbx_map_cchar_erase(bctbx_map_t *map,bctbx_iterator_t *it) {
+	return bctbx_map_erase_type<mmap_cchar_t>(map, it);
 }
-/*iterator*/
-extern "C" bctbx_pair_t *bctbx_iterator_get_pair(const bctbx_iterator_t *it) {
-	return (bctbx_pair_t *)&(**((mmap_ullong_t::iterator*)it));
+
+template<typename T> bctbx_iterator_t *bctbx_map_begin_type(const bctbx_map_t *map) {
+	return (bctbx_iterator_t *) new typename T::iterator(((T *)map)->begin());
+	
 }
-extern "C" bctbx_iterator_t *bctbx_iterator_get_next(bctbx_iterator_t *it) {
-	((mmap_ullong_t::iterator*)it)->operator++();
-	return it;
+extern "C" bctbx_iterator_t *bctbx_map_ullong_begin(const bctbx_map_t *map) {
+	return bctbx_map_begin_type<mmap_ullong_t>(map);
 }
-extern "C" bctbx_iterator_t *bctbx_iterator_get_next_and_delete(bctbx_iterator_t *it) {
-	bctbx_iterator_t * next = bctbx_iterator_get_next(it);
-	bctbx_iterator_delete(it);
-	return next;
+extern "C" bctbx_iterator_t *bctbx_map_cchar_begin(const bctbx_map_t *map) {
+	return bctbx_map_begin_type<mmap_cchar_t>(map);
+}
+
+template<typename T> bctbx_iterator_t *bctbx_map_end_type(const bctbx_map_t *map) {
+	return (bctbx_iterator_t *) new typename T::iterator(((T *)map)->end());
+	
 }
-extern "C" bool_t bctbx_iterator_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b) {
-	return *(mmap_ullong_t::iterator*)a == *(mmap_ullong_t::iterator*)b;
+extern "C" bctbx_iterator_t *bctbx_map_ullong_end(const bctbx_map_t *map) {
+	return bctbx_map_end_type<mmap_ullong_t>(map);
 }
-extern "C" void bctbx_iterator_delete(bctbx_iterator_t *it) {
-	delete ((mmap_ullong_t::iterator*)it);
+extern "C" bctbx_iterator_t *bctbx_map_cchar_end(const bctbx_map_t *map) {
+	return bctbx_map_end_type<mmap_cchar_t>(map);
 }
 
-/*pair*/	
-extern "C" bctbx_pair_ullong_t * bctbx_pair_ullong_new(unsigned long long key,void *value) {
-	return (bctbx_pair_ullong_t *) new pair_ullong_t(key,value);
-	
+template<typename T> bctbx_iterator_t * bctbx_map_find_key_type(bctbx_map_t *map, typename T::key_type key) {
+	bctbx_iterator_t * it = (bctbx_iterator_t*) new typename T::iterator(((T *)map)->find(key));
+	return it;
 }
-extern "C" unsigned long long bctbx_pair_ullong_get_first(const bctbx_pair_ullong_t  * pair) {
-	return ((pair_ullong_t*)pair)->first;
+extern "C" bctbx_iterator_t * bctbx_map_ullong_find_key(bctbx_map_t *map, unsigned long long key) {
+	return bctbx_map_find_key_type<mmap_ullong_t>(map, (mmap_ullong_t::key_type)key);
 }
-extern "C" void* bctbx_pair_get_second(const bctbx_pair_t * pair) {
-	return ((pair_ullong_t*)pair)->second;
+extern "C" bctbx_iterator_t * bctbx_map_cchar_find_key(bctbx_map_t *map, const char * key) {
+	return bctbx_map_find_key_type<mmap_cchar_t>(map, (mmap_cchar_t::key_type)key);
 }
-extern "C" void bctbx_pair_delete(bctbx_pair_t * pair) {
-	delete ((pair_ullong_t*)pair);
+
+template<typename T> size_t bctbx_map_size_type(const bctbx_map_t *map) {
+	return ((T *)map)->size();
+}
+extern "C" size_t bctbx_map_ullong_size(const bctbx_map_t *map) {
+	return bctbx_map_size_type<mmap_ullong_t>(map);
+}
+extern "C" size_t bctbx_map_cchar_size(const bctbx_map_t *map) {
+	return bctbx_map_size_type<mmap_cchar_t>(map);
 }
 
-extern "C" bctbx_iterator_t * bctbx_map_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data) {
-	bctbx_iterator_t * end = bctbx_map_end(map);
+extern "C" bctbx_iterator_t * bctbx_map_ullong_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data) {
+	bctbx_iterator_t * end = bctbx_map_ullong_end(map);
 	
-	for(bctbx_iterator_t * it = bctbx_map_begin(map);!bctbx_iterator_equals(it,end);) {
-		if (compare_func(bctbx_pair_get_second(bctbx_iterator_get_pair(it)),user_data)==0) {
-			bctbx_iterator_delete(end);
+	for(bctbx_iterator_t * it = bctbx_map_ullong_begin(map);!bctbx_iterator_ullong_equals(it,end);) {
+		if (compare_func(bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it)),user_data)==0) {
+			bctbx_iterator_ullong_delete(end);
 			return it;
 		} else {
-			it = bctbx_iterator_get_next(it);
+			it = bctbx_iterator_ullong_get_next(it);
 		}
 		
 	}
-	bctbx_iterator_delete(end);
+	bctbx_iterator_ullong_delete(end);
 	return NULL;
+}
+extern "C" bctbx_iterator_t * bctbx_map_cchar_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data) {
+	bctbx_iterator_t * end = bctbx_map_cchar_end(map);
 	
+	for(bctbx_iterator_t * it = bctbx_map_cchar_begin(map);!bctbx_iterator_cchar_equals(it,end);) {
+		if (compare_func(bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it)),user_data)==0) {
+			bctbx_iterator_cchar_delete(end);
+			return it;
+		} else {
+			it = bctbx_iterator_cchar_get_next(it);
+		}
+		
+	}
+	bctbx_iterator_cchar_delete(end);
+	return NULL;
+}
+
+/*iterator*/
+template<typename T> bctbx_pair_t *bctbx_iterator_get_pair_type(const bctbx_iterator_t *it) {
+	return (bctbx_pair_t *)&(**((typename T::iterator*)it));
+}
+extern "C" bctbx_pair_t *bctbx_iterator_ullong_get_pair(const bctbx_iterator_t *it) {
+	return bctbx_iterator_get_pair_type<mmap_ullong_t>(it);
+}
+extern "C" bctbx_pair_t *bctbx_iterator_cchar_get_pair(const bctbx_iterator_t *it) {
+	return bctbx_iterator_get_pair_type<mmap_cchar_t>(it);
+}
+
+template<typename T> bctbx_iterator_t *bctbx_iterator_get_next_type(bctbx_iterator_t *it) {
+	((typename T::iterator*)it)->operator++();
+	return it;
+}
+extern "C" bctbx_iterator_t *bctbx_iterator_ullong_get_next(bctbx_iterator_t *it) {
+	return bctbx_iterator_get_next_type<mmap_ullong_t>(it);
+}
+extern "C" bctbx_iterator_t *bctbx_iterator_cchar_get_next(bctbx_iterator_t *it) {
+	return bctbx_iterator_get_next_type<mmap_cchar_t>(it);
+}
+extern "C" bctbx_iterator_t *bctbx_iterator_ullong_get_next_and_delete(bctbx_iterator_t *it) {
+	bctbx_iterator_t * next = bctbx_iterator_ullong_get_next(it);
+	bctbx_iterator_ullong_delete(it);
+	return next;
+}
+extern "C" bctbx_iterator_t *bctbx_iterator_cchar_get_next_and_delete(bctbx_iterator_t *it) {
+	bctbx_iterator_t * next = bctbx_iterator_cchar_get_next(it);
+	bctbx_iterator_cchar_delete(it);
+	return next;
+}
+
+template<typename T> bool_t bctbx_iterator_equals_type(const bctbx_iterator_t *a,const bctbx_iterator_t *b) {
+	return *(typename T::iterator*)a == *(typename T::iterator*)b;
+}
+extern "C" bool_t bctbx_iterator_ullong_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b) {
+	return bctbx_iterator_equals_type<mmap_ullong_t>(a, b);
+}
+extern "C" bool_t bctbx_iterator_cchar_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b) {
+	return bctbx_iterator_equals_type<mmap_cchar_t>(a, b);
+}
+
+template<typename T> void bctbx_iterator_delete_type(bctbx_iterator_t *it) {
+	delete ((typename T::iterator*)it);
+}
+extern "C" void bctbx_iterator_ullong_delete(bctbx_iterator_t *it) {
+	bctbx_iterator_delete_type<mmap_ullong_t>(it);
+}
+extern "C" void bctbx_iterator_cchar_delete(bctbx_iterator_t *it) {
+	bctbx_iterator_delete_type<mmap_cchar_t>(it);
+}
+
+/*pair*/
+template<typename T> typename T::value_type * bctbx_pair_new(typename T::key_type key,void *value) {
+	return (typename T::value_type *) new typename T::value_type(key,value);
+}
+extern "C" bctbx_pair_ullong_t * bctbx_pair_ullong_new(unsigned long long key,void *value) {
+	return (bctbx_pair_ullong_t *)bctbx_pair_new<mmap_ullong_t>((mmap_ullong_t::key_type)key, value);
+}
+extern "C" bctbx_pair_cchar_t * bctbx_pair_cchar_new(const char * key,void *value) {
+	return (bctbx_pair_cchar_t *)bctbx_pair_new<mmap_cchar_t>((mmap_cchar_t::key_type)key, value);
+}
+
+template<typename T> typename T::key_type bctbx_pair_get_first(const typename T::value_type  * pair) {
+	return ((typename T::value_type*)pair)->first;
+}
+extern "C" unsigned long long bctbx_pair_ullong_get_first(const bctbx_pair_ullong_t * pair) {
+	return bctbx_pair_get_first<mmap_ullong_t>((pair_ullong_t *)pair);
+}
+extern "C" const char * bctbx_pair_cchar_get_first(const bctbx_pair_cchar_t * pair) {
+	return bctbx_pair_get_first<mmap_cchar_t>((pair_cchar_t *)pair).c_str();
+}
+
+template<typename T> void* bctbx_pair_get_second_type(const bctbx_pair_t * pair) {
+	return ((T*)pair)->second;
+}
+extern "C" void* bctbx_pair_ullong_get_second(const bctbx_pair_t * pair) {
+	return bctbx_pair_get_second_type<pair_ullong_t>(pair);
+}
+extern "C" void* bctbx_pair_cchar_get_second(const bctbx_pair_t * pair) {
+	return bctbx_pair_get_second_type<pair_cchar_t>(pair);
+}
+
+template<typename T> void bctbx_pair_delete_type(bctbx_pair_t * pair) {
+	delete ((T*)pair);
+}
+extern "C" void bctbx_pair_ullong_delete(bctbx_pair_t * pair) {
+	bctbx_pair_delete_type<pair_ullong_t>(pair);
 }
-extern "C" size_t bctbx_map_size(const bctbx_map_t *map) {
-	return ((mmap_ullong_t *)map)->size();
+extern "C" void bctbx_pair_cchar_delete(bctbx_pair_t * pair) {
+	bctbx_pair_delete_type<pair_cchar_t>(pair);
 }
diff --git a/tester/containers.cc b/tester/containers.cc
index 2e1470a..6c6f404 100644
--- a/tester/containers.cc
+++ b/tester/containers.cc
@@ -31,33 +31,33 @@ static void multimap_insert(void) {
 	for(i=0;i<N;i++) {
 		bctbx_pair_t* pair = (bctbx_pair_t*)bctbx_pair_ullong_new(N-i-1, (void*)((long)N-i-1));
 		ref = bctbx_list_append(ref, (void*)i);
-		bctbx_map_insert(mmap, pair);
-		bctbx_pair_delete(pair);
+		bctbx_map_ullong_insert(mmap, pair);
+		bctbx_pair_ullong_delete(pair);
 	}
-	BC_ASSERT_EQUAL(bctbx_map_size(mmap),N, int, "%i");
+	BC_ASSERT_EQUAL(bctbx_map_ullong_size(mmap),N, int, "%i");
 	
-	it = bctbx_map_begin(mmap);
+	it = bctbx_map_ullong_begin(mmap);
 	head = bctbx_list_first_elem(ref);
 	for(ref = bctbx_list_first_elem(ref);ref!=NULL;ref=bctbx_list_next(ref)) {
-		BC_ASSERT_EQUAL( (long)bctbx_pair_get_second(bctbx_iterator_get_pair(it))
+		BC_ASSERT_EQUAL( (long)bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it))
 						, (long)bctbx_list_get_data(ref)
 						, long, "%lu");
-		it = bctbx_iterator_get_next(it);
+		it = bctbx_iterator_ullong_get_next(it);
 	}
-	bctbx_iterator_delete(it);
+	bctbx_iterator_ullong_delete(it);
 	
 	ref = head;
-	end = bctbx_map_end(mmap);
+	end = bctbx_map_ullong_end(mmap);
 	
-	for(it = bctbx_map_begin(mmap);!bctbx_iterator_equals(it,end);it = bctbx_iterator_get_next(it)) {
+	for(it = bctbx_map_ullong_begin(mmap);!bctbx_iterator_ullong_equals(it,end);it = bctbx_iterator_ullong_get_next(it)) {
 		BC_ASSERT_PTR_NOT_NULL(ref);
-		BC_ASSERT_EQUAL( (long)bctbx_pair_get_second(bctbx_iterator_get_pair(it))
+		BC_ASSERT_EQUAL( (long)bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it))
 						, (long)bctbx_list_get_data(ref)
 						, long, "%lu");
 		ref=bctbx_list_next(ref);
 	}
-	bctbx_iterator_delete(it);
-	bctbx_iterator_delete(end);
+	bctbx_iterator_ullong_delete(it);
+	bctbx_iterator_ullong_delete(end);
 	bctbx_list_free(head);
 	bctbx_mmap_ullong_delete(mmap);
 }
@@ -70,26 +70,26 @@ static void multimap_erase(void) {
 	int N = 100;
 	
 	for(i=0;i<N;i++) {
-		bctbx_map_insert_and_delete(mmap, (bctbx_pair_t*)bctbx_pair_ullong_new(i, (void*)((long)i)));
+		bctbx_map_ullong_insert_and_delete(mmap, (bctbx_pair_t*)bctbx_pair_ullong_new(i, (void*)((long)i)));
 	}
 	
-	end= bctbx_map_end(mmap);
+	end= bctbx_map_ullong_end(mmap);
 	
-	for(it = bctbx_map_begin(mmap);!bctbx_iterator_equals(it,end);) {
-		long value = (long)bctbx_pair_get_second(bctbx_iterator_get_pair(it));
+	for(it = bctbx_map_ullong_begin(mmap);!bctbx_iterator_ullong_equals(it,end);) {
+		long value = (long)bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it));
 		if (value < N/2) {
-			it = bctbx_map_erase(mmap, it);
+			it = bctbx_map_ullong_erase(mmap, it);
 		} else {
 			break;
 		}
 	}
-	it = bctbx_map_begin(mmap);
-	BC_ASSERT_EQUAL((long)bctbx_pair_get_second(bctbx_iterator_get_pair(it))
+	it = bctbx_map_ullong_begin(mmap);
+	BC_ASSERT_EQUAL((long)bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it))
 					, N/2
 					,long, "%lu");
 					
 	bctbx_mmap_ullong_delete(mmap);
-	bctbx_iterator_delete(end);
+	bctbx_iterator_ullong_delete(end);
 	
 }
 static int compare_func(const void *a, const void*b) {
@@ -102,14 +102,98 @@ static void multimap_find_custom(void) {
 	
 	for(i=0;i<N;i++) {
 		bctbx_pair_t* pair = (bctbx_pair_t*)bctbx_pair_ullong_new(i, (void*)((long)i));
-		bctbx_map_insert_and_delete(mmap, pair);
+		bctbx_map_ullong_insert_and_delete(mmap, pair);
 	}
-	bctbx_iterator_t * it = bctbx_map_find_custom(mmap, compare_func, (void*)10l);
-	BC_ASSERT_EQUAL((long)bctbx_pair_get_second(bctbx_iterator_get_pair(it))
+	bctbx_iterator_t * it = bctbx_map_ullong_find_custom(mmap, compare_func, (void*)10l);
+	BC_ASSERT_EQUAL((long)bctbx_pair_ullong_get_second(bctbx_iterator_ullong_get_pair(it))
 					, 0
 					,long, "%lu");
 	bctbx_mmap_ullong_delete(mmap);
-	bctbx_iterator_delete(it);
+	bctbx_iterator_ullong_delete(it);
+}
+
+static void multimap_insert_cchar(void) {
+	bctbx_map_t *mmap = bctbx_mmap_cchar_new();	bctbx_iterator_t *it,*end;
+	long i=0;
+	int N = 100;
+	
+	for(i=0;i<N;i++) {
+		char str[32];
+		std::snprintf(str, sizeof(str), "%ld", N-i-1);
+		bctbx_pair_t* pair = (bctbx_pair_t*)bctbx_pair_cchar_new((const char *)str, (void*)((long)N-i-1));
+		bctbx_map_cchar_insert(mmap, pair);
+		bctbx_pair_cchar_delete(pair);
+	}
+	BC_ASSERT_EQUAL(bctbx_map_cchar_size(mmap),N, int, "%i");
+
+	for(i = 0;i < N;i++) {
+		char str[32];
+		std::snprintf(str, sizeof(str), "%ld", i);
+		it = bctbx_map_cchar_find_key(mmap, (const char *)str);
+		BC_ASSERT_EQUAL( (long)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))
+						, (long)i
+						, long, "%lu");
+	}
+	
+	end = bctbx_map_cchar_end(mmap);
+	
+	bctbx_iterator_cchar_delete(it);
+	bctbx_iterator_cchar_delete(end);
+	bctbx_mmap_cchar_delete(mmap);
+}
+
+static void multimap_erase_cchar(void) {
+	bctbx_map_t *mmap = bctbx_mmap_cchar_new();
+	bctbx_iterator_t *it;
+	bctbx_iterator_t *end;
+	long i=0;
+	int N = 100;
+	
+	for(i=0;i<N;i++) {
+		char str[32];
+		std::snprintf(str, sizeof(str),"%ld", i);
+		bctbx_map_cchar_insert_and_delete(mmap, (bctbx_pair_t*)bctbx_pair_cchar_new((const char *)str, (void*)((long)i)));
+	}
+	
+	end= bctbx_map_cchar_end(mmap);
+	
+	for(it = bctbx_map_cchar_begin(mmap);!bctbx_iterator_cchar_equals(it,end);) {
+		long value = (long)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it));
+		if (value < N/2) {
+			it = bctbx_map_cchar_erase(mmap, it);
+		} else {
+			break;
+		}
+	}
+	it = bctbx_map_cchar_begin(mmap);
+	BC_ASSERT_EQUAL((long)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))
+					, N/2
+					,long, "%lu");
+	
+	bctbx_mmap_cchar_delete(mmap);
+	bctbx_iterator_cchar_delete(end);
+	
+}
+static int compare_func_cchar(const void *a, const void*b) {
+	return (long)a == (long)b;
+}
+static void multimap_find_custom_cchar(void) {
+	bctbx_map_t *mmap = bctbx_mmap_cchar_new();
+	long i=0;
+	int N = 100;
+	
+	for(i=0;i<N;i++) {
+		char str[32];
+		std::snprintf(str, sizeof(str), "%ld", i);
+		bctbx_pair_t* pair = (bctbx_pair_t*)bctbx_pair_cchar_new((const char *)str, (void*)((long)i));
+		bctbx_map_cchar_insert_and_delete(mmap, pair);
+	}
+	bctbx_iterator_t * it = bctbx_map_cchar_find_custom(mmap, compare_func, (void*)10l);
+	BC_ASSERT_EQUAL((long)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))
+					, 0
+					,long, "%lu");
+	bctbx_mmap_cchar_delete(mmap);
+	bctbx_iterator_cchar_delete(it);
 }
 
 
@@ -117,6 +201,9 @@ static test_t container_tests[] = {
 	TEST_NO_TAG("mmap insert", multimap_insert),
 	TEST_NO_TAG("mmap erase", multimap_erase),
 	TEST_NO_TAG("mmap find custom", multimap_find_custom),
+	TEST_NO_TAG("mmap insert cchar", multimap_insert_cchar),
+	TEST_NO_TAG("mmap erase cchar", multimap_erase_cchar),
+	TEST_NO_TAG("mmap find custom cchar", multimap_find_custom_cchar),
 };
 
 test_suite_t containers_test_suite = {"Containers", NULL, NULL, NULL, NULL,

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/bctoolbox.git



More information about the Pkg-voip-commits mailing list