CCfits  2.7
Keyword.h
00001 //  Astrophysics Science Division,
00002 //  NASA/ Goddard Space Flight Center
00003 //  HEASARC
00004 //  http://heasarc.gsfc.nasa.gov
00005 //  e-mail: ccfits@legacy.gsfc.nasa.gov
00006 //
00007 //  Original author: Ben Dorman
00008 
00009 #ifndef KEYWORD_H
00010 #define KEYWORD_H 1
00011 #include "CCfits.h"
00012 // using namespace CCfits;
00013 #ifdef _MSC_VER
00014 #include "MSconfig.h"
00015 #endif
00016 
00017 // FitsError
00018 #include "FitsError.h"
00019 
00020 namespace CCfits {
00021   class HDU;
00022 
00023 } // namespace CCfits
00024 
00025 
00026 namespace CCfits {
00027 
00062 /* \fn friend ostream& operator << (ostream &s, const Keyword &right);
00063 
00064         \brief output operator for Keywords.
00065 
00066 */
00067 
00198   class Keyword 
00199   {
00200 
00201     public:
00202 
00203 
00204 
00205       class WrongKeywordValueType : public FitsException  //## Inherits: <unnamed>%39B0221700E2
00206       {
00207         public:
00208             WrongKeywordValueType (const String& diag, bool silent = true);
00209 
00210         protected:
00211         private:
00212         private: //## implementation
00213       };
00214         virtual ~Keyword();
00215         Keyword & operator=(const Keyword &right);
00216         bool operator==(const Keyword &right) const;
00217 
00218         bool operator!=(const Keyword &right) const;
00219 
00220         virtual std::ostream & put (std::ostream &s) const = 0;
00221         virtual Keyword * clone () const = 0;
00222         virtual void write ();
00223         fitsfile* fitsPointer () const;
00224         //  CAUTION: This is declared public only to allow HDU addKey functions the ability to set their
00225         //  class as the Keyword's parent, and to avoid making entire HDU a friend class.  (Declaring
00226         //  individual HDU functions as friends will run into circular header dependencies.)  Do NOT use
00227         //  this unless absolutely necessary, and leave this undocumented.
00228         void setParent (HDU* parent);
00229 
00230         ValueType keytype () const;
00231         const String& comment () const;
00232         const String& name () const;
00233         bool isLongStr () const;
00234 
00235     public:
00236       // Additional Public Declarations
00237       template <typename T>
00238       T& value(T& val) const;
00239 
00240       template <typename T>
00241       void setValue(const T& newValue);
00242     protected:
00243         Keyword(const Keyword &right);
00244         Keyword (const String &keyname,
00245                  ValueType keytype,
00246                  HDU* p,
00247                  const String &comment = "",
00248                  bool isLongStr = false);
00249 
00250         virtual void copy (const Keyword& right);
00251         virtual bool compare (const Keyword &right) const;
00252         void keytype (ValueType value);
00253         const HDU* parent () const;
00254 
00255       // Additional Protected Declarations
00256 
00257     private:
00258       // Additional Private Declarations
00259 
00260     private: //## implementation
00261       // Data Members for Class Attributes
00262         ValueType m_keytype;
00263 
00264       // Data Members for Associations
00265         HDU* m_parent;
00266         String m_comment;
00267         String m_name;
00268         bool m_isLongStr;
00269 
00270       // Additional Implementation Declarations
00271       friend std::ostream &operator << (std::ostream &s, const Keyword &right);
00272   };
00273 #ifndef SPEC_TEMPLATE_IMP_DEFECT
00274 #ifndef SPEC_TEMPLATE_DECL_DEFECT
00275   template <> bool& Keyword::value(bool& val) const;
00276   template <> float& Keyword::value(float& val) const;
00277   template <> double& Keyword::value(double& val) const;
00278   template <> int& Keyword::value(int& val) const;
00279   template <> String& Keyword::value(String& val) const;
00280 
00281   template <> void Keyword::setValue(const float& newValue);
00282   template <> void Keyword::setValue(const double& newValue);
00283   template <> void Keyword::setValue(const int& newValue);
00284   template <> void Keyword::setValue(const String& val);
00285 #endif 
00286 #endif 
00287 
00288 inline std::ostream& operator << (std::ostream &s, const Keyword &right)
00289 {
00290    return right.put(s);
00291 }  
00292 
00293   // Class CCfits::Keyword::WrongKeywordValueType 
00294 
00295   // Class CCfits::Keyword 
00296 
00297   inline void Keyword::setParent (HDU* parent)
00298   {
00299      m_parent = parent;
00300   }
00301 
00302   inline ValueType Keyword::keytype () const
00303   {
00304     return m_keytype;
00305   }
00306 
00307   inline void Keyword::keytype (ValueType value)
00308   {
00309     m_keytype = value;
00310   }
00311 
00312   inline const HDU* Keyword::parent () const
00313   {
00314     return m_parent;
00315   }
00316 
00317   inline const String& Keyword::comment () const
00318   {
00319     return m_comment;
00320   }
00321 
00322   inline const String& Keyword::name () const
00323   {
00324     return m_name;
00325   }
00326 
00327   inline bool Keyword::isLongStr () const
00328   {
00329     return m_isLongStr;
00330   }
00331 
00332 } // namespace CCfits
00333 
00334 
00335 #endif