00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <algorithm>
00019 #include <string>
00020 #include <limits>
00021
00022 #include <OpenKarto/StringHelper.h>
00023 #include <OpenKarto/Geometry.h>
00024
00025 namespace karto
00026 {
00027
00031
00032 String StringHelper::ToString(const char* value)
00033 {
00034 return String(value);
00035 }
00036
00037 String StringHelper::ToString(kt_bool value)
00038 {
00039 if (value == true)
00040 {
00041 return String("true");
00042 }
00043
00044 return String("false");
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 String StringHelper::ToString(kt_int16u value)
00056 {
00057 std::stringstream converter;
00058 converter.precision(std::numeric_limits<double>::digits10);
00059 converter << value;
00060 return converter.str().c_str();
00061 }
00062
00063 String StringHelper::ToString(kt_int16s value)
00064 {
00065 std::stringstream converter;
00066 converter.precision(std::numeric_limits<double>::digits10);
00067 converter << value;
00068 return converter.str().c_str();
00069 }
00070
00071 String StringHelper::ToString(kt_int32u value)
00072 {
00073 char buffer[64];
00074 #ifdef WIN32
00075 sprintf_s(buffer, 64, "%u", value);
00076 #else
00077 sprintf(buffer, "%u", value);
00078 #endif
00079 return String(buffer);
00080 }
00081
00082 String StringHelper::ToString(kt_int32s value)
00083 {
00084 char buffer[64];
00085 #ifdef WIN32
00086 sprintf_s(buffer, 64, "%d", value);
00087 #else
00088 sprintf(buffer, "%d", value);
00089 #endif
00090 return String(buffer);
00091 }
00092
00093 String StringHelper::ToString(kt_int64u value)
00094 {
00095 std::stringstream converter;
00096 converter.precision(std::numeric_limits<double>::digits10);
00097 converter << value;
00098 return converter.str().c_str();
00099 }
00100
00101 String StringHelper::ToString(kt_int64s value)
00102 {
00103 std::stringstream converter;
00104 converter.precision(std::numeric_limits<double>::digits10);
00105 converter << value;
00106 return converter.str().c_str();
00107 }
00108
00109 #if defined(__APPLE__) && !defined(__LP64__)
00110 String StringHelper::ToString(kt_size_t value)
00111 {
00112 std::stringstream converter;
00113 converter.precision(std::numeric_limits<double>::digits10);
00114 converter << value;
00115 return converter.str().c_str();
00116 }
00117 #endif
00118
00119 String StringHelper::ToString(kt_float value)
00120 {
00121 char buffer[64];
00122 #ifdef WIN32
00123 sprintf_s(buffer, 64, "%.*g", 8, (double) value);
00124 #else
00125 sprintf(buffer, "%.*g", 8, (double) value);
00126 #endif
00127 return String(buffer);
00128 }
00129
00130 String StringHelper::ToString(kt_double value)
00131 {
00132 char buffer[64];
00133 #ifdef WIN32
00134 sprintf_s(buffer, 64, "%.*g", 16, value);
00135 #else
00136 sprintf(buffer, "%.*g", 16, value);
00137 #endif
00138 return String(buffer);
00139 }
00140
00141 String StringHelper::ToString(kt_float value, kt_int32u precision)
00142 {
00143 char buffer[64];
00144 #ifdef WIN32
00145 sprintf_s(buffer, 64, "%.*f", (kt_int32s)precision, (double)value);
00146 #else
00147 sprintf(buffer, "%.*f", (kt_int32s)precision, (double)value);
00148 #endif
00149 return String(buffer);
00150 }
00151
00152 String StringHelper::ToString(kt_double value, kt_int32u precision)
00153 {
00154 char buffer[64];
00155 #ifdef WIN32
00156 sprintf_s(buffer, 64, "%.*f", (kt_int32s)precision, value);
00157 #else
00158 sprintf(buffer, "%.*f", (kt_int32s)precision, value);
00159 #endif
00160 return String(buffer);
00161 }
00162
00163 karto::String StringHelper::ToString(const String& rValue)
00164 {
00165 return rValue;
00166 }
00167
00168 karto::String StringHelper::ToString(const Quaternion& rValue)
00169 {
00170 return rValue.ToString();
00171 }
00172
00173 karto::String StringHelper::ToString(const Color& rValue)
00174 {
00175 return rValue.ToString();
00176 }
00177
00178 karto::String StringHelper::ToString(const Pose2& rValue)
00179 {
00180 return rValue.ToString();
00181 }
00182
00183 karto::String StringHelper::ToString(const Pose3& rValue)
00184 {
00185 return rValue.ToString();
00186 }
00187
00188 kt_bool StringHelper::FromString(const String& rStringValue, kt_bool& rValue)
00189 {
00190 rValue = false;
00191
00192 if (ToLowerCase(rStringValue) == String("true"))
00193 {
00194 rValue = true;
00195 }
00196
00197 return true;
00198 }
00199
00200 kt_bool StringHelper::FromString(const String& rStringValue, kt_int16s& rValue)
00201 {
00202 int precision = std::numeric_limits<double>::digits10;
00203 std::stringstream converter;
00204 converter.precision(precision);
00205
00206 converter.str(rStringValue.ToCString());
00207
00208 converter >> rValue;
00209
00210 return true;
00211 }
00212
00213 kt_bool StringHelper::FromString(const String& rStringValue, kt_int16u& rValue)
00214 {
00215 int precision = std::numeric_limits<double>::digits10;
00216 std::stringstream converter;
00217 converter.precision(precision);
00218
00219 converter.str(rStringValue.ToCString());
00220
00221 converter >> rValue;
00222
00223 return true;
00224 }
00225
00226 kt_bool StringHelper::FromString(const String& rStringValue, kt_int32s& rValue)
00227 {
00228 int precision = std::numeric_limits<double>::digits10;
00229 std::stringstream converter;
00230 converter.precision(precision);
00231
00232 converter.str(rStringValue.ToCString());
00233
00234 converter >> rValue;
00235
00236 return true;
00237 }
00238
00239 kt_bool StringHelper::FromString(const String& rStringValue, kt_int32u& rValue)
00240 {
00241 int precision = std::numeric_limits<double>::digits10;
00242 std::stringstream converter;
00243 converter.precision(precision);
00244
00245 converter.str(rStringValue.ToCString());
00246
00247 converter >> rValue;
00248
00249 return true;
00250 }
00251
00252 kt_bool StringHelper::FromString(const String& rStringValue, kt_int64s& rValue)
00253 {
00254 int precision = std::numeric_limits<double>::digits10;
00255 std::stringstream converter;
00256 converter.precision(precision);
00257
00258 converter.str(rStringValue.ToCString());
00259
00260 converter >> rValue;
00261
00262 return true;
00263 }
00264
00265 kt_bool StringHelper::FromString(const String& rStringValue, kt_int64u& rValue)
00266 {
00267 int precision = std::numeric_limits<double>::digits10;
00268 std::stringstream converter;
00269 converter.precision(precision);
00270
00271 converter.str(rStringValue.ToCString());
00272
00273 converter >> rValue;
00274
00275 return true;
00276 }
00277
00278 kt_bool StringHelper::FromString(const String& rStringValue, kt_float& rValue)
00279 {
00280 int precision = std::numeric_limits<double>::digits10;
00281 std::stringstream converter;
00282 converter.precision(precision);
00283
00284 converter.str(rStringValue.ToCString());
00285
00286 converter >> rValue;
00287
00288 return true;
00289 }
00290
00291 kt_bool StringHelper::FromString(const String& rStringValue, kt_double& rValue)
00292 {
00293 int precision = std::numeric_limits<double>::digits10;
00294 std::stringstream converter;
00295 converter.precision(precision);
00296
00297 converter.str(rStringValue.ToCString());
00298
00299 converter >> rValue;
00300
00301 return true;
00302 }
00303
00304 kt_bool StringHelper::FromString(const String& rStringValue, String& rValue)
00305 {
00306 rValue = rStringValue;
00307
00308 return true;
00309 }
00310
00311 kt_bool StringHelper::FromString(const String& rStringValue, Quaternion& rValue)
00312 {
00313 kt_size_t index = rStringValue.FindFirstOf(" ");
00314 if (index != -1)
00315 {
00316 std::stringstream converter;
00317 converter.str(rStringValue.ToCString());
00318
00319 kt_double valueX = 0.0;
00320 kt_double valueY = 0.0;
00321 kt_double valueZ = 0.0;
00322 kt_double valueW = 0.0;
00323
00324 converter >> valueX;
00325 converter >> valueY;
00326 converter >> valueZ;
00327 converter >> valueW;
00328
00329 rValue.SetX(valueX);
00330 rValue.SetY(valueY);
00331 rValue.SetZ(valueZ);
00332 rValue.SetW(valueW);
00333
00334 return true;
00335 }
00336
00337 return false;
00338 }
00339
00340 kt_bool StringHelper::FromString(const String& rStringValue, Color& rValue)
00341 {
00342 kt_size_t index = rStringValue.FindFirstOf(" ");
00343 if (index != -1)
00344 {
00345 std::stringstream converter;
00346 converter.str(rStringValue.ToCString());
00347
00348 kt_double valueRed = 0.0;
00349 kt_double valueGreen = 0.0;
00350 kt_double valueBlue = 0.0;
00351 kt_double valueAlpha = 0.0;
00352
00353 converter >> valueRed;
00354 converter >> valueGreen;
00355 converter >> valueBlue;
00356 converter >> valueAlpha;
00357
00358 rValue.SetRed(valueRed);
00359 rValue.SetGreen(valueGreen);
00360 rValue.SetBlue(valueBlue);
00361 rValue.SetAlpha(valueAlpha);
00362
00363 return true;
00364 }
00365
00366 return false;
00367 }
00368
00369 kt_bool StringHelper::FromString(const String& rStringValue, Pose2& rValue)
00370 {
00371 kt_size_t index = rStringValue.FindFirstOf(" ");
00372 if (index != -1)
00373 {
00374 std::stringstream converter;
00375 converter.str(rStringValue.ToCString());
00376
00377 kt_double valueX = 0.0;
00378 kt_double valueY = 0.0;
00379 kt_double valueHeading = 0.0;
00380
00381 converter >> valueX;
00382 converter >> valueY;
00383 converter >> valueHeading;
00384
00385 rValue.SetX(valueX);
00386 rValue.SetY(valueY);
00387 rValue.SetHeading(valueHeading);
00388
00389 return true;
00390 }
00391
00392 return false;
00393 }
00394
00395 kt_bool StringHelper::FromString(const String& rStringValue, Pose3& rValue)
00396 {
00397 kt_size_t index = rStringValue.FindFirstOf(" ");
00398 if (index != -1)
00399 {
00400 std::stringstream converter;
00401 converter.str(rStringValue.ToCString());
00402
00403 kt_double valueX = 0.0;
00404 kt_double valueY = 0.0;
00405 kt_double valueZ = 0.0;
00406 kt_double valueW = 0.0;
00407
00408 converter >> valueX;
00409 converter >> valueY;
00410 converter >> valueZ;
00411 rValue.SetPosition(karto::Vector3d(valueX, valueY, valueZ));
00412
00413 valueX = 0.0;
00414 valueY = 0.0;
00415 valueZ = 0.0;
00416 valueW = 0.0;
00417
00418 converter >> valueX;
00419 converter >> valueY;
00420 converter >> valueZ;
00421 converter >> valueW;
00422 rValue.SetOrientation(karto::Quaternion(valueX, valueY, valueZ, valueW));
00423
00424 return true;
00425 }
00426
00427 return false;
00428 }
00429
00430 String StringHelper::Trim(const String& rValue)
00431 {
00432 char const* delims = " \t\r\n";
00433
00434 std::string result(rValue.ToCString());
00435 std::string::size_type index = result.find_last_not_of(delims);
00436 if (index != std::string::npos)
00437 result.erase(++index);
00438
00439 index = result.find_first_not_of(delims);
00440 if (index != std::string::npos)
00441 {
00442 result.erase(0, index);
00443 }
00444 else
00445 {
00446 result.erase();
00447 }
00448
00449 return String(result.c_str());
00450 }
00451
00452 String StringHelper::Replace(const String& rSource, const String& rFind, const String& rReplace)
00453 {
00454 size_t j;
00455
00456 std::string retStr = rSource.ToCString();
00457
00458 if (rFind == rReplace)
00459 {
00460 return String(retStr.c_str());
00461 }
00462
00463 for (; ( j = retStr.find(rFind.ToCString()) ) != std::string::npos; )
00464 {
00465 retStr.replace( j, rFind.Size(), rReplace.ToCString());
00466 }
00467
00468 return String(retStr.c_str());
00469 }
00470
00471 kt_bool StringHelper::IsLetter(char ch)
00472 {
00473 return isalpha(ch) != 0;
00474 }
00475
00476 String StringHelper::ToLowerCase(const String &rValue)
00477 {
00478 std::string value = rValue.ToCString();
00479 std::string ext = rValue.ToCString();
00480
00481 std::transform(value.begin(), value.end(), ext.begin(), tolower);
00482
00483 return String(ext.c_str());
00484 }
00485
00486 String StringHelper::ToUpperCase(const String &rValue)
00487 {
00488 std::string value = rValue.ToCString();
00489 std::string ext = rValue.ToCString();
00490
00491 std::transform(value.begin(), value.end(), ext.begin(), toupper);
00492
00493 return String(ext.c_str());
00494 }
00495
00499
00500 void StringBuilder::Clear()
00501 {
00502 m_String = "";
00503 }
00504
00505 const String& StringBuilder::ToString() const
00506 {
00507 return m_String;
00508 }
00509
00510
00511
00512
00513
00514
00515
00516
00517 StringBuilder& StringBuilder::operator << (kt_int8u value)
00518 {
00519 m_String.Append(karto::StringHelper::ToString(value));
00520
00521 return *this;
00522 }
00523
00524 StringBuilder& StringBuilder::operator << (kt_int16s value)
00525 {
00526 m_String.Append(karto::StringHelper::ToString(value));
00527
00528 return *this;
00529 }
00530
00531 StringBuilder& StringBuilder::operator << (kt_int16u value)
00532 {
00533 m_String.Append(karto::StringHelper::ToString(value));
00534
00535 return *this;
00536 }
00537
00538 StringBuilder& StringBuilder::operator << (kt_int32s value)
00539 {
00540 m_String.Append(karto::StringHelper::ToString(value));
00541
00542 return *this;
00543 }
00544
00545 StringBuilder& StringBuilder::operator << (kt_int32u value)
00546 {
00547 m_String.Append(karto::StringHelper::ToString(value));
00548
00549 return *this;
00550 }
00551
00552 StringBuilder& StringBuilder::operator << (kt_int64s value)
00553 {
00554 m_String.Append(karto::StringHelper::ToString(value));
00555
00556 return *this;
00557 }
00558
00559 StringBuilder& StringBuilder::operator << (kt_int64u value)
00560 {
00561 m_String.Append(karto::StringHelper::ToString(value));
00562
00563 return *this;
00564 }
00565
00566 #if defined(__APPLE__) && !defined(__LP64__)
00567 StringBuilder& StringBuilder::operator << (kt_size_t value)
00568 {
00569 m_String.Append(karto::StringHelper::ToString(value));
00570
00571 return *this;
00572 }
00573 #endif
00574
00575 StringBuilder& StringBuilder::operator << (kt_float value)
00576 {
00577 m_String.Append(karto::StringHelper::ToString(value));
00578
00579 return *this;
00580 }
00581
00582 StringBuilder& StringBuilder::operator << (kt_double value)
00583 {
00584 m_String.Append(karto::StringHelper::ToString(value));
00585
00586 return *this;
00587 }
00588
00589 StringBuilder& StringBuilder::operator << (const String& rValue)
00590 {
00591 m_String.Append(rValue);
00592
00593 return *this;
00594 }
00595
00596 StringBuilder& StringBuilder::operator << (const StringBuilder& rValue)
00597 {
00598 m_String.Append(rValue.ToString());
00599
00600 return *this;
00601 }
00602
00603 }