1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_KEY_H_ 2*ab8db090SAndroid Build Coastguard Worker #define MARISA_KEY_H_ 3*ab8db090SAndroid Build Coastguard Worker 4*ab8db090SAndroid Build Coastguard Worker #include "marisa/base.h" 5*ab8db090SAndroid Build Coastguard Worker 6*ab8db090SAndroid Build Coastguard Worker namespace marisa { 7*ab8db090SAndroid Build Coastguard Worker 8*ab8db090SAndroid Build Coastguard Worker class Key { 9*ab8db090SAndroid Build Coastguard Worker public: Key()10*ab8db090SAndroid Build Coastguard Worker Key() : ptr_(NULL), length_(0), union_() { 11*ab8db090SAndroid Build Coastguard Worker union_.id = 0; 12*ab8db090SAndroid Build Coastguard Worker } Key(const Key & key)13*ab8db090SAndroid Build Coastguard Worker Key(const Key &key) 14*ab8db090SAndroid Build Coastguard Worker : ptr_(key.ptr_), length_(key.length_), union_(key.union_) {} 15*ab8db090SAndroid Build Coastguard Worker 16*ab8db090SAndroid Build Coastguard Worker Key &operator=(const Key &key) { 17*ab8db090SAndroid Build Coastguard Worker ptr_ = key.ptr_; 18*ab8db090SAndroid Build Coastguard Worker length_ = key.length_; 19*ab8db090SAndroid Build Coastguard Worker union_ = key.union_; 20*ab8db090SAndroid Build Coastguard Worker return *this; 21*ab8db090SAndroid Build Coastguard Worker } 22*ab8db090SAndroid Build Coastguard Worker 23*ab8db090SAndroid Build Coastguard Worker char operator[](std::size_t i) const { 24*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(i >= length_, MARISA_BOUND_ERROR); 25*ab8db090SAndroid Build Coastguard Worker return ptr_[i]; 26*ab8db090SAndroid Build Coastguard Worker } 27*ab8db090SAndroid Build Coastguard Worker set_str(const char * str)28*ab8db090SAndroid Build Coastguard Worker void set_str(const char *str) { 29*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(str == NULL, MARISA_NULL_ERROR); 30*ab8db090SAndroid Build Coastguard Worker std::size_t length = 0; 31*ab8db090SAndroid Build Coastguard Worker while (str[length] != '\0') { 32*ab8db090SAndroid Build Coastguard Worker ++length; 33*ab8db090SAndroid Build Coastguard Worker } 34*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(length > MARISA_UINT32_MAX, MARISA_SIZE_ERROR); 35*ab8db090SAndroid Build Coastguard Worker ptr_ = str; 36*ab8db090SAndroid Build Coastguard Worker length_ = (UInt32)length; 37*ab8db090SAndroid Build Coastguard Worker } set_str(const char * ptr,std::size_t length)38*ab8db090SAndroid Build Coastguard Worker void set_str(const char *ptr, std::size_t length) { 39*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF((ptr == NULL) && (length != 0), MARISA_NULL_ERROR); 40*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(length > MARISA_UINT32_MAX, MARISA_SIZE_ERROR); 41*ab8db090SAndroid Build Coastguard Worker ptr_ = ptr; 42*ab8db090SAndroid Build Coastguard Worker length_ = (UInt32)length; 43*ab8db090SAndroid Build Coastguard Worker } set_id(std::size_t id)44*ab8db090SAndroid Build Coastguard Worker void set_id(std::size_t id) { 45*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(id > MARISA_UINT32_MAX, MARISA_SIZE_ERROR); 46*ab8db090SAndroid Build Coastguard Worker union_.id = (UInt32)id; 47*ab8db090SAndroid Build Coastguard Worker } set_weight(float weight)48*ab8db090SAndroid Build Coastguard Worker void set_weight(float weight) { 49*ab8db090SAndroid Build Coastguard Worker union_.weight = weight; 50*ab8db090SAndroid Build Coastguard Worker } 51*ab8db090SAndroid Build Coastguard Worker ptr()52*ab8db090SAndroid Build Coastguard Worker const char *ptr() const { 53*ab8db090SAndroid Build Coastguard Worker return ptr_; 54*ab8db090SAndroid Build Coastguard Worker } length()55*ab8db090SAndroid Build Coastguard Worker std::size_t length() const { 56*ab8db090SAndroid Build Coastguard Worker return length_; 57*ab8db090SAndroid Build Coastguard Worker } id()58*ab8db090SAndroid Build Coastguard Worker std::size_t id() const { 59*ab8db090SAndroid Build Coastguard Worker return union_.id; 60*ab8db090SAndroid Build Coastguard Worker } weight()61*ab8db090SAndroid Build Coastguard Worker float weight() const { 62*ab8db090SAndroid Build Coastguard Worker return union_.weight; 63*ab8db090SAndroid Build Coastguard Worker } 64*ab8db090SAndroid Build Coastguard Worker clear()65*ab8db090SAndroid Build Coastguard Worker void clear() { 66*ab8db090SAndroid Build Coastguard Worker Key().swap(*this); 67*ab8db090SAndroid Build Coastguard Worker } swap(Key & rhs)68*ab8db090SAndroid Build Coastguard Worker void swap(Key &rhs) { 69*ab8db090SAndroid Build Coastguard Worker marisa::swap(ptr_, rhs.ptr_); 70*ab8db090SAndroid Build Coastguard Worker marisa::swap(length_, rhs.length_); 71*ab8db090SAndroid Build Coastguard Worker marisa::swap(union_.id, rhs.union_.id); 72*ab8db090SAndroid Build Coastguard Worker } 73*ab8db090SAndroid Build Coastguard Worker 74*ab8db090SAndroid Build Coastguard Worker private: 75*ab8db090SAndroid Build Coastguard Worker const char *ptr_; 76*ab8db090SAndroid Build Coastguard Worker UInt32 length_; 77*ab8db090SAndroid Build Coastguard Worker union Union { 78*ab8db090SAndroid Build Coastguard Worker UInt32 id; 79*ab8db090SAndroid Build Coastguard Worker float weight; 80*ab8db090SAndroid Build Coastguard Worker } union_; 81*ab8db090SAndroid Build Coastguard Worker }; 82*ab8db090SAndroid Build Coastguard Worker 83*ab8db090SAndroid Build Coastguard Worker } // namespace marisa 84*ab8db090SAndroid Build Coastguard Worker 85*ab8db090SAndroid Build Coastguard Worker #endif // MARISA_KEY_H_ 86