Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

VxValue.h

00001 /*
00002  *
00003  *  Copyright (c) 2001, TNO TPD, The Netherlands.
00004  *  All rights reserved. No part of this software may be handed to or used by persons 
00005  *  or organisation outside Kenniscentrum Watergraafsmeer (UvA-ISIS, TNO TPD) without 
00006  *  the written permission of TNO TPD.
00007  *
00008  *  Author(s):
00009  *      Jan Baan (baan@tpd.tno.nl)
00010  *      Jeroen Vendrig
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

Generated on Tue Feb 3 14:18:45 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001