27#ifndef ioutils_fits_fitsHeaderCard_hpp
28#define ioutils_fits_fitsHeaderCard_hpp
44inline void stripApostWS( std::string &str )
51 if( str[0] !=
'\'' && str[0] !=
' ' && str.back() !=
' ' )
57 size_t ns = str.find_first_not_of(
" \t\r\n" );
58 if( ns != std::string::npos && ns != 0 )
62 else if( ns == std::string::npos )
69 ns = str.find_last_not_of(
" \t\r\n" );
70 if( ns != std::string::npos && ns != str.size() - 1 )
75 if( str[0] ==
'\'' && str.back() ==
'\'' )
77 if( str.size() == 1 || str.size() == 2 )
82 str.erase( str.size() - 1, 1 );
107template <
class verboseT = verbose::d>
142 std::complex<__float128> complexQuad;
167 short &member( meta::tagT<short> )
172 unsigned short &member( meta::tagT<unsigned short> )
177 int &member( meta::tagT<int> )
182 unsigned int &member( meta::tagT<unsigned int> )
187 long &member( meta::tagT<long> )
192 unsigned long &member( meta::tagT<unsigned long> )
197 long long &member( meta::tagT<long long> )
202 unsigned long long &member( meta::tagT<unsigned long long> )
207 float &member( meta::tagT<float> )
212 std::complex<float> &member( meta::tagT<std::complex<float>> )
217 double &member( meta::tagT<double> )
222 std::complex<double> &member( meta::tagT<std::complex<double>> )
227 long double &member( meta::tagT<long double> )
232 std::complex<long double> &member( meta::tagT<std::complex<long double>> )
239 __float128 &member( meta::tagT<__float128> )
244 std::complex<__float128> &member( meta::tagT<std::complex<__float128>> )
251 template <
typename typeT>
254 return member( meta::tagT<typeT>() );
281 const std::string &v,
282 const std::string &c =
""
290 const std::string &c =
""
298 const std::string &c =
""
305 const std::string &v,
307 const std::string &c =
""
343 template <
typename typeT>
346 const std::string &c =
""
372 template <
typename typeT>
376 template <
typename typeT>
421 template <
typename typeT>
503 template <
typename typeT>
635 template <
typename typeT>
685template <
class verboseT>
690template <
class verboseT>
704template <
class verboseT>
717template <
class verboseT>
730template <
class verboseT>
732 const std::string &v,
734 const std::string &c )
746template <
class verboseT>
756template <
class verboseT>
766template <
class verboseT>
772template <
class verboseT>
779template <
class verboseT>
780template <
typename typeT>
788template <
class verboseT>
793 memcpy( &m_value, &card.m_value,
sizeof(
values ) );
800template <
class verboseT>
810 memcpy( &m_value, &card.m_value,
sizeof(
values ) );
819template <
class verboseT>
839 m_valueStr << static_cast<int>( m_value.Char );
842 m_valueStr << static_cast<int>( m_value.UChar );
895template <
class verboseT>
896template <
typename typeT>
916template <
class verboseT>
917template <
typename typeT>
924 cval = m_value.UChar;
934 cval = m_value.Short;
939 cval = m_value.UShort;
959 cval = m_value.ULong;
964 cval = m_value.LongLong;
969 cval = m_value.ULongLong;
974 cval = m_value.Float;
980 "can't convert complex type for " +
m_keyword );
984 cval = m_value.Double;
990 "can't convert complex type for " +
m_keyword );
995 "cannot convert comment to numeric type for " +
m_keyword );
1000 "cannot convert history to numeric type for " +
m_keyword );
1005 "cannot convert continue to numeric type for " +
m_keyword );
1010 "cannot convert string to numeric type for " +
m_keyword );
1015 "invalid FITS type conversion for " +
m_keyword );
1020template <
class verboseT>
1084 "can't convert complex type for " +
m_keyword );
1094 "can't convert complex type for " +
m_keyword );
1099 "cannot convert comment to numeric type for " +
m_keyword );
1104 "cannot convert history to numeric type for " +
m_keyword );
1109 "cannot convert continue to numeric type for " +
m_keyword );
1121 "invalid FITS type conversion for " +
m_keyword );
1136template <
class verboseT>
1142template <
class verboseT>
1149template <
class verboseT>
1155template <
class verboseT>
1185template <
class verboseT>
1186template <
typename typeT>
1207 return m_value.template member<typeT>();
1210template <
class verboseT>
1233template <
class verboseT>
1239template <
class verboseT>
1245template <
class verboseT>
1251template <
class verboseT>
1257template <
class verboseT>
1263template <
class verboseT>
1269template <
class verboseT>
1275template <
class verboseT>
1281template <
class verboseT>
1287template <
class verboseT>
1293template <
class verboseT>
1299template <
class verboseT>
1305template <
class verboseT>
1306template <
typename typeT>
1326template <
class verboseT>
1332template <
class verboseT>
1338template <
class verboseT>
1344template <
class verboseT>
1350template <
class verboseT>
1356template <
class verboseT>
1362template <
class verboseT>
1368template <
class verboseT>
1374template <
class verboseT>
1380template <
class verboseT>
1386template <
class verboseT>
1392template <
class verboseT>
1404template <
class verboseT>
1417template <
class verboseT>
1420 std::string str = v;
1422 return value( str );
1425template <
class verboseT>
1429 std::string str = v;
1431 stripApostWS( str );
1442template <
class verboseT>
1443template <
typename typeT>
1447 m_value.template member<typeT>() = v;
1454template <
class verboseT>
1466template <
class verboseT>
1472template <
class verboseT>
1478template <
class verboseT>
1484template <
class verboseT>
1491template <
class verboseT>
1501 if( !m_valueStrGood )
1504 "attempt to continue a card with no value" );
1510 size_t slash = newstr.find_last_of(
'\'' );
1511 if( slash != std::string::npos )
1513 slash = newstr.find_first_of(
'/', slash );
1515 if( slash != std::string::npos )
1518 size_t comm = newstr.find_first_not_of(
' ', slash + 1 );
1519 if( comm != std::string::npos )
1521 m_comment = newstr.substr( comm );
1525 newstr.erase( slash );
1528 stripApostWS( newstr );
1531 std::string vstr = m_valueStr.str();
1532 if( !vstr.empty() && vstr.back() ==
'&' )
1534 vstr.erase( vstr.size() - 1 );
1537 m_valueStr.str( vstr + newstr );
1542template <
class verboseT>
1641 return fits_write_comment( fptr, (
char *)
m_comment.c_str() );
1645 return fits_write_history( fptr, (
char *)
m_comment.c_str() );
Declares and defines utilities to work with FITS files.
error_t
The mxlib error codes.
@ notimpl
A component or technique is not implemented.
@ noerror
No error has occurred.
@ paramnotset
A parameter was not set.
@ invalidconfig
A config setting was invalid.
@ invalidarg
An argument was invalid.
error_t mxlib_error_report(const error_t &code, const std::string &expl, const std::source_location &loc=std::source_location::current())
Print a report to stderr given an mxlib error_t code and explanation and return the code.
constexpr int fitsType()
Return the cfitsio constant for a given data type.
mx::error_t fits_write_key< bool >(fitsfile *fptr, char *keyword, void *value, char *comment)
Specialization to handle the case bool.
mx::error_t fits_write_key(fitsfile *fptr, char *keyword, void *value, char *comment)
Write a header card to a file.
typeT stoT(const std::string &str, error_t *errc=nullptr)
Convert a string to a numerical value.
Declarations of some libarary wide utilities.
Declares and defines an empty struct for tag dispatching.