void multimap_init_copy(multimap_t* pt_multimapdest, const multimap_t* cpt_multimapsrc) { assert(pt_multimapdest != NULL && cpt_multimapsrc != NULL); assert( pt_multimapdest->_t_pair._t_firsttypesize == cpt_multimapsrc->_t_pair._t_firsttypesize && pt_multimapdest->_t_pair._t_secondtypesize == cpt_multimapsrc->_t_pair._t_secondtypesize); assert( strncmp( pt_multimapdest->_t_pair._sz_firsttypename, cpt_multimapsrc->_t_pair._sz_firsttypename, _ELEM_TYPE_NAME_SIZE) == 0 && strncmp( pt_multimapdest->_t_pair._sz_secondtypename, cpt_multimapsrc->_t_pair._sz_secondtypename, _ELEM_TYPE_NAME_SIZE) == 0); /* initialize dest multimap with src multimap attribute */ multimap_init(pt_multimapdest); /* insert all element from src to dest */ if(!multimap_empty(cpt_multimapsrc)) { multimap_insert_range( pt_multimapdest, multimap_begin(cpt_multimapsrc), multimap_end(cpt_multimapsrc)); } }
void multimap_assign(multimap_t* pt_multimapdest, const multimap_t* cpt_multimapsrc) { assert(pt_multimapdest != NULL && cpt_multimapsrc != NULL); assert( _same_multimap_pair_type( &pt_multimapdest->_t_pair, &cpt_multimapsrc->_t_pair)); /* destroy dest multimap */ multimap_destroy(pt_multimapdest); /* initialize dest multimap with src multimap attribute */ multimap_init(pt_multimapdest); /* insert all element from src to dest */ if(!multimap_empty(cpt_multimapsrc)) { multimap_insert_range( pt_multimapdest, multimap_begin(cpt_multimapsrc), multimap_end(cpt_multimapsrc)); } }
void _attribute_sort_items_(container **X, enum attr_sort_enum sort, char sort_reverse) { if (*X == NULL) return; int i, j; container *N = NULL; /* printf("sort: "); switch (sort) { case sort_none: printf("sort_none"); break; case sort_hits: printf("sort_hits"); break; case sort_alpha: printf("sort_alpha"); break; } if (sort_reverse) printf(" (reverse)"); printf("\n"); for (i=0; i<vector_size(*X); i++) { struct _attr_tree_ *item = vector_get(*X, i).ptr; printf(" %.8x name:%s hits:%i\n", (int)X, item->name, item->hits); } */ if (sort == sort_hits) N = multimap_container( int_container(), ptr_container() ); else if (sort == sort_alpha) N = multimap_container( string_container(), ptr_container() ); for (i=0; i<vector_size(*X); i++) { struct _attr_tree_ *item = vector_get(*X, i).ptr; if (item->children != NULL) _attribute_sort_items_(&(item->children), item->sort, item->sort_reverse); if (sort == sort_hits) multimap_insert(N, item->hits, item); else if (sort == sort_alpha) { if (item->name!=NULL) multimap_insert(N, item->name, item); else if (item->value!=NULL) multimap_insert(N, item->name, item); else if (item->name!=NULL) multimap_insert(N, item->name, item); else multimap_insert(N, item->name, item); } } if (!sort_reverse && sort != sort_hits && sort != sort_alpha) return; container *Y = vector_container( ptr_container() ); iterator it; if ((sort == sort_hits && sort_reverse) || (sort == sort_alpha && !sort_reverse)) { it = multimap_begin(N); for (; it.valid; it=multimap_next(it)) vector_pushback(Y, map_val(it).ptr); } else { if (sort != sort_hits && sort != sort_alpha) { for (i=vector_size(*X)-1; i>=0; i--) vector_pushback(Y, vector_get(*X, i).ptr); } else { it = multimap_end(N); for (; it.valid; it=multimap_previous(it)) vector_pushback(Y, map_val(it).ptr); } } if (N != NULL) destroy(N); destroy(*X); *X = Y; /* for (i=0; i<vector_size(*X); i++) { struct _attr_tree_ *item = vector_get(*X, i).ptr; printf(" %.8x name:%s hits:%i\n", (int)X, item->name, item->hits); } */ return; }