Blame lib/marisa/key.h

Packit de3218
#ifndef MARISA_KEY_H_
Packit de3218
#define MARISA_KEY_H_
Packit de3218
Packit de3218
#include "base.h"
Packit de3218
Packit de3218
namespace marisa {
Packit de3218
Packit de3218
class Key {
Packit de3218
 public:
Packit de3218
  Key() : ptr_(NULL), length_(0), union_() {
Packit de3218
    union_.id = 0;
Packit de3218
  }
Packit de3218
  Key(const Key &key)
Packit de3218
      : ptr_(key.ptr_), length_(key.length_), union_(key.union_) {}
Packit de3218
Packit de3218
  Key &operator=(const Key &key) {
Packit de3218
    ptr_ = key.ptr_;
Packit de3218
    length_ = key.length_;
Packit de3218
    union_ = key.union_;
Packit de3218
    return *this;
Packit de3218
  }
Packit de3218
Packit de3218
  char operator[](std::size_t i) const {
Packit de3218
    MARISA_DEBUG_IF(i >= length_, MARISA_BOUND_ERROR);
Packit de3218
    return ptr_[i];
Packit de3218
  }
Packit de3218
Packit de3218
  void set_str(const char *str) {
Packit de3218
    MARISA_DEBUG_IF(str == NULL, MARISA_NULL_ERROR);
Packit de3218
    std::size_t length = 0;
Packit de3218
    while (str[length] != '\0') {
Packit de3218
      ++length;
Packit de3218
    }
Packit de3218
    MARISA_DEBUG_IF(length > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
Packit de3218
    ptr_ = str;
Packit de3218
    length_ = (UInt32)length;
Packit de3218
  }
Packit de3218
  void set_str(const char *ptr, std::size_t length) {
Packit de3218
    MARISA_DEBUG_IF((ptr == NULL) && (length != 0), MARISA_NULL_ERROR);
Packit de3218
    MARISA_DEBUG_IF(length > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
Packit de3218
    ptr_ = ptr;
Packit de3218
    length_ = (UInt32)length;
Packit de3218
  }
Packit de3218
  void set_id(std::size_t id) {
Packit de3218
    MARISA_DEBUG_IF(id > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
Packit de3218
    union_.id = (UInt32)id;
Packit de3218
  }
Packit de3218
  void set_weight(float weight) {
Packit de3218
    union_.weight = weight;
Packit de3218
  }
Packit de3218
Packit de3218
  const char *ptr() const {
Packit de3218
    return ptr_;
Packit de3218
  }
Packit de3218
  std::size_t length() const {
Packit de3218
    return length_;
Packit de3218
  }
Packit de3218
  std::size_t id() const {
Packit de3218
    return union_.id;
Packit de3218
  }
Packit de3218
  float weight() const {
Packit de3218
    return union_.weight;
Packit de3218
  }
Packit de3218
Packit de3218
  void clear() {
Packit de3218
    Key().swap(*this);
Packit de3218
  }
Packit de3218
  void swap(Key &rhs) {
Packit de3218
    marisa::swap(ptr_, rhs.ptr_);
Packit de3218
    marisa::swap(length_, rhs.length_);
Packit de3218
    marisa::swap(union_.id, rhs.union_.id);
Packit de3218
  }
Packit de3218
Packit de3218
 private:
Packit de3218
  const char *ptr_;
Packit de3218
  UInt32 length_;
Packit de3218
  union Union {
Packit de3218
    UInt32 id;
Packit de3218
    float weight;
Packit de3218
  } union_;
Packit de3218
};
Packit de3218
Packit de3218
}  // namespace marisa
Packit de3218
Packit de3218
#endif  // MARISA_KEY_H_