Example #1
0
/**
 * Test whether two iterator are equal types.
 */
bool_t _iterator_same_type(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_is_valid(it_first));
    assert(_iterator_is_valid(it_second));

    if (it_first._t_containertype == it_second._t_containertype &&
        it_first._t_iteratortype == it_second._t_iteratortype) {
        return true;
    } else {
        return false;
    }
}
/**
 * Move iterator to prev n position.
 */
iterator_t iterator_prev_n(iterator_t it_iter, int n_step)
{
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _RANDOM_ACCESS_ITERATOR));

    if (n_step == 0) {
        return it_iter;
    }

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_prev_n(it_iter, n_step);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_prev_n(it_iter, n_step);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_prev_n(it_iter, n_step);
            break;
        default:
            assert(false);
            return it_iter;
            break;
    }
}
/**
 * Set value that pointed by iterator.
 */
void iterator_set_value(iterator_t it_iter, const void* cpv_value)
{
    assert(cpv_value != NULL);
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _OUTPUT_ITERATOR));
 
    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            _vector_iterator_set_value(it_iter, cpv_value);
            break;
        case _LIST_CONTAINER:
            _list_iterator_set_value(it_iter, cpv_value);
            break;
        case _DEQUE_CONTAINER:
            _deque_iterator_set_value(it_iter, cpv_value);
            break;
						/*  
        case _SLIST_CONTAINER:
            _slist_iterator_set_value(it_iter, cpv_value);
            break;
        */
				case _BASIC_STRING_CONTAINER:
            _basic_string_iterator_set_value(it_iter, cpv_value);
            break;
        default:
            assert(false);
            break;
    }
}
/**
 * Test two iterator are equal or not.
 */
bool_t iterator_equal(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_is_valid(it_first));
    assert(_iterator_is_valid(it_second));
    assert(_iterator_limit_type(it_first, _INPUT_ITERATOR));
    assert(_iterator_limit_type(it_second, _INPUT_ITERATOR));

    if (it_first._t_containertype != it_second._t_containertype) {
        return false;
    }

    switch (it_first._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_equal(it_first, it_second);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_equal(it_first, it_second);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_equal(it_first, it_second);
            break;
						/*
        case _SLIST_CONTAINER:
            return _slist_iterator_equal(it_first, it_second);
            break;
						*/
        case _SET_CONTAINER:
            return _set_iterator_equal(it_first, it_second);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_equal(it_first, it_second);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_equal(it_first, it_second);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_equal(it_first, it_second);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_equal(it_first, it_second);
            break;
        default:
            assert(false);
            return false;
            break;
    }
}
Example #5
0
/**
 * Test the type that saved in the avl tree container and referenced by it_iter are same.
 */
bool_t _avl_tree_same_iterator_type(const _avl_tree_t* cpt_avl_tree, iterator_t it_iter)
{
    assert(cpt_avl_tree != NULL);
    assert(_avl_tree_is_inited(cpt_avl_tree) || _avl_tree_is_created(cpt_avl_tree));
    assert(_iterator_is_valid(it_iter));

    return _type_is_same_ex(&cpt_avl_tree->_t_typeinfo, _iterator_get_typeinfo(it_iter));
}
Example #6
0
/**
 * Test the type that saved in the vector container and referenced by it_iter are same.
 */
bool_t _vector_same_iterator_type(const vector_t* cpvec_vector, iterator_t it_iter)
{
    assert(cpvec_vector != NULL);
    assert(_vector_is_inited(cpvec_vector) || _vector_is_created(cpvec_vector));
    assert(_iterator_is_valid(it_iter));

    return _type_is_same_ex(&cpvec_vector->_t_typeinfo, _iterator_get_typeinfo(it_iter));
}
/**
 * Iterator distance.
 */
int iterator_minus(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_is_valid(it_first));
    assert(_iterator_is_valid(it_second));
    assert(_iterator_limit_type(it_first, _RANDOM_ACCESS_ITERATOR));

    switch (it_first._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_minus(it_first, it_second);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_minus(it_first, it_second);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_minus(it_first, it_second);
            break;
        default:
            assert(false);
            return 0;
            break;
    }
}
Example #8
0
/**
 * Get pointer that pointed by iterator, but ignore char*.
 */
const void* _iterator_get_pointer_ignore_cstr(iterator_t it_iter)
{
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _INPUT_ITERATOR));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _SLIST_CONTAINER:
            return _slist_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _SET_CONTAINER:
            return _set_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _MULTISET_CONTAINER:
            return _multiset_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _MULTIMAP_CONTAINER:
            return _multimap_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _HASH_MULTISET_CONTAINER:
            return _hash_multiset_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _HASH_MULTIMAP_CONTAINER:
            return _hash_multimap_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_get_pointer_ignore_cstr(it_iter);
            break;
        default:
            assert(false);
            return NULL;
            break;
    }
}
/**
 * Iterator distance for all iterator type.
 */
