Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void BaseBTree::PageWrapper::insertNonFull (const Byte *k)
- {
- if (isFull())
- throw std::domain_error("Node is full. Can't insert");
- IComparator *c = _tree->getComparator();
- if (!c)
- throw std::runtime_error("Comparator not set. Can't insert");
- UShort i;
- // Ищем количество элементов, если это лист, то будем сдвигать,
- // Иначе просто ищем место, в котором спустимся к ребенку
- for (i = getKeysNum(); i >= 1 && !c->compare(k, getKey(i), _tree->getRecSize()); --i);
- // Мы сделали лишний шаг(потому как сейчас мы на элементе, который меньше нашего), так что возвращаемся назад.
- i++;
- // Если это был лист, то копируем все большие ключи, освобождая место,
- // А потом вставляем ключ на нужную позицию
- if (isLeaf())
- {
- copyKeys(getKey(i + 1), getKey(i), getKeysNum() - i);
- copyKey(getKey(i), k);
- writePage();
- } else
- {
- // Иначе идем вниз
- readPageFromChild(_tree->_rootPage, i);
- // Если ребенок полный, то разбиваем его
- if (getKeysNum() == 2 * i - 1)
- {
- splitChild(i);
- if (c->compare(k, getKey(i), _tree->_keysSize))
- i++;
- }
- readPageFromChild(*this, i);
- insertNonFull(k);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement