// ____ ______ __ // / __ \ / ____// / // / /_/ // / / / // / ____// /___ / /___ PixInsight Class Library // /_/ \____//_____/ PCL 2.4.23 // ---------------------------------------------------------------------------- // pcl/FITSHeaderKeyword.h - Released 2022-03-12T18:59:29Z // ---------------------------------------------------------------------------- // This file is part of the PixInsight Class Library (PCL). // PCL is a multiplatform C++ framework for development of PixInsight modules. // // Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. // // Redistribution and use in both source and binary forms, with or without // modification, is permitted provided that the following conditions are met: // // 1. All redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 2. All redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names // of their contributors, may be used to endorse or promote products derived // from this software without specific prior written permission. For written // permission, please contact info@pixinsight.com. // // 4. All products derived from this software, in any form whatsoever, must // reproduce the following acknowledgment in the end-user documentation // and/or other materials provided with the product: // // "This product is based on software from the PixInsight project, developed // by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." // // Alternatively, if that is where third-party acknowledgments normally // appear, this acknowledgment must be reproduced in the product itself. // // THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS // INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, // DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // ---------------------------------------------------------------------------- #ifndef __PCL_FITSHeaderKeyword_h #define __PCL_FITSHeaderKeyword_h /// \file pcl/FITSHeaderKeyword.h #include #include #include #include namespace pcl { // ---------------------------------------------------------------------------- /*! * \class FITSHeaderKeyword * \brief %FITS header keyword */ class PCL_CLASS FITSHeaderKeyword { public: IsoString name; //!< Keyword name IsoString value; //!< Keyword value IsoString comment; //!< Keyword comment /*! * Constructs a %FITSHeaderKeyword object with empty name, value and comment * components. */ FITSHeaderKeyword() = default; /*! * Copy constructor. */ FITSHeaderKeyword( const FITSHeaderKeyword& ) = default; /*! * Move constructor. */ FITSHeaderKeyword( FITSHeaderKeyword&& ) = default; /*! * Constructs a %FITSHeaderKeyword object with the specified name, value and * comment components. */ FITSHeaderKeyword( const IsoString& a_name, const IsoString& a_value = IsoString(), const IsoString& a_comment = IsoString() ) : name( a_name ) , value( a_value ) , comment( a_comment ) { Trim(); } template FITSHeaderKeyword( const S1& a_name, const S2& a_value, const S3& a_comment ) : name( IsoString( a_name ) ) , value( IsoString( a_value ) ) , comment( IsoString( a_comment ) ) { Trim(); } /*! * Assignment operator. Returns a reference to this object. */ FITSHeaderKeyword& operator =( const FITSHeaderKeyword& ) = default; /*! * Returns true iff this %FITS keyword has no %value (i.e., if the value * member is an empty string). */ bool IsNull() const { return value.IsEmpty(); } /*! * Returns true iff this %FITS keyword has a string %value. * * A string %value is assumed if the value component begins with a single * quote ('). */ bool IsString() const { return value.StartsWith( '\'' ); } /*! * Returns true iff this %FITS keyword has a boolean %value. * * A boolean %value is assumed if the value component is equal to 'T' or 'F' * for \c true and \c false, respectively. */ bool IsBoolean() const { return value == 'T' || value == 'F'; } /*! * Returns true iff this %FITS keyword has a numeric %value. * * A numeric %value is assumed if the value component is a valid * representation of an integer or floating point number. */ bool IsNumeric() const { return value.IsNumeral(); } /*! * Gets the numeric %value of this %FITS keyword in the specified variable * \a v, or zero if this keyword has no numeric %value. * * Returns true iff this keyword has a valid numeric %value. This member * function does not throw exceptions, even if the keyword's value contains * an illegal numeric representation. */ bool GetNumericValue( double& v ) const { if ( value.TryToDouble( v ) ) return true; v = 0; return false; } /*! * Returns the string %value of this %FITS header keyword (irrespective of * its data type), with delimiters pulled off and leading/trailing * whitespace trimmed out. */ IsoString StripValueDelimiters() const { IsoString stripped; if ( !value.IsEmpty() && *value == '\'' ) // leading delimiter ? { size_type n = value.Length()-1; if ( value[n] == '\'' ) // trailing delimiter ? --n; stripped = value.Substring( 1, n ); } else stripped = value; return stripped.Trimmed(); } /*! * If this keyword has a string value without leading and trailing quotes, * this member function adds them, as required by the FITS standard. Returns * true if the value was fixed, false if the value was not changed. */ bool FixValueDelimiters() { double dum; if ( !IsNull() ) if ( !IsString() ) if ( !IsBoolean() ) if ( !IsNumeric() || !value.TryToDouble( dum ) ) { value.EnsureSingleQuoted(); return true; } return false; } /*! * Removes leading and trailing spaces in the name, value and comment * components of this %FITS header keyword. */ void Trim() { name.Trim(); value.Trim(); comment.Trim(); } }; // ---------------------------------------------------------------------------- /*! * \class pcl::FITSKeywordArray * \brief Dynamic array of %FITS header keywords * * %FITSKeywordArray is a template instantiation of Array for * FITSHeaderKeyword. */ typedef Array FITSKeywordArray; // ---------------------------------------------------------------------------- /*! * \defgroup fits_keyword_comparison FITS Keyword Comparison Functions */ /*! * Returns true iff two %FITS header keywords, \a h1 and \a h2, are equal. * * Two %FITS keywords are equal if their three components (name, value, * comment) are equal. However, keyword name comparison is case-insensitive as * per the %FITS standard. * * \ingroup fits_keyword_comparison */ inline bool operator ==( const FITSHeaderKeyword& h1, const FITSHeaderKeyword& h2 ) { // Keyword name comparison is case-insensitive as per the FITS standard. return h1.name.CompareIC( h2.name ) == 0 && h1.value == h2.value && h1.comment == h2.comment; } /*! * Returns true iff a %FITS header keyword \a h1 is less than other keyword * \a h2. * * This function compares the components of both keywords. The precedence order * is name, value and comment. Keyword name comparison is case-insensitive as * per the %FITS standard. * * \ingroup fits_keyword_comparison */ inline bool operator <( const FITSHeaderKeyword& h1, const FITSHeaderKeyword& h2 ) { int i = h1.name.CompareIC( h2.name ); return i < 0 || i == 0 && (h1.value < h2.value || h1.value == h2.value && h1.comment < h2.comment); } // ---------------------------------------------------------------------------- } // pcl #endif // __PCL_FITSHeaderKeyword_h // ---------------------------------------------------------------------------- // EOF pcl/FITSHeaderKeyword.h - Released 2022-03-12T18:59:29Z