00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00027 #ifndef string_h
00028 #define string_h
00029
00030 #include <cassert>
00031 #include <climits>
00032 #include <string>
00033 #include "matpack.h"
00034
00035
00036
00037 #ifdef HAVE_SSTREAM
00038 #include <sstream>
00039 #else
00040 #include "sstream.h"
00041 #endif
00042
00059 template<class charT>
00060 class my_basic_string : public basic_string<charT>
00061 {
00062 public:
00063
00064 my_basic_string();
00065 explicit my_basic_string(Index n, char c=' ');
00066 my_basic_string(const basic_string<charT>& A,
00067 Index pos=0,
00068 Index numpos=my_basic_string<charT>::npos);
00069 my_basic_string(const char A[]);
00070
00071
00072 my_basic_string& operator=(const my_basic_string<charT>& A);
00073
00074
00075
00076 void insert_substr(const my_basic_string<charT> searchstr,
00077 const my_basic_string<charT> insstr);
00078
00079
00080 Index nelem() const;
00081
00082
00083
00084
00085
00086
00087 char operator[](Index n) const;
00088 char& operator[](Index n);
00089
00091 static const Index npos = static_cast<Index>(basic_string<charT>::npos);
00092
00093 typedef Index size_type;
00094 };
00095
00096
00097
00098
00099
00100
00101
00103 template<class charT>
00104 inline my_basic_string<charT>::my_basic_string() : basic_string<charT>()
00105 { }
00106
00114 template<class charT>
00115 inline my_basic_string<charT>::my_basic_string(Index n, char c) :
00116 basic_string<charT>(n,c)
00117 { }
00118
00120
00121
00122
00123
00136 template<class charT>
00137 inline my_basic_string<charT>::my_basic_string(const basic_string<charT>& A,
00138 Index pos,
00139 Index numpos)
00140 {
00141
00142 assert(0<=pos);
00143
00144
00145
00146
00147
00148 assert(static_cast<typename basic_string<charT>::size_type>(pos)<A.size());
00149
00150
00151 assert( numpos==my_basic_string<charT>::npos ||
00152 ( (numpos >= 0) &&
00153 (static_cast<typename basic_string<charT>::size_type>(numpos)<=(A.size()-pos))
00154 )
00155 );
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 basic_string<charT>::operator=(basic_string<charT>(A,pos,numpos));
00166
00167 }
00168
00170 template<class charT>
00171 inline my_basic_string<charT>::my_basic_string(const char A[]) : basic_string<charT>(A)
00172 { }
00173
00174
00181 template<class charT>
00182 inline my_basic_string<charT>& my_basic_string<charT>::operator=(const my_basic_string<charT>& A)
00183 {
00184 basic_string<charT>::operator=(A);
00185 return *this;
00186 }
00187
00193 template<class charT>
00194 inline void my_basic_string<charT>::insert_substr(const my_basic_string<charT> searchstr, const my_basic_string<charT> insstr)
00195 {
00196 size_t searchstr_size = searchstr.size();
00197 size_t insstr_size = insstr.size();
00198 size_t start_pos = 0;
00199
00200 while (start_pos != string::npos)
00201 {
00202 start_pos = this->find (searchstr, start_pos);
00203 if (start_pos && start_pos != string::npos)
00204 {
00205 this->insert (start_pos, insstr);
00206 start_pos += searchstr_size + insstr_size;
00207 }
00208 }
00209 }
00210
00212 template<class charT>
00213 inline Index my_basic_string<charT>::nelem() const
00214 {
00215 size_t s = this->size();
00216 assert(s<LONG_MAX);
00217 return static_cast<long>(s);
00218 }
00219
00226 template<class charT>
00227 inline char my_basic_string<charT>::operator[](Index n) const
00228 {
00229 assert(0<=n);
00230 assert(n<nelem());
00231 return basic_string<charT>::operator[](n);
00232 }
00233
00240 template<class charT>
00241 inline char& my_basic_string<charT>::operator[](Index n)
00242 {
00243 assert(0<=n);
00244 assert(n<nelem());
00245 return basic_string<charT>::operator[](n);
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00276 typedef my_basic_string<char> String;
00277
00278
00279 template<class base>
00280 class Array;
00281
00283 typedef Array<String> ArrayOfString;
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 #endif // string_h