00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkString_DEFINED
00018 #define SkString_DEFINED
00019
00020 #include "SkScalar.h"
00021
00022
00023
00024
00025 bool SkStrStartsWith(const char string[], const char prefix[]);
00026 bool SkStrEndsWith(const char string[], const char suffix[]);
00027 int SkStrStartsWithOneOf(const char string[], const char prefixes[]);
00028
00029 #define SkStrAppendS32_MaxSize 11
00030 char* SkStrAppendS32(char buffer[], int32_t);
00031 #define SkStrAppendScalar_MaxSize 11
00032 char* SkStrAppendScalar(char buffer[], SkScalar);
00033
00040 class SkString {
00041 public:
00042 SkString();
00043 explicit SkString(size_t len);
00044 explicit SkString(const char text[]);
00045 SkString(const char text[], size_t len);
00046 SkString(const SkString&);
00047 ~SkString();
00048
00049 bool isEmpty() const { return fRec->fLength == 0; }
00050 size_t size() const { return (size_t) fRec->fLength; }
00051 const char* c_str() const { return fRec->data(); }
00052 char operator[](size_t n) const { return this->c_str()[n]; }
00053
00054 bool equals(const SkString&) const;
00055 bool equals(const char text[]) const;
00056 bool equals(const char text[], size_t len) const;
00057
00058 bool startsWith(const char prefix[]) const
00059 {
00060 return SkStrStartsWith(fRec->data(), prefix);
00061 }
00062 bool endsWith(const char suffix[]) const
00063 {
00064 return SkStrEndsWith(fRec->data(), suffix);
00065 }
00066
00067 friend int operator==(const SkString& a, const SkString& b)
00068 {
00069 return a.equals(b);
00070 }
00071 friend int operator!=(const SkString& a, const SkString& b)
00072 {
00073 return !a.equals(b);
00074 }
00075
00076
00077
00078 SkString& operator=(const SkString&);
00079
00080 char* writable_str();
00081 char& operator[](size_t n) { return this->writable_str()[n]; }
00082
00083 void reset();
00084 void resize(size_t len) { this->set(NULL, len); }
00085 void set(const SkString& src) { *this = src; }
00086 void set(const char text[]);
00087 void set(const char text[], size_t len);
00088 void setUTF16(const uint16_t[]);
00089 void setUTF16(const uint16_t[], size_t len);
00090
00091 void insert(size_t offset, const SkString& src) { this->insert(offset, src.c_str(), src.size()); }
00092 void insert(size_t offset, const char text[]);
00093 void insert(size_t offset, const char text[], size_t len);
00094 void insertUnichar(size_t offset, SkUnichar);
00095 void insertS32(size_t offset, int32_t value);
00096 void insertHex(size_t offset, uint32_t value, int minDigits = 0);
00097 void insertScalar(size_t offset, SkScalar);
00098
00099 void append(const SkString& str) { this->insert((size_t)-1, str); }
00100 void append(const char text[]) { this->insert((size_t)-1, text); }
00101 void append(const char text[], size_t len) { this->insert((size_t)-1, text, len); }
00102 void appendUnichar(SkUnichar uni) { this->insertUnichar((size_t)-1, uni); }
00103 void appendS32(int32_t value) { this->insertS32((size_t)-1, value); }
00104 void appendHex(uint32_t value, int minDigits = 0) { this->insertHex((size_t)-1, value, minDigits); }
00105 void appendScalar(SkScalar value) { this->insertScalar((size_t)-1, value); }
00106
00107 void prepend(const SkString& str) { this->insert(0, str); }
00108 void prepend(const char text[]) { this->insert(0, text); }
00109 void prepend(const char text[], size_t len) { this->insert(0, text, len); }
00110 void prependUnichar(SkUnichar uni) { this->insertUnichar(0, uni); }
00111 void prependS32(int32_t value) { this->insertS32(0, value); }
00112 void prependHex(uint32_t value, int minDigits = 0) { this->insertHex(0, value, minDigits); }
00113 void prependScalar(SkScalar value) { this->insertScalar((size_t)-1, value); }
00114
00115 void printf(const char format[], ...);
00116 void appendf(const char format[], ...);
00117 void prependf(const char format[], ...);
00118
00119 void remove(size_t offset, size_t length);
00120
00124 void swap(SkString& other);
00125
00126 private:
00127 struct Rec {
00128 public:
00129 uint16_t fLength;
00130 uint16_t fRefCnt;
00131 char fBeginningOfData;
00132
00133 char* data() { return &fBeginningOfData; }
00134 const char* data() const { return &fBeginningOfData; }
00135 };
00136 Rec* fRec;
00137
00138 #ifdef SK_DEBUG
00139 const char* fStr;
00140 void validate() const;
00141 #else
00142 void validate() const {}
00143 #endif
00144
00145 static const Rec gEmptyRec;
00146 static Rec* AllocRec(const char text[], U16CPU len);
00147 static Rec* RefRec(Rec*);
00148 };
00149
00150 class SkAutoUCS2 {
00151 public:
00152 SkAutoUCS2(const char utf8[]);
00153 ~SkAutoUCS2();
00154
00157 int count() const { return fCount; }
00160 const uint16_t* getUCS2() const { return fUCS2; }
00161
00162 private:
00163 int fCount;
00164 uint16_t* fUCS2;
00165 };
00166
00167 #endif
00168