00001 #include "FCam/TagValue.h"
00002
00003 #include <sstream>
00004 #include <iomanip>
00005 #include <iostream>
00006
00007 namespace FCam {
00008
00009 TagValue::TagValue() : type(Null), data(NULL) {
00010
00011 }
00012
00013 TagValue::~TagValue() {
00014 nullify();
00015 }
00016
00017 void TagValue::nullify() {
00018 switch (type) {
00019 case Null:
00020 break;
00021 case Int:
00022 delete(int *)data;
00023 break;
00024 case Float:
00025 delete(float *)data;
00026 break;
00027 case Double:
00028 delete(double *)data;
00029 break;
00030 case String:
00031 delete(std::string *)data;
00032 break;
00033 case Time:
00034 delete(FCam::Time *)data;
00035 break;
00036 case IntVector:
00037 delete(std::vector<int> *)data;
00038 break;
00039 case FloatVector:
00040 delete(std::vector<float> *)data;
00041 break;
00042 case DoubleVector:
00043 delete(std::vector<double> *)data;
00044 break;
00045 case StringVector:
00046 delete(std::vector<std::string> *)data;
00047 break;
00048 case TimeVector:
00049 delete(std::vector<FCam::Time> *)data;
00050 break;
00051 }
00052 type = Null;
00053 data = NULL;
00054 }
00055
00056 TagValue::TagValue(int x) {
00057 type = Int;
00058 int *ptr = new int;
00059 *ptr = x;
00060 data = (void *)ptr;
00061 }
00062
00063 TagValue::TagValue(float x) {
00064 type = Float;
00065 float *ptr = new float;
00066 *ptr = x;
00067 data = (void *)ptr;
00068 }
00069
00070 TagValue::TagValue(double x) {
00071 type = Double;
00072 double *ptr = new double;
00073 *ptr = x;
00074 data = (void *)ptr;
00075 }
00076
00077 TagValue::TagValue(std::string x) {
00078 type = String;
00079 std::string *ptr = new std::string;
00080 *ptr = x;
00081 data = (void *)ptr;
00082 }
00083
00084 TagValue::TagValue(FCam::Time x) {
00085 type = Time;
00086 FCam::Time *ptr = new FCam::Time;
00087 *ptr = x;
00088 data = (void *)ptr;
00089 }
00090
00091 TagValue::TagValue(std::vector<int> x) {
00092 type = IntVector;
00093 std::vector<int> *ptr = new std::vector<int>;
00094 *ptr = x;
00095 data = (void *)ptr;
00096 }
00097
00098 TagValue::TagValue(std::vector<float> x) {
00099 type = FloatVector;
00100 std::vector<float> *ptr = new std::vector<float>;
00101 *ptr = x;
00102 data = (void *)ptr;
00103 }
00104
00105 TagValue::TagValue(std::vector<double> x) {
00106 type = DoubleVector;
00107 std::vector<double> *ptr = new std::vector<double>;
00108 *ptr = x;
00109 data = (void *)ptr;
00110 }
00111
00112 TagValue::TagValue(std::vector<std::string> x) {
00113 type = StringVector;
00114 std::vector<std::string> *ptr = new std::vector<std::string>;
00115 *ptr = x;
00116 data = (void *)ptr;
00117 }
00118
00119 TagValue::TagValue(std::vector<FCam::Time> x) {
00120 type = TimeVector;
00121 std::vector<FCam::Time> *ptr = new std::vector<FCam::Time>;
00122 *ptr = x;
00123 data = (void *)ptr;
00124 }
00125
00126 const TagValue &TagValue::operator=(const int &x) {
00127 if (type == Int) {
00128 ((int *)data)[0] = x;
00129 } else {
00130 nullify();
00131 type = Int;
00132 int *ptr = new int;
00133 ptr[0] = x;
00134 data = (void *)ptr;
00135 }
00136 return *this;
00137 }
00138
00139 const TagValue &TagValue::operator=(const float &x) {
00140 if (type == Float) {
00141 ((float *)data)[0] = x;
00142 } else {
00143 nullify();
00144 type = Float;
00145 float *ptr = new float;
00146 ptr[0] = x;
00147 data = (void *)ptr;
00148 }
00149 return *this;
00150 }
00151
00152 const TagValue &TagValue::operator=(const double &x) {
00153 if (type == Double) {
00154 ((double *)data)[0] = x;
00155 } else {
00156 nullify();
00157 type = Double;
00158 double *ptr = new double;
00159 ptr[0] = x;
00160 data = (void *)ptr;
00161 }
00162 return *this;
00163 }
00164
00165 const TagValue &TagValue::operator=(const std::string &x) {
00166 if (type == String) {
00167 ((std::string *)data)[0] = x;
00168 } else {
00169 nullify();
00170 type = String;
00171 std::string *ptr = new std::string;
00172 ptr[0] = x;
00173 data = (void *)ptr;
00174 }
00175 return *this;
00176 }
00177
00178 const TagValue &TagValue::operator=(const FCam::Time &x) {
00179 if (type == Time) {
00180 ((FCam::Time *)data)[0] = x;
00181 } else {
00182 nullify();
00183 type = Time;
00184 FCam::Time *ptr = new FCam::Time;
00185 ptr[0] = x;
00186 data = (void *)ptr;
00187 }
00188 return *this;
00189 }
00190
00191 const TagValue &TagValue::operator=(const std::vector<int> &x) {
00192 if (type == IntVector) {
00193 ((std::vector<int> *)data)[0] = x;
00194 } else {
00195 nullify();
00196 type = IntVector;
00197 std::vector<int> *ptr = new std::vector<int>;
00198 ptr[0] = x;
00199 data = (void *)ptr;
00200 }
00201 return *this;
00202 }
00203
00204 const TagValue &TagValue::operator=(const std::vector<float> &x) {
00205 if (type == FloatVector) {
00206 ((std::vector<float> *)data)[0] = x;
00207 } else {
00208 nullify();
00209 type = FloatVector;
00210 std::vector<float> *ptr = new std::vector<float>;
00211 ptr[0] = x;
00212 data = (void *)ptr;
00213 }
00214 return *this;
00215 }
00216
00217 const TagValue &TagValue::operator=(const std::vector<double> &x) {
00218 if (type == DoubleVector) {
00219 ((std::vector<double> *)data)[0] = x;
00220 } else {
00221 nullify();
00222 type = DoubleVector;
00223 std::vector<double> *ptr = new std::vector<double>;
00224 ptr[0] = x;
00225 data = (void *)ptr;
00226 }
00227 return *this;
00228 }
00229
00230 const TagValue &TagValue::operator=(const std::vector<std::string> &x) {
00231 if (type == StringVector) {
00232 ((std::vector<std::string> *)data)[0] = x;
00233 } else {
00234 nullify();
00235 type = StringVector;
00236 std::vector<std::string> *ptr = new std::vector<std::string>;
00237 ptr[0] = x;
00238 data = (void *)ptr;
00239 }
00240 return *this;
00241 }
00242
00243 const TagValue &TagValue::operator=(const std::vector<FCam::Time> &x) {
00244 if (type == TimeVector) {
00245 ((std::vector<FCam::Time> *)data)[0] = x;
00246 } else {
00247 nullify();
00248 type = TimeVector;
00249 std::vector<FCam::Time> *ptr = new std::vector<FCam::Time>;
00250 ptr[0] = x;
00251 data = (void *)ptr;
00252 }
00253 return *this;
00254 }
00255
00256 const TagValue &TagValue::operator=(const TagValue &other) {
00257 switch (other.type) {
00258 case Null:
00259 nullify();
00260 return *this;
00261 case Int:
00262 *this = (int)other;
00263 return *this;
00264 case Float:
00265 *this = (float)other;
00266 return *this;
00267 case Double:
00268 *this = (double)other;
00269 return *this;
00270 case String:
00271 *this = (std::string)other;
00272 return *this;
00273 case Time:
00274 *this = (FCam::Time)other;
00275 return *this;
00276 case IntVector: {
00277 std::vector<int> temp = other;
00278 *this = temp;
00279 return *this;
00280 }
00281 case FloatVector: {
00282 std::vector<float> temp = other;
00283 *this = temp;
00284 return *this;
00285 }
00286 case DoubleVector: {
00287 std::vector<double> temp = other;
00288 *this = temp;
00289 return *this;
00290 }
00291 case StringVector: {
00292 std::vector<std::string> temp = other;
00293 *this = temp;
00294 return *this;
00295 }
00296 case TimeVector: {
00297 std::vector<FCam::Time> temp = other;
00298 *this = temp;
00299 return *this;
00300 }
00301 }
00302 return *this;
00303 }
00304
00305 TagValue::TagValue(const TagValue &other) : type(Null), data(NULL) {
00306 *this = other;
00307 }
00308
00309 TagValue::operator int &() const {
00310 switch (type) {
00311 case Null:
00312 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to an int");
00313 dummyInt = 0;
00314 return dummyInt;
00315 case Int:
00316 return ((int *)data)[0];
00317 case Float:
00318 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to an int");
00319 dummyInt = 0;
00320 return dummyInt;
00321 case Double:
00322 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to an int");
00323 dummyInt = 0;
00324 return dummyInt;
00325 case String:
00326 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to an int");
00327 dummyInt = 0;
00328 return dummyInt;
00329 case Time:
00330 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to an int");
00331 dummyInt = 0;
00332 return dummyInt;
00333 case IntVector:
00334 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to an int");
00335 dummyInt = 0;
00336 return dummyInt;
00337 case FloatVector:
00338 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to an int");
00339 dummyInt = 0;
00340 return dummyInt;
00341 case DoubleVector:
00342 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to an int");
00343 dummyInt = 0;
00344 return dummyInt;
00345 case StringVector:
00346 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to an int");
00347 dummyInt = 0;
00348 return dummyInt;
00349 case TimeVector:
00350 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to an int");
00351 dummyInt = 0;
00352 return dummyInt;
00353 }
00354 dummyInt = 0;
00355 return dummyInt;
00356 }
00357
00358 TagValue::operator float &() const {
00359 switch (type) {
00360 case Null:
00361 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a float");
00362 dummyFloat = 0;
00363 return dummyFloat;
00364 case Int:
00365 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a float");
00366 dummyFloat = 0;
00367 return dummyFloat;
00368 case Float:
00369 return (((float *)data)[0]);
00370 case Double:
00371 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a float");
00372 dummyFloat = 0;
00373 return dummyFloat;
00374 case String:
00375 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a float");
00376 dummyFloat = 0;
00377 return dummyFloat;
00378 case Time:
00379 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a float");
00380 dummyFloat = 0;
00381 return dummyFloat;
00382 case IntVector:
00383 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a float");
00384 dummyFloat = 0;
00385 return dummyFloat;
00386 case FloatVector:
00387 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a float");
00388 dummyFloat = 0;
00389 return dummyFloat;
00390 case DoubleVector:
00391 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a float");
00392 dummyFloat = 0;
00393 return dummyFloat;
00394 case StringVector:
00395 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a float");
00396 dummyFloat = 0;
00397 return dummyFloat;
00398 case TimeVector:
00399 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a float");
00400 dummyFloat = 0;
00401 return dummyFloat;
00402 }
00403 dummyFloat = 0;
00404 return dummyFloat;
00405 }
00406
00407 TagValue::operator double &() const {
00408 switch (type) {
00409 case Null:
00410 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a double");
00411 dummyDouble = 0;
00412 return dummyDouble;
00413 case Int:
00414 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a double");
00415 dummyDouble = 0;
00416 return dummyDouble;
00417 case Float:
00418 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a double");
00419 dummyDouble = 0;
00420 return dummyDouble;
00421 case Double:
00422 return (((double *)data)[0]);
00423 case String:
00424 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a double");
00425 dummyDouble = 0;
00426 return dummyDouble;
00427 case Time:
00428 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a double");
00429 dummyDouble = 0;
00430 return dummyDouble;
00431 case IntVector:
00432 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a double");
00433 dummyDouble = 0;
00434 return dummyDouble;
00435 case FloatVector:
00436 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a double");
00437 dummyDouble = 0;
00438 return dummyDouble;
00439 case DoubleVector:
00440 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a double");
00441 dummyDouble = 0;
00442 return dummyDouble;
00443 case StringVector:
00444 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a double");
00445 dummyDouble = 0;
00446 return dummyDouble;
00447 case TimeVector:
00448 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a double");
00449 dummyDouble = 0;
00450 return dummyDouble;
00451 }
00452 dummyDouble = 0;
00453 return dummyDouble;
00454 }
00455
00456 TagValue::operator std::string &() const {
00457 switch (type) {
00458 case Null:
00459 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a string");
00460 dummyString.clear();
00461 return dummyString;
00462 case Int:
00463 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a string");
00464 dummyString.clear();
00465 return dummyString;
00466 case Float:
00467 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a string");
00468 dummyString.clear();
00469 return dummyString;
00470 case Double:
00471 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a string");
00472 dummyString.clear();
00473 return dummyString;
00474 case String:
00475 return ((std::string *)data)[0];
00476 case Time:
00477 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a string");
00478 dummyString.clear();
00479 return dummyString;
00480 case IntVector:
00481 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a string");
00482 dummyString.clear();
00483 return dummyString;
00484 case FloatVector:
00485 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a string");
00486 dummyString.clear();
00487 return dummyString;
00488 case DoubleVector:
00489 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a string");
00490 dummyString.clear();
00491 return dummyString;
00492 case StringVector:
00493 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a string");
00494 dummyString.clear();
00495 return dummyString;
00496 case TimeVector:
00497 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a string");
00498 dummyString.clear();
00499 return dummyString;
00500 }
00501 dummyString.clear();
00502 return dummyString;
00503 }
00504
00505 TagValue::operator FCam::Time &() const {
00506 switch (type) {
00507 case Null:
00508 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a time");
00509 dummyTime = FCam::Time(0, 0);
00510 return dummyTime;
00511 case Int:
00512 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a time");
00513 dummyTime = FCam::Time(0, 0);
00514 return dummyTime;
00515 case Float:
00516 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a time");
00517 dummyTime = FCam::Time(0, 0);
00518 return dummyTime;
00519 case Double:
00520 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a time");
00521 dummyTime = FCam::Time(0, 0);
00522 return dummyTime;
00523 case String:
00524 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a time");
00525 dummyTime = FCam::Time(0, 0);
00526 return dummyTime;
00527 case Time:
00528 return ((FCam::Time *)data)[0];
00529 case IntVector:
00530 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a time");
00531 dummyTime = FCam::Time(0, 0);
00532 return dummyTime;
00533 case FloatVector:
00534 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a time");
00535 dummyTime = FCam::Time(0, 0);
00536 return dummyTime;
00537 case DoubleVector:
00538 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a time");
00539 dummyTime = FCam::Time(0, 0);
00540 return dummyTime;
00541 case StringVector:
00542 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a time");
00543 dummyTime = FCam::Time(0, 0);
00544 return dummyTime;
00545 case TimeVector:
00546 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a time");
00547 dummyTime = FCam::Time(0, 0);
00548 return dummyTime;
00549 }
00550 dummyTime = FCam::Time(0, 0);
00551 return dummyTime;
00552 }
00553
00554 TagValue::operator std::vector<int> &() const {
00555 switch (type) {
00556 case Null:
00557 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to an int vector");
00558 dummyIntVector.clear();
00559 return dummyIntVector;
00560 case Int:
00561 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to an int vector");
00562 dummyIntVector.clear();
00563 return dummyIntVector;
00564 case Float:
00565 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to an int vector");
00566 dummyIntVector.clear();
00567 return dummyIntVector;
00568 case Double:
00569 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to an int vector");
00570 dummyIntVector.clear();
00571 return dummyIntVector;
00572 case String:
00573 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to an int vector");
00574 dummyIntVector.clear();
00575 return dummyIntVector;
00576 case Time:
00577 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to an int vector");
00578 dummyIntVector.clear();
00579 return dummyIntVector;
00580 case IntVector:
00581 return ((std::vector<int> *)data)[0];
00582 case FloatVector:
00583 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to an int vector");
00584 dummyIntVector.clear();
00585 return dummyIntVector;
00586 case DoubleVector:
00587 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to an int vector");
00588 dummyIntVector.clear();
00589 return dummyIntVector;
00590 case StringVector:
00591 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to an int vector");
00592 dummyIntVector.clear();
00593 return dummyIntVector;
00594 case TimeVector:
00595 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to an int vector");
00596 dummyIntVector.clear();
00597 return dummyIntVector;
00598 }
00599 dummyIntVector.clear();
00600 return dummyIntVector;
00601 }
00602
00603
00604 TagValue::operator std::vector<float> &() const {
00605 switch (type) {
00606 case Null:
00607 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a float vector");
00608 dummyFloatVector.clear();
00609 return dummyFloatVector;
00610 case Int:
00611 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a float vector");
00612 dummyFloatVector.clear();
00613 return dummyFloatVector;
00614 case Float:
00615 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a float vector");
00616 dummyFloatVector.clear();
00617 return dummyFloatVector;
00618 case Double:
00619 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a float vector");
00620 dummyFloatVector.clear();
00621 return dummyFloatVector;
00622 case String:
00623 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a float vector");
00624 dummyFloatVector.clear();
00625 return dummyFloatVector;
00626 case Time:
00627 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a float vector");
00628 dummyFloatVector.clear();
00629 return dummyFloatVector;
00630 case IntVector:
00631 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a float vector");
00632 dummyFloatVector.clear();
00633 return dummyFloatVector;
00634 case FloatVector:
00635 return ((std::vector<float> *)data)[0];
00636 case DoubleVector:
00637 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a float vector");
00638 dummyFloatVector.clear();
00639 return dummyFloatVector;
00640 case StringVector:
00641 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a float vector");
00642 dummyFloatVector.clear();
00643 return dummyFloatVector;
00644 case TimeVector:
00645 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a float vector");
00646 dummyFloatVector.clear();
00647 return dummyFloatVector;
00648 }
00649 dummyFloatVector.clear();
00650 return dummyFloatVector;
00651 }
00652
00653 TagValue::operator std::vector<double> &() const {
00654 switch (type) {
00655 case Null:
00656 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a double vector");
00657 dummyDoubleVector.clear();
00658 return dummyDoubleVector;
00659 case Int:
00660 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a double vector");
00661 dummyDoubleVector.clear();
00662 return dummyDoubleVector;
00663 case Float:
00664 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a double vector");
00665 dummyDoubleVector.clear();
00666 return dummyDoubleVector;
00667 case Double:
00668 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a double vector");
00669 dummyDoubleVector.clear();
00670 return dummyDoubleVector;
00671 case String:
00672 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a double vector");
00673 dummyDoubleVector.clear();
00674 return dummyDoubleVector;
00675 case Time:
00676 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a double vector");
00677 dummyDoubleVector.clear();
00678 return dummyDoubleVector;
00679 case IntVector:
00680 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a double vector");
00681 dummyDoubleVector.clear();
00682 return dummyDoubleVector;
00683 case FloatVector:
00684 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a double vector");
00685 dummyDoubleVector.clear();
00686 return dummyDoubleVector;
00687 case DoubleVector:
00688 return ((std::vector<double> *)data)[0];
00689 case StringVector:
00690 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a double vector");
00691 dummyDoubleVector.clear();
00692 return dummyDoubleVector;
00693 case TimeVector:
00694 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a double vector");
00695 dummyDoubleVector.clear();
00696 return dummyDoubleVector;
00697 }
00698 dummyDoubleVector.clear();
00699 return dummyDoubleVector;
00700 }
00701
00702
00703
00704 TagValue::operator std::vector<std::string> &() const {
00705 switch (type) {
00706 case Null:
00707 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a string vector");
00708 dummyStringVector.clear();
00709 return dummyStringVector;
00710 case Int:
00711 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a string vector");
00712 dummyStringVector.clear();
00713 return dummyStringVector;
00714 case Float:
00715 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a string vector");
00716 dummyStringVector.clear();
00717 return dummyStringVector;
00718 case Double:
00719 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a string vector");
00720 dummyStringVector.clear();
00721 return dummyStringVector;
00722 case String:
00723 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a string vector");
00724 dummyStringVector.clear();
00725 return dummyStringVector;
00726 case Time:
00727 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a string vector");
00728 dummyStringVector.clear();
00729 return dummyStringVector;
00730 case IntVector:
00731 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a string vector");
00732 dummyStringVector.clear();
00733 return dummyStringVector;
00734 case FloatVector:
00735 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a string vector");
00736 dummyStringVector.clear();
00737 return dummyStringVector;
00738 case DoubleVector:
00739 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a string vector");
00740 dummyStringVector.clear();
00741 return dummyStringVector;
00742 case StringVector:
00743 return ((std::vector<std::string> *)data)[0];
00744 case TimeVector:
00745 postEvent(Event::Error, Event::BadCast, "Cannot cast a time vector to a string vector");
00746 dummyStringVector.clear();
00747 return dummyStringVector;
00748 }
00749 dummyStringVector.clear();
00750 return dummyStringVector;
00751 }
00752
00753 TagValue::operator std::vector<FCam::Time> &() const {
00754 switch (type) {
00755 case Null:
00756 postEvent(Event::Error, Event::BadCast, "Cannot cast a null to a time vector");
00757 dummyTimeVector.clear();
00758 return dummyTimeVector;
00759 case Int:
00760 postEvent(Event::Error, Event::BadCast, "Cannot cast an int to a time vector");
00761 dummyTimeVector.clear();
00762 return dummyTimeVector;
00763 case Float:
00764 postEvent(Event::Error, Event::BadCast, "Cannot cast a float to a time vector");
00765 dummyTimeVector.clear();
00766 return dummyTimeVector;
00767 case Double:
00768 postEvent(Event::Error, Event::BadCast, "Cannot cast a double to a time vector");
00769 dummyTimeVector.clear();
00770 return dummyTimeVector;
00771 case String:
00772 postEvent(Event::Error, Event::BadCast, "Cannot cast a string to a time vector");
00773 dummyTimeVector.clear();
00774 return dummyTimeVector;
00775 case Time:
00776 postEvent(Event::Error, Event::BadCast, "Cannot cast a time to a time vector");
00777 dummyTimeVector.clear();
00778 return dummyTimeVector;
00779 case IntVector:
00780 postEvent(Event::Error, Event::BadCast, "Cannot cast an int vector to a time vector");
00781 dummyTimeVector.clear();
00782 return dummyTimeVector;
00783 case FloatVector:
00784 postEvent(Event::Error, Event::BadCast, "Cannot cast a float vector to a time vector");
00785 dummyTimeVector.clear();
00786 return dummyTimeVector;
00787 case DoubleVector:
00788 postEvent(Event::Error, Event::BadCast, "Cannot cast a double vector to a time vector");
00789 dummyTimeVector.clear();
00790 return dummyTimeVector;
00791 case StringVector:
00792 postEvent(Event::Error, Event::BadCast, "Cannot cast a string vector to a time vector");
00793 dummyTimeVector.clear();
00794 return dummyTimeVector;
00795 case TimeVector:
00796 return ((std::vector<FCam::Time> *)data)[0];
00797 }
00798 dummyTimeVector.clear();
00799 return dummyTimeVector;
00800 }
00801
00802 std::string TagValue::toString() const {
00803 std::ostringstream sstr;
00804 sstr << *this;
00805 return sstr.str();
00806 }
00807
00808 TagValue TagValue::fromString(const std::string &str) {
00809 TagValue t;
00810 std::istringstream sstr(str);
00811 sstr >> t;
00812 return t;
00813 }
00814
00815 std::string TagValue::toBlob() const {
00816 std::string str;
00817 switch (type) {
00818 case Null: {
00819 str.resize(2);
00820 str[0] = 'b';
00821 str[1] = (char)type;
00822 return str;
00823 }
00824 case Int: {
00825 str.resize(4 + sizeof(int));
00826 str[0] = 'b';
00827 str[1] = (char)type;
00828 int *ptr = (int *)(&(str[4]));
00829 ptr[0] = (int)(*this);
00830 return str;
00831 }
00832 case Float: {
00833 str.resize(4 + sizeof(float));
00834 str[0] = 'b';
00835 str[1] = (char)type;
00836 float *ptr = (float *)(&(str[4]));
00837 ptr[0] = (float)(*this);
00838 return str;
00839 }
00840 case Double: {
00841 str.resize(4 + sizeof(double));
00842 str[0] = 'b';
00843 str[1] = (char)type;
00844 double *ptr = (double *)(&(str[4]));
00845 ptr[0] = (double)(*this);
00846 return str;
00847 }
00848 case String: {
00849 std::string &x = *this;
00850 str.resize(8 + x.size());
00851 str[0] = 'b';
00852 str[1] = (char)type;
00853 int *ptr = (int *)(&(str[4]));
00854 ptr[0] = x.size();
00855 for (size_t i = 0; i < x.size(); i++) {
00856 str[i+8] = x[i];
00857 }
00858 return str;
00859 }
00860 case Time: {
00861 str.resize(4 + sizeof(int)*2);
00862 str[0] = 'b';
00863 str[1] = (char)type;
00864 int *ptr = (int *)(&(str[4]));
00865 FCam::Time time = *this;
00866 ptr[0] = time.s();
00867 ptr[1] = time.us();
00868 return str;
00869 }
00870 case IntVector: {
00871 std::vector<int> &x = *this;
00872 str.resize(4 + (1+x.size())*sizeof(int));
00873 str[0] = 'b';
00874 str[1] = (char)type;
00875 int *ptr = (int *)(&(str[4]));
00876 ptr[0] = x.size();
00877 for (size_t i = 0; i < x.size(); i++) {
00878 ptr[i+1] = x[i];
00879 }
00880 return str;
00881 }
00882 case FloatVector: {
00883 std::vector<float> &x = *this;
00884 str.resize(4 + sizeof(int) + x.size()*sizeof(float));
00885 str[0] = 'b';
00886 str[1] = (char)type;
00887 int *iptr = (int *)(&(str[4]));
00888 float *fptr = (float *)(&(str[4 + sizeof(int)]));
00889 iptr[0] = x.size();
00890 for (size_t i = 0; i < x.size(); i++) {
00891 fptr[i] = x[i];
00892 }
00893 return str;
00894 }
00895 case DoubleVector: {
00896 std::vector<double> &x = *this;
00897 str.resize(4 + (1+x.size())*sizeof(double));
00898 str[0] = 'b';
00899 str[1] = (char)type;
00900 int *iptr = (int *)(&(str[4]));
00901 double *fptr = (double *)(&(str[4 + sizeof(int)]));
00902 iptr[0] = x.size();
00903 for (size_t i = 0; i < x.size(); i++) {
00904 fptr[i] = x[i];
00905 }
00906 return str;
00907 }
00908 case StringVector: {
00909 std::vector<std::string> &x = *this;
00910 size_t total = 0;
00911 for (size_t i = 0; i < x.size(); i++) {
00912 total += x[i].size();
00913 }
00914 str.resize(4 + sizeof(int)*(1+x.size()) + total);
00915 str[0] = 'b';
00916 str[1] = (char)type;
00917 int *ptr = (int *)(&(str[4]));
00918 ptr[0] = x.size();
00919 for (size_t i = 0; i < x.size(); i++) {
00920 ptr[i+1] = x[i].size();
00921 }
00922 int idx = 4 + sizeof(int)*(1+x.size());
00923 for (size_t i = 0; i < x.size(); i++) {
00924 for (size_t j = 0; j < x[i].size(); j++) {
00925 str[idx+j] = x[i][j];
00926 }
00927 idx += x[i].size();
00928 }
00929 return str;
00930 }
00931
00932 case TimeVector:
00933 std::vector<FCam::Time> &x = *this;
00934 str.resize(4 + sizeof(int)*(1+2*x.size()));
00935 str[0] = 'b';
00936 str[1] = (char)type;
00937 int *ptr = (int *)(&(str[4]));
00938 ptr[0] = x.size();
00939 for (size_t i = 0; i < x.size(); i++) {
00940 ptr[i*2+1] = x[i].s();
00941 ptr[i*2+2] = x[i].us();
00942 }
00943 return str;
00944 }
00945 return "";
00946 }
00947
00948 std::ostream &operator<<(std::ostream &out, const TagValue &t) {
00949 out << std::scientific;
00950 switch (t.type) {
00951 case TagValue::Null: {
00952 return (out << "None");
00953 }
00954
00955 case TagValue::Int: {
00956 int contents = t;
00957 return (out << contents);
00958 }
00959
00960 case TagValue::Float: {
00961 out.precision(8);
00962 float contents = t;
00963 return (out << contents << 'f');
00964 }
00965
00966 case TagValue::Double: {
00967 out.precision(16);
00968 double contents = t;
00969 return (out << contents);
00970 }
00971
00972 case TagValue::String: {
00973 std::string contents = t;
00974 out << '"';
00975 for (size_t j = 0; j < contents.size(); j++) {
00976 char c = contents[j];
00977 if (isprint(c) && c != '"' && c != '\\') {
00978 out << c;
00979 } else {
00980 int x = (int)c;
00981 if (x < 16) {
00982 out << "\\x0" << std::hex << x << std::dec;
00983 } else {
00984 out << "\\x" << std::hex << x << std::dec;
00985 }
00986 }
00987 }
00988 out << '"';
00989 return out;
00990 }
00991
00992 case TagValue::Time: {
00993 Time contents = t;
00994 return (out << "(" << contents.s() << ", " << contents.us() << ")");
00995 }
00996
00997 case TagValue::IntVector: {
00998 std::vector<int> &contents = t;
00999 out << "[";
01000 if (contents.size() > 0) {
01001 for (size_t i = 0; i < contents.size()-1; i++) {
01002 out << contents[i] << ", ";
01003 }
01004 out << contents[contents.size()-1];
01005 }
01006 out << "]";
01007 return out;
01008 }
01009
01010 case TagValue::FloatVector: {
01011 out.precision(8);
01012 std::vector<float> &contents = t;
01013 out << "[";
01014 if (contents.size() > 0) {
01015 for (size_t i = 0; i < contents.size()-1; i++) {
01016 out << contents[i] << "f, ";
01017 }
01018 out << contents[contents.size()-1];
01019 }
01020 out << "]";
01021 return out;
01022 }
01023
01024 case TagValue::DoubleVector: {
01025 out.precision(16);
01026 std::vector<double> &contents = t;
01027 out << "[";
01028 if (contents.size() > 0) {
01029 for (size_t i = 0; i < contents.size()-1; i++) {
01030 out << contents[i] << ", ";
01031 }
01032 out << contents[contents.size()-1];
01033 }
01034 out << "]";
01035 return out;
01036 }
01037
01038 case TagValue::StringVector: {
01039 std::vector<std::string> &contents = t;
01040 out << "[";
01041 if (contents.size() > 0) {
01042 for (size_t i = 0; i < contents.size(); i++) {
01043 if (i) { out << ", "; }
01044 out << '"';
01045 for (size_t j = 0; j < contents[i].size(); j++) {
01046 char c = contents[i][j];
01047 if (isprint(c) && c != '"' && c != '\\') {
01048 out << c;
01049 } else {
01050 int x = (int)c;
01051 if (x < 16) {
01052 out << "\\x0" << std::hex << x << std::dec;
01053 } else {
01054 out << "\\x" << std::hex << x << std::dec;
01055 }
01056 }
01057 }
01058 out << '"';
01059 }
01060 }
01061 out << "]";
01062 return out;
01063 }
01064
01065 case TagValue::TimeVector: {
01066 std::vector<FCam::Time> &contents = t;
01067 out << "[";
01068 if (contents.size() > 0) {
01069 for (size_t i = 0; i < contents.size(); i++) {
01070 if (i) { out << ", "; }
01071 out << "(" << contents[i].s() << ", " << contents[i].us() << ")";
01072 }
01073 }
01074 out << "]";
01075 return out;
01076 }
01077
01078 }
01079 return out;
01080 }
01081
01082 TagValue::Type readType(int x) {
01083 switch (x) {
01084 case TagValue::Null:
01085 return TagValue::Null;
01086 case TagValue::Int:
01087 return TagValue::Int;
01088 case TagValue::Float:
01089 return TagValue::Float;
01090 case TagValue::Double:
01091 return TagValue::Double;
01092 case TagValue::String:
01093 return TagValue::String;
01094 case TagValue::Time:
01095 return TagValue::Time;
01096 case TagValue::IntVector:
01097 return TagValue::IntVector;
01098 case TagValue::FloatVector:
01099 return TagValue::FloatVector;
01100 case TagValue::DoubleVector:
01101 return TagValue::DoubleVector;
01102 case TagValue::StringVector:
01103 return TagValue::StringVector;
01104 case TagValue::TimeVector:
01105 return TagValue::TimeVector;
01106 default:
01107 error(Event::ParseError, "Invalid type for tag value: %d", x);
01108 return TagValue::Null;
01109 }
01110 }
01111
01112 std::istream &operator>>(std::istream &in, TagValue &t) {
01113 switch (in.peek()) {
01114 case 'b':
01115
01116 {
01117 in.get();
01118 TagValue::Type type = readType(in.get());
01119
01120 if (in.get() != 0 || in.get() != 0) {
01121 goto error;
01122 }
01123 switch (type) {
01124 case TagValue::Null: {
01125 TagValue nullTag;
01126 t = nullTag;
01127 return in;
01128 }
01129 case TagValue::Int: {
01130 int x;
01131 in.read((char *)&x, sizeof(int));
01132 t = x;
01133 return in;
01134 }
01135 case TagValue::Float: {
01136 float x;
01137 in.read((char *)&x, sizeof(float));
01138 t = x;
01139 return in;
01140 }
01141 case TagValue::Double: {
01142 double x;
01143 in.read((char *)&x, sizeof(double));
01144 t = x;
01145 return in;
01146 }
01147 case TagValue::Time: {
01148 int x[2];
01149 in.read((char *)x, sizeof(int)*2);
01150 t = FCam::Time(x[0], x[1]);
01151 return in;
01152 }
01153 case TagValue::String: {
01154 int size;
01155 std::string x;
01156 in.read((char *)&size, sizeof(int));
01157 x.resize(size);
01158 in.read((char *)(&(x[0])), size);
01159 t = x;
01160 return in;
01161 }
01162 case TagValue::IntVector: {
01163 int size;
01164 std::vector<int> v;
01165 t = v;
01166 std::vector<int> &x = t;
01167 in.read((char *)&size, sizeof(int));
01168 x.resize(size);
01169 in.read((char *)(&(x[0])), sizeof(int)*size);
01170 return in;
01171 }
01172 case TagValue::FloatVector: {
01173 int size;
01174 std::vector<float> v;
01175 t = v;
01176 std::vector<float> &x = t;
01177 in.read((char *)&size, sizeof(int));
01178 x.resize(size);
01179 in.read((char *)(&(x[0])), sizeof(float)*size);
01180 return in;
01181 }
01182 case TagValue::DoubleVector: {
01183 int size;
01184 std::vector<double> v;
01185 t = v;
01186 std::vector<double> &x = t;
01187 in.read((char *)&size, sizeof(int));
01188 x.resize(size);
01189 in.read((char *)(&(x[0])), sizeof(double)*size);
01190 return in;
01191 }
01192 case TagValue::StringVector: {
01193 int size;
01194 std::vector<std::string> v;
01195 t = v;
01196 std::vector<std::string> &x = t;
01197 in.read((char *)&size, sizeof(int));
01198 x.resize(size);
01199 for (size_t i = 0; i < x.size(); i++) {
01200 in.read((char *)&size, sizeof(int));
01201 x[i].resize(size);
01202 }
01203 for (size_t i = 0; i < x.size(); i++) {
01204 in.read((char *)(&(x[i][0])), x[i].size());
01205 }
01206 return in;
01207 }
01208 case TagValue::TimeVector: {
01209 int size;
01210 std::vector<FCam::Time> v;
01211 t = v;
01212 std::vector<FCam::Time> &x = t;
01213 in.read((char *)&size, sizeof(int));
01214 x.resize(size);
01215 for (size_t i = 0; i < x.size(); i++) {
01216 int time[2];
01217 in.read((char *)time, sizeof(int)*2);
01218 x[i] = FCam::Time(time[0], time[1]);
01219 }
01220 return in;
01221 }
01222 default:
01223 goto error;
01224 }
01225 }
01226 case '-':
01227 case '0':
01228 case '1':
01229 case '2':
01230 case '3':
01231 case '4':
01232 case '5':
01233 case '6':
01234 case '7':
01235 case '8':
01236 case '9':
01237
01238 {
01239
01240 std::ostringstream osstr;
01241
01242 bool floating = false;
01243 if (in.peek() == '-') {
01244 osstr << char(in.get());
01245 if (!isdigit(in.peek())) {
01246
01247 in.putback('-');
01248 goto error;
01249 }
01250 }
01251 while (isdigit(in.peek())) { osstr << char(in.get()); }
01252 if (in.peek() == '.') {
01253 floating = true;
01254 osstr << char(in.get());
01255 if (!isdigit(in.peek())) {
01256
01257 in.putback('.');
01258 floating = false;
01259 goto done;
01260 }
01261 }
01262 while (isdigit(in.peek())) { osstr << char(in.get()); }
01263 if (in.peek() == 'e') { osstr << char(in.get()); }
01264 else { goto done; }
01265 if (in.peek() == '+') { osstr << char(in.get()); }
01266 else if (in.peek() == '-') { osstr << char(in.get()); }
01267 else {
01268
01269 in.putback('e');
01270 goto done;
01271 }
01272 while (isdigit(in.peek())) { osstr << char(in.get()); }
01273
01274 done:
01275 std::istringstream isstr(osstr.str());
01276 if (floating && in.peek() == 'f') {
01277 in.get();
01278 float x;
01279 isstr >> x;
01280 t = x;
01281 } else if (floating) {
01282 double x;
01283 isstr >> x;
01284 t = x;
01285 } else {
01286 int x;
01287 isstr >> x;
01288 t = x;
01289 }
01290 return in;
01291 }
01292 case 'N': {
01293 in.get();
01294 if (in.peek() != 'o') {
01295 in.putback('N');
01296 goto error;
01297 }
01298 in.get();
01299 if (in.peek() != 'n') {
01300 in.putback('o');
01301 in.putback('N');
01302 goto error;
01303 }
01304 in.get();
01305 if (in.peek() != 'e') {
01306 in.putback('n');
01307 in.putback('o');
01308 in.putback('N');
01309 goto error;
01310 }
01311 in.get();
01312
01313 TagValue null;
01314 t = null;
01315 return in;
01316 }
01317 case '(': {
01318 in.get();
01319 timeval tv;
01320 in >> tv.tv_sec;
01321 in >> std::ws;
01322 if (in.peek() != ',') { goto error; }
01323 in.get();
01324 in >> std::ws;
01325 in >> tv.tv_usec;
01326 if (in.peek() != ')') { goto error; }
01327 in.get();
01328 FCam::Time time(tv);
01329 t = time;
01330 return in;
01331 }
01332 case '"': {
01333
01334 in.get();
01335 std::ostringstream osstr;
01336 while (in.peek() != '"') {
01337 if (in.peek() < 0) {
01338 t = osstr.str();
01339 goto error;
01340 } else if (in.peek() == '\\') {
01341 in.get();
01342 switch (in.get()) {
01343 case '0':
01344 osstr << '\0';
01345 break;
01346 case 'n':
01347 osstr << '\n';
01348 break;
01349 case 'r':
01350 osstr << '\r';
01351 break;
01352 case 'x': {
01353 int v = 0;
01354 char c1 = in.get();
01355 char c2 = in.get();
01356 if (c1 >= '0' && c1 <= '9') {
01357 v = (c1 - '0');
01358 } else if (c1 >= 'a' && c1 <= 'f') {
01359 v = (c1 - 'a' + 10);
01360 } else {
01361 in.putback(c2);
01362 in.putback(c1);
01363 t = osstr.str();
01364 goto error;
01365 }
01366 v = v << 4;
01367 if (c2 >= '0' && c2 <= '9') {
01368 v += (c2 - '0');
01369 } else if (c2 >= 'a' && c2 <= 'f') {
01370 v += (c2 - 'a' + 10);
01371 } else {
01372 in.putback(c2);
01373 in.putback(c1);
01374 t = osstr.str();
01375 goto error;
01376 }
01377 osstr << (char)v;
01378 break;
01379 }
01380 case '"':
01381 osstr << '"';
01382 break;
01383 case '\\':
01384 osstr << '\\';
01385 break;
01386 case 'a':
01387 osstr << '\a';
01388 break;
01389 case 'b':
01390 osstr << '\b';
01391 break;
01392 case 'v':
01393 osstr << '\v';
01394 break;
01395 case '\'':
01396 osstr << '\'';
01397 break;
01398 case 'f':
01399 osstr << '\f';
01400 break;
01401 case 't':
01402 osstr << '\t';
01403 break;
01404 default:
01405 t = osstr.str();
01406 goto error;
01407 }
01408 } else {
01409 osstr << (char)in.get();
01410 }
01411 }
01412 in.get();
01413 t = osstr.str();
01414 return in;
01415 }
01416 case '[': {
01417
01418 in.get();
01419
01420
01421 in >> std::ws;
01422
01423 if (in.peek() == '[') { goto error; }
01424
01425 TagValue first;
01426 in >> first;
01427 switch (first.type) {
01428 case TagValue::Int: {
01429 std::vector<int> v;
01430 t = v;
01431 std::vector<int> &l = t;
01432 l.push_back(first);
01433 in >> std::ws;
01434 while (in.peek() != ']') {
01435 int x;
01436 if (in.peek() != ',') { goto error; }
01437 in.get();
01438 in >> std::ws >> x >> std::ws;
01439 l.push_back(x);
01440 }
01441 in.get();
01442 return in;
01443 }
01444 case TagValue::Float: {
01445 std::vector<float> v;
01446 t = v;
01447 std::vector<float> &l = t;
01448 l.push_back(first);
01449 in >> std::ws;
01450 while (in.peek() != ']') {
01451 float x;
01452 if (in.peek() != ',') { goto error; }
01453 in.get();
01454 in >> std::ws >> x;
01455 if (in.peek() == 'f') { in.get(); }
01456 in >> std::ws;
01457 l.push_back(x);
01458 }
01459 in.get();
01460 return in;
01461 }
01462 case TagValue::Double: {
01463 std::vector<double> v;
01464 t = v;
01465 std::vector<double> &l = t;
01466 l.push_back(first);
01467 in >> std::ws;
01468 while (in.peek() != ']') {
01469 double x;
01470 if (in.peek() != ',') { goto error; }
01471 in.get();
01472 in >> std::ws >> x >> std::ws;
01473 l.push_back(x);
01474 }
01475 in.get();
01476 return in;
01477 }
01478 case TagValue::Time: {
01479 std::vector<FCam::Time> v;
01480 t = v;
01481 std::vector<FCam::Time> &l = t;
01482 l.push_back(first);
01483 in >> std::ws;
01484 while (in.peek() != ']') {
01485 TagValue x;
01486 if (in.peek() != ',') { goto error; }
01487 in.get();
01488 in >> std::ws >> x >> std::ws;
01489 if (x.type != TagValue::Time) { goto error; }
01490 l.push_back((FCam::Time)x);
01491 }
01492 in.get();
01493 return in;
01494 }
01495 case TagValue::String: {
01496 std::vector<std::string> v;
01497 t = v;
01498 std::vector<std::string> &l = t;
01499 l.push_back(first);
01500 in >> std::ws;
01501 while (in.peek() != ']') {
01502 TagValue x;
01503 if (in.peek() != ',') { goto error; }
01504 in.get();
01505 in >> std::ws >> x >> std::ws;
01506 if (x.type != TagValue::String) { goto error; }
01507 l.push_back((std::string)x);
01508 }
01509 in.get();
01510 return in;
01511 }
01512 default:
01513 goto error;
01514 }
01515 if (first.type == TagValue::Null) {
01516 goto error;
01517 }
01518
01519 return in;
01520 }
01521 case EOF:
01522
01523 t = TagValue();
01524 return in;
01525 default:
01526 goto error;
01527 }
01528
01529 return in;
01530 error:
01531 error(Event::ParseError, "Could not parse TagValue");
01532 return in;
01533 }
01534
01535 int TagValue::dummyInt;
01536 float TagValue::dummyFloat;
01537 double TagValue::dummyDouble;
01538 std::string TagValue::dummyString;
01539 FCam::Time TagValue::dummyTime;
01540 std::vector<int> TagValue::dummyIntVector;
01541 std::vector<float> TagValue::dummyFloatVector;
01542 std::vector<double> TagValue::dummyDoubleVector;
01543 std::vector<std::string> TagValue::dummyStringVector;
01544 std::vector<FCam::Time> TagValue::dummyTimeVector;
01545
01546 }