int iterator_distance(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_is_valid(it_first));
    assert(_iterator_is_valid(it_second));
    assert(_iterator_same_type(it_first, it_second));

    switch (it_first._t_containertype) {
        case _VECTOR_CONTAINER:
        case _DEQUE_CONTAINER:
        case _BASIC_STRING_CONTAINER:
            return iterator_minus(it_second, it_first);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_distance(it_first, it_second);
            break;
						/*  
        case _SLIST_CONTAINER:
            return _slist_iterator_distance(it_first, it_second);
            break;
*/
        case _SET_CONTAINER:
            return _set_iterator_distance(it_first, it_second);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_distance(it_first, it_second);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_distance(it_first, it_second);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_distance(it_first, it_second);
            break;
        default:
            assert(false);
            return 0;
            break;
    }
}
Example #10
0
/**
 * Get typeinfo of iterator.
 */
_typeinfo_t* _iterator_get_typeinfo(iterator_t it_iter)
{
    assert(_iterator_is_valid(it_iter));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return &((vector_t*)it_iter._pt_container)->_t_typeinfo;
            break;
        case _DEQUE_CONTAINER:
            return &((deque_t*)it_iter._pt_container)->_t_typeinfo;
            break;
        case _BASIC_STRING_CONTAINER:
            return &((basic_string_t*)it_iter._pt_container)->_vec_base._t_typeinfo;
            break;
        case _LIST_CONTAINER:
            return &((list_t*)it_iter._pt_container)->_t_typeinfo;
            break;
        case _SLIST_CONTAINER:
            return &((slist_t*)it_iter._pt_container)->_t_typeinfo;
            break;
        case _SET_CONTAINER:
            return &((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo;
            break;
        case _MULTISET_CONTAINER:
            return &((multiset_t*)it_iter._pt_container)->_t_tree._t_typeinfo;
            break;
        case _MAP_CONTAINER:
            return &((map_t*)it_iter._pt_container)->_t_tree._t_typeinfo;
            break;
        case _MULTIMAP_CONTAINER:
            return &((multimap_t*)it_iter._pt_container)->_t_tree._t_typeinfo;
            break;
        case _HASH_SET_CONTAINER:
            return &((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo;
            break;
        case _HASH_MULTISET_CONTAINER:
            return &((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo;
            break;
        case _HASH_MAP_CONTAINER:
            return &((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo;
            break;
        case _HASH_MULTIMAP_CONTAINER:
            return &((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo;
            break;
        default:
            assert(false);
            return NULL;
            break;
    }
}
Example #11
0
/**
 * Test whether the iterator type of restriction.
 */
bool_t _iterator_limit_type(iterator_t it_iter, iteratortype_t t_limittype)
{
    assert(_iterator_is_valid(it_iter));

    /* check iterator type */
    switch (t_limittype) {
        case _INPUT_ITERATOR:
            if (it_iter._t_iteratortype == _RANDOM_ACCESS_ITERATOR ||
                it_iter._t_iteratortype == _BIDIRECTIONAL_ITERATOR ||
                it_iter._t_iteratortype == _FORWARD_ITERATOR ||
                it_iter._t_iteratortype == _INPUT_ITERATOR) {
                return true;
            }
            break;
        case _OUTPUT_ITERATOR:
            if (it_iter._t_iteratortype == _RANDOM_ACCESS_ITERATOR ||
                it_iter._t_iteratortype == _BIDIRECTIONAL_ITERATOR ||
                it_iter._t_iteratortype == _FORWARD_ITERATOR ||
                it_iter._t_iteratortype == _OUTPUT_ITERATOR) {
                return true;
            }
            break;
        case _FORWARD_ITERATOR:
            if (it_iter._t_iteratortype == _RANDOM_ACCESS_ITERATOR ||
                it_iter._t_iteratortype == _BIDIRECTIONAL_ITERATOR ||
                it_iter._t_iteratortype == _FORWARD_ITERATOR) {
                return true;
            }
            break;
        case _BIDIRECTIONAL_ITERATOR:
            if (it_iter._t_iteratortype == _RANDOM_ACCESS_ITERATOR ||
                it_iter._t_iteratortype == _BIDIRECTIONAL_ITERATOR) {
                return true;
            }
            break;
        case _RANDOM_ACCESS_ITERATOR:
            if (it_iter._t_iteratortype == _RANDOM_ACCESS_ITERATOR) {
                return true;
            }
            break;
        default:
            assert(false);
            break;
    }

    return false;
}
/**
 * Get value that pointed by iterator.
 */
void iterator_get_value(iterator_t it_iter, void* pv_value)
{
    assert(pv_value != NULL);
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _INPUT_ITERATOR));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            _vector_iterator_get_value(it_iter, pv_value);
            break;
        case _LIST_CONTAINER:
            _list_iterator_get_value(it_iter, pv_value);
            break;
        case _DEQUE_CONTAINER:
            _deque_iterator_get_value(it_iter, pv_value);
            break;
						/*
        case _SLIST_CONTAINER:
            _slist_iterator_get_value(it_iter, pv_value);
            break;
						*/
        case _SET_CONTAINER:
            _set_iterator_get_value(it_iter, pv_value);
            break;
        case _MAP_CONTAINER:
            _map_iterator_get_value(it_iter, pv_value);
            break;
        case _HASH_SET_CONTAINER:
            _hash_set_iterator_get_value(it_iter, pv_value);
            break;
        case _HASH_MAP_CONTAINER:
            _hash_map_iterator_get_value(it_iter, pv_value);
            break;
        case _BASIC_STRING_CONTAINER:
            _basic_string_iterator_get_value(it_iter, pv_value);
            break;
        default:
            assert(false);
            break;
    }
}
/**
 * Element random access.
 */
void* iterator_at(iterator_t it_iter, int n_index)
{
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _RANDOM_ACCESS_ITERATOR));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_at(it_iter, n_index);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_at(it_iter, n_index);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_at(it_iter, n_index);
            break;
        default:
            assert(false);
            return NULL;
            break;
    }
}
/**
 * Move iterator to next position.
 */
iterator_t iterator_next(iterator_t it_iter)
{
    assert(_iterator_is_valid(it_iter));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_next(it_iter);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_next(it_iter);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_next(it_iter);
            break;
						/*  
        case _SLIST_CONTAINER:
            return _slist_iterator_next(it_iter);
            break;
       */
				case _SET_CONTAINER:
            return _set_iterator_next(it_iter);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_next(it_iter);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_next(it_iter);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_next(it_iter);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_next(it_iter);
            break;
        default:
            assert(false);
            return it_iter;
            break;
    }
}
/**
 * Move iterator to previous position.
 */
iterator_t iterator_prev(iterator_t it_iter)
{
    assert(_iterator_is_valid(it_iter));
    assert(_iterator_limit_type(it_iter, _BIDIRECTIONAL_ITERATOR));

    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_prev(it_iter);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_prev(it_iter);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_prev(it_iter);
            break;
        case _SET_CONTAINER:
            return _set_iterator_prev(it_iter);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_prev(it_iter);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_prev(it_iter);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_prev(it_iter);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_prev(it_iter);
            break;
        default:
            assert(false);
            return it_iter;
            break;
    }
}
/**
 * Select binary function accroding to binary function type.
 */
bfun_t _fun_get_binary(iterator_t it_iter, fun_type_t ftype_type)
{
    const char*  s_typename = NULL;
    _typeinfo_t* pt_typeinfo = NULL;

    assert(_iterator_is_valid(it_iter));
    assert(ftype_type >= _PLUS_FUN && ftype_type <= _LOGICAL_OR_FUN);

    s_typename = _iterator_get_typebasename(it_iter);
    pt_typeinfo = _iterator_get_typeinfo(it_iter);
    if (s_typename == NULL) {
        return fun_default_binary;
    }

    if (strncmp(s_typename, _CHAR_TYPE, _TYPE_NAME_SIZE) == 0 ||
        strncmp(s_typename, _SIGNED_CHAR_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* char */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_char;                   break;
            case _MINUS_FUN:            return fun_minus_char;                  break;
            case _MULTIPLIES_FUN:       return fun_multiplies_char;             break;
            case _DIVIDES_FUN:          return fun_divides_char;                break;
            case _MODULUS_FUN:          return fun_modulus_char;                break;
            case _EQUAL_FUN:            return fun_equal_char;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_char;              break;
            case _GREATER_FUN:          return fun_greater_char;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_char;          break;
            case _LESS_FUN:             return fun_less_char;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_char;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _UNSIGNED_CHAR_TYPE, _TYPE_NAME_SIZE) == 0) {        /* unsigned char */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_uchar;                  break;
            case _MINUS_FUN:            return fun_minus_uchar;                 break;
            case _MULTIPLIES_FUN:       return fun_multiplies_uchar;            break;
            case _DIVIDES_FUN:          return fun_divides_uchar;               break;
            case _MODULUS_FUN:          return fun_modulus_uchar;               break;
            case _EQUAL_FUN:            return fun_equal_uchar;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_uchar;             break;
            case _GREATER_FUN:          return fun_greater_uchar;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_uchar;         break;
            case _LESS_FUN:             return fun_less_uchar;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_uchar;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0) {     /* short */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_short;                  break;
            case _MINUS_FUN:            return fun_minus_short;                 break;
            case _MULTIPLIES_FUN:       return fun_multiplies_short;            break;
            case _DIVIDES_FUN:          return fun_divides_short;               break;
            case _MODULUS_FUN:          return fun_modulus_short;               break;
            case _EQUAL_FUN:            return fun_equal_short;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_short;             break;
            case _GREATER_FUN:          return fun_greater_short;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_short;         break;
            case _LESS_FUN:             return fun_less_short;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_short;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _UNSIGNED_SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0) {   /* unsigned short */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_ushort;                 break;
            case _MINUS_FUN:            return fun_minus_ushort;                break;
            case _MULTIPLIES_FUN:       return fun_multiplies_ushort;           break;
            case _DIVIDES_FUN:          return fun_divides_ushort;              break;
            case _MODULUS_FUN:          return fun_modulus_ushort;              break;
            case _EQUAL_FUN:            return fun_equal_ushort;                break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_ushort;            break;
            case _GREATER_FUN:          return fun_greater_ushort;              break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_ushort;        break;
            case _LESS_FUN:             return fun_less_ushort;                 break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_ushort;           break;
            default: break;
        }
    } else if (strncmp(s_typename, _INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_TYPE, _TYPE_NAME_SIZE) == 0) {               /* int */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_int;                    break;
            case _MINUS_FUN:            return fun_minus_int;                   break;
            case _MULTIPLIES_FUN:       return fun_multiplies_int;              break;
            case _DIVIDES_FUN:          return fun_divides_int;                 break;
            case _MODULUS_FUN:          return fun_modulus_int;                 break;
            case _EQUAL_FUN:            return fun_equal_int;                   break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_int;               break;
            case _GREATER_FUN:          return fun_greater_int;                 break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_int;           break;
            case _LESS_FUN:             return fun_less_int;                    break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_int;              break;
            default: break;
        }
    } else if (strncmp(s_typename, _UNSIGNED_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_INT_TYPE, _TYPE_NAME_SIZE) == 0) {         /* unsigned int */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_uint;                   break;
            case _MINUS_FUN:            return fun_minus_uint;                  break;
            case _MULTIPLIES_FUN:       return fun_multiplies_uint;             break;
            case _DIVIDES_FUN:          return fun_divides_uint;                break;
            case _MODULUS_FUN:          return fun_modulus_uint;                break;
            case _EQUAL_FUN:            return fun_equal_uint;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_uint;              break;
            case _GREATER_FUN:          return fun_greater_uint;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_uint;          break;
            case _LESS_FUN:             return fun_less_uint;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_uint;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {      /* long */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_long;                   break;
            case _MINUS_FUN:            return fun_minus_long;                  break;
            case _MULTIPLIES_FUN:       return fun_multiplies_long;             break;
            case _DIVIDES_FUN:          return fun_divides_long;                break;
            case _MODULUS_FUN:          return fun_modulus_long;                break;
            case _EQUAL_FUN:            return fun_equal_long;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_long;              break;
            case _GREATER_FUN:          return fun_greater_long;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_long;          break;
            case _LESS_FUN:             return fun_less_long;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_long;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _UNSIGNED_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {    /* unsigned long */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_ulong;                  break;
            case _MINUS_FUN:            return fun_minus_ulong;                 break;
            case _MULTIPLIES_FUN:       return fun_multiplies_ulong;            break;
            case _DIVIDES_FUN:          return fun_divides_ulong;               break;
            case _MODULUS_FUN:          return fun_modulus_ulong;               break;
            case _EQUAL_FUN:            return fun_equal_ulong;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_ulong;             break;
            case _GREATER_FUN:          return fun_greater_ulong;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_ulong;         break;
            case _LESS_FUN:             return fun_less_ulong;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_ulong;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _FLOAT_TYPE, _TYPE_NAME_SIZE) == 0) {                /* float */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_float;                  break;
            case _MINUS_FUN:            return fun_minus_float;                 break;
            case _MULTIPLIES_FUN:       return fun_multiplies_float;            break;
            case _DIVIDES_FUN:          return fun_divides_float;               break;
            case _EQUAL_FUN:            return fun_equal_float;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_float;             break;
            case _GREATER_FUN:          return fun_greater_float;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_float;         break;
            case _LESS_FUN:             return fun_less_float;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_float;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _DOUBLE_TYPE, _TYPE_NAME_SIZE) == 0) {               /* double */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_double;                 break;
            case _MINUS_FUN:            return fun_minus_double;                break;
            case _MULTIPLIES_FUN:       return fun_multiplies_double;           break;
            case _DIVIDES_FUN:          return fun_divides_double;              break;
            case _EQUAL_FUN:            return fun_equal_double;                break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_double;            break;
            case _GREATER_FUN:          return fun_greater_double;              break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_double;        break;
            case _LESS_FUN:             return fun_less_double;                 break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_double;           break;
            default: break;
        }
    } else if (strncmp(s_typename, _LONG_DOUBLE_TYPE, _TYPE_NAME_SIZE) == 0) {          /* long double */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_long_double;            break;
            case _MINUS_FUN:            return fun_minus_long_double;           break;
            case _MULTIPLIES_FUN:       return fun_multiplies_long_double;      break;
            case _DIVIDES_FUN:          return fun_divides_long_double;         break;
            case _EQUAL_FUN:            return fun_equal_long_double;           break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_long_double;       break;
            case _GREATER_FUN:          return fun_greater_long_double;         break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_long_double;   break;
            case _LESS_FUN:             return fun_less_long_double;            break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_long_double;      break;
            default: break;
        }
    } else if (strncmp(s_typename, _C_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {             /* c-string */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_cstr;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_cstr;              break;
            case _GREATER_FUN:          return fun_greater_cstr;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_cstr;          break;
            case _LESS_FUN:             return fun_less_cstr;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_cstr;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _POINTER_TYPE, _TYPE_NAME_SIZE) == 0) {              /* void* */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_pointer;               break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_pointer;           break;
            case _GREATER_FUN:          return fun_greater_pointer;             break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_pointer;       break;
            case _LESS_FUN:             return fun_less_pointer;                break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_pointer;          break;
            default: break;
        }
    } else if (strncmp(s_typename, _CSTL_BOOL_TYPE, _TYPE_NAME_SIZE) == 0) {            /* bool_t */
        switch (ftype_type) {
            case _LOGICAL_AND_FUN:      return fun_logical_and_cstl_bool;       break;
            case _LOGICAL_OR_FUN:       return fun_logical_or_cstl_bool;        break;
            default: break;
        }
#ifndef _MSC_VER
    } else if (strncmp(s_typename, _BOOL_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* _Bool */
        switch (ftype_type) {
            case _LOGICAL_AND_FUN:      return fun_logical_and_bool;            break;
            case _LOGICAL_OR_FUN:       return fun_logical_or_bool;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) { /* long long */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_long_long;              break;
            case _MINUS_FUN:            return fun_minus_long_long;             break;
            case _MULTIPLIES_FUN:       return fun_multiplies_long_long;        break;
            case _DIVIDES_FUN:          return fun_divides_long_long;           break;
            case _MODULUS_FUN:          return fun_modulus_long_long;           break;
            case _EQUAL_FUN:            return fun_equal_long_long;             break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_long_long;         break;
            case _GREATER_FUN:          return fun_greater_long_long;           break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_long_long;     break;
            case _LESS_FUN:             return fun_less_long_long;              break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_long_long;        break;
            default: break;
        }
    } else if (strncmp(s_typename, _UNSIGNED_LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {/* unsigned long long */
        switch (ftype_type) {
            case _PLUS_FUN:             return fun_plus_ulong_long;             break;
            case _MINUS_FUN:            return fun_minus_ulong_long;            break;
            case _MULTIPLIES_FUN:       return fun_multiplies_ulong_long;       break;
            case _DIVIDES_FUN:          return fun_divides_ulong_long;          break;
            case _MODULUS_FUN:          return fun_modulus_ulong_long;          break;
            case _EQUAL_FUN:            return fun_equal_ulong_long;            break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_ulong_long;        break;
            case _GREATER_FUN:          return fun_greater_ulong_long;          break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_ulong_long;    break;
            case _LESS_FUN:             return fun_less_ulong_long;             break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_ulong_long;       break;
            default: break;
        }
#endif
    } else if (strncmp(s_typename, _VECTOR_TYPE, _TYPE_NAME_SIZE) == 0) {               /* vector_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_vector;                break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_vector;            break;
            case _GREATER_FUN:          return fun_greater_vector;              break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_vector;        break;
            case _LESS_FUN:             return fun_less_vector;                 break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_vector;           break;
            default: break;
        }
    } else if (strncmp(s_typename, _DEQUE_TYPE, _TYPE_NAME_SIZE) == 0) {                /* deque_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_deque;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_deque;             break;
            case _GREATER_FUN:          return fun_greater_deque;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_deque;         break;
            case _LESS_FUN:             return fun_less_deque;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_deque;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _LIST_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* list_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_list;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_list;              break;
            case _GREATER_FUN:          return fun_greater_list;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_list;          break;
            case _LESS_FUN:             return fun_less_list;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_list;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _SLIST_TYPE, _TYPE_NAME_SIZE) == 0) {                /* slist_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_slist;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_slist;             break;
            case _GREATER_FUN:          return fun_greater_slist;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_slist;         break;
            case _LESS_FUN:             return fun_less_slist;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_slist;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _QUEUE_TYPE, _TYPE_NAME_SIZE) == 0) {                /* queue_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_queue;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_queue;             break;
            case _GREATER_FUN:          return fun_greater_queue;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_queue;         break;
            case _LESS_FUN:             return fun_less_queue;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_queue;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _STACK_TYPE, _TYPE_NAME_SIZE) == 0) {                /* stack_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_stack;                 break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_stack;             break;
            case _GREATER_FUN:          return fun_greater_stack;               break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_stack;         break;
            case _LESS_FUN:             return fun_less_stack;                  break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_stack;            break;
            default: break;
        }
    } else if (strncmp(s_typename, _PAIR_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* pair_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_pair;                  break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_pair;              break;
            case _GREATER_FUN:          return fun_greater_pair;                break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_pair;          break;
            case _LESS_FUN:             return fun_less_pair;                   break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_pair;             break;
            default: break;
        }
    } else if (strncmp(s_typename, _SET_TYPE, _TYPE_NAME_SIZE) == 0) {                  /* set_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_set;                   break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_set;               break;
            case _GREATER_FUN:          return fun_greater_set;                 break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_set;           break;
            case _LESS_FUN:             return fun_less_set;                    break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_set;              break;
            default: break;
        }
    } else if (strncmp(s_typename, _MAP_TYPE, _TYPE_NAME_SIZE) == 0) {                  /* map_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_map;                   break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_map;               break;
            case _GREATER_FUN:          return fun_greater_map;                 break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_map;           break;
            case _LESS_FUN:             return fun_less_map;                    break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_map;              break;
            default: break;
        }
    } else if (strncmp(s_typename, _MULTISET_TYPE, _TYPE_NAME_SIZE) == 0) {             /* multiset_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_multiset;              break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_multiset;          break;
            case _GREATER_FUN:          return fun_greater_multiset;            break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_multiset;      break;
            case _LESS_FUN:             return fun_less_multiset;               break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_multiset;         break;
            default: break;
        }
    } else if (strncmp(s_typename, _MULTIMAP_TYPE, _TYPE_NAME_SIZE) == 0) {             /* multimap_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_multimap;              break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_multimap;          break;
            case _GREATER_FUN:          return fun_greater_multimap;            break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_multimap;      break;
            case _LESS_FUN:             return fun_less_multimap;               break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_multimap;         break;
            default: break;
        }
    } else if (strncmp(s_typename, _HASH_SET_TYPE, _TYPE_NAME_SIZE) == 0) {             /* hash_set_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_hash_set;              break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_hash_set;          break;
            case _GREATER_FUN:          return fun_greater_hash_set;            break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_hash_set;      break;
            case _LESS_FUN:             return fun_less_hash_set;               break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_hash_set;         break;
            default: break;
        }
    } else if (strncmp(s_typename, _HASH_MAP_TYPE, _TYPE_NAME_SIZE) == 0) {             /* hash_map_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_hash_map;              break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_hash_map;          break;
            case _GREATER_FUN:          return fun_greater_hash_map;            break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_hash_map;      break;
            case _LESS_FUN:             return fun_less_hash_map;               break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_hash_map;         break;
            default: break;
        }
    } else if (strncmp(s_typename, _HASH_MULTISET_TYPE, _TYPE_NAME_SIZE) == 0) {        /* hash_multiset_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_hash_multiset;         break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_hash_multiset;     break;
            case _GREATER_FUN:          return fun_greater_hash_multiset;       break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_hash_multiset; break;
            case _LESS_FUN:             return fun_less_hash_multiset;          break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_hash_multiset;    break;
            default: break;
        }
    } else if (strncmp(s_typename, _HASH_MULTIMAP_TYPE, _TYPE_NAME_SIZE) == 0) {        /* hash_multimap_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_hash_multimap;         break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_hash_multimap;     break;
            case _GREATER_FUN:          return fun_greater_hash_multimap;       break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_hash_multimap; break;
            case _LESS_FUN:             return fun_less_hash_multimap;          break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_hash_multimap;    break;
            default: break;
        }
    } else if (strncmp(s_typename, _STRING_TYPE, _TYPE_NAME_SIZE) == 0) {               /* string_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_string;                break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_string;            break;
            case _GREATER_FUN:          return fun_greater_string;              break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_string;        break;
            case _LESS_FUN:             return fun_less_string;                 break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_string;           break;
            default: break;
        }
    } else if (strncmp(s_typename, _BASIC_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {          /* basic_string_t */
        switch (ftype_type) {
            case _EQUAL_FUN:            return fun_equal_basic_string;          break;
            case _NOT_EQUAL_FUN:        return fun_not_equal_basic_string;      break;
            case _GREATER_FUN:          return fun_greater_basic_string;        break;
            case _GREATER_EQUAL_FUN:    return fun_greater_equal_basic_string;  break;
            case _LESS_FUN:             return fun_less_basic_string;           break;
            case _LESS_EQUAL_FUN:       return fun_less_equal_basic_string;     break;
            default: break;
        }
    }

    if (pt_typeinfo != NULL && pt_typeinfo->_pt_type != NULL &&
        pt_typeinfo->_t_style == _TYPE_USER_DEFINE && ftype_type == _LESS_FUN) {
        return pt_typeinfo->_pt_type->_t_typeless;
    }

    return fun_default_binary;
}
Example #17
0
/**
 * Destroy and deallocate element allocated and initialized by _iterator_allocate_init_elem().
 */
void _iterator_deallocate_destroy_elem(iterator_t it_iter, void* pv_value)
{
    bool_t b_result = false;

    assert(_iterator_is_valid(it_iter));
    assert(pv_value != NULL);
    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            ((vector_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((vector_t*)it_iter._pt_container)->_t_allocator, pv_value,
                ((vector_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _DEQUE_CONTAINER:
            ((deque_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((deque_t*)it_iter._pt_container)->_t_allocator, pv_value,
                ((deque_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _BASIC_STRING_CONTAINER:
            ((basic_string_t*)it_iter._pt_container)->_vec_base._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((basic_string_t*)it_iter._pt_container)->_vec_base._t_allocator, pv_value,
                ((basic_string_t*)it_iter._pt_container)->_vec_base._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _LIST_CONTAINER:
            ((list_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((list_t*)it_iter._pt_container)->_t_allocator, pv_value,
                ((list_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _SLIST_CONTAINER:
            ((slist_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((slist_t*)it_iter._pt_container)->_t_allocator, pv_value,
                ((slist_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _SET_CONTAINER:
            ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((set_t*)it_iter._pt_container)->_t_tree._t_allocator, pv_value,
                ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _MULTISET_CONTAINER:
            ((multiset_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((multiset_t*)it_iter._pt_container)->_t_tree._t_allocator, pv_value,
                ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _MAP_CONTAINER:
            ((map_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((map_t*)it_iter._pt_container)->_t_tree._t_allocator, pv_value,
                ((map_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _MULTIMAP_CONTAINER:
            ((multimap_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((multimap_t*)it_iter._pt_container)->_t_tree._t_allocator, pv_value,
                ((multimap_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _HASH_SET_CONTAINER:
            ((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_allocator, pv_value,
                ((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _HASH_MULTISET_CONTAINER:
            ((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_allocator, pv_value,
                ((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _HASH_MAP_CONTAINER:
            ((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_allocator, pv_value,
                ((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        case _HASH_MULTIMAP_CONTAINER:
            ((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typedestroy(pv_value, &b_result);
            assert(b_result);
            _alloc_deallocate(&((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_allocator, pv_value,
                ((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            break;
        default:
            assert(false);
            break;
    }
}
/**
 * Select unary function accroding to unary function type.
 */
ufun_t _fun_get_unary(iterator_t it_iter, fun_type_t ftype_type)
{
    const char* s_typename = NULL;

    assert(_iterator_is_valid(it_iter));
    assert(ftype_type >= _NEGATE_FUN && ftype_type <= _RANDOM_NUMBER_FUN);

    if ((s_typename = _iterator_get_typebasename(it_iter))== NULL) {
        return fun_default_unary;
    }

    if (strncmp(s_typename, _CHAR_TYPE, _TYPE_NAME_SIZE) == 0 ||
        strncmp(s_typename, _SIGNED_CHAR_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* char */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_char;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_char;
        }
    } else if (strncmp(s_typename, _UNSIGNED_CHAR_TYPE, _TYPE_NAME_SIZE) == 0) {        /* unsigned char */
        if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_uchar;
        }
    } else if (strncmp(s_typename, _SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0) {     /* short */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_short;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_short;
        }
    } else if (strncmp(s_typename, _UNSIGNED_SHORT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_SHORT_INT_TYPE, _TYPE_NAME_SIZE) == 0) {   /* unsigned short */
        if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_ushort;
        }
    } else if (strncmp(s_typename, _INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_TYPE, _TYPE_NAME_SIZE) == 0) {               /* int */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_int;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_int;
        }
    } else if (strncmp(s_typename, _UNSIGNED_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_INT_TYPE, _TYPE_NAME_SIZE) == 0) {         /* unsigned int */
        if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_uint;
        }
    } else if (strncmp(s_typename, _LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {      /* long */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_long;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_long;
        }
    } else if (strncmp(s_typename, _UNSIGNED_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {    /* unsigned long */
        if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_ulong;
        }
    } else if (strncmp(s_typename, _FLOAT_TYPE, _TYPE_NAME_SIZE) == 0) {                /* float */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_float;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_float;
        }
    } else if (strncmp(s_typename, _DOUBLE_TYPE, _TYPE_NAME_SIZE) == 0) {               /* double */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_double;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_double;
        }
    } else if (strncmp(s_typename, _LONG_DOUBLE_TYPE, _TYPE_NAME_SIZE) == 0) {          /* long double */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_long_double;
        }
    } else if (strncmp(s_typename, _CSTL_BOOL_TYPE, _TYPE_NAME_SIZE) == 0) {            /* bool_t */
        if (ftype_type == _LOGICAL_NOT_FUN) {
            return fun_logical_not_cstl_bool;
        }
#ifndef _MSC_VER
    } else if (strncmp(s_typename, _BOOL_TYPE, _TYPE_NAME_SIZE) == 0) {                 /* _Bool */
        if (ftype_type == _LOGICAL_NOT_FUN) {
            return fun_logical_not_bool;
        }
    } else if (strncmp(s_typename, _LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _SIGNED_LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {      /* long */
        if (ftype_type == _NEGATE_FUN) {
            return fun_negate_long_long;
        } else if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_long_long;
        }
    } else if (strncmp(s_typename, _UNSIGNED_LONG_LONG_TYPE, _TYPE_NAME_SIZE) == 0 ||
               strncmp(s_typename, _UNSIGNED_LONG_LONG_INT_TYPE, _TYPE_NAME_SIZE) == 0) {    /* unsigned long */
        if (ftype_type == _INCREASE_FUN) {
            return _fun_increase_ulong_long;
        }
#endif
    }

    return fun_default_unary;
}
Example #19
0
/**
 * Initialize an element according to the type of iterator pointed data.
 */
void* _iterator_allocate_init_elem(iterator_t it_iter)
{
    void* pv_value = NULL;

    assert(_iterator_is_valid(it_iter));
    switch (it_iter._t_containertype) {
        case _VECTOR_CONTAINER:
            pv_value = _alloc_allocate(&((vector_t*)it_iter._pt_container)->_t_allocator,
                ((vector_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            _vector_init_elem_auxiliary((vector_t*)it_iter._pt_container, pv_value);
            break;
        case _DEQUE_CONTAINER:
            pv_value = _alloc_allocate(&((deque_t*)it_iter._pt_container)->_t_allocator,
                ((deque_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            _deque_init_elem_auxiliary((deque_t*)it_iter._pt_container, pv_value);
            break;
        case _BASIC_STRING_CONTAINER:
            pv_value = _alloc_allocate(&((basic_string_t*)it_iter._pt_container)->_vec_base._t_allocator,
                ((basic_string_t*)it_iter._pt_container)->_vec_base._t_typeinfo._pt_type->_t_typesize, 1);
            _basic_string_init_elem_auxiliary((basic_string_t*)it_iter._pt_container, pv_value);
            break;
        case _LIST_CONTAINER:
            pv_value = _alloc_allocate(&((list_t*)it_iter._pt_container)->_t_allocator,
                ((list_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            _list_init_elem_auxiliary((list_t*)it_iter._pt_container, pv_value);
            break;
        case _SLIST_CONTAINER:
            pv_value = _alloc_allocate(&((slist_t*)it_iter._pt_container)->_t_allocator,
                ((slist_t*)it_iter._pt_container)->_t_typeinfo._pt_type->_t_typesize, 1);
            _slist_init_elem_auxiliary((slist_t*)it_iter._pt_container, pv_value);
            break;
        case _SET_CONTAINER:
            pv_value = _alloc_allocate(&((set_t*)it_iter._pt_container)->_t_tree._t_allocator,
                ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            _set_init_elem_auxiliary((set_t*)it_iter._pt_container, pv_value);
            break;
        case _MULTISET_CONTAINER:
            pv_value = _alloc_allocate(&((multiset_t*)it_iter._pt_container)->_t_tree._t_allocator,
                ((set_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            _multiset_init_elem_auxiliary((multiset_t*)it_iter._pt_container, pv_value);
            break;
        case _MAP_CONTAINER:
            pv_value = _alloc_allocate(&((map_t*)it_iter._pt_container)->_t_tree._t_allocator,
                ((map_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            _map_init_elem_auxiliary((map_t*)it_iter._pt_container, pv_value);
            break;
        case _MULTIMAP_CONTAINER:
            pv_value = _alloc_allocate(&((multimap_t*)it_iter._pt_container)->_t_tree._t_allocator,
                ((multimap_t*)it_iter._pt_container)->_t_tree._t_typeinfo._pt_type->_t_typesize, 1);
            _multimap_init_elem_auxiliary((multimap_t*)it_iter._pt_container, pv_value);
            break;
        case _HASH_SET_CONTAINER:
            pv_value = _alloc_allocate(&((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_allocator,
                ((hash_set_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            _hash_set_init_elem_auxiliary((hash_set_t*)it_iter._pt_container, pv_value);
            break;
        case _HASH_MULTISET_CONTAINER:
            pv_value = _alloc_allocate(&((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_allocator,
                ((hash_multiset_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            _hash_multiset_init_elem_auxiliary((hash_multiset_t*)it_iter._pt_container, pv_value);
            break;
        case _HASH_MAP_CONTAINER:
            pv_value = _alloc_allocate(&((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_allocator,
                ((hash_map_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            _hash_map_init_elem_auxiliary((hash_map_t*)it_iter._pt_container, pv_value);
            break;
        case _HASH_MULTIMAP_CONTAINER:
            pv_value = _alloc_allocate(&((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_allocator,
                ((hash_multimap_t*)it_iter._pt_container)->_t_hashtable._t_typeinfo._pt_type->_t_typesize, 1);
            _hash_multimap_init_elem_auxiliary((hash_multimap_t*)it_iter._pt_container, pv_value);
            break;
        default:
            assert(false);
            pv_value = NULL;
            break;
    }

    return pv_value;
}