string.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:9k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  string.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/basic.h>
  12. #ifndef LEDA_STRING_H
  13. #define LEDA_STRING_H
  14. class string_rep : public handle_rep {
  15. friend class string;
  16.       char*   s;
  17. int dummy;
  18.  string_rep(const char*);
  19.  string_rep(const char*,const char*); //concat
  20.  string_rep(char);
  21. ~string_rep() { delete[] s; }
  22. friend string operator+(const string&, const string&);
  23. };
  24. /*{Manpage {string} {} {Strings} }*/
  25. class string  : public handle_base
  26. {
  27. /*{Mdefinition
  28. An instance $s$ of the data type $string$ is a sequence of characters 
  29. (type $char$).  The number of characters in the sequence is called the 
  30. length of $s$. A string of length zero is called the empty string.
  31. Strings can be used wherever a CC $char*$ string can be used.
  32. $Strings$ differ from the CC type $char*$ in several aspects: parameter
  33. passing by value and assignment works properly (i.e., the value is passed
  34. or assigned and not a pointer to the value) and $strings$ offer many additional
  35. operations.
  36. }*/
  37.  friend class string_rep;
  38.  friend class panel;
  39.  static char* str_dup(const char*);
  40.  static char* str_cat(const char*,const char*);
  41.  static char* str_ncat(int, char**);
  42.  string_rep*  ptr() const { return (string_rep*)PTR; }
  43.  char** access_ptr() { return &(ptr()->s); }   // used by panel::string_item
  44.  string(string_rep* rep) { PTR = rep; }  // for private use only
  45. public:
  46. /*{Mcreation s }*/
  47. string() { PTR = new string_rep(""); }
  48. /*{Mcreate introduces a variable $s$ of type $string$. $s$ is initialized 
  49.             with the empty string.}*/
  50. string(const char* p)       { PTR = new string_rep(p);}
  51. /*{Mcreate introduces a variable $s$ of type $string$. $s$ is initialized 
  52.             with a copy of the CC string $p$.}*/
  53. // string(const char*, ...); // printf-like constructor
  54. //
  55. // That's what we want, but then (ARM page 326) a call string("xyz") is
  56. // ambiguous. We first tried to use a dummy class "format_string" with
  57. // a format_string(cosnt char*) constructor to resolve  the  ambiguity:
  58. // string(format_string, ...);
  59. // However, only g++ seems to be able to handle the case where the 
  60. // first argument is a class object (like format_string). For this reason
  61. // we now provide a version of the string constructor for every possible 
  62. // second argument (this seems to work with all compilers).
  63.  string(const char*, char, ...);
  64.  string(const char*, unsigned char, ...);
  65.  string(const char*, short,...);
  66.  string(const char*, unsigned short, ...);
  67.  string(const char*, int, ...);
  68.  string(const char*, unsigned int, ...);
  69.  string(const char*, long, ...);
  70.  string(const char*, unsigned long, ...);
  71.  string(const char*, float, ...);
  72.  string(const char*, double, ...);
  73.  string(const char*, void*, ...);
  74. /* manual:
  75. string(const char* format, ...); 
  76. */
  77. /*{Mcreate introduces a variable $s$ of type $string$. $s$ is initialized 
  78.             with the string produced by printf($format$,dots). }*/
  79. string(char c) { PTR = new string_rep(c);  }
  80. /*{Mcreate introduces a variable $s$ of type $string$. $s$ is initialized 
  81.             with the one-character string ``$c$''.}*/
  82.  string(int argc, char** argv) { PTR = new string_rep(str_ncat(argc,argv)); }
  83.  string(const string& x) : handle_base(x)  {}
  84. ~string() {}
  85.  string& operator=(const string& x) { handle_base::operator=(x); return *this; }
  86. char*    operator~()   const { return str_dup(ptr()->s); }   // makes a copy !
  87. char*    cstring()     const { return ptr()->s; }
  88. operator const char*() const { return ptr()->s; }
  89. /*{Moperations 2. 4.7 }*/
  90. int    length()          const;
  91. /*{Mop        returns the length of string $s$.}*/
  92. char  operator[](int) const;
  93. char& operator[](int i);
  94. /*{Marrop     returns the character at position $i$.\ 
  95.        precond{$0 le i le s$.length()$-$1.}}*/
  96. string operator()(int i, int j)  const { return sub(i,j); }
  97. /*{Mfunop    returns the substring of $s$ starting at 
  98.       position $max(0,i)$ and ending at 
  99.               position $min(j,s$.length()$-1)$.\
  100.               If $min(j,s$.length()$-1) < max(0,i)$
  101.               then the empty string is returned.  
  102.      }*/
  103. string head(int i)               const { return sub(0,i-1); }
  104. /*{Mop       returns the first $i$ characters of $s$. }*/
  105. string tail(int i)               const { return sub(length()-i,length()-1); }
  106. /*{Mop       returns the last $i$ characters of $s$. }*/
  107. string sub(int,int)      const;
  108. int pos(string s1, int i) const;
  109. /*{Mop       returns the minimum $j$ such that $j ge i$ and $s_1$
  110.               is a substring of $s$ starting at position $j$
  111.       (returns -1 if no such $j$ exists).}*/
  112. int    pos(string s1) const { return pos(s1,0); }
  113. /*{Mop       returns pos$(s1,0)$.}*/
  114. string insert(string s1, int i =0)     const;
  115. string insert(int i, string s1)       const;
  116. /*{Mop       returns $s(0,i-1)$ + $s_1$ + $s(i,s$.length()$-1)$.}*/
  117. string replace(const string& s1, const string& s2, int i=1) const;
  118. /*{Mopl      returns the string created from $s$ by replacing 
  119.       the $i$-th occurrence of $s_1$ in $s$ by $s_2$. }*/
  120. string replace(int i, int j , const string& s1) const;
  121. /*{Mopl     returns the string created from $s$ by replacing 
  122.       $s(i,j)$ by $s_1$.\ precond{$i leq j$.} }*/
  123. string replace(int i, const string& s1) const { return replace(i,i,s1);  }
  124. /*{Mopl      returns the string created from $s$ by replacing
  125.       $s[i]$ by $s_1$. }*/
  126. string replace_all(const string& s1, const string& s2) const 
  127. { return replace(s1,s2,0); }
  128. /*{Mopl      returns the string created from $s$ by replacing  
  129.       all occurrences of $s_1$ in $s$ by $s_2$.\
  130.               precond{The occurrences of $s_1$ in $s$ 
  131.                do not overlap (it's hard to say what the function returns
  132.                if the precondition is violated.).} }*/
  133. string del(const string& s1 , int i=1) const;
  134. /*{Mopl       returns $s$.replace($s_1,"",i$). }*/
  135. string del(int i , int j) const;
  136. /*{Mop       returns $s$.replace($i,j,""$). }*/
  137. string del(int i) const  { return del(i,i); }
  138. /*{Mop       returns $s$.replace($i,""$). }*/
  139. string del_all(const string& s1) const  { return del(s1,0); }
  140. /*{Mop       returns $s$.replace_all($s_1,""$). }*/
  141. void   read(istream& I, char delim = ' ');
  142. /*{Mopl      reads characters from input stream $I$ into $s$ 
  143.               until the first occurrence of character $delim$.}*/
  144. void   read(char delim = ' ')           { read(cin,delim); }
  145. /*{Mop       read($cin$,$delim$). }*/
  146. void   read_line(istream& I)    { read(I,'n'); }
  147. /*{Mop       read($I$,'$backslash$n'). }*/
  148. void read_line() {read_line(cin);}
  149. /*{Mop       read_line($cin$). }*/
  150. string format(string) const;
  151. friend string  operator+(const string& x ,const string& y);
  152. /*{Mbinopfunc     returns the concatenation of $x$ and $y$.}*/
  153. string& operator+=(const string& x);
  154. /*{Mbinop     appends $x$  to $s$ and returns a reference to $s$.}*/
  155. friend bool operator==(const string& x, const string& y);
  156. /*{Mbinopfunc     true iff $x$ and $y$ are equal.}*/
  157. friend bool operator==(const string& x, const char* y);
  158. friend bool operator!=(const string& x, const string& y);
  159. /*{Mbinopfunc     true iff $x$ and $y$ are not equal.}*/
  160. friend bool operator!=(const string& x, const char* y);
  161. friend bool operator< (const string& x, const string& y);
  162. /*{Mbinopfunc     true iff $x$ is lexicographically smaller than $y$.}*/
  163. friend bool operator> (const string& x, const string& y);
  164. /*{Mbinopfunc     true iff $x$ is lexicographically greater than $y$.}*/
  165. friend bool operator<=(const string& x, const string& y);
  166. /*{Mbinopfunc     returns $(x < y) || (x == y)$.}*/
  167. friend bool operator>=(const string& x, const string& y);
  168. /*{Mbinopfunc     returns $(x > y) || (x == y)$.}*/
  169. friend istream& operator>>(istream& I, string& s);
  170. /*{Mbinopfunc     read($I$,' '). }*/
  171. friend ostream& operator<<(ostream& O, const string& s) ;
  172. /*{Mbinopfunc     writes string $s$ to the output stream $O$. }*/
  173. static int cmp(const string& x, const string& y);
  174. };
  175. inline void Print(const string& x, ostream& out)      { out << x; }
  176. inline void Read(string& x, istream& in)              { in  >> x; }
  177. inline int  compare(const string& x, const string& y) 
  178. { return string::cmp(x,y); }
  179. inline char* Type_Name(const string*) { return "string"; }
  180. /*{Mimplementation 
  181. Strings are implemented by CC character vectors. All operations involving
  182. the search for a pattern $s1$ in a string $s$ take time $O(s.lenght() * s1.length())$, $[ ]$ takes constant time and all other operations on a 
  183. string $s$ take time $O(s.length())$.}*/
  184. #endif