Branch data Line data Source code
1 : : //- Class: CubitString
2 : : //-
3 : : //- Description: This file defines the CubitString class which is a
4 : : //- simple implementation of a character string. Basic functionality
5 : : //- is provided as well as equality/inequality tests, subscripting into
6 : : //- a string, searching a string for another string.
7 : : //-
8 : :
9 : : #if !defined(CUBITSTRING_HPP)
10 : : #define CUBITSTRING_HPP
11 : :
12 : : #include <sstream>
13 : : #include <vector>
14 : : #include <string>
15 : :
16 : : #include "CGMUtilConfigure.h"
17 : :
18 : : // GCC compiler checking of format arguments
19 : : // Note: For class member functions, the first argument is the
20 : : // implicit 'this' pointer, so if the format string is the
21 : : // first explicit argument A should be 2, not 1.
22 : : #ifdef __GNUC__
23 : : # define CUBIT_STRING_PRINTF_FORMAT(A,B) __attribute__ ((format (printf, A, B)))
24 : : #else
25 : : # define CUBIT_STRING_PRINTF_FORMAT(A,B)
26 : : #endif
27 : :
28 : : #if defined(_MSC_VER)
29 : : #pragma warning(push)
30 : : #pragma warning(disable : 4251) // hide warnings about template dll exports
31 : : #endif
32 : :
33 : : //! String class that represents a UTF-8 string
34 : : class CUBIT_UTIL_EXPORT CubitString
35 : : {
36 : : public:
37 : : //! max size of a string
38 : : static const size_t npos;
39 : :
40 : : enum CaseSensitivity
41 : : {
42 : : CaseInsensitive,
43 : : CaseSensitive
44 : : };
45 : :
46 : : //! Default constructor
47 : : CubitString();
48 : :
49 : : //! Default destructor
50 : : ~CubitString();
51 : :
52 : : //! Copy Constructor
53 : : CubitString(const CubitString& s);
54 : :
55 : : //! Create a string from a char*
56 : : CubitString(const char* s);
57 : :
58 : : //- Create a string from a std::string
59 : : CubitString(const std::string& s);
60 : :
61 : : CubitString(int i,char c);
62 : : //- Create a string from a char
63 : :
64 : : //! Create a string from a integer or other stringstream recognized type
65 : : template <typename T>
66 : 421 : static CubitString number(const T& i)
67 : : {
68 [ + - ][ + - ]: 421 : std::stringstream si;
69 [ + - ]: 421 : si << i;
70 [ + - ][ + - ]: 421 : return CubitString(si.str().c_str());
[ + - ][ + - ]
[ + - ]
71 : : }
72 : :
73 : : //! Create a value from a CubitString.
74 : : template <typename T>
75 : : static T toNumber(const CubitString& str, bool *ok = NULL)
76 : : {
77 : : std::istringstream ss(str.c_str());
78 : : T result;
79 : : bool temp_ok = ss >> result;
80 : : if(ok)
81 : : (*ok) = temp_ok;
82 : : return result;
83 : : }
84 : :
85 : : //! Create a string from a double.
86 : : //! Use either fixed point or scientific notation, whichever is shorter.
87 : : //! s_length is the maximum string length: If s_length > 0, then
88 : : //! string will contain no spaces and be close to s_length long
89 : : //! without going over. Hence precision is variable.
90 : : static CubitString number(double f, unsigned int s_length = 0, unsigned int sig_digits = 0);
91 : :
92 : : //! set a formated string with arguments
93 : : static CubitString format(const char* fmt, ...) CUBIT_STRING_PRINTF_FORMAT(1,2);
94 : :
95 : : CubitString& operator=(const CubitString& s);
96 : :
97 : : CubitString& operator+=(const CubitString& s);
98 : :
99 : : CUBIT_UTIL_EXPORT friend CubitString operator+(const CubitString& s1, const CubitString& s2);
100 : :
101 : : CUBIT_UTIL_EXPORT friend bool operator<=(const CubitString&, const CubitString&);
102 : : CUBIT_UTIL_EXPORT friend bool operator>=(const CubitString&, const CubitString&);
103 : : CUBIT_UTIL_EXPORT friend bool operator<(const CubitString&, const CubitString&);
104 : : CUBIT_UTIL_EXPORT friend bool operator>(const CubitString&, const CubitString&);
105 : :
106 : : bool operator==(const CubitString &s) const;
107 : : bool operator!=(const CubitString &s) const;
108 : : //- Predicates: Compare equality/inequality with other CubitStrings or
109 : : //- with pointers to a list of characters.
110 : :
111 : : //! compare this string with another and return whether they are equal.
112 : : //! one can also specify case sensitivity
113 : : bool compare(const CubitString& s, CaseSensitivity cs = CaseSensitive);
114 : : // note case insensitive comparison with unicode is not yet supported
115 : :
116 : : //! get a character at a position
117 : : char get_at(size_t pos) const;
118 : : //! set a character at a position
119 : : void put_at(size_t pos, char c);
120 : :
121 : : //! get a substring starting at first and counting
122 : : CubitString substr(size_t first, size_t count = CubitString::npos) const;
123 : :
124 : : //! remove len number of characters starting at a position pos.
125 : : void erase(size_t pos, size_t len = npos);
126 : :
127 : : //! replace a portion of ths string with another string
128 : : void replace(size_t pos, size_t len, const CubitString& str);
129 : :
130 : : //! replace every occurance of string with another string
131 : : void replace(const CubitString& to_find, const CubitString& to_replace);
132 : :
133 : : //! convert to lower case (Note: this is not internationalized)
134 : : void to_lower();
135 : : static void to_lower(char *string);
136 : : //! convert to upper case (Note: this is not internationalized)
137 : : void to_upper();
138 : : static void to_upper(char *string);
139 : :
140 : : //! trim off whitespace from the beginning and end of the string
141 : : void trim();
142 : :
143 : : //! trim whitespace from the beginning and end of string, and
144 : : //! each sequence of internal white space is replaced with a single space
145 : : void simplify();
146 : :
147 : : //! split a string given a delimiter
148 : : void tokenize( char delimiter, std::vector<CubitString> &strings ) const;
149 : :
150 : :
151 : : //! find functions
152 : : size_t find(const CubitString& s, size_t pos = 0) const;
153 : : size_t find_first_of(const CubitString& s, size_t pos = 0) const;
154 : : size_t find_first(char c, size_t pos = 0) const;
155 : : size_t find_last (char c, size_t pos = CubitString::npos) const;
156 : :
157 : :
158 : : //! return whether the string ends with str
159 : : bool ends_with(const CubitString& str) const;
160 : : //! return whether the string starts with str
161 : : bool starts_with(const CubitString& str) const;
162 : :
163 : : //! returns whether the string is empty
164 : : bool is_empty() const;
165 : :
166 : : //! returns the length of the string
167 : : size_t length() const;
168 : :
169 : : //! returns a const char* for the string
170 : : const char *c_str() const;
171 : :
172 : : //! returns a std::string
173 : : const std::string& str() const;
174 : :
175 : : //! clear the string
176 : : void clear();
177 : :
178 : : //! resize the string. If growing, it is filled with null characters.
179 : : void resize(size_t n);
180 : : //! resize the string. If growing, it is filled with the given character.
181 : : void resize(size_t n, char c);
182 : :
183 : : // UTF-16/UTF-8 unicode conversions to support using Unicode aware Windows APIs.
184 : : // Note: wchar_t on non-Windows platforms is UTF-32
185 : : #if defined(_WIN32)
186 : : static std::wstring toUtf16(const char* str);
187 : : static std::wstring toUtf16(const CubitString& str);
188 : : static CubitString toUtf8(const wchar_t* str);
189 : : #endif
190 : :
191 : : #if defined(_MSC_VER)
192 : : static std::wstring toNative(const char* str);
193 : : static std::wstring toNative(const CubitString& str);
194 : : #else
195 : : static CubitString toNative(const char* str);
196 : : static CubitString toNative(const CubitString& str);
197 : : #endif
198 : :
199 : : static std::wstring toWide(const CubitString& str);
200 : : static CubitString toNarrow(const std::wstring& str);
201 : :
202 : : private:
203 : : std::string rep;
204 : : };
205 : :
206 : : #if defined(_MSC_VER)
207 : : #pragma warning(pop)
208 : : #endif
209 : :
210 : : #endif
211 : :
|