Project: finder, src: BPTreeCore.h


B+ Tree 基本ヘッダーファイル
#ifndef BPTREECORE_H_
#define BPTREECORE_H_

#include <vector>
#include <stack>
#include <string>
#include <unistd.h>
#include "Serializer.h"
#include "NGram.h"

#define BPTREE_ELEMENT_SIZE (256)

/**
 * B++ Tree の実装
 */
class BPTreeCore {
 public:
   struct Element : public Serializer {
     NGram key;
     off_t offset;
     Element(const NGram &key, off_t offset) : key(key), offset(offset) {}
     bool operator < (const Element &e) const {
       return key < e.key;
     }
     void writeObject(int fd) const;
     void readObject(int fd);
   };

   struct Node : public Serializer {
     std::vector<BPTreeCore::Element> elements;
     int level;
     int last;
     off_t offset;
     Node() : level(0), last(0), offset(0), elements() {}
     void writeObject(int fd) const;
     void readObject(int fd);
   };

 private:
   int fd;
   bool bCreated;
   void initialFill();
   void splitNode(std::stack<BPTreeCore::Node> &stack, BPTreeCore::Node &node, const NGram &key);
   static int bsearch(const std::vector<BPTreeCore::Element> &elements, const NGram &key);

 public:
   BPTreeCore(const std::string &filename, bool bTruncate = true);
   BPTreeCore(int fd);
   virtual ~BPTreeCore();

   void append(const NGram &key, off_t value);
   bool find(const NGram &key, off_t *pvalue) const;
};

#endif //BPTREECORE_H_