/** * Initialize pair container with pair. */ void pair_init_copy(pair_t* ppair_dest, const pair_t* cppair_src) { bool_t b_result = false; assert(ppair_dest != NULL); assert(cppair_src != NULL); assert(_pair_is_created(ppair_dest)); assert(_pair_is_inited(cppair_src)); assert(_pair_same_type(ppair_dest, cppair_src)); /* initialize dest pair */ pair_init(ppair_dest); /* copy element */ b_result = _GET_PAIR_FIRST_TYPE_SIZE(ppair_dest); _GET_PAIR_FIRST_TYPE_COPY_FUNCTION(ppair_dest)(ppair_dest->_pv_first, cppair_src->_pv_first, &b_result); assert(b_result); b_result = _GET_PAIR_SECOND_TYPE_SIZE(ppair_dest); _GET_PAIR_SECOND_TYPE_COPY_FUNCTION(ppair_dest)(ppair_dest->_pv_second, cppair_src->_pv_second, &b_result); assert(b_result); ppair_dest->_bfun_mapkeycompare = cppair_src->_bfun_mapkeycompare; ppair_dest->_bfun_mapvaluecompare = cppair_src->_bfun_mapvaluecompare; }
/** * Tests if the two pair are equal. */ bool_t pair_equal(const pair_t* cppair_first, const pair_t* cppair_second) { bool_t b_less = false; bool_t b_greater = false; assert(cppair_first != NULL); assert(cppair_second != NULL); assert(_pair_is_inited(cppair_first)); assert(_pair_is_inited(cppair_second)); assert(_pair_same_type(cppair_first, cppair_second)); if (cppair_first == cppair_second) { return true; } /* compare first */ b_less = b_greater = _GET_PAIR_FIRST_TYPE_SIZE(cppair_first); _GET_PAIR_FIRST_TYPE_LESS_FUNCTION(cppair_first)(cppair_first->_pv_first, cppair_second->_pv_first, &b_less); _GET_PAIR_FIRST_TYPE_LESS_FUNCTION(cppair_first)(cppair_second->_pv_first, cppair_first->_pv_first, &b_greater); if (b_less || b_greater) { return false; } /* compare second */ b_less = b_greater = _GET_PAIR_SECOND_TYPE_SIZE(cppair_first); _GET_PAIR_SECOND_TYPE_LESS_FUNCTION(cppair_first)(cppair_first->_pv_second, cppair_second->_pv_second, &b_less); _GET_PAIR_SECOND_TYPE_LESS_FUNCTION(cppair_first)(cppair_second->_pv_second, cppair_first->_pv_second, &b_greater); if (b_less || b_greater) { return false; } return true; }
/** * Destroy pair container auxiliary function. */ void _pair_destroy_auxiliary(pair_t* ppair_pair) { assert(ppair_pair != NULL); assert(_pair_is_inited(ppair_pair) || _pair_is_created(ppair_pair)); if (ppair_pair->_pv_first != NULL && ppair_pair->_pv_second != NULL) { bool_t b_result = false; /* destroy first */ b_result = _GET_PAIR_FIRST_TYPE_SIZE(ppair_pair); _GET_PAIR_FIRST_TYPE_DESTROY_FUNCTION(ppair_pair)(ppair_pair->_pv_first, &b_result); assert(b_result); free(ppair_pair->_pv_first); ppair_pair->_pv_first = NULL; /* destroy second */ b_result = _GET_PAIR_SECOND_TYPE_SIZE(ppair_pair); _GET_PAIR_SECOND_TYPE_DESTROY_FUNCTION(ppair_pair)(ppair_pair->_pv_second, &b_result); assert(b_result); free(ppair_pair->_pv_second); ppair_pair->_pv_second = NULL; } ppair_pair->_bfun_mapkeycompare = NULL; ppair_pair->_bfun_mapvaluecompare = NULL; }
/** * Initialize pair container. */ void pair_init(pair_t* ppair_pair) { assert(ppair_pair != NULL); assert(_pair_is_created(ppair_pair)); if ((ppair_pair->_pv_first = malloc(_GET_PAIR_FIRST_TYPE_SIZE(ppair_pair))) == NULL) { fprintf(stderr, "CSTL FATAL ERROR: memory allocation error!\n"); exit(EXIT_FAILURE); } else { memset(ppair_pair->_pv_first, 0x00, _GET_PAIR_FIRST_TYPE_SIZE(ppair_pair)); } if ((ppair_pair->_pv_second = malloc(_GET_PAIR_SECOND_TYPE_SIZE(ppair_pair))) == NULL) { fprintf(stderr, "CSTL FATAL ERROR: memory allocation error!\n"); exit(EXIT_FAILURE); } else { memset(ppair_pair->_pv_second, 0x00, _GET_PAIR_SECOND_TYPE_SIZE(ppair_pair)); } /* initialize new elements */ if (_GET_PAIR_FIRST_TYPE_STYLE(ppair_pair) == _TYPE_CSTL_BUILTIN) { /* get element type name */ char s_elemtypename[_TYPE_NAME_SIZE + 1]; _type_get_elem_typename(_GET_PAIR_FIRST_TYPE_NAME(ppair_pair), s_elemtypename); _GET_PAIR_FIRST_TYPE_INIT_FUNCTION(ppair_pair)(ppair_pair->_pv_first, s_elemtypename); } else { bool_t b_result = _GET_PAIR_FIRST_TYPE_SIZE(ppair_pair); _GET_PAIR_FIRST_TYPE_INIT_FUNCTION(ppair_pair)(ppair_pair->_pv_first, &b_result); assert(b_result); } if (_GET_PAIR_SECOND_TYPE_STYLE(ppair_pair) == _TYPE_CSTL_BUILTIN) { /* get element type name */ char s_elemtypename[_TYPE_NAME_SIZE + 1]; _type_get_elem_typename(_GET_PAIR_SECOND_TYPE_NAME(ppair_pair), s_elemtypename); _GET_PAIR_SECOND_TYPE_INIT_FUNCTION(ppair_pair)(ppair_pair->_pv_second, s_elemtypename); } else { bool_t b_result = _GET_PAIR_SECOND_TYPE_SIZE(ppair_pair); _GET_PAIR_SECOND_TYPE_INIT_FUNCTION(ppair_pair)(ppair_pair->_pv_second, &b_result); assert(b_result); } }