Project: finder, src: NGram.h


N-Gram クラスの定義
#ifndef NGRAM_H_
#define NGRAM_H_

#if defined(NO_HASH_FUNC)
#include "hash.h"
#else
#include <functional>
#endif
#include "ucs4.h"
#include "Serializer.h"
#define NGRAM_SIZE (2)

/**
 * N-gram をキーとするクラス
 */
class NGram : public Serializer {
 private:
  UCS4 key[NGRAM_SIZE];
 public:
  NGram() {
    key[0] = 0;
    key[1] = 0;
  }

  NGram(UCS4 *ucs4) {
    for (int i = 0; i < NGRAM_SIZE; ++i) {
      key[i] = ucs4[i];
    }
  }

  void writeObject(int fd) const;
  void readObject(int fd);

  bool operator == (const NGram &ngram) const {
    for (int i = 0; i < NGRAM_SIZE; ++i) {
      if (key[i] != ngram.key[i]) return false;
    }
    return true;
  }

  bool operator < (const NGram &ngram) const {
    for (int i = 0; i < NGRAM_SIZE; ++i) {
      if (key[i] < ngram.key[i]) return true;
      if (ngram.key[i] < key[i]) return false;
    }
    return false;
  }

  std::size_t operator()(const NGram &ngram) const {
    std::size_t r = 0;
    for (int i = 0; i < NGRAM_SIZE; ++i) {
      r ^= std::hash<UCS4>()(ngram.key[i]);
    }
    return r;
  }
};

#endif // NGRAM_H_