template <class elem_t, class holder_t> tos_handle<elem_t> adlist_tos_base<elem_t, holder_t>::handle_for_num(size_t position) const { if (position < 0) return build_handle(0); else if (position >= _cached_size) return build_handle(0); if (position < _index_size) return build_handle(_index[position]); if (_index_size == 0) { _index[0] = _head_e; typedef adlist_tos_base<elem_t, holder_t> *this_type; ++(CONST_CAST(this_type, this)->_index_size); } size_t total = _index_size - 1; holder_t *follow = _index[total]; while (total < position) { ++total; follow = follow->next; _index[total] = follow; } return build_handle(follow); }
template <class elem_t, class holder_t> tos_handle<elem_t> adlist_tos_base<elem_t, holder_t>::tail_handle(void) const { if (_tail_e == 0) return build_handle(0); else return build_handle(_tail_e); }
template <class elem_t, class holder_t> tos_handle<elem_t> adlist_tos_base<elem_t, holder_t>::previous_handle( tos_handle<elem_t> the_handle) const { holder_t *elem_ptr = (holder_t *)(from_handle(the_handle)); if (elem_ptr == 0) return build_handle(0); else return build_handle(elem_ptr->previous); }
template <class key_t, class elem_t> index_handle<key_t, elem_t> alist_index<key_t, elem_t>::lookup_handle(key_t the_key) const { tos_handle<alist_item<key_t, elem_t> > follow = _list.handle_for_num(0); while (!follow.is_null()) { alist_item<key_t, elem_t> this_item = _list.elem(follow); if (this_item.the_key == the_key) return build_handle(follow.raw_referenced_item()); follow = _list.next_handle(follow); } return build_handle(0); }
template <class key_t, class elem_t> index_handle<key_t, elem_t> alist_index<key_t, elem_t>::enter(key_t the_key, elem_t the_elem) { assert(!exists(the_key)); _list.prepend(alist_item<key_t, elem_t>(the_key, the_elem)); return build_handle(_list.handle_for_num(0).raw_referenced_item()); }
template <class key_base_t, class elem_t> index_handle<key_base_t *, elem_t> ts_ptr_index<key_base_t, elem_t>::lookup_handle(key_base_t *the_key) const { char buffer[100]; sprintf(buffer, "%p", the_key); index_handle<const char *, elem_t> tsi_handle = _tsi.lookup_handle(buffer); return build_handle(tsi_handle.raw_referenced_item()); }
template <class elem_t, class holder_t> tos_handle<elem_t> adlist_tos_base<elem_t, holder_t>::lookup_handle(elem_t the_elem) const { size_t total = 0; holder_t *follow = _head_e; while (follow != 0) { if (total >= _index_size) { _index[total] = follow; typedef adlist_tos_base<elem_t, holder_t> *this_type; ++(CONST_CAST(this_type, this)->_index_size); } if (follow->data == the_elem) return build_handle(follow); ++total; follow = follow->next; } return build_handle(0); }