docs: @Override
    protected boolean hasUnderflow(N node) {
      if(node.isLeaf()) {
        return node.getNumEntries() < leafMinimum;
      }
      else {
        if(node.isSuperNode()) {
          if(node.getCapacity() - node.getNumEntries() >= dirCapacity) {
            int newCapacity = node.shrinkSuperNode(dirCapacity);
            if(newCapacity == dirCapacity) {
              assert !node.isSuperNode();
              // convert into a normal node (and insert into the index file)
              if(node.isSuperNode()) {
                throw new IllegalStateException("This node should not be a supernode anymore");
              }
              N n = supernodes.remove(Long.valueOf(node.getPageID()));
              assert (n != null);
              // update the old reference in the file
              writeNode(node);
            }
          }
          return false;
        }
        return node.getNumEntries() < dirMinimum;
      }
    }