status_t Tokenizer::release(uint32_t token) { const ssize_t i = _indexOrderOf(token); if (i >= 0) { const run_t& run = mRanges[i]; if ((token >= run.first) && (token < run.first+run.length)) { // token in this range, we need to split run_t& run = mRanges.editItemAt(i); if ((token == run.first) || (token == run.first+run.length-1)) { if (token == run.first) { run.first += 1; } run.length -= 1; if (run.length == 0) { // XXX: should we systematically remove a run that's empty? mRanges.removeItemsAt(i); } } else { // split the run run_t new_run; new_run.first = token+1; new_run.length = run.first+run.length - new_run.first; run.length = token - run.first; mRanges.insertAt(new_run, i+1); } return NO_ERROR; } } return NAME_NOT_FOUND; }
status_t Tokenizer::reserve(uint32_t token) { size_t o; const ssize_t i = _indexOrderOf(token, &o); if (i >= 0) { return BAD_VALUE; // this token is already taken } ssize_t err = _insertTokenAt(token, o); return (err<0) ? err : status_t(NO_ERROR); }
ssize_t SortedVectorImpl::add(const void* item) { size_t order; ssize_t index = _indexOrderOf(item, &order); if (index < 0) { index = VectorImpl::insertAt(item, order, 1); } else { index = VectorImpl::replaceAt(item, index); } return index; }
size_t SortedVectorImpl::orderOf(const void* item) const { size_t o; _indexOrderOf(item, &o); return o; }
ssize_t SortedVectorImpl::indexOf(const void* item) const { return _indexOrderOf(item); }
bool Tokenizer::isAcquired(uint32_t token) const { return (_indexOrderOf(token) >= 0); }