00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "rtabmap/utilite/UVariant.h"
00021 #include "rtabmap/utilite/UConversion.h"
00022 #include <limits>
00023 #include <string.h>
00024
00025 UVariant::UVariant() :
00026 type_(kUndef)
00027 {
00028 }
00029 UVariant::UVariant(const bool & value) :
00030 type_(kBool),
00031 data_(1)
00032 {
00033 data_[0] = value?1:0;
00034 }
00035 UVariant::UVariant(const char & value) :
00036 type_(kChar),
00037 data_(sizeof(char))
00038 {
00039 memcpy(data_.data(), &value, sizeof(char));
00040 }
00041 UVariant::UVariant(const unsigned char & value) :
00042 type_(kUChar),
00043 data_(sizeof(unsigned char))
00044 {
00045 memcpy(data_.data(), &value, sizeof(unsigned char));
00046 }
00047 UVariant::UVariant(const short & value) :
00048 type_(kShort),
00049 data_(sizeof(short))
00050 {
00051 memcpy(data_.data(), &value, sizeof(short));
00052 }
00053 UVariant::UVariant(const unsigned short & value) :
00054 type_(kUShort),
00055 data_(sizeof(unsigned short))
00056 {
00057 memcpy(data_.data(), &value, sizeof(unsigned short));
00058 }
00059 UVariant::UVariant(const int & value) :
00060 type_(kInt),
00061 data_(sizeof(int))
00062 {
00063 memcpy(data_.data(), &value, sizeof(int));
00064 }
00065 UVariant::UVariant(const unsigned int & value) :
00066 type_(kUInt),
00067 data_(sizeof(unsigned int))
00068 {
00069 memcpy(data_.data(), &value, sizeof(unsigned int));
00070 }
00071 UVariant::UVariant(const float & value) :
00072 type_(kFloat),
00073 data_(sizeof(float))
00074 {
00075 memcpy(data_.data(), &value, sizeof(float));
00076 }
00077 UVariant::UVariant(const double & value) :
00078 type_(kDouble),
00079 data_(sizeof(double))
00080 {
00081 memcpy(data_.data(), &value, sizeof(double));
00082 }
00083 UVariant::UVariant(const char * value) :
00084 type_(kStr)
00085 {
00086 std::string str(value);
00087 data_.resize(str.size()+1);
00088 memcpy(data_.data(), str.data(), str.size()+1);
00089 }
00090 UVariant::UVariant(const std::string & value) :
00091 type_(kStr),
00092 data_(value.size()+1)
00093 {
00094 memcpy(data_.data(), value.data(), value.size()+1);
00095 }
00096
00097 bool UVariant::toBool() const
00098 {
00099 if(type_ ==kStr)
00100 {
00101 return uStr2Bool(toStr().c_str());
00102 }
00103 else if(data_.size())
00104 {
00105 return memcmp(data_.data(), std::vector<unsigned char>(data_.size(), 0).data(), data_.size()) != 0;
00106 }
00107 return false;
00108 }
00109
00110 char UVariant::toChar(bool * ok) const
00111 {
00112 if(ok)
00113 {
00114 *ok = false;
00115 }
00116 char v = 0;
00117 if(type_ == kChar)
00118 {
00119 memcpy(&v, data_.data(), sizeof(char));
00120 if(ok)
00121 {
00122 *ok = true;
00123 }
00124 }
00125 else if(type_ == kUChar)
00126 {
00127 unsigned char tmp = toUChar();
00128 if(tmp <= std::numeric_limits<char>::max())
00129 {
00130 v = (char)tmp;
00131 if(ok)
00132 {
00133 *ok = true;
00134 }
00135 }
00136 }
00137 else if(type_ == kShort)
00138 {
00139 short tmp = toShort();
00140 if(tmp >= std::numeric_limits<char>::min() && tmp <= std::numeric_limits<char>::max())
00141 {
00142 v = (char)tmp;
00143 if(ok)
00144 {
00145 *ok = true;
00146 }
00147 }
00148 }
00149 else if(type_ == kUShort)
00150 {
00151 unsigned short tmp = toUShort();
00152 if(tmp <= std::numeric_limits<char>::max())
00153 {
00154 v = (char)tmp;
00155 if(ok)
00156 {
00157 *ok = true;
00158 }
00159 }
00160 }
00161 else if(type_ == kInt)
00162 {
00163 int tmp = toInt();
00164 if(tmp >= std::numeric_limits<char>::min() && tmp <= std::numeric_limits<char>::max())
00165 {
00166 v = (char)tmp;
00167 if(ok)
00168 {
00169 *ok = true;
00170 }
00171 }
00172 }
00173 else if(type_ == kUInt)
00174 {
00175 unsigned int tmp = toUInt();
00176 if(tmp <= (unsigned int)std::numeric_limits<char>::max())
00177 {
00178 v = (char)tmp;
00179 if(ok)
00180 {
00181 *ok = true;
00182 }
00183 }
00184 }
00185 return v;
00186 }
00187 unsigned char UVariant::toUChar(bool * ok) const
00188 {
00189 if(ok)
00190 {
00191 *ok = false;
00192 }
00193 unsigned char v = 0;
00194 if(type_ == kUChar)
00195 {
00196 memcpy(&v, data_.data(), sizeof(unsigned char));
00197 if(ok)
00198 {
00199 *ok = true;
00200 }
00201 }
00202 else if(type_ == kChar)
00203 {
00204 char tmp = toChar();
00205 if(tmp >= std::numeric_limits<unsigned char>::min())
00206 {
00207 v = (unsigned char)tmp;
00208 if(ok)
00209 {
00210 *ok = true;
00211 }
00212 }
00213 }
00214 else if(type_ == kShort)
00215 {
00216 short tmp = toShort();
00217 if(tmp >= std::numeric_limits<unsigned char>::min() && tmp <= std::numeric_limits<unsigned char>::max())
00218 {
00219 v = (unsigned char)tmp;
00220 if(ok)
00221 {
00222 *ok = true;
00223 }
00224 }
00225 }
00226 else if(type_ == kUShort)
00227 {
00228 unsigned short tmp = toUShort();
00229 if(tmp >= std::numeric_limits<unsigned char>::min() && tmp <= std::numeric_limits<unsigned char>::max())
00230 {
00231 v = (unsigned char)tmp;
00232 if(ok)
00233 {
00234 *ok = true;
00235 }
00236 }
00237 }
00238 else if(type_ == kInt)
00239 {
00240 int tmp = toInt();
00241 if(tmp >= std::numeric_limits<unsigned char>::min() && tmp <= std::numeric_limits<unsigned char>::max())
00242 {
00243 v = (unsigned char)tmp;
00244 if(ok)
00245 {
00246 *ok = true;
00247 }
00248 }
00249 }
00250 else if(type_ == kUInt)
00251 {
00252 unsigned int tmp = toUInt();
00253 if(tmp <= std::numeric_limits<unsigned char>::max())
00254 {
00255 v = (unsigned char)tmp;
00256 if(ok)
00257 {
00258 *ok = true;
00259 }
00260 }
00261 }
00262 return v;
00263 }
00264 short UVariant::toShort(bool * ok) const
00265 {
00266 if(ok)
00267 {
00268 *ok = false;
00269 }
00270 short v = 0;
00271 if(type_ == kShort)
00272 {
00273 memcpy(&v, data_.data(), sizeof(short));
00274 if(ok)
00275 {
00276 *ok = true;
00277 }
00278 }
00279 else if(type_ == kChar)
00280 {
00281 v = (short)toChar();
00282 if(ok)
00283 {
00284 *ok = true;
00285 }
00286 }
00287 else if(type_ == kUChar)
00288 {
00289 v = (short)toUChar();
00290 if(ok)
00291 {
00292 *ok = true;
00293 }
00294 }
00295 else if(type_ == kUShort)
00296 {
00297 unsigned short tmp = toUShort();
00298 if(tmp <= std::numeric_limits<short>::max())
00299 {
00300 v = (short)tmp;
00301 if(ok)
00302 {
00303 *ok = true;
00304 }
00305 }
00306 }
00307 else if(type_ == kInt)
00308 {
00309 int tmp = toInt();
00310 if(tmp >= std::numeric_limits<short>::min() && tmp <= std::numeric_limits<short>::max())
00311 {
00312 v = (short)tmp;
00313 if(ok)
00314 {
00315 *ok = true;
00316 }
00317 }
00318 }
00319 else if(type_ == kUInt)
00320 {
00321 unsigned int tmp = toUInt();
00322 if(tmp <= (unsigned int)std::numeric_limits<short>::max())
00323 {
00324 v = (short)tmp;
00325 if(ok)
00326 {
00327 *ok = true;
00328 }
00329 }
00330 }
00331 return v;
00332 }
00333 unsigned short UVariant::toUShort(bool * ok) const
00334 {
00335 if(ok)
00336 {
00337 *ok = false;
00338 }
00339 unsigned short v = 0;
00340 if(type_ == kUShort)
00341 {
00342 memcpy(&v, data_.data(), sizeof(unsigned short));
00343 if(ok)
00344 {
00345 *ok = true;
00346 }
00347 }
00348 else if(type_ == kChar)
00349 {
00350 char tmp = toChar();
00351 if(tmp >= 0)
00352 {
00353 v = (unsigned short)tmp;
00354 if(ok)
00355 {
00356 *ok = true;
00357 }
00358 }
00359 }
00360 else if(type_ == kUChar)
00361 {
00362 v = (unsigned short)toUChar();
00363 if(ok)
00364 {
00365 *ok = true;
00366 }
00367 }
00368 else if(type_ == kShort)
00369 {
00370 short tmp = toShort();
00371 if(tmp >= std::numeric_limits<unsigned short>::min())
00372 {
00373 v = (unsigned short)tmp;
00374 if(ok)
00375 {
00376 *ok = true;
00377 }
00378 }
00379 }
00380 else if(type_ == kInt)
00381 {
00382 int tmp = toInt();
00383 if(tmp >= std::numeric_limits<unsigned short>::min() && tmp <= std::numeric_limits<unsigned short>::max())
00384 {
00385 v = (unsigned short)tmp;
00386 if(ok)
00387 {
00388 *ok = true;
00389 }
00390 }
00391 }
00392 else if(type_ == kUInt)
00393 {
00394 unsigned int tmp = toUInt();
00395 if(tmp <= std::numeric_limits<unsigned short>::max())
00396 {
00397 v = (unsigned short)tmp;
00398 if(ok)
00399 {
00400 *ok = true;
00401 }
00402 }
00403 }
00404 return v;
00405 }
00406 int UVariant::toInt(bool * ok) const
00407 {
00408 if(ok)
00409 {
00410 *ok = false;
00411 }
00412 int v = 0;
00413 if(type_ == kInt)
00414 {
00415 memcpy(&v, data_.data(), sizeof(int));
00416 if(ok)
00417 {
00418 *ok = true;
00419 }
00420 }
00421 else if(type_ == kChar)
00422 {
00423 v = (int)toChar();
00424 if(ok)
00425 {
00426 *ok = true;
00427 }
00428 }
00429 else if(type_ == kUChar)
00430 {
00431 v = (int)toUChar();
00432 if(ok)
00433 {
00434 *ok = true;
00435 }
00436 }
00437 else if(type_ == kShort)
00438 {
00439 v = (int)toShort();
00440 if(ok)
00441 {
00442 *ok = true;
00443 }
00444 }
00445 else if(type_ == kUShort)
00446 {
00447 v = (int)toUShort();
00448 if(ok)
00449 {
00450 *ok = true;
00451 }
00452 }
00453 else if(type_ == kUInt)
00454 {
00455 unsigned int tmp = toUInt();
00456 if(tmp <= (unsigned int)std::numeric_limits<int>::max())
00457 {
00458 v = (int)tmp;
00459 if(ok)
00460 {
00461 *ok = true;
00462 }
00463 }
00464 }
00465 return v;
00466 }
00467 unsigned int UVariant::toUInt(bool * ok) const
00468 {
00469 if(ok)
00470 {
00471 *ok = false;
00472 }
00473 unsigned int v = 0;
00474 if(type_ == kUInt)
00475 {
00476 memcpy(&v, data_.data(), sizeof(unsigned int));
00477 if(ok)
00478 {
00479 *ok = true;
00480 }
00481 }
00482 else if(type_ == kChar)
00483 {
00484 char tmp = toChar();
00485 if(tmp >= 0)
00486 {
00487 v = (unsigned int)tmp;
00488 if(ok)
00489 {
00490 *ok = true;
00491 }
00492 }
00493 }
00494 else if(type_ == kUChar)
00495 {
00496 v = (unsigned int)toUChar();
00497 if(ok)
00498 {
00499 *ok = true;
00500 }
00501 }
00502 else if(type_ == kShort)
00503 {
00504 short tmp = toShort();
00505 if(tmp >= 0)
00506 {
00507 v = (unsigned int)tmp;
00508 if(ok)
00509 {
00510 *ok = true;
00511 }
00512 }
00513 }
00514 else if(type_ == kUShort)
00515 {
00516 v = (unsigned int)toUShort();
00517 if(ok)
00518 {
00519 *ok = true;
00520 }
00521 }
00522 else if(type_ == kInt)
00523 {
00524 int tmp = toInt();
00525 if(tmp >= 0)
00526 {
00527 v = (unsigned int)tmp;
00528 if(ok)
00529 {
00530 *ok = true;
00531 }
00532 }
00533 }
00534 return v;
00535 }
00536 float UVariant::toFloat(bool * ok) const
00537 {
00538 if(ok)
00539 {
00540 *ok = false;
00541 }
00542 float v = 0;
00543 if(type_ == kFloat)
00544 {
00545 memcpy(&v, data_.data(), sizeof(float));
00546 if(ok)
00547 {
00548 *ok = true;
00549 }
00550 }
00551 else if(type_ == kDouble)
00552 {
00553 double tmp = toDouble();
00554 if(tmp >= std::numeric_limits<float>::min() && tmp <= std::numeric_limits<float>::max())
00555 {
00556 v = (float)tmp;
00557 if(ok)
00558 {
00559 *ok = true;
00560 }
00561 }
00562 }
00563 return v;
00564 }
00565 double UVariant::toDouble(bool * ok) const
00566 {
00567 if(ok)
00568 {
00569 *ok = false;
00570 }
00571 double v = 0;
00572 if(type_ == kDouble)
00573 {
00574 memcpy(&v, data_.data(), sizeof(double));
00575 if(ok)
00576 {
00577 *ok = true;
00578 }
00579 }
00580 else if(type_ == kFloat)
00581 {
00582 v = (double)toFloat(ok);
00583 }
00584 return v;
00585 }
00586 std::string UVariant::toStr(bool * ok) const
00587 {
00588 if(ok)
00589 {
00590 *ok = false;
00591 }
00592 std::string v;
00593 if(type_ == kStr)
00594 {
00595 v = std::string((const char *)data_.data());
00596 if(ok)
00597 {
00598 *ok = true;
00599 }
00600 }
00601 else if(type_ == kBool)
00602 {
00603 v = toBool()?"true":"false";
00604 if(ok)
00605 {
00606 *ok = true;
00607 }
00608 }
00609 else if(type_ == kChar)
00610 {
00611 v = " ";
00612 v.at(0) = toChar(ok);
00613 }
00614 else if(type_ == kUChar)
00615 {
00616 v = uNumber2Str(toUChar(ok));
00617 }
00618 else if(type_ == kShort)
00619 {
00620 v = uNumber2Str(toShort(ok));
00621 }
00622 else if(type_ == kUShort)
00623 {
00624 v = uNumber2Str(toUShort(ok));
00625 }
00626 else if(type_ == kInt)
00627 {
00628 v = uNumber2Str(toInt(ok));
00629 }
00630 else if(type_ == kUInt)
00631 {
00632 v = uNumber2Str(toUInt(ok));
00633 }
00634 else if(type_ == kFloat)
00635 {
00636 v = uNumber2Str(toFloat(ok));
00637 }
00638 else if(type_ == kDouble)
00639 {
00640 v = uNumber2Str(toDouble(ok));
00641 }
00642 return v;
00643 }