24 #include "FitsError.h"
281 #include "MSconfig.h"
284 template <
typename T>
285 void swap(T& left,T& right);
287 template <
typename T>
288 void swap(std::vector<T>& left, std::vector<T>& right);
290 string lowerCase(
const string& inputString);
292 string upperCase(
const string& inputString);
296 string::size_type checkForCompressString(
const string& fileName);
298 struct InvalidConversion :
public FitsException
300 InvalidConversion(
const string& diag,
bool silent=
false);
304 struct MatchStem :
public std::binary_function<string,string,bool>
306 bool operator()(
const string& left,
const string& right)
const;
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);
324 char** CharArray(
const std::vector<string>& inArray);
326 string FITSType2String(
int typeInt );
329 template <
typename S,
typename T>
330 void fill(std::vector<S>& outArray,
const std::vector<T>& inArray,
size_t first,
size_t last);
332 template <
typename S,
typename T>
333 void fill(std::valarray<S>& outArray,
const std::valarray<T>& inArray);
335 template <
typename S,
typename T>
336 void fill(std::valarray<S>& outArray,
const std::vector<T>& inArray,
size_t first,
size_t last);
339 template <
typename S,
typename T>
340 void fill(std::vector<S>& outArray,
const std::valarray<T>& inArray);
343 void fill(std::vector<std::complex<float> >& outArray,
344 const std::valarray<std::complex<float> >& inArray);
347 void fill(std::vector<std::complex<float> >& outArray,
348 const std::valarray<std::complex<double> >& inArray);
351 void fill(std::vector<std::complex<double> >& outArray,
352 const std::valarray<std::complex<double> >& inArray);
356 void fill(std::vector<std::complex<double> >& outArray,
357 const std::valarray<std::complex<float> >& inArray);
359 template <
typename T>
360 void fill(std::vector<string>& outArray,
const std::vector<T>& inArray,
size_t first,
size_t last);
362 template <
typename T>
363 void fill(std::vector<T>& outArray,
const std::vector<string>& inArray,
size_t first,
size_t last);
365 template <
typename S>
366 void fill(std::valarray<S>& outArray,
const std::vector<string>& inArray,
size_t first,
size_t last);
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);
378 void fill(std::vector<std::complex<float> >& outArray,
379 const std::vector<std::complex<float> >& inArray,
size_t first,
size_t last);
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);
387 void fill(std::vector<std::complex<float> >& outArray,
388 const std::vector<std::complex<double> >& inArray,
size_t first,
size_t last);
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);
396 void fill(std::vector<std::complex<double> >& outArray,
397 const std::vector<std::complex<double> >& inArray,
size_t first,
size_t last);
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);
404 void fill(std::vector<std::complex<double> >& outArray,
405 const std::vector<std::complex<float> >& inArray,
size_t first,
size_t last);
409 void fill(std::valarray<std::complex<float> >& outArray,
410 const std::vector<std::complex<double> >& inArray,
size_t first,
size_t last);
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);
417 void fill(std::valarray<std::complex<float> >& outArray,
418 const std::vector<std::complex<float> >& inArray,
size_t first,
size_t last);
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);
426 void fill(std::valarray<std::complex<double> >& outArray,
427 const std::vector<std::complex<float> >& inArray,
size_t first,
size_t last);
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);
435 void fill(std::valarray<std::complex<double> >& outArray,
436 const std::vector<std::complex<double> >& inArray,
size_t first,
size_t last);
440 void fill(std::valarray<std::complex<float> >& outArray,
441 const std::valarray<std::complex<float> >& inArray);
443 void fill(std::valarray<std::complex<double> >& outArray,
444 const std::valarray<std::complex<double> >& inArray);
446 void fill(std::valarray<std::complex<float> >& outArray,
447 const std::valarray<std::complex<double> >& inArray);
449 void fill(std::valarray<std::complex<double> >& outArray,
450 const std::valarray<std::complex<float> >& inArray);
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);
457 void fill(std::vector<string>& outArray,
const std::vector<string>& inArray,
size_t first,
size_t last);
459 template <
typename S,
typename T>
460 string errorMessage(
const S& out,
const T& in);
468 bool operator () (
const T& left,
const string& right)
const;
479 struct MatchName :
public std::binary_function<T,std::string,bool>
481 bool operator () (
const T& left,
const string& right)
const;
492 struct MatchNum :
public std::binary_function<T,int,bool>
494 bool operator () (
const T& left,
const int& right)
const;
504 template <
typename T>
517 template <
typename T>
530 template <
typename T>
543 template <
typename T>
544 struct MatchImageType
546 ImageType operator () ();
559 bool operator () (
const T& left,
const int& right)
const;
570 template <
typename X>
584 X*
reset (X* p)
throw ();
585 static void remove (X*& x);
597 template <
typename T>
598 struct ComparePtrIndex :
public std::binary_function<T,T,bool>
600 bool operator () (
const T* left,
const T* right);
610 template <
typename T>
623 template <
typename T>
626 T*
operator () (
const std::vector< std::valarray<T> >& inArray);
651 return left->name() == right;
657 inline bool MatchName<T>::operator () (
const T& left,
const string& right)
const
659 return left.name() == right;
665 inline bool MatchNum<T>::operator () (
const T& left,
const int& right)
const
667 return left.index() == right;
674 template <
typename T>
682 std::copy(inArray.begin(),inArray.end(),&c[0]);
688 template <
typename T>
689 inline T FitsNullValue<T>::operator () ()
701 inline bool MatchPtrNum<T>::operator () (
const T& left,
const int& right)
const
703 return left->index() == right;
724 template <
typename T>
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;
743 if (
typeid(T) ==
typeid(ll1) )
return Tlonglong;
744 throw UnrecognizedType(
"Invalid data type for FITS Data I/O\n");
751 template <
typename T>
752 ImageType MatchImageType<T>::operator () ()
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 MatchType<T> errType;
762 string diag (
"Image: ");
763 diag += FITSType2String(errType());
764 throw UnrecognizedType(diag);
771 template <
typename X>
777 template <
typename X>
779 : m_p(right.release())
784 template <
typename X>
791 template <
typename X>
801 template <
typename X>
807 template <
typename X>
813 template <
typename X>
819 template <
typename X>
825 template <
typename X>
831 template <
typename X>
840 template <
typename X>
850 template <
typename T>
851 bool ComparePtrIndex<T>::operator () (
const T* left,
const T* right)
853 return (left->index() < right->index());
858 template <
typename T>
861 size_t n(inArray.size());
864 for (
size_t j = 0; j < n; ++j) c[j] = inArray[j];
870 template <
typename T>
874 size_t n(inArray.size());
876 std::vector<size_t> nr(n);
879 for ( i = 0; i < n; ++i)
881 nr[i] = inArray[i].size();
889 for ( i = 0; i < n; ++i)
892 const std::valarray<T>& current = inArray[i];
893 for (
size_t j=0; j < m ; ++j) c[k++] = current[j];
908 template <
typename T>
909 void swap(T& left, T& right)
916 template <
typename T>
917 void swap(std::vector<T>& left, std::vector<T>& right)
923 inline string FitsNullValue<string>::operator () ()
929 inline float FitsNullValue<float>::operator () ()
931 return FLOATNULLVALUE;
935 inline double FitsNullValue<double>::operator () ()
937 return DOUBLENULLVALUE;
941 inline std::complex<float> FitsNullValue<std::complex<float> >::operator () ()
943 return std::complex<float>(FLOATNULLVALUE);
947 inline std::complex<double> FitsNullValue<std::complex<double> >::operator () ()
949 return std::complex<double>(DOUBLENULLVALUE);