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