00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef MYSQLPP_CONST_STRING_H
00030 #define MYSQLPP_CONST_STRING_H
00031
00032 #include "defs.h"
00033
00034 #include <stdexcept>
00035 #include <string>
00036 #include <iostream>
00037
00038 namespace mysqlpp {
00039
00049 class const_string
00050 {
00051 public:
00054 typedef const char value_type;
00055
00057 typedef unsigned int size_type;
00058
00061 typedef const char& const_reference;
00062
00064 typedef const char* const_iterator;
00065
00068 typedef const_iterator iterator;
00069
00070 #if !defined(DOXYGEN_IGNORE)
00071
00072 typedef int difference_type;
00073 typedef const_reference reference;
00074 typedef const char* const_pointer;
00075 typedef const_pointer pointer;
00076 #endif // !defined(DOXYGEN_IGNORE)
00077
00079 const_string() :
00080 str_data_("")
00081 {
00082 }
00083
00085 const_string(const char* str) :
00086 str_data_(str)
00087 {
00088 }
00089
00091 const_string& operator=(const char* str)
00092 {
00093 str_data_ = str;
00094 return *this;
00095 }
00096
00098 size_type size() const
00099 {
00100 register int i = 0;
00101 while (str_data_[i])
00102 i++;
00103 return i;
00104 }
00105
00108 const_iterator begin() const
00109 {
00110 return str_data_;
00111 }
00112
00115 const_iterator end() const
00116 {
00117 return str_data_ + size();
00118 }
00119
00121 size_type length() const
00122 {
00123 return size();
00124 }
00125
00131 size_type max_size() const
00132 {
00133 return size();
00134 }
00135
00137 const_reference operator [](size_type pos) const
00138 {
00139 return str_data_[pos];
00140 }
00141
00146 const_reference at(size_type pos) const
00147 {
00148 if (pos >= size())
00149 throw std::out_of_range("");
00150 else
00151 return str_data_[pos];
00152 }
00153
00156 const char* c_str() const
00157 {
00158 return str_data_;
00159 }
00160
00162 const char* data() const
00163 {
00164 return str_data_;
00165 }
00166
00174 int compare(const const_string& str) const
00175 {
00176 const char* str1 = str_data_;
00177 const char* str2 = str.str_data_;
00178 while (*str1 == *str2 && (*str1 && *str2)) {
00179 str1++;
00180 str2++;
00181 }
00182 return *str1 - *str2;
00183 }
00184
00185 private:
00186 const char* str_data_;
00187 };
00188
00189
00191 inline std::ostream& operator <<(std::ostream& o,
00192 const const_string& str)
00193 {
00194 return o << str.c_str();
00195 }
00196
00198 inline int compare(const const_string& lhs, const const_string& rhs)
00199 {
00200 return lhs.compare(rhs);
00201 }
00202
00204 inline bool operator ==(const_string& lhs, const_string& rhs)
00205 {
00206 return compare(lhs, rhs) == 0;
00207 }
00208
00210 inline bool operator !=(const_string& lhs, const_string& rhs)
00211 {
00212 return compare(lhs, rhs) != 0;
00213 }
00214
00216 inline bool operator <(const_string& lhs, const_string& rhs)
00217 {
00218 return compare(lhs, rhs) < 0;
00219 }
00220
00222 inline bool operator <=(const_string& lhs, const_string& rhs)
00223 {
00224 return compare(lhs, rhs) <= 0;
00225 }
00226
00228 inline bool operator >(const_string& lhs, const_string& rhs)
00229 {
00230 return compare(lhs, rhs) > 0;
00231 }
00232
00234 inline bool operator >=(const_string& lhs, const_string& rhs)
00235 {
00236 return compare(lhs, rhs) >= 0;
00237 }
00238
00239 }
00240
00241 #endif