• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef MARISA_ALPHA_STRING_H_
2 #define MARISA_ALPHA_STRING_H_
3 
4 #include "base.h"
5 
6 namespace marisa_alpha {
7 
8 class String {
9  public:
String()10   String() : ptr_(NULL), length_(0) {}
String(const char * str)11   explicit String(const char *str) : ptr_(str), length_(0) {
12     while (str[length_] != '\0') {
13       ++length_;
14     }
15   }
String(const char * ptr,std::size_t length)16   String(const char *ptr, std::size_t length)
17       : ptr_(ptr), length_(length) {}
String(const String & str)18   String(const String &str) : ptr_(str.ptr_), length_(str.length_) {}
19 
substr(std::size_t pos,std::size_t length)20   String substr(std::size_t pos, std::size_t length) const {
21     MARISA_ALPHA_DEBUG_IF(pos + length > length_, MARISA_ALPHA_PARAM_ERROR);
22     return String(ptr_ + pos, length);
23   }
24 
25   String &operator=(const String &str) {
26     ptr_ = str.ptr_;
27     length_ = str.length_;
28     return *this;
29   }
30 
31   UInt8 operator[](std::size_t i) const {
32     MARISA_ALPHA_DEBUG_IF(i >= length_, MARISA_ALPHA_PARAM_ERROR);
33     return ptr_[i];
34   }
35 
ptr()36   const char *ptr() const {
37     return ptr_;
38   }
length()39   std::size_t length() const {
40     return length_;
41   }
42 
43  private:
44   const char *ptr_;
45   std::size_t length_;
46 };
47 
48 inline bool operator==(const String &lhs, const String &rhs) {
49   if (lhs.length() != rhs.length()) {
50     return false;
51   }
52   for (std::size_t i = 0; i < lhs.length(); ++i) {
53     if (lhs[i] != rhs[i]) {
54       return false;
55     }
56   }
57   return true;
58 }
59 
60 inline bool operator!=(const String &lhs, const String &rhs) {
61   return !(lhs == rhs);
62 }
63 
64 inline bool operator<(const String &lhs, const String &rhs) {
65   for (std::size_t i = 0; i < lhs.length(); ++i) {
66     if (i == rhs.length()) {
67       return false;
68     }
69     if (lhs[i] != rhs[i]) {
70       return lhs[i] < rhs[i];
71     }
72   }
73   return lhs.length() < rhs.length();
74 }
75 
76 inline bool operator>(const String &lhs, const String &rhs) {
77   return rhs < lhs;
78 }
79 
80 class RString {
81  public:
RString()82   RString()
83       : ptr_(static_cast<const char *>(NULL) - 1), length_(0) {}
RString(const String & str)84   explicit RString(const String &str)
85       : ptr_(str.ptr() + str.length() - 1), length_(str.length()) {}
RString(const RString & str)86   RString(const RString &str)
87       : ptr_(str.ptr_), length_(str.length_) {}
88 
substr(std::size_t pos,std::size_t length)89   RString substr(std::size_t pos, std::size_t length) const {
90     MARISA_ALPHA_DEBUG_IF(pos + length > length_, MARISA_ALPHA_PARAM_ERROR);
91     RString str(*this);
92     str.ptr_ -= pos;
93     str.length_ = length;
94     return str;
95   }
96 
97   RString &operator=(const RString &str) {
98     ptr_ = str.ptr_;
99     length_ = str.length_;
100     return *this;
101   }
102 
103   UInt8 operator[](std::size_t i) const {
104     MARISA_ALPHA_DEBUG_IF(i >= length_, MARISA_ALPHA_PARAM_ERROR);
105     return *(ptr_ - i);
106   }
107 
ptr()108   const char *ptr() const {
109     return ptr_ - length_ + 1;
110   }
length()111   std::size_t length() const {
112     return length_;
113   }
114 
115  private:
116   const char *ptr_;
117   std::size_t length_;
118 };
119 
120 inline bool operator==(const RString &lhs, const RString &rhs) {
121   if (lhs.length() != rhs.length()) {
122     return false;
123   }
124   for (std::size_t i = 0; i < lhs.length(); ++i) {
125     if (lhs[i] != rhs[i]) {
126       return false;
127     }
128   }
129   return true;
130 }
131 
132 inline bool operator!=(const RString &lhs, const RString &rhs) {
133   return !(lhs == rhs);
134 }
135 
136 inline bool operator<(const RString &lhs, const RString &rhs) {
137   for (std::size_t i = 0; i < lhs.length(); ++i) {
138     if (i == rhs.length()) {
139       return false;
140     }
141     if (lhs[i] != rhs[i]) {
142       return lhs[i] < rhs[i];
143     }
144   }
145   return lhs.length() < rhs.length();
146 }
147 
148 inline bool operator>(const RString &lhs, const RString &rhs) {
149   return rhs < lhs;
150 }
151 
152 }  // namespace marisa_alpha
153 
154 #endif  // MARISA_ALPHA_STRING_H_
155