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 
00030 
00036 #ifndef OWBI1_STRING_HPP_INCLUDE_GUARD_
00037 #define OWBI1_STRING_HPP_INCLUDE_GUARD_
00038 #include "OWBI1_config.h"
00039 #include "OWBI1_Types.hpp"
00040 #include "OWBI1_COWIntrusiveReference.hpp"
00041 #include "OWBI1_CommonFwd.hpp"
00042 #include "OWBI1_CIMFwd.hpp"
00043 #include "OWBI1_Exception.hpp"
00044 #include <iosfwd>
00045 
00046 namespace OWBI1
00047 {
00048 
00049 OWBI1_DECLARE_APIEXCEPTION(StringConversion, OWBI1_OWBI1PROVIFC_API);
00050 
00063 class OWBI1_OWBI1PROVIFC_API String
00064 {
00065 public:
00066    class ByteBuf;
00070    String();
00077    explicit String(Int32 val);
00084    explicit String(UInt32 val);
00085 
00086 #if defined(OWBI1_INT32_IS_INT) && defined(OWBI1_INT64_IS_LONG_LONG)
00087 
00093    explicit String(long val);
00100    explicit String(unsigned long val);
00101 #endif
00102 
00108    explicit String(Int64 val);
00115    explicit String(UInt64 val);
00122    explicit String(Real32 val);
00129    explicit String(Real64 val);
00135    String(const char* str);
00136    enum ETakeOwnershipFlag
00137    {
00138       E_TAKE_OWNERSHIP
00139    };
00151    explicit String(ETakeOwnershipFlag, char* allocatedMemory, size_t len);
00158    explicit String(const char* str, size_t len);
00166    String(const String& arg);
00171    explicit String(char c);
00175    ~String();
00179    void swap(String& x);
00186    char* allocateCString() const;
00190    size_t length() const;
00196    size_t UTF8Length() const;
00200    bool empty() const { return length() == 0; }
00209    int format(const char* fmt, ...);
00210    enum EReturnDelimitersFlag
00211    {
00212       E_DISCARD_DELIMITERS,
00213       E_RETURN_DELIMITERS
00214    };
00215    enum EEmptyTokenReturnFlag
00216    {
00217       E_SKIP_EMPTY_TOKENS,
00218       E_RETURN_EMPTY_TOKENS
00219    };
00233    StringArray tokenize(const char* delims = " \n\r\t\v",
00234       EReturnDelimitersFlag returnDelimitersAsTokens = E_DISCARD_DELIMITERS,
00235       EEmptyTokenReturnFlag returnEmptyTokens = E_SKIP_EMPTY_TOKENS ) const;
00240    const char* c_str() const;
00247    char charAt(size_t ndx) const;
00255    int compareTo(const String& arg) const;
00263    int compareTo(const char* arg) const;
00271    int compareToIgnoreCase(const String& arg) const;
00279    int compareToIgnoreCase(const char* arg) const;
00285    String& concat(const char* arg);
00286 
00292    String& concat(const String& arg)
00293    {
00294       return concat(arg.c_str());
00295    }
00296 
00302    String& concat(char arg);
00303    enum EIgnoreCaseFlag
00304    {
00305       E_CASE_SENSITIVE,
00306       E_CASE_INSENSITIVE
00307    };
00316    bool endsWith(const char* arg, EIgnoreCaseFlag ignoreCase = E_CASE_SENSITIVE) const;
00317 
00327    bool endsWith(const String& arg, EIgnoreCaseFlag ignoreCase = E_CASE_SENSITIVE) const
00328    {
00329       return endsWith(arg.c_str(), ignoreCase);
00330    }
00331 
00338    bool endsWith(char arg) const;
00339 
00347    bool equals(const String& arg) const;
00355    bool equals(const char* arg) const;
00364    bool equalsIgnoreCase(const String& arg) const;
00373    bool equalsIgnoreCase(const char* arg) const;
00377    UInt32 hashCode() const;
00386    size_t indexOf(char ch, size_t fromIndex=0) const;
00394    size_t indexOf(const char* arg, size_t fromIndex=0) const;
00402    size_t indexOf(const String& arg, size_t fromIndex=0) const
00403    {
00404       return indexOf(arg.c_str(), fromIndex);
00405    }
00406 
00415    size_t lastIndexOf(char ch, size_t fromIndex=npos) const;
00424    size_t lastIndexOf(const char* arg, size_t fromIndex=npos) const;
00433    size_t lastIndexOf(const String& arg, size_t fromIndex=npos) const
00434    {
00435       return lastIndexOf(arg.c_str(), fromIndex);
00436    }
00437 
00446    bool startsWith(const char* arg, EIgnoreCaseFlag ignoreCase = E_CASE_SENSITIVE) const;
00455    bool startsWith(const String& arg, EIgnoreCaseFlag ignoreCase = E_CASE_SENSITIVE) const
00456    {
00457       return startsWith(arg.c_str(), ignoreCase);
00458    }
00465    bool startsWith(char arg) const;
00466 
00475    String substring(size_t beginIndex,
00476       size_t length=npos) const;
00481    bool isSpaces() const;
00487    String& toLowerCase();
00493    String& toUpperCase();
00499    String& ltrim();
00505    String& rtrim();
00512    String& trim();
00518    String& erase();
00519    
00525    String& erase( size_t idx, size_t len = npos );
00532    String& operator= (const String & arg);
00540    const char& operator[] (size_t ndx) const;
00541    char& operator[] (size_t ndx);
00548    String& operator+= (const String& arg) { return concat(arg); }
00555    String& operator+= (const char* arg) { return concat(arg); }
00562    String& operator+= (char arg) { return concat(arg); }
00569    void readObject(std::istream& istrm);
00575    void writeObject(std::ostream& ostrm) const;
00579    String toString() const;
00584    Real32 toReal32() const;
00589    Real64 toReal64() const;
00595    bool toBool() const;
00600    UInt8 toUInt8(int base=10) const;
00605    Int8 toInt8(int base=10) const;
00610    UInt16 toUInt16(int base=10) const;
00615    Int16 toInt16(int base=10) const;
00620    UInt32 toUInt32(int base=10) const;
00625    Int32 toInt32(int base=10) const;
00630    UInt64 toUInt64(int base=10) const;
00635    Int64 toInt64(int base=10) const;
00640    unsigned int toUnsignedInt(int base=10) const;
00645    int toInt(int base=10) const;
00656    static unsigned long long int strtoull(const char* nptr, char** endptr,
00657       int base);
00668    static long long int strtoll(const char* nptr, char** endptr, int base);
00676    static const char* strchr(const char* theStr, int c);
00685    static String getLine(std::istream& istr);
00686 
00687 #if defined(OWBI1_AIX)
00688    static const size_t npos;
00689 #else
00690    static const size_t npos = ~0;
00691 #endif // OWBI1_AIX
00692 
00693 #ifdef OWBI1_WIN32
00694 #pragma warning (push)
00695 #pragma warning (disable: 4251)
00696 #endif
00697 
00698    typedef COWIntrusiveReference<ByteBuf> buf_t;
00699 private:
00700    buf_t m_buf;
00701 
00702 #ifdef OWBI1_WIN32
00703 #pragma warning (pop)
00704 #endif
00705 
00706 };
00707 OWBI1_OWBI1PROVIFC_API std::ostream& operator<< (std::ostream& ostr, const String& arg);
00708 OWBI1_OWBI1PROVIFC_API String operator + (const String& s1, const String& s2);
00709 OWBI1_OWBI1PROVIFC_API String operator + (const char* p, const String& s);
00710 OWBI1_OWBI1PROVIFC_API String operator + (const String& s, const char* p);
00711 OWBI1_OWBI1PROVIFC_API String operator + (char c, const String& s);
00712 OWBI1_OWBI1PROVIFC_API String operator + (const String& s, char c);
00713 inline bool
00714 operator == (const String& s1, const String& s2)
00715 {
00716    return (s1.compareTo(s2) == 0);
00717 }
00718 inline bool
00719 operator == (const String& s, const char* p)
00720 {
00721    return (s.compareTo(p) == 0);
00722 }
00723 inline bool
00724 operator == (const char* p, const String& s)
00725 {
00726    return (s.compareTo(p) == 0);
00727 }
00728 inline bool
00729 operator != (const String& s1, const String& s2)
00730 {
00731    return (s1.compareTo(s2) != 0);
00732 }
00733 inline bool
00734 operator != (const String& s, const char* p)
00735 {
00736    return (s.compareTo(p) != 0);
00737 }
00738 inline bool
00739 operator != (const char* p, const String& s)
00740 {
00741    return (s.compareTo(p) != 0);
00742 }
00743 inline bool
00744 operator < (const String& s1, const String& s2)
00745 {
00746    return (s1.compareTo(s2) < 0);
00747 }
00748 inline bool
00749 operator < (const String& s, const char* p)
00750 {
00751    return (s.compareTo(p) < 0);
00752 }
00753 inline bool
00754 operator < (const char* p, const String& s)
00755 {
00756    return (String(p).compareTo(s) < 0);
00757 }
00758 inline bool
00759 operator <= (const String& s1, const String& s2)
00760 {
00761    return (s1.compareTo(s2) <= 0);
00762 }
00763 inline bool
00764 operator <= (const String& s, const char* p)
00765 {
00766    return (s.compareTo(p) <= 0);
00767 }
00768 inline bool
00769 operator <= (const char* p, const String& s)
00770 {
00771    return (String(p).compareTo(s) <= 0);
00772 }
00773 inline bool
00774 operator > (const String& s1, const String& s2)
00775 {
00776    return (s1.compareTo(s2) > 0);
00777 }
00778 inline bool
00779 operator > (const String& s, const char* p)
00780 {
00781    return (s.compareTo(p) > 0);
00782 }
00783 inline bool
00784 operator > (const char* p, const String& s)
00785 {
00786    return (String(p).compareTo(s) > 0);
00787 }
00788 inline bool
00789 operator >= (const String& s1, const String& s2)
00790 {
00791    return (s1.compareTo(s2) >= 0);
00792 }
00793 inline bool
00794 operator >= (const String& s, const char* p)
00795 {
00796    return (s.compareTo(p) >= 0);
00797 }
00798 inline bool
00799 operator >= (const char* p, const String& s)
00800 {
00801    return (String(p).compareTo(s) >= 0);
00802 }
00803 
00804 } 
00805 
00806 #endif