示例#1
0
/**
 * Calculate distance between two iterators.
 */
int _slist_iterator_distance(slist_iterator_t it_first, slist_iterator_t it_second)
{
    int           n_distance = 0;
    _slistnode_t* pt_node = NULL;

    assert(_iterator_same_type(it_first, it_second));
    assert(_SLIST_ITERATOR_CONTAINER(it_first) == _SLIST_ITERATOR_CONTAINER(it_second));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_first), it_first));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_second), it_second));

    if (_slist_iterator_before(it_first, it_second)) {
        for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first);
             pt_node != (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second);
             pt_node = pt_node->_pt_next) {
            n_distance++;
        }

        return n_distance;
    } else if (_slist_iterator_before(it_second, it_first)) {
        for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second);
             pt_node != (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first);
             pt_node = pt_node->_pt_next) {
            n_distance++;
        }

        return -n_distance;
    } else {
        return 0;
    }
}
示例#2
0
/**
 * Testing of the first iterator is less than the second iterator.
 */
bool_t _deque_iterator_less(deque_iterator_t it_first, deque_iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));
    assert(_DEQUE_ITERATOR_CONTAINER(it_first) == _DEQUE_ITERATOR_CONTAINER(it_second));
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_first), it_first));
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_second), it_second));

    if(_DEQUE_ITERATOR_MAP_POINTER(it_first) < _DEQUE_ITERATOR_MAP_POINTER(it_second))
    {
        /* it_first and it_second are deque_begin(); */
        if(_DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_first) &&
           _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_FIRST_POS(it_second) &&
           _DEQUE_ITERATOR_MAP_POINTER(it_first) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_second))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else if(_DEQUE_ITERATOR_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(it_second))
    {
        return _DEQUE_ITERATOR_COREPOS(it_first) < _DEQUE_ITERATOR_COREPOS(it_second) ? true : false;
    }
    else
    {
        return false;
    }
}
示例#3
0
/**
 * Compare two iterators for equality.
 */
bool_t _vector_iterator_equal(vector_iterator_t it_first, vector_iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));
    assert(_VECTOR_ITERATOR_CONTAINER(it_first) == _VECTOR_ITERATOR_CONTAINER(it_second));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_first), it_first));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_second), it_second));

    return _VECTOR_ITERATOR_COREPOS(it_first) == _VECTOR_ITERATOR_COREPOS(it_second) ? true : false;
}
示例#4
0
/**
 * Test the two slist iterator are equal.
 */
bool_t _slist_iterator_equal(slist_iterator_t it_first, slist_iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));
    assert(_SLIST_ITERATOR_CONTAINER(it_first) == _SLIST_ITERATOR_CONTAINER(it_second));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_first), it_first));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_second), it_second));

    return _SLIST_ITERATOR_COREPOS(it_first) == _SLIST_ITERATOR_COREPOS(it_second) ? true : false;
}
示例#5
0
/**
 * Calculate the distance between two iterators.
 */
int _vector_iterator_minus(vector_iterator_t it_first, vector_iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));
    assert(_VECTOR_ITERATOR_CONTAINER(it_first) == _VECTOR_ITERATOR_CONTAINER(it_second));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_first), it_first));
    assert(_vector_iterator_belong_to_vector(_VECTOR_ITERATOR_CONTAINER(it_second), it_second));

    return (_VECTOR_ITERATOR_COREPOS(it_first) - _VECTOR_ITERATOR_COREPOS(it_second)) / 
           (int)_GET_VECTOR_TYPE_SIZE(_VECTOR_ITERATOR_CONTAINER(it_first));
}
示例#6
0
/**
 * Compare two iterators for equality.
 */
