Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef VLXValue_INCLUDE_ONCE
00033 #define VLXValue_INCLUDE_ONCE
00034
00035 #include <vlCore/VLXVisitor.hpp>
00036 #include <vector>
00037
00038 namespace vl
00039 {
00041 class VLXTaggedValue: public Object
00042 {
00043 VL_INSTRUMENT_ABSTRACT_CLASS(vl::VLXTaggedValue, Object)
00044
00045 public:
00046 VLXTaggedValue(const char* tag=NULL): mLineNumber(0)
00047 {
00048 if (tag)
00049 mTag = tag;
00050 }
00051
00052 virtual ~VLXTaggedValue() {}
00053
00054 int lineNumber() const { return mLineNumber; }
00055
00056 void setLineNumber(int line) { mLineNumber = line; }
00057
00058 virtual void acceptVisitor(VLXVisitor*) = 0;
00059
00060 void setTag(const char* tag) { mTag = tag; }
00061
00062 const std::string& tag() const { return mTag; }
00063
00064 private:
00065 std::string mTag;
00066 int mLineNumber;
00067 };
00068
00070 class VLXRawtextBlock: public VLXTaggedValue
00071 {
00072 VL_INSTRUMENT_CLASS(vl::VLXRawtextBlock, VLXTaggedValue)
00073
00074 public:
00075 VLXRawtextBlock(const char* tag=NULL, const char* value=NULL): VLXTaggedValue(tag)
00076 {
00077 if (value)
00078 mValue = value;
00079 }
00080
00081 virtual void acceptVisitor(VLXVisitor* v) { v->visitRawtextBlock(this); }
00082
00083 std::string& value() { return mValue; }
00084
00085 const std::string& value() const { return mValue; }
00086
00087 void setValue(const char* value) { mValue = value; }
00088
00089 private:
00090 std::string mValue;
00091 };
00092
00094 class VLXArray: public VLXTaggedValue
00095 {
00096 VL_INSTRUMENT_ABSTRACT_CLASS(vl::VLXArray, VLXTaggedValue)
00097
00098 public:
00099 VLXArray(const char* tag=NULL): VLXTaggedValue(tag) {}
00100
00101 };
00102
00104 template<typename T>
00105 class VLXArrayTemplate: public VLXArray
00106 {
00107 VL_INSTRUMENT_ABSTRACT_CLASS(vl::VLXArrayTemplate<T>, VLXArray)
00108
00109 public:
00110 typedef T scalar_type;
00111
00112 public:
00113 VLXArrayTemplate(const char* tag=NULL): VLXArray(tag) { }
00114
00115 std::vector<T>& value() { return mValue; }
00116
00117 const std::vector<T>& value() const { return mValue; }
00118
00119 T* ptr() { if (mValue.empty()) return NULL; else return &mValue[0]; }
00120
00121 const T* ptr() const { if (mValue.empty()) return NULL; else return &mValue[0]; }
00122
00123 template<typename T2> void copyTo(T2*ptr) const { for(size_t i=0; i<mValue.size(); ++i, ++ptr) *ptr = (T2)mValue[i]; }
00124
00125 template<typename T2> void copyFrom(const T2*ptr) { for(size_t i=0; i<mValue.size(); ++i, ++ptr) mValue[i] = (scalar_type)*ptr; }
00126
00127 private:
00128 std::vector<T> mValue;
00129 };
00130
00132 class VLXArrayInteger: public VLXArrayTemplate<long long>
00133 {
00134 VL_INSTRUMENT_CLASS(vl::VLXArrayInteger, VLXArrayTemplate<long long>)
00135
00136 public:
00137 VLXArrayInteger(const char* tag=NULL): VLXArrayTemplate<long long>(tag) { }
00138
00139 virtual void acceptVisitor(VLXVisitor* v) { v->visitArray(this); }
00140 };
00141
00143 class VLXArrayReal: public VLXArrayTemplate<double>
00144 {
00145 VL_INSTRUMENT_CLASS(vl::VLXArrayReal, VLXArrayTemplate<double>)
00146
00147 public:
00148 VLXArrayReal(const char* tag=NULL): VLXArrayTemplate<double>(tag) { }
00149
00150 virtual void acceptVisitor(VLXVisitor* v) { v->visitArray(this); }
00151 };
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00239 class VLXValue
00240 {
00241 public:
00242 enum EType
00243 {
00244 Bool,
00245 Integer,
00246 Real,
00247 String,
00248 Identifier,
00249 ID,
00250 RawtextBlock,
00251 List,
00252 Structure,
00253 ArrayInteger,
00254 ArrayReal
00255
00256
00257
00258
00259
00260 };
00261
00262 private:
00263 VLCORE_EXPORT void release();
00264
00265 public:
00266 VLXValue()
00267 {
00268 mLineNumber = 0;
00269 mType = Integer;
00270 mUnion.mInteger = 0;
00271 }
00272
00273 VLXValue(VLXStructure* obj)
00274 {
00275 mLineNumber = 0;
00276 mType = Integer;
00277 mUnion.mInteger = 0;
00278
00279 setStructure(obj);
00280 }
00281
00282 VLXValue(VLXList* list)
00283 {
00284 mLineNumber = 0;
00285 mType = Integer;
00286 mUnion.mInteger = 0;
00287
00288 setList(list);
00289 }
00290
00291 VLXValue(VLXRawtextBlock* rawtext)
00292 {
00293 mLineNumber = 0;
00294 mType = Integer;
00295 mUnion.mInteger = 0;
00296
00297 setRawtextBlock(rawtext);
00298 }
00299
00300 VLXValue(VLXArrayInteger* arr)
00301 {
00302 mLineNumber = 0;
00303 mType = Integer;
00304 mUnion.mInteger = 0;
00305 setArrayInteger(arr);
00306 }
00307
00308 VLXValue(VLXArrayReal* arr)
00309 {
00310 mLineNumber = 0;
00311 mType = Integer;
00312 mUnion.mInteger = 0;
00313 setArrayReal(arr);
00314 }
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 VLXValue(long long i)
00343 {
00344 mLineNumber = 0;
00345 mType = Integer;
00346 mUnion.mInteger = i;
00347 }
00348
00349 VLXValue(double d)
00350 {
00351 mLineNumber = 0;
00352 mType = Real;
00353 mUnion.mReal = d;
00354 }
00355
00356 VLXValue(const char* str, EType type)
00357 {
00358 mLineNumber = 0;
00359 mType = Integer;
00360 mUnion.mInteger = 0;
00361
00362 switch(type)
00363 {
00364 case String: setString(str); break;
00365 case Identifier: setIdentifier(str); break;
00366 case ID: setID(str); break;
00367 default:
00368 VL_TRAP();
00369 break;
00370 }
00371 }
00372
00373 VLXValue(bool boolean)
00374 {
00375 mLineNumber = 0;
00376 mType = Integer;
00377 mUnion.mInteger = 0;
00378
00379 setBool(boolean);
00380 }
00381
00382 VLXValue(const VLXValue& other)
00383 {
00384 mType = Integer;
00385 mUnion.mInteger = 0;
00386 mLineNumber = 0;
00387
00388 *this = other;
00389 }
00390
00391 ~VLXValue() { release(); }
00392
00393 VLCORE_EXPORT VLXValue& operator=(const VLXValue& other);
00394
00395 EType type() const { return mType; }
00396
00397
00398
00399 VLCORE_EXPORT VLXStructure* setStructure(VLXStructure*);
00400
00401 VLXStructure* getStructure() { VL_CHECK(mType == Structure); return mUnion.mStructure; }
00402
00403 const VLXStructure* getStructure() const { VL_CHECK(mType == Structure); return mUnion.mStructure; }
00404
00405
00406
00407 VLCORE_EXPORT VLXList* setList(VLXList*);
00408
00409 VLXList* getList() { VL_CHECK(mType == List); return mUnion.mList; }
00410
00411 const VLXList* getList() const { VL_CHECK(mType == List); return mUnion.mList; }
00412
00413
00414
00415 VLCORE_EXPORT VLXRawtextBlock* setRawtextBlock(VLXRawtextBlock*);
00416
00417 VLXRawtextBlock* getRawtextBlock() { VL_CHECK(mType == RawtextBlock); return mUnion.mRawtextBlock; }
00418
00419 const VLXRawtextBlock* getRawtextBlock() const { VL_CHECK(mType == RawtextBlock); return mUnion.mRawtextBlock; }
00420
00421
00422
00423 VLCORE_EXPORT VLXArray* setArray(VLXArray*);
00424 VLCORE_EXPORT VLXArrayInteger* setArrayInteger(VLXArrayInteger*);
00425 VLCORE_EXPORT VLXArrayReal* setArrayReal(VLXArrayReal*);
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443 VLXArrayInteger* getArrayInteger() { VL_CHECK(mType == ArrayInteger); return mUnion.mArray->as<VLXArrayInteger>(); }
00444 const VLXArrayInteger* getArrayInteger() const { VL_CHECK(mType == ArrayInteger); return mUnion.mArray->as<VLXArrayInteger>(); }
00445
00446 VLXArrayReal* getArrayReal() { VL_CHECK(mType == ArrayReal); return mUnion.mArray->as<VLXArrayReal>(); }
00447 const VLXArrayReal* getArrayReal() const { VL_CHECK(mType == ArrayReal); return mUnion.mArray->as<VLXArrayReal>(); }
00448
00449
00450
00451 const std::string& setString(const char* str)
00452 {
00453 release();
00454 mType = String;
00455 mUnion.mString = new std::string(str);
00456 return *mUnion.mString;
00457 }
00458
00459 const std::string& getString() const { VL_CHECK(mType == String); return *mUnion.mString; }
00460
00461
00462
00463 const std::string& setIdentifier(const char* str)
00464 {
00465 release();
00466 mType = Identifier;
00467 mUnion.mString = new std::string(str);
00468 return *mUnion.mString;
00469 }
00470
00471 const std::string& getIdentifier() const { VL_CHECK(mType == Identifier); return *mUnion.mString; }
00472
00473
00474
00475 const std::string& setID(const char* str)
00476 {
00477 release();
00478 mType = ID;
00479 mUnion.mString = new std::string(str);
00480 return *mUnion.mString;
00481 }
00482
00483 const std::string& getID() const { VL_CHECK(mType == ID); return *mUnion.mString; }
00484
00485
00486
00487 long long setInteger(long long val)
00488 {
00489 release();
00490 mType = Integer;
00491 return mUnion.mInteger = val;
00492 }
00493
00494 long long getInteger() const { VL_CHECK(mType == Integer); return mUnion.mInteger; }
00495
00496
00497
00498 double setReal(double val)
00499 {
00500 release();
00501 mType = Real;
00502 return mUnion.mReal = val;
00503 }
00504
00505 double getReal() const { VL_CHECK(mType == Real); return mUnion.mReal; }
00506
00507
00508
00509 bool setBool(bool val)
00510 {
00511 release();
00512 mType = Bool;
00513 return mUnion.mBool = val;
00514 }
00515
00516 bool getBool() const { VL_CHECK(mType == Bool); return mUnion.mBool; }
00517
00518 int lineNumber() const { return mLineNumber; }
00519
00520 void setLineNumber(int line) { mLineNumber = line; }
00521
00522 private:
00523 union
00524 {
00525 bool mBool;
00526 long long mInteger;
00527 double mReal;
00528 std::string* mString;
00529 VLXStructure* mStructure;
00530 VLXList* mList;
00531 VLXArray* mArray;
00532 VLXRawtextBlock* mRawtextBlock;
00533 } mUnion;
00534
00535 EType mType;
00536 int mLineNumber;
00537 };
00538
00540 class VLXStructure: public VLXTaggedValue
00541 {
00542 VL_INSTRUMENT_CLASS(vl::VLXStructure, VLXTaggedValue)
00543
00544 public:
00545 VLXStructure()
00546 {
00547 mKeyValue.reserve(16);
00548 setID("#NULL");
00549 }
00550
00551 VLXStructure(const char* tag)
00552 {
00553 mKeyValue.reserve(16);
00554 setID("#NULL");
00555 setTag(tag);
00556 }
00557
00558 VLXStructure(const char* tag, const std::string& uid)
00559 {
00560 mKeyValue.reserve(16);
00561 setID(uid.c_str());
00562 setTag(tag);
00563 }
00564
00565 virtual void acceptVisitor(VLXVisitor* v) { v->visitStructure(this); }
00566
00567 VLXStructure& operator<<(const char* str)
00568 {
00569 value().resize( value().size() + 1 );
00570 value().back().setKey(str);
00571 return *this;
00572 }
00573
00574 VLXStructure& operator<<(const VLXValue& val)
00575 {
00576 value().back().setValue(val);
00577 return *this;
00578 }
00579
00581 class Value
00582 {
00583 friend class VLXStructure;
00584
00585 public:
00586 Value() {}
00587 Value(const char* key, VLXValue value): mKey(key), mValue(value) {}
00588
00589 std::string& key() { return mKey; }
00590 const std::string& key() const { return mKey; }
00591 void setKey(const char* key) { mKey = key; }
00592
00593 VLXValue& value() { return mValue; }
00594 const VLXValue& value() const { return mValue; }
00595 void setValue(const VLXValue& value) { mValue = value; }
00596
00597 private:
00598 std::string mKey;
00599 VLXValue mValue;
00600 };
00601
00602 void setID(const char* uid) { mID = uid; }
00603
00604 const std::string& uid() const { return mID; }
00605
00606 std::vector<Value>& value() { return mKeyValue; }
00607
00608 const std::vector<Value>& value() const { return mKeyValue; }
00609
00610
00611 VLXValue* getValue(const char* key)
00612 {
00613 for(size_t i=0; i<mKeyValue.size(); ++i)
00614 if (mKeyValue[i].key() == key)
00615 return &mKeyValue[i].value();
00616 return NULL;
00617 }
00618
00619 const VLXValue* getValue(const char* key) const
00620 {
00621 for(size_t i=0; i<mKeyValue.size(); ++i)
00622 if (mKeyValue[i].key() == key)
00623 return &mKeyValue[i].value();
00624 return NULL;
00625 }
00626
00627 private:
00628 std::string mID;
00629 std::vector<Value> mKeyValue;
00630 };
00631
00633 class VLXList: public VLXTaggedValue
00634 {
00635 VL_INSTRUMENT_CLASS(vl::VLXList, VLXTaggedValue)
00636
00637 public:
00638 VLXList(const char* tag=NULL): VLXTaggedValue(tag)
00639 {
00640 mValue.reserve(16);
00641 }
00642
00643 VLXList& operator<<(const VLXValue& val)
00644 {
00645 value().push_back( val );
00646 return *this;
00647 }
00648
00649 virtual void acceptVisitor(VLXVisitor* v) { v->visitList(this); }
00650
00651 std::vector< VLXValue >& value() { return mValue; }
00652
00653 const std::vector< VLXValue >& value() const { return mValue; }
00654
00655 private:
00656 std::vector< VLXValue > mValue;
00657 };
00658 }
00659
00660 #endif