Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1.     void BaseBTree::PageWrapper::insertNonFull (const Byte *k)
  2.     {
  3.         if (isFull())
  4.             throw std::domain_error("Node is full. Can't insert");
  5.  
  6.         IComparator *c = _tree->getComparator();
  7.         if (!c)
  8.             throw std::runtime_error("Comparator not set. Can't insert");
  9.  
  10.         UShort i;
  11.  
  12.         // Ищем количество элементов, если это лист, то будем сдвигать,
  13.         // Иначе просто ищем место, в котором спустимся к ребенку
  14.         for (i = getKeysNum(); i >= 1 && !c->compare(k, getKey(i), _tree->getRecSize()); --i);
  15.  
  16.         // Мы сделали лишний шаг(потому как сейчас мы на элементе, который меньше нашего), так что возвращаемся назад.
  17.         i++;
  18.  
  19.         // Если это был лист, то копируем все большие ключи, освобождая место,
  20.         // А потом вставляем ключ на нужную позицию
  21.         if (isLeaf())
  22.         {
  23.             copyKeys(getKey(i + 1), getKey(i), getKeysNum() - i);
  24.             copyKey(getKey(i), k);
  25.  
  26.             writePage();
  27.         } else
  28.         {
  29.             // Иначе идем вниз
  30.             readPageFromChild(_tree->_rootPage, i);
  31.  
  32.             // Если ребенок полный, то разбиваем его
  33.             if (getKeysNum() == 2 * i - 1)
  34.             {
  35.                 splitChild(i);
  36.                 if (c->compare(k, getKey(i), _tree->_keysSize))
  37.                     i++;
  38.             }
  39.  
  40.             readPageFromChild(*this, i);
  41.             insertNonFull(k);
  42.         }
  43.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement