#define STRING_HH
-#include <string.h>
+// too darn slow with gcc3
+#ifdef STREAM_SUPPORT
+#if ( __GNUC__ > 2 )
#include <iostream.h>
-#include <Rational.h>
+#else
+class ostream;
+#endif
+#endif
+#include "arithmetic-operator.hh"
+#include "flower-proto.hh"
#include "string-handle.hh"
/**
indexing (index_i, index_any_i, last_index_i)
\item
- cutting (left_str, right_str, mid_str)
+ cutting (left_string, right_string, mid_string)
\item
concat (+=, +)
class String
{
protected:
- String_handle strh_;
+ String_handle strh_;
- bool null_terminated();
+ bool null_terminated ();
public:
- /** init to empty string. This is needed because other
- constructors are provided.*/
- String() { }
- String(Rational);
+ /** init to empty string. This is needed because other
+ constructors are provided.*/
+ String ();
- /// String s = "abc";
- String( char const* source );
- String( Byte const* byte_c_l, int length_i );
+ /// String s = "abc";
+ String (char const* source);
+ String (Byte const* byte, int length_i);
- /// "ccccc"
- String( char c, int n = 1 );
+ /// return "new"-ed copy of contents
+ Byte* get_copy_byte () const;
+ char* get_copy_str0 () const;
- String( int i , char const *fmt=0);
- String ( double f , char const* fmt =0);
- /// 'true' or 'false'
- String(bool );
+ char const* to_str0 () const;
+ Byte const* to_bytes () const;
+ char* get_str0 ();
+ Byte* get_bytes ();
- /// return a "new"-ed copy of contents
- Byte* copy_byte_p() const; // return a "new"-ed copy of contents
+ String &operator = (String const & source);
- char const* ch_c_l() const;
- Byte const* byte_c_l() const;
- char* ch_l();
- Byte* byte_l();
+ /// concatenate s
+ void operator += (char const* s) { strh_ += s; }
+ void operator += (String s);
- /// deprecated; use ch_c_l()
- operator char const* () const { return ch_c_l(); }
-
- String &operator =( String const & source );
+ bool is_empty () const;
- /// concatenate s
- void operator += (char const* s) { strh_ += s; }
- void operator += (String s);
+ void append (String);
+ void prepend (String);
- void append(String);
- void prepend(String);
+ /**
+ Return a char. UNSAFE because it may change strlen () result
+ */
+ char &operator [] (int n);
+ char operator [] (int n) const;
- char operator []( int n ) const { return strh_[n]; }
+ /// return n leftmost chars
+ String left_string (int n) const;
- /// return n leftmost chars
- String left_str( int n ) const;
+ /// return n rightmost chars
+ String right_string (int n) const;
- /// return n rightmost chars
- String right_str( int n ) const;
+ /// return uppercase of *this
+ String upper_string () const;
- /// return uppercase of *this
- String upper_str() const;
+ /// return lowercase of *this
+ String lower_string () const;
- /// return lowercase of *this
- String lower_str() const;
+ /// return the "esrever" of *this
+ String reversed_string () const;
- /// return the "esrever" of *this
- String reversed_str() const;
+ /// return a piece starting at index (first char = index_i 0), length n
+ String cut_string (int index_i, int n) const;
+ /// cut out a middle piece, return remainder
+ String nomid_string (int index_i, int n) const;
- /// return a piece starting at index_i (first char = index_i 0), length n
- String mid_str(int index_i, int n ) const;
+ /// signed comparison, analogous to memcmp;
+ static int compare (String const & s1,const String& s2);
+
+ /// index of rightmost c
+ int index_last (char c) const;
- /// cut out a middle piece, return remainder
- String nomid_str(int index_i, int n ) const;
+ /// index of rightmost element of string (???)
+ int index_last (char const* string) const;
- /// signed comparison, analogous to memcmp;
- static int compare_i(String const & s1,const String& s2);
-
- /// index of rightmost c
- int index_last_i( char c) const;
+ int index (char c) const;
- /// index of rightmost element of string
- int index_last_i( char const* string ) const;
+ /// index of leftmost occurance of STRING
+ int index (String) const;
- int index_i(char c ) const;
- int index_i(String ) const;
- int index_any_i(String ) const;
- void to_upper();
- void to_lower();
- /// provide Stream output
- void print_on(ostream& os) const;
+ int index_any (String) const;
- /// the length of the string
- int length_i() const;
+ void to_upper ();
+ void to_lower ();
- // ***** depreciated
- int len() const {
- return length_i();
- }
+#ifdef STREAM_SUPPORT
+ /// provide Stream output
+ void print_on (ostream& os) const;
+#endif
+
+ /// the length of the string
+ int length () const;
- /// convert to an integer
- int value_i() const;
+ /// convert to an integer
+ int to_int () const;
- /// convert to a double
- double value_f() const;
+ /// convert to a double
+ double to_double () const;
};
+/*
+ better to clutter global namespace, than suffer *ugh, ugh, ugh*
+ implicit conversions.
+
+ it might be cool to have no type-checking at all in a language,
+ but once there is, having this silently circumvented is a nightmare.
+
+ whenever implicit conversions seem necessary (e.g. operator << ()),
+ use Scalar as the generic type iso String.
+ */
+
+/// for completeness (=handy)
+inline String to_string (String s) { return s; }
+/// "cccc"
+String to_string (char c, int n = 1);
+String to_string (int i, char const* format = 0);
+String to_string (double f, char const* format = 0);
+String to_string (long b);
+String to_string (bool b);
+String to_string (char const* format, ... );
+
+/*
+ technically incorrect, but lets keep it here: this is a
+ catch all place for this stuff.
+ */
+
+#include "international.hh"
+
+
#include "compare.hh"
+INSTANTIATE_COMPARE (String const &, String::compare);
+
+#ifdef STRING_UTILS_INLINED
+#ifndef INLINE
+#define INLINE inline
+#endif
+#include "string.icc"
+/* we should be resetting INLINE. oh well. */
+#endif
-instantiate_compare(String const &, String::compare_i);
// because char const* also has an operator ==, this is for safety:
-inline bool operator==(String s1, char const* s2){
- return s1 == String(s2);
-}
-inline bool operator==(char const* s1, String s2)
+inline bool operator== (String s1, char const* s2)
{
- return String(s1)==s2;
-}
-inline bool operator!=(String s1, char const* s2 ) {
- return s1!=String(s2);
-}
-inline bool operator!=(char const* s1,String s2) {
- return String(s2) !=s1;
+ return s1 == String (s2);
}
-
-
-inline String
-operator + (String s1, String s2)
+inline bool operator== (char const* s1, String s2)
{
- s1 += s2;
- return s1;
+ return String (s1)==s2;
}
-
-inline ostream &
-operator << ( ostream& os, String d )
-{
- d.print_on(os);
- return os;
+inline bool operator!= (String s1, char const* s2 ) {
+ return s1!=String (s2);
+}
+inline bool operator!= (char const* s1,String s2) {
+ return String (s2) !=s1;
}
-
-// String quoteString(String message, String quote);
+IMPLEMENT_ARITHMETIC_OPERATOR (String, +);
+#ifdef STREAM_SUPPORT
+ostream &operator << (ostream& os, String d);
+#endif
#endif