| #ifndef MARISA_ALPHA_STRING_H_ |
| #define MARISA_ALPHA_STRING_H_ |
| |
| #include "base.h" |
| |
| namespace marisa_alpha { |
| |
| class String { |
| public: |
| String() : ptr_(NULL), length_(0) {} |
| explicit String(const char *str) : ptr_(str), length_(0) { |
| while (str[length_] != '\0') { |
| ++length_; |
| } |
| } |
| String(const char *ptr, std::size_t length) |
| : ptr_(ptr), length_(length) {} |
| String(const String &str) : ptr_(str.ptr_), length_(str.length_) {} |
| |
| String substr(std::size_t pos, std::size_t length) const { |
| MARISA_ALPHA_DEBUG_IF(pos + length > length_, MARISA_ALPHA_PARAM_ERROR); |
| return String(ptr_ + pos, length); |
| } |
| |
| String &operator=(const String &str) { |
| ptr_ = str.ptr_; |
| length_ = str.length_; |
| return *this; |
| } |
| |
| UInt8 operator[](std::size_t i) const { |
| MARISA_ALPHA_DEBUG_IF(i >= length_, MARISA_ALPHA_PARAM_ERROR); |
| return ptr_[i]; |
| } |
| |
| const char *ptr() const { |
| return ptr_; |
| } |
| std::size_t length() const { |
| return length_; |
| } |
| |
| private: |
| const char *ptr_; |
| std::size_t length_; |
| }; |
| |
| inline bool operator==(const String &lhs, const String &rhs) { |
| if (lhs.length() != rhs.length()) { |
| return false; |
| } |
| for (std::size_t i = 0; i < lhs.length(); ++i) { |
| if (lhs[i] != rhs[i]) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| inline bool operator!=(const String &lhs, const String &rhs) { |
| return !(lhs == rhs); |
| } |
| |
| inline bool operator<(const String &lhs, const String &rhs) { |
| for (std::size_t i = 0; i < lhs.length(); ++i) { |
| if (i == rhs.length()) { |
| return false; |
| } |
| if (lhs[i] != rhs[i]) { |
| return lhs[i] < rhs[i]; |
| } |
| } |
| return lhs.length() < rhs.length(); |
| } |
| |
| inline bool operator>(const String &lhs, const String &rhs) { |
| return rhs < lhs; |
| } |
| |
| class RString { |
| public: |
| RString() |
| : ptr_(static_cast<const char *>(NULL) - 1), length_(0) {} |
| explicit RString(const String &str) |
| : ptr_(str.ptr() + str.length() - 1), length_(str.length()) {} |
| RString(const RString &str) |
| : ptr_(str.ptr_), length_(str.length_) {} |
| |
| RString substr(std::size_t pos, std::size_t length) const { |
| MARISA_ALPHA_DEBUG_IF(pos + length > length_, MARISA_ALPHA_PARAM_ERROR); |
| RString str(*this); |
| str.ptr_ -= pos; |
| str.length_ = length; |
| return str; |
| } |
| |
| RString &operator=(const RString &str) { |
| ptr_ = str.ptr_; |
| length_ = str.length_; |
| return *this; |
| } |
| |
| UInt8 operator[](std::size_t i) const { |
| MARISA_ALPHA_DEBUG_IF(i >= length_, MARISA_ALPHA_PARAM_ERROR); |
| return *(ptr_ - i); |
| } |
| |
| const char *ptr() const { |
| return ptr_ - length_ + 1; |
| } |
| std::size_t length() const { |
| return length_; |
| } |
| |
| private: |
| const char *ptr_; |
| std::size_t length_; |
| }; |
| |
| inline bool operator==(const RString &lhs, const RString &rhs) { |
| if (lhs.length() != rhs.length()) { |
| return false; |
| } |
| for (std::size_t i = 0; i < lhs.length(); ++i) { |
| if (lhs[i] != rhs[i]) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| inline bool operator!=(const RString &lhs, const RString &rhs) { |
| return !(lhs == rhs); |
| } |
| |
| inline bool operator<(const RString &lhs, const RString &rhs) { |
| for (std::size_t i = 0; i < lhs.length(); ++i) { |
| if (i == rhs.length()) { |
| return false; |
| } |
| if (lhs[i] != rhs[i]) { |
| return lhs[i] < rhs[i]; |
| } |
| } |
| return lhs.length() < rhs.length(); |
| } |
| |
| inline bool operator>(const RString &lhs, const RString &rhs) { |
| return rhs < lhs; |
| } |
| |
| } // namespace marisa_alpha |
| |
| #endif // MARISA_ALPHA_STRING_H_ |