Esempio n. 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;
    }
}
Esempio n. 2
0
/**
 * Transfer the range [it_begin, it_end) to position it_pos.
 */
void _slist_transfer(slist_iterator_t it_pos, slist_iterator_t it_begin, slist_iterator_t it_end)
{
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_pos), it_pos));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_begin), it_begin));
    assert(_slist_iterator_belong_to_slist(_SLIST_ITERATOR_CONTAINER(it_end), it_end));
    assert(_SLIST_ITERATOR_CONTAINER(it_begin) == _SLIST_ITERATOR_CONTAINER(it_end));
    assert(iterator_equal(it_begin, it_end) || _slist_iterator_before(it_begin, it_end));
    assert(_slist_same_slist_iterator_type(_SLIST_ITERATOR_CONTAINER(it_pos), it_begin));

    /* empty range */
    if(iterator_equal(it_begin, it_end))
    {
        return;
    }

    /* same slist container */
    if(_SLIST_ITERATOR_CONTAINER(it_pos) == _SLIST_ITERATOR_CONTAINER(it_begin))
    {
        assert(iterator_equal(it_pos, it_begin) || iterator_equal(it_pos, it_end) ||
               _slist_iterator_before(it_pos, it_begin) || _slist_iterator_before(it_end, it_pos));

        if(iterator_equal(it_pos, it_begin) || iterator_equal(it_pos, it_end))
        {
            return;
        }
    }

    slist_insert_range(_SLIST_ITERATOR_CONTAINER(it_pos), it_pos, it_begin, it_end);
    slist_erase_range(_SLIST_ITERATOR_CONTAINER(it_begin), it_begin, it_end);
}
Esempio n. 3
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;
    }
}