// $Id: TFitsKeyValue.h 55 2010-12-07 07:35:06Z oxon $ // Author: Akira Okumura 18/11/09 //////////////////////////////////////////////////////////////////////////////// // FITS card value (similar to boost::any) //////////////////////////////////////////////////////////////////////////////// #ifndef ROOT_ASTRO_TFitsKeyValue #define ROOT_ASTRO_TFitsKeyValue #include #include #ifndef ROOT_TObject #include "TObject.h" #endif class TFitsPlaceHolder : public TObject { public: TFitsPlaceHolder() : TObject() {} TFitsPlaceHolder(const TFitsPlaceHolder&) : TObject() {} TFitsPlaceHolder& operator=(const TFitsPlaceHolder& rhs); virtual ~TFitsPlaceHolder() {} virtual Bool_t AsBool() const = 0; virtual std::complex AsComplexDouble() const = 0; virtual std::complex AsComplexFloat() const = 0; virtual Double_t AsDouble() const = 0; virtual std::string AsFitsString() const = 0; virtual Float_t AsFloat() const = 0; virtual Int_t AsInt() const = 0; virtual Long64_t AsLong64() const = 0; virtual std::string AsString() const = 0; virtual Bool_t IsBool() const = 0; virtual Bool_t IsComplexDouble() const = 0; virtual Bool_t IsComplexFloat() const = 0; virtual Bool_t IsDouble() const = 0; virtual Bool_t IsFloat() const = 0; virtual Bool_t IsInt() const = 0; virtual Bool_t IsLong64() const = 0; virtual Bool_t IsString() const = 0; ClassDef(TFitsPlaceHolder,0) }; template class TFitsHolder : public TFitsPlaceHolder { private: TFitsHolder& operator=(const TFitsHolder& rhs); // hidden public: T fHeld; // TFitsHolder(); TFitsHolder(const T& value) : fHeld(value) {} virtual ~TFitsHolder() {} virtual Bool_t AsBool() const; virtual std::complex AsComplexDouble() const; virtual std::complex AsComplexFloat() const; virtual Double_t AsDouble() const; virtual std::string AsFitsString() const; virtual Float_t AsFloat() const {return AsDouble();} virtual Int_t AsInt() const; virtual Long64_t AsLong64() const; virtual std::string AsString() const; virtual Bool_t IsBool() const {return typeid(T) == typeid(Bool_t);} virtual Bool_t IsComplexDouble() const {return typeid(T) == typeid(std::complex);} virtual Bool_t IsComplexFloat() const {return typeid(T) == typeid(std::complex);} virtual Bool_t IsDouble() const {return typeid(T) == typeid(Double_t);} virtual Bool_t IsFloat() const {return typeid(T) == typeid(Float_t);} virtual Bool_t IsInt() const {return typeid(T) == typeid(Int_t);} virtual Bool_t IsLong64() const {return typeid(T) == typeid(Long64_t);} virtual Bool_t IsString() const {return typeid(T) == typeid(std::string);} ClassDef(TFitsHolder,1) }; class TFitsKeyValue : public TObject { private: TFitsPlaceHolder* fContent; //-> public: TFitsKeyValue() : TObject(), fContent(0) {} TFitsKeyValue(const TFitsKeyValue& value); template TFitsKeyValue(const T& value); TFitsKeyValue& operator=(const TFitsKeyValue& rhs); virtual ~TFitsKeyValue() {SafeDelete(fContent);} virtual Bool_t AsBool() const {return fContent ? fContent->AsBool() : 0;} virtual std::complex AsComplexDouble() const {return fContent ? fContent->AsComplexDouble() : 0;} virtual std::complex AsComplexFloat() const {return fContent ? fContent->AsComplexFloat() : 0;} virtual Double_t AsDouble() const {return fContent ? fContent->AsDouble() : 0;} virtual std::string AsFitsString() const {return fContent ? fContent->AsFitsString() : "";} virtual Float_t AsFloat() const {return fContent ? fContent->AsFloat() : 0;} virtual Int_t AsInt() const {return fContent ? fContent->AsInt() : 0;} virtual Long64_t AsLong64() const {return fContent ? fContent->AsLong64() : 0;} virtual std::string AsString() const {return fContent ? fContent->AsString() : "";} virtual Bool_t IsBool() const {return fContent ? fContent->IsBool() : kFALSE;} virtual Bool_t IsComplexDouble() const {return fContent ? fContent->IsComplexDouble() : kFALSE;} virtual Bool_t IsComplexFloat() const {return fContent ? fContent->IsComplexFloat() : kFALSE;} virtual Bool_t IsDouble() const {return fContent ? fContent->IsDouble() : kFALSE;} virtual Bool_t IsFloat() const {return fContent ? fContent->IsFloat() : kFALSE;} virtual Bool_t IsInt() const {return fContent ? fContent->IsInt() : kFALSE;} virtual Bool_t IsLong64() const {return fContent ? fContent->IsLong64() : kFALSE;} virtual Bool_t IsString() const {return fContent ? fContent->IsString() : kFALSE;} virtual operator Bool_t() {return AsBool();} virtual operator std::complex() {return AsComplexDouble();} virtual operator std::complex() {return AsComplexFloat();} virtual operator Double_t() {return AsDouble();} virtual operator Float_t() {return AsFloat();} virtual operator Int_t() {return AsInt();} virtual operator Long64_t() {return AsLong64();} virtual operator std::string() {return AsString();} //friend class TFitsCardImage; ClassDef(TFitsKeyValue,1) // FITS card value }; #endif