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_