bool_t _deque_iterator_equal(deque_iterator_t it_first, deque_iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));
    assert(_DEQUE_ITERATOR_CONTAINER(it_first) == _DEQUE_ITERATOR_CONTAINER(it_second));
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_first), it_first));
    assert(_deque_iterator_belong_to_deque(_DEQUE_ITERATOR_CONTAINER(it_second), it_second));
    
    if(_DEQUE_ITERATOR_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(it_second) &&
       _DEQUE_ITERATOR_FIRST_POS(it_first) == _DEQUE_ITERATOR_FIRST_POS(it_second) &&
       _DEQUE_ITERATOR_AFTERLAST_POS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_second) &&
       _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_COREPOS(it_second))
    {
        return true;
    }
    else
    {
        /* 
         * if the start corepos equal to the after last node and the finish 
         * corepos equal to the first position, the two iterator equal to.
         */
        if(_DEQUE_ITERATOR_MAP_POINTER(it_first) < _DEQUE_ITERATOR_MAP_POINTER(it_second))
        {
            if(_DEQUE_ITERATOR_MAP_POINTER(it_first) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_second) &&
               _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_AFTERLAST_POS(it_first) &&
               _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_FIRST_POS(it_second))
            {
                /* the it_first must be deque_begin. */
                assert(_DEQUE_ITERATOR_MAP_POINTER(it_first) == _DEQUE_ITERATOR_MAP_POINTER(_DEQUE_ITERATOR_CONTAINER(it_first)->_t_start));
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            if(_DEQUE_ITERATOR_MAP_POINTER(it_second) + 1 == _DEQUE_ITERATOR_MAP_POINTER(it_first) &&
               _DEQUE_ITERATOR_COREPOS(it_second) == _DEQUE_ITERATOR_AFTERLAST_POS(it_second) &&
               _DEQUE_ITERATOR_COREPOS(it_first) == _DEQUE_ITERATOR_FIRST_POS(it_first))
            {
                /* the it_second must be deque_begin. */
                assert(_DEQUE_ITERATOR_MAP_POINTER(it_second) == _DEQUE_ITERATOR_MAP_POINTER(_DEQUE_ITERATOR_CONTAINER(it_second)->_t_start));
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
示例#7
0
/**
 * Test whether an iterator on another front.
 */
bool_t _iterator_before(iterator_t it_first, iterator_t it_second)
{
    assert(_iterator_same_type(it_first, it_second));

    switch (it_first._t_containertype) {
        case _VECTOR_CONTAINER:
            return _vector_iterator_before(it_first, it_second);
            break;
        case _DEQUE_CONTAINER:
            return _deque_iterator_before(it_first, it_second);
            break;
        case _LIST_CONTAINER:
            return _list_iterator_before(it_first, it_second);
            break;
        case _SLIST_CONTAINER:
            return _slist_iterator_before(it_first, it_second);
            break;
        case _SET_CONTAINER:
            return _set_iterator_before(it_first, it_second);
            break;
        case _MULTISET_CONTAINER:
            return _multiset_iterator_before(it_first, it_second);
            break;
        case _MAP_CONTAINER:
            return _map_iterator_before(it_first, it_second);
            break;
        case _MULTIMAP_CONTAINER:
            return _multimap_iterator_before(it_first, it_second);
            break;
        case _HASH_SET_CONTAINER:
            return _hash_set_iterator_before(it_first, it_second);
            break;
        case _HASH_MULTISET_CONTAINER:
            return _hash_multiset_iterator_before(it_first, it_second);
            break;
        case _HASH_MAP_CONTAINER:
            return _hash_map_iterator_before(it_first, it_second);
            break;
        case _HASH_MULTIMAP_CONTAINER:
            return _hash_multimap_iterator_before(it_first, it_second);
            break;
        case _BASIC_STRING_CONTAINER:
            return _basic_string_iterator_before(it_first, it_second);
            break;
        default:
            return false;
            break;
    }
}
示例#8
0
/**
 * Test the first iterator is before the second.
 */
bool_t _slist_iterator_before(slist_iterator_t it_first, slist_iterator_t it_second)
{
    _slistnode_t* pt_node = NULL;

    assert(_iterator_same_type(it_first, it_second));
    assert(_SLIST_ITERATOR_CONTAINER(it_first) == _SLIST_ITERATOR_CONTAINER(it_second));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_first), it_first));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_second), it_second));

    if (_SLIST_ITERATOR_COREPOS(it_first) == _SLIST_ITERATOR_COREPOS(it_second)) {
        return false;
    }

    for (pt_node = (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_first); pt_node != NULL; pt_node = pt_node->_pt_next) {
        if (pt_node == (_slistnode_t*)_SLIST_ITERATOR_COREPOS(it_second)) {
            return true;
        }
    }

    return _SLIST_ITERATOR_COREPOS(it_second) == NULL ? true : false;
}
/**
 * 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;
    }
}
示例#10
0
/**
 * Test whether the [it_first, it_end) is valid range.
 */
bool_t _iterator_valid_range(iterator_t it_first, iterator_t it_end, iteratortype_t t_type)
{
    return _iterator_same_type(it_first, it_end) &&
           _iterator_limit_type(it_first, t_type) &&
           (iterator_equal(it_first, it_end) || _iterator_before(it_first, it_end));
}