Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Cstring.hh
Go to the documentation of this file.
1 #ifndef INCLUDED_ObjexxFCL_Cstring_hh
2 #define INCLUDED_ObjexxFCL_Cstring_hh
3 
4 
5 // Cstring: C String Wrapper
6 //
7 // Project: Objexx Fortran Compatibility Library (ObjexxFCL)
8 //
9 // Version: 3.0.0
10 //
11 // Language: C++
12 //
13 // Copyright (c) 2000-2009 Objexx Engineering, Inc. All Rights Reserved.
14 // Use of this source code or any derivative of it is restricted by license.
15 // Licensing is available from Objexx Engineering, Inc.: http://objexx.com Objexx@objexx.com
16 
17 
18 // C++ Headers
19 #include <cassert>
20 #include <cstddef>
21 #include <cstring>
22 #include <iosfwd>
23 #include <string>
24 
25 #ifdef CXX11
26 #include <type_traits> // for swap
27 #else
28 #include <algorithm>
29 #endif
30 
31 namespace ObjexxFCL {
32 
33 
34 // Types
35 typedef char * cstring;
36 typedef char const * c_cstring;
37 
38 
39 /// @brief Cstring: C String Wrapper
40 ///
41 /// @remarks
42 /// @li A memory-managed C string (char*) wrapper for convenience when using a C-style interfaces
43 /// @li Explicit conversion from std::string
44 /// @li Implicit conversion from/to char* for argument passing
45 /// @li Automatic memory management
46 /// @li Invariant: Null-terminated upon return from any constructor or function
47 class Cstring
48 {
49 
50 
51 public: // Types
52 
53 
54  // STL Style
55  typedef std::size_t size_type;
56 
57  // C++ Style
58  typedef std::size_t Size;
59 
60 
61 public: // Creation
62 
63 
64  /// @brief Default Constructor
65  inline
66  Cstring() :
67  str_( new char[ 1 ] )
68  {
69  str_[ 0 ] ='\0';
70  }
71 
72 
73  /// @brief Copy Constructor
74  inline
75  Cstring( Cstring const & s ) :
76  str_( new char[ std::strlen( s.str_ ) + 1 ] )
77  {
78  std::memcpy( str_, s.str_, std::strlen( s.str_ ) + 1 );
79  }
80 
81 
82  /// @brief C string Constructor: Implicit Conversion
83  inline
84  Cstring( c_cstring const s ) :
85  str_( new char[ std::strlen( s ) + 1 ] )
86  {
87  std::memcpy( str_, s, std::strlen( s ) + 1 );
88  }
89 
90 
91  /// @brief std::string Constructor
92  inline
93  explicit
94  Cstring( std::string const & s ) :
95  str_( new char[ s.length() + 1 ] )
96  {
97  size_type const len( s.length() );
98  s.copy( str_, len );
99  str_[ len ] = '\0';
100  }
101 
102 
103  /// @brief Cstring + Length Constructor
104  inline
106  Cstring const & s,
107  size_type const len
108  ) :
109  str_( new char[ len + 1 ] )
110  {
111  assert( len <= s.length() );
112  std::memcpy( str_, s.str_, len );
113  str_[ len ] = '\0';
114  }
115 
116 
117  /// @brief C string + Length Constructor
118  inline
120  c_cstring const s,
121  size_type const len
122  ) :
123  str_( new char[ len + 1 ] )
124  {
125  assert( len <= std::strlen( s ) );
126  std::memcpy( str_, s, len );
127  str_[ len ] = '\0';
128  }
129 
130 
131  /// @brief std::string + Length Constructor
132  inline
134  std::string const & s,
135  size_type const len
136  ) :
137  str_( new char[ len + 1 ] )
138  {
139  assert( len <= s.length() );
140  s.copy( str_, len );
141  str_[ len ] = '\0';
142  }
143 
144 
145  /// @brief char Constructor
146  inline
147  explicit
148  Cstring( char const c ) :
149  str_( new char[ 2 ] )
150  {
151  str_[ 0 ] = c;
152  str_[ 1 ] = '\0';
153  }
154 
155 
156  /// @brief Length Constructor
157  inline
158  explicit
159  Cstring( size_type const len ) :
160  str_( new char[ len + 1 ] )
161  {
162  std::memset( str_, ' ', len );
163  str_[ len ] = '\0';
164  }
165 
166 
167  /// @brief Length Constructor
168  inline
169  explicit
170  Cstring( int const len ) :
171  str_( new char[ len + 1 ] )
172  {
173  std::memset( str_, ' ', len );
174  str_[ len ] = '\0';
175  }
176 
177 
178  /// @brief Destructor
179  inline
180  virtual
182  {
183  delete[] str_;
184  }
185 
186 
187 public: // Conversion
188 
189 
190  /// @brief C string Conversion: Invalid after str_ is reallocated
191  inline
192  operator c_cstring() const
193  {
194  return str_;
195  }
196 
197 
198  /// @brief C string Conversion: Invalid after str_ is reallocated
199  inline
200  operator cstring()
201  {
202  return str_;
203  }
204 
205 
206 public: // Assignment
207 
208 
209  /// @brief Copy Assignment
210  inline
211  Cstring &
212  operator =( Cstring const & s )
213  {
214  if ( this != &s ) {
215  size_type const len( s.length() + 1 );
216  delete[] str_; str_ = new char[ len ];
217  std::memcpy( str_, s.str_, len );
218  }
219  return *this;
220  }
221 
222 
223  /// @brief cstring Assignment
224  inline
225  Cstring &
227  {
228  size_type const len( std::strlen( s ) + 1 );
229  delete[] str_; str_ = new char[ len ];
230  std::memmove( str_, s, len );
231  return *this;
232  }
233 
234 
235  /// @brief std::string Assignment
236  inline
237  Cstring &
238  operator =( std::string const & s )
239  {
240  size_type const len( s.length() );
241  delete[] str_; str_ = new char[ len + 1 ];
242  s.copy( str_, len );
243  str_[ len ] = '\0';
244  return *this;
245  }
246 
247 
248  /// @brief char Assignment
249  inline
250  Cstring &
251  operator =( char const c )
252  {
253  delete[] str_; str_ = new char[ 2 ];
254  str_[ 0 ] = c;
255  str_[ 1 ] = '\0';
256  return *this;
257  }
258 
259 
260  /// @brief Cstring Append
261  inline
262  Cstring &
263  operator +=( Cstring const & s )
264  {
265  Cstring( *this + s ).swap( *this );
266  return *this;
267  }
268 
269 
270  /// @brief cstring Append
271  inline
272  Cstring &
274  {
275  Cstring( *this + s ).swap( *this );
276  return *this;
277  }
278 
279 
280  /// @brief std::string Append
281  inline
282  Cstring &
283  operator +=( std::string const & s )
284  {
285  Cstring( *this + s ).swap( *this );
286  return *this;
287  }
288 
289 
290  /// @brief char Append
291  inline
292  Cstring &
293  operator +=( char const c )
294  {
295  Cstring( *this + c ).swap( *this );
296  return *this;
297  }
298 
299 
300 public: // Predicate
301 
302 
303  /// @brief Empty?
304  inline
305  bool
306  empty() const
307  {
308  return ( std::strlen( str_ ) == 0 );
309  }
310 
311 
312  /// @brief Blank?
313  inline
314  bool
315  is_blank() const
316  {
317  return ( len_trim() == 0 );
318  }
319 
320 
321  /// @brief Not blank?
322  inline
323  bool
324  not_blank() const
325  {
326  return ( len_trim() != 0 );
327  }
328 
329 
330  /// @brief Has Any Character of a Cstring?
331  bool
332  has_any_of( Cstring const & s ) const;
333 
334 
335  /// @brief Has Any Character of a cstring?
336  bool
337  has_any_of( c_cstring const s ) const;
338 
339 
340  /// @brief Has Any Character of a std::string?
341  bool
342  has_any_of( std::string const s ) const;
343 
344 
345  /// @brief Has a Character?
346  bool
347  has_any_of( char const c ) const;
348 
349 
350  /// @brief Has a Character?
351  bool
352  has( char const c ) const;
353 
354 
355 public: // Inspector
356 
357 
358  /// @brief Length
359  inline
360  size_type
361  length() const
362  {
363  return std::strlen( str_ );
364  }
365 
366 
367  /// @brief Length
368  inline
369  size_type
370  len() const
371  {
372  return std::strlen( str_ );
373  }
374 
375 
376  /// @brief Size
377  inline
378  size_type
379  size() const
380  {
381  return std::strlen( str_ );
382  }
383 
384 
385  /// @brief Length Space-Trimmed
386  size_type
387  len_trim() const;
388 
389 
390  /// @brief Length Whitespace-Trimmed
391  size_type
392  len_trim_whitespace() const;
393 
394 
395  /// @brief Find First Occurrence of a Character
396  size_type
397  find( char const c ) const;
398 
399 
400  /// @brief Find Last Occurrence of a Character
401  size_type
402  find_last( char const c ) const;
403 
404 
405 public: // Modifier
406 
407 
408  /// @brief Lowercase
409  Cstring &
410  lowercase();
411 
412 
413  /// @brief Uppercase
414  Cstring &
415  uppercase();
416 
417 
418  /// @brief Left Justify
419  Cstring &
420  left_justify();
421 
422 
423  /// @brief Right Justify
424  Cstring &
425  right_justify();
426 
427 
428  /// @brief Trim Trailing Space
429  inline
430  Cstring &
432  {
433  str_[ len_trim() ] = '\0';
434  return *this;
435  }
436 
437 
438  /// @brief Trim Trailing Whitespace
439  inline
440  Cstring &
442  {
443  str_[ len_trim_whitespace() ] = '\0';
444  return *this;
445  }
446 
447 
448  /// @brief Center
449  Cstring &
450  center();
451 
452 
453  /// @brief Compress Out Whitespace
454  Cstring &
455  compress();
456 
457 
458  /// @brief swap( Cstring )
459  inline
460  void
462  {
463  std::swap( str_, s.str_ );
464  }
465 
466 
467  /// @brief swap( Cstring, Cstring )
468  friend
469  inline
470  void
471  swap( Cstring & s, Cstring & t )
472  {
473  std::swap( s.str_, t.str_ );
474  }
475 
476 
477 public: // Subscript
478 
479 
480  /// @brief Cstring[ i ] const
481  inline
482  char
483  operator []( size_type const i ) const
484  {
485  assert( i < std::strlen( str_ ) );
486  return str_[ i ];
487  }
488 
489 
490  /// @brief Cstring[ i ]
491  inline
492  char &
494  {
495  assert( i < std::strlen( str_ ) );
496  return str_[ i ];
497  }
498 
499 
500  /// @brief Cstring[ i ] const
501  /// @note Overload prevents ambiguity with built-in operator[] with int arguments
502  inline
503  char
504  operator []( int const i ) const
505  {
506  assert( i >= 0 );
507  assert( static_cast< size_type >( i ) < std::strlen( str_ ) );
508  return str_[ i ];
509  }
510 
511 
512  /// @brief Cstring[ i ]
513  /// @note Overload prevents ambiguity with built-in operator[] with int arguments
514  inline
515  char &
516  operator []( int const i )
517  {
518  assert( i >= 0 );
519  assert( static_cast< size_type >( i ) < std::strlen( str_ ) );
520  return str_[ i ];
521  }
522 
523 
524 public: // Concatenation
525 
526 
527  /// @brief Cstring + Cstring
528  friend
529  inline
530  Cstring
531  operator +( Cstring const & s, Cstring const & t )
532  {
533  size_type const s_len( s.length() );
534  size_type const t_len( t.length() );
535  Cstring u( s_len + t_len );
536  std::memcpy( u.str_, s.str_, s_len );
537  std::memcpy( u.str_ + s_len, t.str_, t_len + 1 );
538  return u;
539  }
540 
541 
542  /// @brief Cstring + cstring
543  friend
544  inline
545  Cstring
546  operator +( Cstring const & s, c_cstring const t )
547  {
548  size_type const s_len( s.length() );
549  size_type const t_len( std::strlen( t ) );
550  Cstring u( s_len + t_len );
551  std::memcpy( u.str_, s.str_, s_len );
552  std::memcpy( u.str_ + s_len, t, t_len + 1 );
553  return u;
554  }
555 
556 
557  /// @brief cstring + Cstring
558  friend
559  inline
560  Cstring
561  operator +( c_cstring const s, Cstring const & t )
562  {
563  size_type const s_len( std::strlen( s ) );
564  size_type const t_len( t.length() );
565  Cstring u( s_len + t_len );
566  std::memcpy( u.str_, s, s_len );
567  std::memcpy( u.str_ + s_len, t.str_, t_len + 1 );
568  return u;
569  }
570 
571 
572  /// @brief Cstring + std::string
573  friend
574  inline
575  Cstring
576  operator +( Cstring const & s, std::string const & t )
577  {
578  size_type const s_len( s.length() );
579  size_type const t_len( t.length() );
580  Cstring u( s_len + t_len );
581  std::memcpy( u.str_, s.str_, s_len );
582  t.copy( u.str_ + s_len, t_len );
583  return u;
584  }
585 
586 
587  /// @brief Cstring + char
588  friend
589  inline
590  Cstring
591  operator +( Cstring const & s, char const c )
592  {
593  size_type const s_len( s.length() );
594  Cstring u( s_len + 1 );
595  std::memcpy( u.str_, s.str_, s_len );
596  u.str_[ s_len ] = c;
597  return u;
598  }
599 
600 
601  /// @brief char + Cstring
602  friend
603  inline
604  Cstring
605  operator +( char const c, Cstring const & t )
606  {
607  size_type const t_len( t.length() );
608  Cstring u( 1 + t_len );
609  u.str_[ 0 ] = c;
610  std::memcpy( u.str_ + 1, t.str_, t_len + 1 );
611  return u;
612  }
613 
614 
615 public: // Generator
616 
617 
618  /// @brief Lowercased Copy
619  inline
620  Cstring
621  lowercased() const
622  {
623  return Cstring( *this ).lowercase();
624  }
625 
626 
627  /// @brief Uppercased Copy
628  inline
629  Cstring
630  uppercased() const
631  {
632  return Cstring( *this ).uppercase();
633  }
634 
635 
636  /// @brief Left-Justified Copy
637  inline
638  Cstring
640  {
641  return Cstring( *this ).left_justify();
642  }
643 
644 
645  /// @brief Right-Justified Copy
646  inline
647  Cstring
649  {
650  return Cstring( *this ).right_justify();
651  }
652 
653 
654  /// @brief Space-Trimmed Copy
655  inline
656  Cstring
657  trimmed() const
658  {
659  return Cstring( *this, len_trim() );
660  }
661 
662 
663  /// @brief Whitespace-Trimmed Copy
664  inline
665  Cstring
667  {
668  return Cstring( *this, len_trim_whitespace() );
669  }
670 
671 
672  /// @brief Centered Copy
673  inline
674  Cstring
675  centered() const
676  {
677  return Cstring( *this ).center();
678  }
679 
680 
681  /// @brief Compressed Copy
682  inline
683  Cstring
684  compressed() const
685  {
686  return Cstring( *this ).compress();
687  }
688 
689 
690 public: // Comparison
691 
692 
693  /// @brief Cstring == Cstring
694  friend
695  inline
696  bool
697  operator ==( Cstring const & s, Cstring const & t )
698  {
699  return ( std::strcmp( s.str_, t.str_ ) == 0 );
700  }
701 
702 
703  /// @brief Cstring != Cstring
704  friend
705  inline
706  bool
707  operator !=( Cstring const & s, Cstring const & t )
708  {
709  return ( std::strcmp( s.str_, t.str_ ) != 0 );
710  }
711 
712 
713  /// @brief Cstring == cstring
714  friend
715  inline
716  bool
717  operator ==( Cstring const & s, c_cstring const t )
718  {
719  return ( std::strcmp( s.str_, t ) == 0 );
720  }
721 
722 
723  /// @brief cstring == Cstring
724  friend
725  inline
726  bool
727  operator ==( c_cstring const t, Cstring const & s )
728  {
729  return ( std::strcmp( s.str_, t ) == 0 );
730  }
731 
732 
733  /// @brief Cstring != cstring
734  friend
735  inline
736  bool
737  operator !=( Cstring const & s, c_cstring const t )
738  {
739  return ( std::strcmp( s.str_, t ) != 0 );
740  }
741 
742 
743  /// @brief cstring != Cstring
744  friend
745  inline
746  bool
747  operator !=( c_cstring const t, Cstring const & s )
748  {
749  return ( std::strcmp( s.str_, t ) != 0 );
750  }
751 
752 
753  /// @brief Cstring == std::string
754  friend
755  inline
756  bool
757  operator ==( Cstring const & s, std::string const & t )
758  {
759  return ( s.str_ == t );
760  }
761 
762 
763  /// @brief std::string == Cstring
764  friend
765  inline
766  bool
767  operator ==( std::string const & t, Cstring const & s )
768  {
769  return ( t == s.str_ );
770  }
771 
772 
773  /// @brief Cstring != std::string
774  friend
775  inline
776  bool
777  operator !=( Cstring const & s, std::string const & t )
778  {
779  return ( s.str_ != t );
780  }
781 
782 
783  /// @brief std::string != Cstring
784  friend
785  inline
786  bool
787  operator !=( std::string const & t, Cstring const & s )
788  {
789  return ( t != s.str_ );
790  }
791 
792 
793  /// @brief Cstring == char
794  friend
795  inline
796  bool
797  operator ==( Cstring const & s, char const c )
798  {
799  return ( ( s.length() == 1 ) && ( s.str_[ 0 ] == c ) );
800  }
801 
802 
803  /// @brief char == Cstring
804  friend
805  inline
806  bool
807  operator ==( char const c, Cstring const & s )
808  {
809  return ( ( s.length() == 1 ) && ( s.str_[ 0 ] == c ) );
810  }
811 
812 
813  /// @brief Cstring != char
814  friend
815  inline
816  bool
817  operator !=( Cstring const & s, char const c )
818  {
819  return ( ( s.length() != 1 ) || ( s.str_[ 0 ] != c ) );
820  }
821 
822 
823  /// @brief char != Cstring
824  friend
825  inline
826  bool
827  operator !=( char const c, Cstring const & s )
828  {
829  return ( ( s.length() != 1 ) || ( s.str_[ 0 ] != c ) );
830  }
831 
832 
833  /// @brief Cstring == Cstring Case-Insensitively?
834  friend
835  bool
836  equali( Cstring const & s, Cstring const & t );
837 
838 
839  /// @brief Cstring == cstring Case-Insensitively?
840  friend
841  bool
842  equali( Cstring const & s, c_cstring const t );
843 
844 
845  /// @brief cstring == Cstring Case-Insensitively?
846  friend
847  bool
848  equali( c_cstring const s, Cstring const & t );
849 
850 
851  /// @brief Cstring == std::string Case-Insensitively?
852  friend
853  bool
854  equali( Cstring const & s, std::string const & t );
855 
856 
857  /// @brief std::string == Cstring Case-Insensitively?
858  friend
859  bool
860  equali( std::string const & s, Cstring const & t );
861 
862 
863  /// @brief Cstring == char Case-Insensitively?
864  friend
865  bool
866  equali( Cstring const & s, char const c );
867 
868 
869  /// @brief char == Cstring Case-Insensitively?
870  friend
871  bool
872  equali( char const c, Cstring const & s );
873 
874 
875 public: // I/O
876 
877 
878  /// @brief Output to Stream
879  friend
880  std::ostream &
881  operator <<( std::ostream & stream, Cstring const & s );
882 
883 
884  /// @brief Input from Stream
885  friend
886  std::istream &
887  operator >>( std::istream & stream, Cstring & s );
888 
889 
890 public: // Data
891 
892 
893  static size_type const npos = static_cast< size_type >( -1 );
894 
895 
896 private: // Data
897 
898 
899  /// @brief String
900  char * str_;
901 
902 
903 }; // Cstring
904 
905 
906 /// @brief swap( Cstring, Cstring );
907 void
908 swap( Cstring & s, Cstring & t );
909 
910 
911 /// @brief Cstring + Cstring
912 Cstring
913 operator +( Cstring const & s, Cstring const & t );
914 
915 
916 /// @brief Cstring + cstring
917 Cstring
918 operator +( Cstring const & s, c_cstring const t );
919 
920 
921 /// @brief cstring + Cstring
922 Cstring
923 operator +( c_cstring const s, Cstring const & t );
924 
925 
926 /// @brief Cstring + std::string
927 Cstring
928 operator +( Cstring const & s, std::string const & t );
929 
930 
931 /// @brief Cstring + char
932 Cstring
933 operator +( Cstring const & s, char const c );
934 
935 
936 /// @brief char + Cstring
937 Cstring
938 operator +( char const c, Cstring const & t );
939 
940 
941 /// @brief Cstring == Cstring
942 bool
943 operator ==( Cstring const & s, Cstring const & t );
944 
945 
946 /// @brief Cstring != Cstring
947 bool
948 operator !=( Cstring const & s, Cstring const & t );
949 
950 
951 /// @brief Cstring == cstring
952 bool
953 operator ==( Cstring const & s, c_cstring const t );
954 
955 
956 /// @brief cstring == Cstring
957 bool
958 operator ==( c_cstring const t, Cstring const & s );
959 
960 
961 /// @brief Cstring != cstring
962 bool
963 operator !=( Cstring const & s, c_cstring const t );
964 
965 
966 /// @brief cstring != Cstring
967 bool
968 operator !=( c_cstring const t, Cstring const & s );
969 
970 
971 /// @brief Cstring == std::string
972 bool
973 operator ==( Cstring const & s, std::string const & t );
974 
975 
976 /// @brief std::string == Cstring
977 bool
978 operator ==( std::string const & t, Cstring const & s );
979 
980 
981 /// @brief Cstring != std::string
982 bool
983 operator !=( Cstring const & s, std::string const & t );
984 
985 
986 /// @brief std::string != Cstring
987 bool
988 operator !=( std::string const & t, Cstring const & s );
989 
990 
991 /// @brief Cstring == char
992 bool
993 operator ==( Cstring const & s, char const c );
994 
995 
996 /// @brief char == Cstring
997 bool
998 operator ==( char const c, Cstring const & s );
999 
1000 
1001 /// @brief Cstring != char
1002 bool
1003 operator !=( Cstring const & s, char const c );
1004 
1005 
1006 /// @brief char != Cstring
1007 bool
1008 operator !=( char const c, Cstring const & s );
1009 
1010 
1011 /// @brief Cstring == Cstring Case-Insensitively?
1012 bool
1013 equali( Cstring const & s, Cstring const & t );
1014 
1015 
1016 /// @brief Cstring == cstring Case-Insensitively?
1017 bool
1018 equali( Cstring const & s, c_cstring const t );
1019 
1020 
1021 /// @brief cstring == Cstring Case-Insensitively?
1022 bool
1023 equali( c_cstring const s, Cstring const & t );
1024 
1025 
1026 /// @brief Cstring == std::string Case-Insensitively?
1027 bool
1028 equali( Cstring const & s, std::string const & t );
1029 
1030 
1031 /// @brief std::string == Cstring Case-Insensitively?
1032 bool
1033 equali( std::string const & s, Cstring const & t );
1034 
1035 
1036 /// @brief Cstring == char Case-Insensitively?
1037 bool
1038 equali( Cstring const & s, char const c );
1039 
1040 
1041 /// @brief char == Cstring Case-Insensitively?
1042 bool
1043 equali( char const c, Cstring const & s );
1044 
1045 
1046 /// @brief Output to Stream
1047 std::ostream &
1048 operator <<( std::ostream & stream, Cstring const & s );
1049 
1050 
1051 /// @brief Input from Stream
1052 std::istream &
1053 operator >>( std::istream & stream, Cstring & s );
1054 
1055 
1056 } // namespace ObjexxFCL
1057 
1058 
1059 #endif // INCLUDED_ObjexxFCL_Cstring_HH
std::istream & operator>>(std::istream &stream, byte &b)
Stream Input.
Definition: byte.hh:409
Cstring right_justified() const
Right-Justified Copy.
Definition: Cstring.hh:648
Cstring(size_type const len)
Length Constructor.
Definition: Cstring.hh:159
bool is_blank() const
Blank?
Definition: Cstring.hh:315
Cstring & compress()
Compress Out Whitespace.
Definition: Cstring.cc:218
bool operator!=(byte const &i, byte const &j)
byte != byte
Definition: byte.hh:356
Cstring(std::string const &s, size_type const len)
std::string + Length Constructor
Definition: Cstring.hh:133
friend bool equali(Cstring const &s, Cstring const &t)
Cstring == Cstring Case-Insensitively?
Definition: Cstring.cc:233
Cstring & trim()
Trim Trailing Space.
Definition: Cstring.hh:431
bool has(char const c) const
Has a Character?
Definition: Cstring.cc:89
static void swap(T &x, T &y)
Definition: Svm.cc:21
Cstring(c_cstring const s)
C string Constructor: Implicit Conversion.
Definition: Cstring.hh:84
char * cstring
Definition: Cstring.hh:35
Cstring & left_justify()
Left Justify.
Definition: Cstring.cc:167
Cstring centered() const
Centered Copy.
Definition: Cstring.hh:675
void swap(Cstring &s)
swap( Cstring )
Definition: Cstring.hh:461
friend std::istream & operator>>(std::istream &stream, Cstring &s)
Input from Stream.
Definition: Cstring.cc:345
size_type find(char const c) const
Find First Occurrence of a Character.
Definition: Cstring.cc:123
Cstring(char const c)
char Constructor
Definition: Cstring.hh:148
size_type size() const
Size.
Definition: Cstring.hh:379
size_type len_trim() const
Length Space-Trimmed.
Definition: Cstring.cc:100
size_type len_trim_whitespace() const
Length Whitespace-Trimmed.
Definition: Cstring.cc:111
Cstring()
Default Constructor.
Definition: Cstring.hh:66
Cstring left_justified() const
Left-Justified Copy.
Definition: Cstring.hh:639
Cstring(std::string const &s)
std::string Constructor
Definition: Cstring.hh:94
Cstring & uppercase()
Uppercase.
Definition: Cstring.cc:156
friend bool operator==(Cstring const &s, Cstring const &t)
Cstring == Cstring.
Definition: Cstring.hh:697
byte operator+(byte const &i, byte const &j)
byte + byte
Definition: byte.hh:194
Cstring & center()
Center.
Definition: Cstring.cc:203
friend bool operator!=(Cstring const &s, Cstring const &t)
Cstring != Cstring.
Definition: Cstring.hh:707
bool has_any_of(Cstring const &s) const
Has Any Character of a Cstring?
Definition: Cstring.cc:36
char const * c_cstring
bool equali(char const c, char const d)
char == char Case-Insensitively
virtual ~Cstring()
Destructor.
Definition: Cstring.hh:181
Cstring trimmed_whitespace() const
Whitespace-Trimmed Copy.
Definition: Cstring.hh:666
size_type length() const
Length.
Definition: Cstring.hh:361
Cstring: C String Wrapper.
Definition: Cstring.hh:47
Cstring(Cstring const &s, size_type const len)
Cstring + Length Constructor.
Definition: Cstring.hh:105
Cstring & lowercase()
Lowercase.
Definition: Cstring.cc:145
Cstring uppercased() const
Uppercased Copy.
Definition: Cstring.hh:630
Cstring lowercased() const
Lowercased Copy.
Definition: Cstring.hh:621
char * str_
String.
Definition: Cstring.hh:900
Cstring & right_justify()
Right Justify.
Definition: Cstring.cc:185
Cstring(int const len)
Length Constructor.
Definition: Cstring.hh:170
Cstring & operator+=(Cstring const &s)
Cstring Append.
Definition: Cstring.hh:263
bool empty() const
Empty?
Definition: Cstring.hh:306
Cstring & trim_whitespace()
Trim Trailing Whitespace.
Definition: Cstring.hh:441
std::size_t size_type
Definition: Cstring.hh:55
Cstring compressed() const
Compressed Copy.
Definition: Cstring.hh:684
Cstring & operator=(Cstring const &s)
Copy Assignment.
Definition: Cstring.hh:212
Cstring(c_cstring const s, size_type const len)
C string + Length Constructor.
Definition: Cstring.hh:119
Cstring trimmed() const
Space-Trimmed Copy.
Definition: Cstring.hh:657
size_type find_last(char const c) const
Find Last Occurrence of a Character.
Definition: Cstring.cc:134
static size_type const npos
Definition: Cstring.hh:893
void swap(CArray< T > &a, CArray< T > &b)
Swap.
Definition: CArray.hh:1403
size_type len() const
Length.
Definition: Cstring.hh:370
std::ostream & operator<<(std::ostream &stream, CArray< T > const &a)
stream << CArray
Definition: CArray.io.hh:33
std::size_t Size
Definition: Cstring.hh:58
bool operator==(byte const &i, byte const &j)
byte == byte
Definition: byte.hh:346
friend Cstring operator+(Cstring const &s, Cstring const &t)
Cstring + Cstring.
Definition: Cstring.hh:531
char operator[](size_type const i) const
Cstring[ i ] const.
Definition: Cstring.hh:483
bool not_blank() const
Not blank?
Definition: Cstring.hh:324
Cstring(Cstring const &s)
Copy Constructor.
Definition: Cstring.hh:75
friend std::ostream & operator<<(std::ostream &stream, Cstring const &s)
Output to Stream.
Definition: Cstring.cc:334