Diana  0.8.3
CapeVariant.hpp
00001 /* -----------------------------------------------------------------------------
00002  *  Diana process modelling, simulation and analysis software
00003  *  Copyright (c) 2005, Michael Krasnyk
00004  *  All rights reserved.
00005  *
00006  *  This file is a part of Diana process modelling, simulation and analysis software
00007  *
00008  *  Diana is free software; you can redistribute it and/or modify it
00009  *  under the terms of the GNU General Public License as published
00010  *  by the Free Software Foundation (see accompanying file LICENSE)
00011  * -----------------------------------------------------------------------------
00012  *  $Id: CapeVariant.hpp 8160 2009-03-16 18:36:30Z miha $
00013  * -----------------------------------------------------------------------------
00014  *  Description:
00015  */
00016 
00017 #ifndef CAPE_VARIANT_HPP
00018 #define CAPE_VARIANT_HPP
00019 
00020 #include "CapeTypes.hpp"
00021 #include "DianaArray.hpp"
00022 #include "DianaSparseArray.hpp"
00023 
00024 namespace Common{
00025   namespace Types{
00026 
00045     class CapeVariant{
00046 #ifndef SWIG
00047 
00048       friend std::ostream& operator<<(std::ostream& out_file, const CapeVariant& variant);
00049 #endif
00050     private:
00051       Common::Types::CapeType type;                     
00052 
00054       union _value{
00055         Common::Types::CapeDouble       d;              
00056         Common::Types::CapeFloat        f;              
00057         Common::Types::CapeLong         l;              
00058         Common::Types::CapeBoolean      b;              
00059         Common::Types::CapeChar         ch;             
00060         Common::Types::CapeShort        sh;             
00061         Common::Types::CapeString*      str;            
00062         Common::Types::CapeArrayString* strarray;       
00063         Common::Types::CapeDate*        date;           
00064         Common::Types::CapeURL*         url;            
00065         Common::Types::CapePointer      ptr;            
00066         Diana::DianaArray*              array;          
00067         Diana::DianaSparseArray*        sarray;         
00068       }value;
00069 
00070     public:
00072       CapeVariant();
00073 
00075       virtual ~CapeVariant();
00076       
00077       CapeVariant( const CapeVariant& var );       
00078       CapeVariant( const CapeDouble _val );        
00079       CapeVariant( const CapeFloat _val );         
00080       CapeVariant( const CapeLong _val );          
00081       CapeVariant( const bool _val );              
00082       CapeVariant( const CapeBoolean _val );       
00083       CapeVariant( const CapeChar _val );          
00084       CapeVariant( const CapeShort _val );         
00086       // Important!!!
00087       // for CapeDate and CapeURL casting to the CapeString
00088 #ifndef SWIG    // leave only one overloaded definition for the Python
00089       CapeVariant( const CapeString& _val );       
00090       CapeVariant( const CapeString* _val );       
00091 #endif
00092       CapeVariant( const char* _val );             
00093       CapeVariant( const CapeArrayString& _val );  
00095       CapeVariant( const CapePointer _val );       
00097       CapeVariant( const Diana::DianaArray& _val );        
00098       CapeVariant( const Diana::DianaSparseArray& _val );  
00100       // assignment constructors
00101 #ifndef SWIG
00102       CapeVariant& operator=(const CapeVariant& v); 
00103       CapeVariant& operator=(const CapeDouble d);   
00104       CapeVariant& operator=(const CapeFloat f);    
00105       CapeVariant& operator=(const CapeLong l);     
00106       CapeVariant& operator=(const bool b);  
00107       CapeVariant& operator=(const CapeBoolean b);  
00108       CapeVariant& operator=(const CapeChar ch);    
00109       CapeVariant& operator=(const CapeShort sh);   
00111       // Important!!!
00112       // for CapeDate and CapeURL casting to the CapeString
00113       CapeVariant& operator=(const CapeString& str); 
00114       CapeVariant& operator=(const CapeString* str); 
00115       CapeVariant& operator=(const char* str);       
00116       CapeVariant& operator=(const CapeArrayString& str); 
00117       CapeVariant& operator=(const CapePointer ptr); 
00118       CapeVariant& operator=(const Diana::DianaArray& array); 
00119       CapeVariant& operator=(const Diana::DianaSparseArray& array); 
00121       Types::CapeType getType() const;  
00123       CapeDouble               asDouble()           const;  
00124       CapeFloat                asFloat()            const;  
00125       CapeLong                 asLong()             const;  
00126       CapeBoolean              asBoolean()          const;  
00127       CapeChar                 asChar()             const;  
00128       CapeShort                asShort()            const;  
00129       CapeString               asString()           const;  
00130       CapeDate                 asDate()             const;  
00131       CapeURL                  asURL()              const;  
00132       CapePointer              asPointer()          const;  
00133       Diana::DianaArray&       asDianaArray()       const;  
00134       Diana::DianaSparseArray& asDianaSparseArray() const;  
00135       CapeArrayString&         asStringArray()      const;  
00136 #endif
00137 
00138     private:
00139       void freeData();    
00140     };
00141 
00143     typedef std::vector<CapeVariant>   CapeArrayVariant;
00144 
00145 #ifndef SWIG
00146 
00147     std::ostream& operator<<(std::ostream& out_file, const CapeVariant& variant);
00148 #endif
00149 
00150   };
00151 };
00152 
00153 
00154 #endif // CAPE_VARIANT_HPP