CCfits 2.6
FITSUtil.h
1// Astrophysics Science Division,
2// NASA/ Goddard Space Flight Center
3// HEASARC
4// http://heasarc.gsfc.nasa.gov
5// e-mail: ccfits@legacy.gsfc.nasa.gov
6//
7// Original author: Ben Dorman
8
9#ifndef FITSUTIL_H
10#define FITSUTIL_H 1
11#include "CCfits.h"
12
13// functional
14#include <functional>
15// complex
16#include <complex>
17// valarray
18#include <valarray>
19// vector
20#include <vector>
21// string
22#include <string>
23// FitsError
24#include "FitsError.h"
25#include <typeinfo>
26
27
28namespace CCfits {
29
30 namespace FITSUtil {
31
38
39
40
61
62
63
70
90
94
114
120
121
122
144
149
153
157
158
163
164
165
171
175
180
186
193
199
205
214
228
233
238
239
240
241
247
252
258
259
279
280#ifdef _MSC_VER
281#include "MSconfig.h" // for truncation double to float warning
282#endif
283
284 template <typename T>
285 void swap(T& left,T& right);
286
287 template <typename T>
288 void swap(std::vector<T>& left, std::vector<T>& right);
289
290 string lowerCase(const string& inputString);
291
292 string upperCase(const string& inputString);
293
294 // Check if a file name includes an image compression specifier,
295 // and return its location if it exists.
296 string::size_type checkForCompressString(const string& fileName);
297
298 struct InvalidConversion : public FitsException
299 {
300 InvalidConversion(const string& diag, bool silent=false);
301
302 };
303
304 struct MatchStem
305 {
306 bool operator()(const string& left, const string& right) const;
307 };
308
309 static const double d1(0);
310 static const float f1(0);
311 static const std::complex<float> c1(0.);
312 static const std::complex<double> d2(0.);
313 static const string s1("");
314 static const int i1(0);
315 static const unsigned int u1(0);
316 static const long l1(0);
317 static const unsigned long ul1(0);
318 static const LONGLONG ll1(0);
319 static const short s2(0);
320 static const unsigned short us1(0);
321 static const bool b1(false);
322 static const unsigned char b2(0);
323
324 char** CharArray(const std::vector<string>& inArray);
325
326 string FITSType2String( int typeInt );
327
328
329 template <typename S, typename T>
330 void fill(std::vector<S>& outArray, const std::vector<T>& inArray,size_t first, size_t last);
331
332 template <typename S, typename T>
333 void fill(std::valarray<S>& outArray, const std::valarray<T>& inArray);
334
335 template <typename S, typename T>
336 void fill(std::valarray<S>& outArray, const std::vector<T>& inArray,size_t first, size_t last);
337
338
339 template <typename S, typename T>
340 void fill(std::vector<S>& outArray, const std::valarray<T>& inArray);
341
342 // VF<-AF
343 void fill(std::vector<std::complex<float> >& outArray,
344 const std::valarray<std::complex<float> >& inArray);
345
346 // VF<-AD
347 void fill(std::vector<std::complex<float> >& outArray,
348 const std::valarray<std::complex<double> >& inArray);
349
350 // VD<-AD
351 void fill(std::vector<std::complex<double> >& outArray,
352 const std::valarray<std::complex<double> >& inArray);
353
354
355 // VD<-AF
356 void fill(std::vector<std::complex<double> >& outArray,
357 const std::valarray<std::complex<float> >& inArray);
358
359 template <typename T>
360 void fill(std::vector<string>& outArray, const std::vector<T>& inArray, size_t first, size_t last);
361
362 template <typename T>
363 void fill(std::vector<T>& outArray, const std::vector<string>& inArray, size_t first, size_t last);
364
365 template <typename S>
366 void fill(std::valarray<S>& outArray, const std::vector<string>& inArray,size_t first, size_t last);
367
368// template <typename S, typename T>
369// void fill(std::valarray<std::complex<S> >& outArray, const std::valarray<std::complex<T> >& inArray);
370 // seems no other way of doing this.
371
372 // VF<-VF
373#ifdef TEMPLATE_AMBIG_DEFECT
374 void fillMSvfvf(std::vector<std::complex<float> >& outArray,
375 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
376#endif
377
378 void fill(std::vector<std::complex<float> >& outArray,
379 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
380
381 // VF<-VD
382#ifdef TEMPLATE_AMBIG_DEFECT
383 void fillMSvfvd(std::vector<std::complex<float> >& outArray,
384 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
385#endif
386
387 void fill(std::vector<std::complex<float> >& outArray,
388 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
389
390 // VD<-VD
391#ifdef TEMPLATE_AMBIG_DEFECT
392 void fillMSvdvd(std::vector<std::complex<double> >& outArray,
393 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
394#endif
395
396 void fill(std::vector<std::complex<double> >& outArray,
397 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
398
399#ifdef TEMPLATE_AMBIG_DEFECT
400 void fillMSvdvf(std::vector<std::complex<double> >& outArray,
401 const std::vector<std::complex<float> >& inArray,
402 size_t first, size_t last);
403#else
404 void fill(std::vector<std::complex<double> >& outArray,
405 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
406#endif
407
408 // AF<-VD
409 void fill(std::valarray<std::complex<float> >& outArray,
410 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
411
412 // AF<-VF
413#ifdef TEMPLATE_AMBIG_DEFECT
414 void fillMSafvf(std::valarray<std::complex<float> >& outArray,
415 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
416#else
417 void fill(std::valarray<std::complex<float> >& outArray,
418 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
419#endif
420
421 // AD<-VF
422#ifdef TEMPLATE_AMBIG_DEFECT
423 void fillMSadvf(std::valarray<std::complex<double> >& outArray,
424 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
425#else
426 void fill(std::valarray<std::complex<double> >& outArray,
427 const std::vector<std::complex<float> >& inArray, size_t first, size_t last);
428#endif
429
430 // AD<-VD
431#ifdef TEMPLATE_AMBIG_DEFECT
432 void fillMSadvd(std::valarray<std::complex<double> >& outArray,
433 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
434#else
435 void fill(std::valarray<std::complex<double> >& outArray,
436 const std::vector<std::complex<double> >& inArray, size_t first, size_t last);
437#endif
438
439 // AF<-AF
440 void fill(std::valarray<std::complex<float> >& outArray,
441 const std::valarray<std::complex<float> >& inArray);
442 // AD<-AD
443 void fill(std::valarray<std::complex<double> >& outArray,
444 const std::valarray<std::complex<double> >& inArray);
445 // AF<-AD
446 void fill(std::valarray<std::complex<float> >& outArray,
447 const std::valarray<std::complex<double> >& inArray);
448 // AD<-AF
449 void fill(std::valarray<std::complex<double> >& outArray,
450 const std::valarray<std::complex<float> >& inArray);
451
452#if TEMPLATE_AMBIG_DEFECT || TEMPLATE_AMBIG7_DEFECT
453 void fillMSvsvs(std::vector<string>& outArray, const std::vector<string>& inArray, size_t first, size_t last);
454#endif
455
456
457 void fill(std::vector<string>& outArray, const std::vector<string>& inArray, size_t first, size_t last);
458
459 template <typename S, typename T>
460 string errorMessage(const S& out, const T& in);
461
462
463
464 template <class T>
466 {
467 // Parameterized Class MatchPtrName
468 bool operator () (const T& left, const string& right) const;
469
470 public:
471 protected:
472 private:
473 private: //## implementation
474 };
475
476
477
478 template <class T>
479 struct MatchName
480 {
481 bool operator () (const T& left, const string& right) const;
482
483 public:
484 protected:
485 private:
486 private: //## implementation
487 };
488
489
490
491 template <class T>
492 struct MatchNum
493 {
494 bool operator () (const T& left, const int& right) const;
495
496 public:
497 protected:
498 private:
499 private: //## implementation
500 };
501
502
503
504 template <typename T>
505 struct MatchType
506 {
507 ValueType operator () ();
508
509 public:
510 protected:
511 private:
512 private: //## implementation
513 };
514
515
516
517 template <typename T>
518 struct CVarray
519 {
520 T* operator () (const std::vector<T>& inArray);
521
522 public:
523 protected:
524 private:
525 private: //## implementation
526 };
527
528
529
530 template <typename T>
531 struct FitsNullValue
532 {
533 T operator () ();
534
535 public:
536 protected:
537 private:
538 private: //## implementation
539 };
540
541
542
543 template <typename T>
544 struct MatchImageType
545 {
546 ImageType operator () ();
547
548 public:
549 protected:
550 private:
551 private: //## implementation
552 };
553
554
555
556 template <class T>
558 {
559 bool operator () (const T& left, const int& right) const;
560
561 public:
562 protected:
563 private:
564 private: //## implementation
565 };
566 // auto_ptr analogue for arrays.
567
568
569
570 template <typename X>
572 {
573 public:
574 explicit auto_array_ptr (X* p = 0) throw ();
575 explicit auto_array_ptr (auto_array_ptr<X>& right) throw ();
577
578 void operator = (auto_array_ptr<X>& right);
579 X& operator * () throw ();
580 X& operator [] (size_t i) throw ();
581 X operator [] (size_t i) const throw ();
582 X* get () const;
583 X* release () throw ();
584 X* reset (X* p) throw ();
585 static void remove (X*& x);
586
587 protected:
588 private:
589 private: //## implementation
590 // Data Members for Class Attributes
591 X* m_p;
592
593 };
594
595
596
597 template <typename T>
598 struct ComparePtrIndex
599 {
600 bool operator () (const T* left, const T* right);
601
602 public:
603 protected:
604 private:
605 private: //## implementation
606 };
607
608
609
610 template <typename T>
611 struct CAarray
612 {
613 T* operator () (const std::valarray<T>& inArray);
614
615 public:
616 protected:
617 private:
618 private: //## implementation
619 };
620
621
622
623 template <typename T>
624 struct CVAarray
625 {
626 T* operator () (const std::vector< std::valarray<T> >& inArray);
627
628 public:
629 protected:
630 private:
631 private: //## implementation
632 };
633
634
635
636 class UnrecognizedType : public FitsException //## Inherits: <unnamed>%3CE143AB00C6
637 {
638 public:
639 UnrecognizedType (string diag, bool silent = true);
640
641 protected:
642 private:
643 private: //## implementation
644 };
645
646 // Parameterized Class CCfits::FITSUtil::MatchPtrName
647
648 template <class T>
649 inline bool MatchPtrName<T>::operator () (const T& left, const string& right) const
650 {
651 return left->name() == right;
652 }
653
654 // Parameterized Class CCfits::FITSUtil::MatchName
655
656 template <class T>
657 inline bool MatchName<T>::operator () (const T& left, const string& right) const
658 {
659 return left.name() == right;
660 }
661
662 // Parameterized Class CCfits::FITSUtil::MatchNum
663
664 template <class T>
665 inline bool MatchNum<T>::operator () (const T& left, const int& right) const
666 {
667 return left.index() == right;
668 }
669
670 // Parameterized Class CCfits::FITSUtil::MatchType
671
672 // Parameterized Class CCfits::FITSUtil::CVarray
673
674 template <typename T>
675 inline T* CVarray<T>::operator () (const std::vector<T>& inArray)
676 {
677
678 // convert std containers used commonly in FITS to C arrays in an exception
679 // safe manner that is also clear about resource ownership.
680 auto_array_ptr<T> pC(new T[inArray.size()]);
681 T* c = pC.get();
682 std::copy(inArray.begin(),inArray.end(),&c[0]);
683 return pC.release();
684 }
685
686 // Parameterized Class CCfits::FITSUtil::FitsNullValue
687
688 template <typename T>
689 inline T FitsNullValue<T>::operator () ()
690 {
691 // This works for int types. Float, complex, and string types
692 // are handled below with specialized templates.
693 return 0;
694 }
695
696 // Parameterized Class CCfits::FITSUtil::MatchImageType
697
698 // Parameterized Class CCfits::FITSUtil::MatchPtrNum
699
700 template <class T>
701 inline bool MatchPtrNum<T>::operator () (const T& left, const int& right) const
702 {
703 return left->index() == right;
704 }
705
706 // Parameterized Class CCfits::FITSUtil::auto_array_ptr
707
708 // Parameterized Class CCfits::FITSUtil::ComparePtrIndex
709
710 // Parameterized Class CCfits::FITSUtil::CAarray
711
712 // Parameterized Class CCfits::FITSUtil::CVAarray
713
714 // Class CCfits::FITSUtil::UnrecognizedType
715
716 // Parameterized Class CCfits::FITSUtil::MatchPtrName
717
718 // Parameterized Class CCfits::FITSUtil::MatchName
719
720 // Parameterized Class CCfits::FITSUtil::MatchNum
721
722 // Parameterized Class CCfits::FITSUtil::MatchType
723
724 template <typename T>
725 ValueType MatchType<T>::operator () ()
726 {
727
728 if ( typeid(T) == typeid(d1) ) return Tdouble;
729 if ( typeid(T) == typeid(f1) ) return Tfloat;
730 if ( typeid(T) == typeid(c1) ) return Tcomplex;
731 if ( typeid(T) == typeid(d2) ) return Tdblcomplex;
732 if ( typeid(T) == typeid(s1) ) return Tstring;
733 if ( typeid(T) == typeid(i1) ) return Tint;
734 if ( typeid(T) == typeid(u1) ) return Tuint;
735 if ( typeid(T) == typeid(s2) ) return Tshort;
736 if ( typeid(T) == typeid(us1) ) return Tushort;
737 if ( typeid(T) == typeid(b1) ) return Tlogical;
738 if ( typeid(T) == typeid(b2) ) return Tbyte;
739 if ( typeid(T) == typeid(l1) ) return Tlong;
740 if ( typeid(T) == typeid(ul1) ) return Tulong;
741 // Carefull, on some compilers LONGLONG == long,
742 // so this should go after test for long.
743 if ( typeid(T) == typeid(ll1) ) return Tlonglong;
744 throw UnrecognizedType("Invalid data type for FITS Data I/O\n");
745 }
746
747 // Parameterized Class CCfits::FITSUtil::CVarray
748
749 // Parameterized Class CCfits::FITSUtil::MatchImageType
750
751 template <typename T>
752 ImageType MatchImageType<T>::operator () ()
753 {
754 if ( typeid(T) == typeid(b2) ) return Ibyte;
755 if ( typeid(T) == typeid(s2) ) return Ishort;
756 if ( typeid(T) == typeid(l1) ) return Ilong;
757 if ( typeid(T) == typeid(f1) ) return Ifloat;
758 if ( typeid(T) == typeid(d1) ) return Idouble;
759 if ( typeid(T) == typeid(us1) ) return Iushort;
760 if ( typeid(T) == typeid(ul1) ) return Iulong;
761 if ( typeid(T) == typeid(ll1) ) return Ilonglong;
762 MatchType<T> errType;
763 string diag ("Image: ");
764 diag += FITSType2String(errType());
765 throw UnrecognizedType(diag);
766 }
767
768 // Parameterized Class CCfits::FITSUtil::MatchPtrNum
769
770 // Parameterized Class CCfits::FITSUtil::auto_array_ptr
771
772 template <typename X>
774 : m_p(p)
775 {
776 }
777
778 template <typename X>
780 : m_p(right.release())
781 {
782 }
783
784
785 template <typename X>
787 {
788 delete [] m_p;
789 }
790
791
792 template <typename X>
794 {
795 if (this != &right)
796 {
797 remove(m_p);
798 m_p = right.release();
799 }
800 }
801
802 template <typename X>
804 {
805 return *m_p;
806 }
807
808 template <typename X>
810 {
811 return m_p[i];
812 }
813
814 template <typename X>
815 X auto_array_ptr<X>::operator [] (size_t i) const throw ()
816 {
817 return m_p[i];
818 }
819
820 template <typename X>
822 {
823 return m_p;
824 }
825
826 template <typename X>
828 {
829 return reset(0);
830 }
831
832 template <typename X>
833 X* auto_array_ptr<X>::reset (X* p) throw ()
834 {
835 // set the auto_ptr to manage p and return the old pointer it was managing.
836 X* __tmp = m_p;
837 m_p = p;
838 return __tmp;
839 }
840
841 template <typename X>
843 {
844 X* __tmp(x);
845 x = 0;
846 delete [] __tmp;
847 }
848
849 // Parameterized Class CCfits::FITSUtil::ComparePtrIndex
850
851 template <typename T>
852 bool ComparePtrIndex<T>::operator () (const T* left, const T* right)
853 {
854 return (left->index() < right->index());
855 }
856
857 // Parameterized Class CCfits::FITSUtil::CAarray
858
859 template <typename T>
860 T* CAarray<T>::operator () (const std::valarray<T>& inArray)
861 {
862 size_t n(inArray.size());
863 auto_array_ptr<T> pC(new T[n]);
864 T* c= pC.get();
865 for (size_t j = 0; j < n; ++j) c[j] = inArray[j];
866 return pC.release();
867 }
868
869 // Parameterized Class CCfits::FITSUtil::CVAarray
870
871 template <typename T>
872 T* CVAarray<T>::operator () (const std::vector< std::valarray<T> >& inArray)
873 {
874 size_t sz(0);
875 size_t n(inArray.size());
876
877 std::vector<size_t> nr(n);
878
879 size_t i = 0; // for MS VC++ bug
880 for ( i = 0; i < n; ++i)
881 {
882 nr[i] = inArray[i].size();
883 sz += nr[i];
884
885 }
886 auto_array_ptr<T> pC(new T[sz]);
887 T* c = pC.get();
888
889 size_t k(0);
890 for ( i = 0; i < n; ++i)
891 {
892 size_t& m = nr[i];
893 const std::valarray<T>& current = inArray[i];
894 for (size_t j=0; j < m ; ++j) c[k++] = current[j];
895 }
896
897 return pC.release();
898 }
899
900 } // namespace FITSUtil
901} // namespace CCfits
902
903namespace CCfits
904{
905
906 namespace FITSUtil
907 {
908
909 template <typename T>
910 void swap(T& left, T& right)
911 {
912 T temp(left);
913 left = right;
914 right = temp;
915 }
916
917 template <typename T>
918 void swap(std::vector<T>& left, std::vector<T>& right)
919 {
920 left.swap(right);
921 }
922
923 template <>
924 inline string FitsNullValue<string>::operator () ()
925 {
926 return string("");
927 }
928
929 template <>
930 inline float FitsNullValue<float>::operator () ()
931 {
932 return FLOATNULLVALUE;
933 }
934
935 template <>
936 inline double FitsNullValue<double>::operator () ()
937 {
938 return DOUBLENULLVALUE;
939 }
940
941 template <>
942 inline std::complex<float> FitsNullValue<std::complex<float> >::operator () ()
943 {
944 return std::complex<float>(FLOATNULLVALUE);
945 }
946
947 template <>
948 inline std::complex<double> FitsNullValue<std::complex<double> >::operator () ()
949 {
950 return std::complex<double>(DOUBLENULLVALUE);
951 }
952
953 } // end namespace FITSUtil
954} // end namespace CCfits
955
956
957
958#endif
exception thrown by MatchType if it encounters data type incompatible with cfitsio.
Definition FITSUtil.h:637
A class that mimics the std:: library auto_ptr class, but works with arrays.
Definition FITSUtil.h:572
X & operator[](size_t i)
return a reference to the ith element of the array
Definition FITSUtil.h:809
void operator=(auto_array_ptr< X > &right)
assignment operator: transfer of ownership semantics
Definition FITSUtil.h:793
static void remove(X *&x)
utility function to delete the memory owned by x and set it to null.
Definition FITSUtil.h:842
X & operator*()
deference operator
Definition FITSUtil.h:803
~auto_array_ptr()
destructor.
Definition FITSUtil.h:786
X * get() const
return a token for the underlying content of *this
Definition FITSUtil.h:821
X * release()
return underlying content of *this, transferring memory ownership
Definition FITSUtil.h:827
auto_array_ptr(X *p=0)
constructor. allows creation of pointer to null, can be modified by reset()
Definition FITSUtil.h:773
X * reset(X *p)
change the content of the auto_array_ptr to p
Definition FITSUtil.h:833
FitsException(const string &msg, bool &silent)
Definition FitsError.cxx:42
Namespace enclosing all CCfits classes and globals definitions.
Definition AsciiTable.cxx:26
ValueType
CCfits value types and their CFITSIO equivalents (in caps).
Definition CCfits.h:81
FITSUtil is a namespace containing functions used internally by CCfits, but which might be of use for...
function object returning C array from a valarray. see CVarray for details
Definition FITSUtil.h:612
T * operator()(const std::valarray< T > &inArray)
operator returning C array for use with image data.
Definition FITSUtil.h:860
function object returning C array from a vector of valarrays. see CVarray for details
Definition FITSUtil.h:625
T * operator()(const std::vector< std::valarray< T > > &inArray)
operator returning C array for use with vector column data.
Definition FITSUtil.h:872
Function object class for returning C arrays from standard library objects used in the FITS library i...
Definition FITSUtil.h:519
T * operator()(const std::vector< T > &inArray)
operator returning C array for use with scalar column data.
Definition FITSUtil.h:675
predicate for classes that have a name attribute; match input string with instance name.
Definition FITSUtil.h:480
predicate for classes that have an index attribute; match input index with instance value.
Definition FITSUtil.h:493
as for MatchName, only with the input class a pointer.
Definition FITSUtil.h:466
as for MatchNum, only with the input class a pointer.
Definition FITSUtil.h:558
function object that returns the FITS ValueType corresponding to an input intrinsic type
Definition FITSUtil.h:506