00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef VxValue_h
00017 #define VxValue_h
00018
00019 #include "HxFeature.h"
00020
00021 class VxValue {
00022 public:
00024 VxValue() {_data=new VxValueRep(); _data->_val=0;};
00025
00027 template<class T>
00028 VxValue(const T& val) {
00029 _data = new VxValueRep();
00030 _data->_val = new HxFeature<T>(val);
00031 }
00032
00034 template<>
00035 VxValue(const VxValue& rhs)
00036 : _data(rhs._data)
00037 {
00038 _data->refCount++;
00039 }
00040
00042 ~VxValue() {
00043 _data->refCount--;
00044 if (_data->refCount==0)
00045 {
00046 if(_data->_val!=0)
00047 delete _data->_val;
00048 delete _data;
00049 }
00050 }
00051
00053 bool operator==(VxValue val) const {
00054 return (_data->_val==val._data->_val);
00055 }
00056
00058 VxValue& operator=(const VxValue& rhs){
00059 if (--_data->refCount<= 0 && _data != rhs._data)
00060 {
00061 if(_data->_val!=0)
00062 delete _data->_val;
00063 delete _data;
00064 }
00065 (_data=rhs._data)->refCount++;
00066
00067 return *this;
00068 }
00069
00071 template<class T>
00072 bool get(T& val) const {
00073 const HxFeature<T>* ftPtr = dynamic_cast<HxFeature<T> *>(_data->_val);
00074 if(ftPtr == 0) {
00075 return false;
00076 }
00077 val = ftPtr->getvalue();
00078 return true;
00079 }
00080
00082 bool isNull() const {
00083 return (_data->_val==0);
00084 }
00085
00087 std::ostream& put(std::ostream& os) const {
00088 return _data->_val->put(os);
00089 }
00090
00091 private:
00092
00093 struct VxValueRep
00094 {
00095 HxFeatureBase *_val;
00096 int refCount;
00097 VxValueRep() { refCount = 1;}
00098 };
00099
00100 VxValueRep* _data;
00101 };
00102
00103 inline std::ostream&
00104 operator<<(std::ostream& os, VxValue val) {
00105 return val.put(os);
00106 }
00107
00108
00109 #endif