pcrtypes.h
来自「支持各种栅格图像和矢量图像读取的库」· C头文件 代码 · 共 247 行
H
247 行
#ifndef INCLUDED_PCRTYPES# define INCLUDED_PCRTYPES#ifndef INCLUDED_CSFTYPES#include "csftypes.h"#define INCLUDED_CSFTYPES#endif#ifndef INCLUDED_STRING#include <string>#define INCLUDED_STRING#endif// memset// use string.h not cstring// VC6 does not have memset in std// better use Ansi-C string.h to be safe#ifndef INCLUDED_C_STRING#include <string.h>#define INCLUDED_C_STRING#endifnamespace pcr {/*! \brief Tests if the value v is a missing value. \param v the value to be tested. \return True if value \a v is a missing value. the generic isMV(const T& v) is not implemented, only the specializations \todo Zet alle dingen met een bepaald type,isMV, setMv, isType in een zgn. struct trait zie cast drama als isMV mist voor INT2 in BandMapTest::Open2 Zie numeric_limit discussie in Josuttis*/ template<typename T> bool isMV(const T& v);/*! \brief Tests if the value pointed to by v is a missing value. \param v Pointer to the value to be tested. \return True if the value pointed to by v is a missing value.*/ template<typename T> bool isMV(T* v) { return isMV(*v); }# define PCR_DEF_ISMV(type) \ template<> \ inline bool isMV(const type& v) \ { return v == MV_##type; } PCR_DEF_ISMV(UINT1) PCR_DEF_ISMV(UINT2) PCR_DEF_ISMV(UINT4) PCR_DEF_ISMV(INT1) PCR_DEF_ISMV(INT2) PCR_DEF_ISMV(INT4)# undef PCR_DEF_ISMV template<> inline bool isMV(const REAL4& v) { return IS_MV_REAL4(&v); } template<> inline bool isMV(const REAL8& v) { return IS_MV_REAL8(&v); }template<> inline bool isMV(std::string const& string){ return string.empty();} /*! \brief Sets the value v to a missing value. \param v value to be set. the generic setMV(T& v) is not implemented, only the specializations */ template<typename T> void setMV(T& v); /*! \brief Sets the value pointed to by v to a missing value. \param v Pointer to the value to be set. */ template<typename T> void setMV(T *v) { setMV(*v); }# define PCR_DEF_SETMV(type) \ template<> \ inline void setMV(type& v) \ { v = MV_##type; } PCR_DEF_SETMV(UINT1) PCR_DEF_SETMV(UINT2) PCR_DEF_SETMV(UINT4) PCR_DEF_SETMV(INT1) PCR_DEF_SETMV(INT2) PCR_DEF_SETMV(INT4)# undef PCR_DEF_SETMV template<> inline void setMV(REAL4& v) {# ifndef __i386__ SET_MV_REAL4((&v));# else // this fixes an optimization problem (release mode), if is v is a single // element variable in function scope (stack-based) // constraint the setting to memory (m) // for correct alignment asm ("movl $-1, %0" : "=m" (v));# endif } template<> inline void setMV(REAL8& v) {# ifndef __i386__ SET_MV_REAL8((&v));# else memset(&v,MV_UINT1,sizeof(REAL8)); // constraint the setting to memory (m) // this fixes the same optimization problem, as for REAL4 // see com_mvoptest.cc, does not work: ! // int *v2= (int *)&v; // asm ("movl $-1, %[dest]" : [dest] "=m" (v2[0])); // asm ("movl $-1, %[dest]" : [dest] "=m" (v2[1]));# endif }template<>inline void setMV(std::string& string){// string.clear(); string = "";}/*! \brief set array \a v of size \a n to all MV's * the generic setMV(T& v) is implemented, the specializations * are optimizations * \todo * check if stdlib has a 'wordsized' memset * or optimize for I86, for gcc look into include/asm/string */template<typename T> void setMV(T *v, size_t n){ for(size_t i=0; i<n; i++) pcr::setMV(v[i]);} namespace detail { template<typename T> void setMVMemSet(T *v, size_t n) { memset(v,MV_UINT1,n*sizeof(T)); } }# define PCR_DEF_SETMV_MEMSET(type) \ template<> \ inline void setMV(type* v,size_t n) \ { detail::setMVMemSet(v,n); } PCR_DEF_SETMV_MEMSET(UINT1) PCR_DEF_SETMV_MEMSET(UINT2) PCR_DEF_SETMV_MEMSET(UINT4) PCR_DEF_SETMV_MEMSET(REAL4) PCR_DEF_SETMV_MEMSET(REAL8)# undef PCR_DEF_SETMV_MEMSET template<> inline void setMV(INT1 *v, size_t n) { memset(v,MV_INT1,n); }//! replace a value equal to \a nonStdMV with the standard MV/*! * \todo * the isMV test is only needed for floats, to protect NAN evaluation * what happens on bcc/win32 */template<typename T> struct AlterToStdMV { T d_nonStdMV; AlterToStdMV(T nonStdMV): d_nonStdMV(nonStdMV) {}; void operator()(T& v) { if (!isMV(v) && v == d_nonStdMV) setMV(v); } };//! return the value or the standard missing value if value equal to \a nonStdMV/*! * \todo * the isMV test is only needed for floats, to protect NAN evaluation * what happens on bcc/win32 */template<typename T> struct ToStdMV { T d_nonStdMV; T d_mv; ToStdMV(T nonStdMV): d_nonStdMV(nonStdMV) { setMV(d_mv); } T operator()(T const& v) { if (!isMV(v) && v == d_nonStdMV) { return d_mv; } return v; } };//! replace the standard MV with a value equal to \a otherMV/*! * \todo * the isMV test is only needed for floats, to protect NAN evaluation * what happens on bcc/win32 */template<typename T> struct AlterFromStdMV { T d_otherMV; AlterFromStdMV(T otherMV): d_otherMV(otherMV) {}; void operator()(T& v) { if (isMV(v)) v = d_otherMV; } };//! return the value or \a otherMV if value equal to standard MV/*! * \todo * the isMV test is only needed for floats, to protect NAN evaluation * what happens on bcc/win32 */template<typename T> struct FromStdMV { T d_otherMV; FromStdMV(T otherMV): d_otherMV(otherMV) {}; T operator()(const T& v) { if (isMV(v)) return d_otherMV; return v; } };};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?