NTrace
GPU ray tracing framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
String.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2011, NVIDIA Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of NVIDIA Corporation nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "base/String.hpp"
29 
30 #include <stdio.h>
31 #include <time.h>
32 #include <ctype.h>
33 
34 using namespace FW;
35 
36 //------------------------------------------------------------------------
37 
38 String& String::set(char chr)
39 {
40  m_chars.reset(2);
41  m_chars[0] = chr;
42  m_chars[1] = '\0';
43  return *this;
44 }
45 
46 //------------------------------------------------------------------------
47 
48 String& String::set(const char* chars)
49 {
50  int len = strlen(chars);
51  if (!len)
52  return reset();
53 
54  m_chars.set(chars, len + 1);
55  return *this;
56 }
57 
58 //------------------------------------------------------------------------
59 
60 String& String::set(const char* start, const char* end)
61 {
62  int len = int(end-start);
63  if (!len)
64  return reset();
65 
66  m_chars.set(start, len + 1);
67  m_chars[len] = 0x00;
68  return *this;
69 }
70 
71 //------------------------------------------------------------------------
72 String& String::setf(const char* fmt, ...)
73 {
74  va_list args;
75  va_start(args, fmt);
76  setfv(fmt, args);
77  va_end(args);
78  return *this;
79 }
80 
81 //------------------------------------------------------------------------
82 
83 String& String::setfv(const char* fmt, va_list args)
84 {
85  int len = _vscprintf(fmt, args);
86  if (!len)
87  return reset();
88 
89  m_chars.reset(len + 1);
90  vsprintf_s(m_chars.getPtr(), len + 1, fmt, args);
91  return *this;
92 }
93 
94 //------------------------------------------------------------------------
95 
96 String String::substring(int start, int end) const
97 {
98  FW_ASSERT(end <= getLength());
99 
100  String res;
101  res.m_chars.reset(end - start + 1);
102  Array<char>::copy(res.m_chars.getPtr(), m_chars.getPtr(start), end - start);
103  res.m_chars[end - start] = '\0';
104  return res;
105 }
106 
107 //------------------------------------------------------------------------
108 
110 {
111  int len = getLength();
112  for (int i=0; i < len; i++)
113  if (!isspace(m_chars[i]))
114  return substring(i, getLength());
115  return "";
116 }
117 
118 //------------------------------------------------------------------------
119 
121 {
122  int len = getLength();
123  for (int i=len-1; i >= 0; i--)
124  if (!isspace(m_chars[i]))
125  return substring(0, i+1);
126  return "";
127 }
128 
129 //------------------------------------------------------------------------
130 
131 String String::trim(void) const
132 {
133  int len = getLength();
134  int idx = -1;
135 
136  for (int i=0; i < len; i++)
137  {
138  if (!isspace(m_chars[i]))
139  {
140  idx = i;
141  break;
142  }
143  }
144 
145  if (idx == -1)
146  return "";
147 
148  for (int i=len-1; i >= 0; i--)
149  if (!isspace(m_chars[i]))
150  return substring(idx, i+1);
151 
152  return ""; // unreachable
153 }
154 
155 //------------------------------------------------------------------------
156 
157 void String::split(char chr, Array<String>& pieces, bool includeEmpty) const
158 {
159  int n = 0;
160  while (n <= getLength())
161  {
162  int c = indexOf(chr, n);
163  if (c < 0)
164  c = getLength();
165  if (c != n || includeEmpty)
166  pieces.add(substring(n, c));
167  n = c+1;
168  }
169 }
170 
171 //------------------------------------------------------------------------
172 
174 {
175  int len = getLength();
176  m_chars.resize(len + 2);
177  m_chars[len] = chr;
178  m_chars[len + 1] = '\0';
179  return *this;
180 }
181 
182 //------------------------------------------------------------------------
183 
184 String& String::append(const char* chars)
185 {
186  int lenA = getLength();
187  int lenB = strlen(chars);
188  m_chars.resize(lenA + lenB + 1);
189  Array<char>::copy(m_chars.getPtr(lenA), chars, lenB);
190  m_chars[lenA + lenB] = '\0';
191  return *this;
192 }
193 
194 //------------------------------------------------------------------------
195 
197 {
198  if (&other != this)
199  return append(other.getPtr());
200 
201  String tmp = other;
202  return append(tmp.getPtr());
203 }
204 
205 //------------------------------------------------------------------------
206 
207 String& String::appendf(const char* fmt, ...)
208 {
209  va_list args;
210  va_start(args, fmt);
211  appendfv(fmt, args);
212  va_end(args);
213  return *this;
214 }
215 
216 //------------------------------------------------------------------------
217 
218 String& String::appendfv(const char* fmt, va_list args)
219 {
220  int lenA = getLength();
221  int lenB = _vscprintf(fmt, args);
222  m_chars.resize(lenA + lenB + 1);
223  vsprintf_s(m_chars.getPtr(lenA), lenB + 1, fmt, args);
224  return *this;
225 }
226 
227 //------------------------------------------------------------------------
228 
230 {
231  String str;
232  str.m_chars.reset(m_chars.getSize());
233  for (int i = 0; i < m_chars.getSize(); i++)
234  {
235  char c = m_chars[i];
236  if (c >= 'a' && c <= 'z')
237  c += 'A' - 'a';
238  str.m_chars[i] = c;
239  }
240  return str;
241 }
242 
243 //------------------------------------------------------------------------
244 
246 {
247  String str;
248  str.m_chars.reset(m_chars.getSize());
249  for (int i = 0; i < m_chars.getSize(); i++)
250  {
251  char c = m_chars[i];
252  if (c >= 'A' && c <= 'Z')
253  c += 'a' - 'A';
254  str.m_chars[i] = c;
255  }
256  return str;
257 }
258 
259 //------------------------------------------------------------------------
260 
261 bool String::startsWith(const String& str) const
262 {
263  const char* a = getPtr();
264  const char* b = str.getPtr();
265  for (int ofs = 0; b[ofs]; ofs++)
266  if (a[ofs] != b[ofs])
267  return false;
268  return true;
269 }
270 
271 //------------------------------------------------------------------------
272 
273 bool String::endsWith(const String& str) const
274 {
275  int a = getLength();
276  int b = str.getLength();
277  if (a < b)
278  return false;
279  return (strcmp(getPtr() + a - b, str.getPtr()) == 0);
280 }
281 
282 //------------------------------------------------------------------------
283 
285 {
286  int idx = max(lastIndexOf('/'), lastIndexOf('\\'));
287  return (idx == -1) ? *this : substring(idx + 1, getLength());
288 }
289 
290 //------------------------------------------------------------------------
291 
293 {
294  int idx = max(lastIndexOf('/'), lastIndexOf('\\'));
295  return (idx == -1) ? "." : substring(0, idx);
296 }
297 
298 //------------------------------------------------------------------------
299 
300 int String::strlen(const char* chars)
301 {
302  if (!chars)
303  return 0;
304 
305  int len = 0;
306  while (chars[len])
307  len++;
308  return len;
309 }
310 
311 //------------------------------------------------------------------------
312 
313 int String::strcmp(const char* a, const char* b)
314 {
315  int ofs = 0;
316  while (a[ofs] && a[ofs] == b[ofs])
317  ofs++;
318  return a[ofs] - b[ofs];
319 }
320 
321 //------------------------------------------------------------------------
322 
324 {
325  // Query and format.
326 
327  char buffer[256];
328  time_t currTime;
329  time(&currTime);
330  if (ctime_s(buffer, sizeof(buffer), &currTime) != 0)
331  fail("ctime_s() failed!");
332 
333  // Strip linefeed.
334 
335  char* ptr = buffer;
336  while (*ptr && *ptr != '\n' && *ptr != '\r')
337  ptr++;
338  *ptr = 0;
339  return buffer;
340 }
341 
342 //------------------------------------------------------------------------
343 
344 bool FW::parseSpace(const char*& ptr)
345 {
346  FW_ASSERT(ptr);
347  while (*ptr == ' ' || *ptr == '\t')
348  ptr++;
349  return true;
350 }
351 
352 //------------------------------------------------------------------------
353 
354 bool FW::parseChar(const char*& ptr, char chr)
355 {
356  FW_ASSERT(ptr);
357  if (*ptr != chr)
358  return false;
359  ptr++;
360  return true;
361 }
362 
363 //------------------------------------------------------------------------
364 
365 bool FW::parseLiteral(const char*& ptr, const char* str)
366 {
367  FW_ASSERT(ptr && str);
368  const char* tmp = ptr;
369 
370  while (*str && *tmp == *str)
371  {
372  tmp++;
373  str++;
374  }
375  if (*str)
376  return false;
377 
378  ptr = tmp;
379  return true;
380 }
381 
382 //------------------------------------------------------------------------
383 
384 bool FW::parseInt(const char*& ptr, S32& value)
385 {
386  const char* tmp = ptr;
387  S32 v = 0;
388  bool neg = (!parseChar(tmp, '+') && parseChar(tmp, '-'));
389  if (*tmp < '0' || *tmp > '9')
390  return false;
391  while (*tmp >= '0' && *tmp <= '9')
392  v = v * 10 + *tmp++ - '0';
393 
394  value = (neg) ? -v : v;
395  ptr = tmp;
396  return true;
397 }
398 
399 //------------------------------------------------------------------------
400 
401 bool FW::parseInt(const char*& ptr, S64& value)
402 {
403  const char* tmp = ptr;
404  S64 v = 0;
405  bool neg = (!parseChar(tmp, '+') && parseChar(tmp, '-'));
406  if (*tmp < '0' || *tmp > '9')
407  return false;
408  while (*tmp >= '0' && *tmp <= '9')
409  v = v * 10 + *tmp++ - '0';
410 
411  value = (neg) ? -v : v;
412  ptr = tmp;
413  return true;
414 }
415 
416 //------------------------------------------------------------------------
417 
418 bool FW::parseHex(const char*& ptr, U32& value)
419 {
420  const char* tmp = ptr;
421  U32 v = 0;
422  for (;;)
423  {
424  if (*tmp >= '0' && *tmp <= '9') v = v * 16 + *tmp++ - '0';
425  else if (*tmp >= 'A' && *tmp <= 'F') v = v * 16 + *tmp++ - 'A' + 10;
426  else if (*tmp >= 'a' && *tmp <= 'f') v = v * 16 + *tmp++ - 'a' + 10;
427  else break;
428  }
429 
430  if (tmp == ptr)
431  return false;
432 
433  value = v;
434  ptr = tmp;
435  return true;
436 }
437 
438 //------------------------------------------------------------------------
439 
440 bool FW::parseFloat(const char*& ptr, F32& value)
441 {
442  const char* tmp = ptr;
443  bool neg = (!parseChar(tmp, '+') && parseChar(tmp, '-'));
444 
445  F32 v = 0.0f;
446  int numDigits = 0;
447  while (*tmp >= '0' && *tmp <= '9')
448  {
449  v = v * 10.0f + (F32)(*tmp++ - '0');
450  numDigits++;
451  }
452  if (parseChar(tmp, '.'))
453  {
454  F32 scale = 1.0f;
455  while (*tmp >= '0' && *tmp <= '9')
456  {
457  scale *= 0.1f;
458  v += scale * (F32)(*tmp++ - '0');
459  numDigits++;
460  }
461  }
462  if (!numDigits)
463  return false;
464 
465  ptr = tmp;
466  if (*ptr == '#')
467  {
468  if (parseLiteral(ptr, "#INF"))
469  {
470  value = bitsToFloat((neg) ? 0xFF800000 : 0x7F800000);
471  return true;
472  }
473  if (parseLiteral(ptr, "#SNAN"))
474  {
475  value = bitsToFloat((neg) ? 0xFF800001 : 0x7F800001);
476  return true;
477  }
478  if (parseLiteral(ptr, "#QNAN"))
479  {
480  value = bitsToFloat((neg) ? 0xFFC00001 : 0x7FC00001);
481  return true;
482  }
483  if (parseLiteral(ptr, "#IND"))
484  {
485  value = bitsToFloat((neg) ? 0xFFC00000 : 0x7FC00000);
486  return true;
487  }
488  }
489 
490  S32 e = 0;
491  if ((parseChar(tmp, 'e') || parseChar(tmp, 'E')) && parseInt(tmp, e))
492  {
493  ptr = tmp;
494  if (e)
495  v *= pow(10.0f, (F32)e);
496  }
497  value = (neg) ? -v : v;
498  return true;
499 }
500 
501 //------------------------------------------------------------------------
502 
503 bool FW::parseVec3f(const char*& ptr, Vec3f& value)
504 {
505  if(!parseChar(ptr, '('))
506  return false;
507 
508  for(int j = 0; j < 3; j++)
509  {
510  if(!parseFloat(ptr, value[j]) || (j < 2 && !parseChar(ptr, ',')))
511  return false;
512  }
513 
514  if(!parseChar(ptr, ')'))
515  return false;
516 
517  return true;
518 }
519 
520 //------------------------------------------------------------------------
String trimEnd(void) const
Definition: String.cpp:120
String & append(char chr)
Definition: String.cpp:173
String substring(int start, int end) const
Definition: String.cpp:96
bool endsWith(const String &str) const
Definition: String.cpp:273
const char * getPtr(void) const
Definition: String.hpp:51
static void copy(T *dst, const T *src, S32size)
String & setf(const char *fmt,...)
Definition: String.cpp:72
String getFileName(void) const
Definition: String.cpp:284
String & appendfv(const char *fmt, va_list args)
Definition: String.cpp:218
int indexOf(char chr) const
Definition: String.hpp:78
FW_CUDA_FUNC F32 scale(F32 a, int b)
Definition: Math.hpp:104
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer
Definition: DLLImports.inl:315
void ** ptr
Definition: DLLImports.cpp:74
bool parseVec3f(const char *&ptr, Vec3f &value)
Definition: String.cpp:503
FW_CUDA_FUNC F64 pow(F64 a, F64 b)
Definition: Math.hpp:45
String & setfv(const char *fmt, va_list args)
Definition: String.cpp:83
String toLower(void) const
Definition: String.cpp:245
int lastIndexOf(char chr) const
Definition: String.hpp:80
String & reset(void)
Definition: String.hpp:53
bool parseLiteral(const char *&ptr, const char *str)
Definition: String.cpp:365
void reset(S size=0)
Definition: Array.hpp:317
float F32
Definition: Defs.hpp:89
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid GLenum usage GLuint shader GLenum type GLsizei const GLuint framebuffers GLsizei const GLuint renderbuffers GLuint v
Definition: DLLImports.inl:329
String & set(char chr)
Definition: String.cpp:38
FW_CUDA_FUNC T max(const VectorBase< T, L, S > &v)
Definition: Math.hpp:462
#define FW_ASSERT(X)
Definition: Defs.hpp:67
signed int S32
Definition: Defs.hpp:88
int getLength(void) const
Definition: String.hpp:49
String getDirName(void) const
Definition: String.cpp:292
String trimStart(void) const
Definition: String.cpp:109
CUdevice int ordinal char int len
Definition: DLLImports.inl:48
bool parseInt(const char *&ptr, S32 &value)
Definition: String.cpp:384
signed __int64 S64
Definition: Defs.hpp:98
unsigned int U32
Definition: Defs.hpp:85
F32 bitsToFloat(U32 a)
Definition: Math.hpp:96
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction f
Definition: DLLImports.inl:88
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value
Definition: DLLImports.inl:84
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr const GLvoid GLenum usage GLuint shader GLenum type GLsizei n
Definition: DLLImports.inl:325
String trim(void) const
Definition: String.cpp:131
bool parseFloat(const char *&ptr, F32 &value)
Definition: String.cpp:440
String & appendf(const char *fmt,...)
Definition: String.cpp:207
bool startsWith(const String &str) const
Definition: String.cpp:261
bool parseSpace(const char *&ptr)
Definition: String.cpp:344
void split(char chr, Array< String > &pieces, bool includeEmpty=false) const
Definition: String.cpp:157
T set(S idx, const T &item)
Definition: Array.hpp:248
bool parseHex(const char *&ptr, U32 &value)
Definition: String.cpp:418
const T * getPtr(S idx=0) const
Definition: Array.hpp:202
void fail(const char *fmt,...)
Definition: Defs.cpp:304
String getDateString(void)
Definition: String.cpp:323
void resize(S size)
Definition: Array.hpp:366
S getSize(void) const
Definition: Array.hpp:188
bool parseChar(const char *&ptr, char chr)
Definition: String.cpp:354
String toUpper(void) const
Definition: String.cpp:229