#ifndef GDCMVR_H
#define GDCMVR_H
#include "gdcmTag.h"
#include "gdcmTrace.h"
#include "gdcmString.h"
#include <iostream>
#include <fstream>
#include <assert.h>
#if defined (CS)
# undef CS
#endif
#if defined (DS)
# undef DS
#endif
#if defined (SS)
# undef SS
#endif
namespace gdcm
{
class GDCM_EXPORT VR
{
public:
enum VRType : long long {
INVALID = 0, AE = 1,
AS = 2,
AT = 4,
CS = 8,
DA = 16,
DS = 32,
DT = 64,
FD = 128,
FL = 256,
IS = 512,
LO = 1024,
LT = 2048,
OB = 4096,
OD = 134217728, OF = 8192,
OL = 268435456, OV = 2147483648, OW = 16384,
PN = 32768,
SH = 65536,
SL = 131072,
SQ = 262144,
SS = 524288,
ST = 1048576,
SV = 4294967296, TM = 2097152,
UC = 536870912, UI = 4194304,
UL = 8388608,
UN = 16777216,
UR = 1073741824, US = 33554432,
UT = 67108864,
UV = 8589934592, OB_OW = OB | OW,
US_SS = US | SS,
US_SS_OW = US | SS | OW,
US_OW = US | OW,
VL16 = AE | AS | AT | CS | DA | DS | DT | FD | FL | IS | LO | LT | PN | SH | SL | SS | ST | TM | UI | UL | US, VL32 = OB | OW | OD | OF | OL | OV | SQ | SV | UC | UN | UR | UT | UV, VRASCII = AE | AS | CS | DA | DS | DT | IS | LO | LT | PN | SH | ST | TM | UC | UI | UR | UT,
VRBINARY = AT | FL | FD | OB | OD | OF | OL | OV | OW | SL | SQ | SS | SV | UL | UN | US | UV, VR_VM1 = AS | LT | ST | UT | SQ | OF | OL | OV | OD | OW | OB | UN, VRALL = VRASCII | VRBINARY,
VR_END = UV+1 };
static const char *GetVRString(VRType vr);
static VRType GetVRTypeFromFile(const char *vr);
static VRType GetVRType(const char *vr);
static const char *GetVRStringFromFile(VRType vr);
static bool IsValid(const char *vr);
static bool IsValid(const char *vr1, VRType vr2);
static bool IsSwap(const char *vr);
int GetLength() const {
return VR::GetLength(VRField);
}
unsigned int GetSizeof() const;
static uint32_t GetLength(VRType vr) {
if( vr & VL32 )
{
return 4;
}
else
return 2;
}
static bool IsBinary(VRType vr);
static bool IsASCII(VRType vr);
static bool CanDisplay(VRType vr);
static bool IsBinary2(VRType vr);
static bool IsASCII2(VRType vr);
VR(VRType vr = INVALID):VRField(vr) { }
std::istream &Read(std::istream &is)
{
char vr[2];
is.read(vr, 2);
VRField = GetVRTypeFromFile(vr);
gdcm_assert( VRField != VR::VR_END );
if( VRField == VR::INVALID )
{
throw Exception( "INVALID VR" );
}
if( VRField & VL32 )
{
#if 0#else
char dumb[2];
is.read(dumb, 2);
if( !(dumb[0] == 0 && dumb[1] == 0 ))
{
gdcmDebugMacro( "32bits VR contains non zero bytes. Skipped" );
}
#endif
}
return is;
}
const std::ostream &Write(std::ostream &os) const
{
VRType vrfield = VRField;
gdcmAssertAlwaysMacro( !IsDual() );
if( vrfield == VR::INVALID )
{
}
const char *vr = GetVRString(vrfield);
gdcm_assert( vr[0] && vr[1] && vr[2] == 0 );
os.write(vr, 2);
if( vrfield & VL32 )
{
const char dumb[2] = {0, 0};
os.write(dumb,2);
}
return os;
}
friend std::ostream &operator<<(std::ostream &os, const VR &vr);
operator VRType () const { return VRField; }
unsigned int GetSize() const;
bool Compatible(VR const &vr) const;
bool IsVRFile() const;
bool IsDual() const;
private:
static unsigned int GetIndex(VRType vr);
VRType VRField;
};
inline std::ostream &operator<<(std::ostream &_os, const VR &val)
{
_os << VR::GetVRString(val.VRField);
return _os;
}
#ifndef SWIG
template<long long T> struct VRToEncoding;
template<long long T> struct VRToType;
#define TYPETOENCODING(type,rep, rtype) \
template<> struct VRToEncoding<VR::type> \
{ enum:long long { Mode = VR::rep }; }; \
template<> struct VRToType<VR::type> \
{ typedef rtype Type; };
struct UI { char Internal[64+1];
friend std::ostream& operator<<(std::ostream &_os, const UI &_val);
};
inline std::ostream& operator<<(std::ostream &_os, const UI &_val)
{
_os << _val.Internal;
return _os;
}
typedef String<'\\',16> AEComp;
typedef String<'\\',64> ASComp;
typedef String<'\\',16> CSComp;
typedef String<'\\',64> DAComp;
typedef String<'\\',64> DTComp;
typedef String<'\\',64> LOComp;
typedef String<'\\',64> LTComp;
typedef String<'\\',64> PNComp;
typedef String<'\\',64> SHComp;
typedef String<'\\',64> STComp;
typedef String<'\\',4294967294> UCComp;
typedef String<'\\',4294967294> URComp;
typedef String<'\\',16> TMComp;
typedef String<'\\',64,0> UIComp;
typedef String<'\\',64> UTComp;
TYPETOENCODING(AE,VRASCII ,AEComp)
TYPETOENCODING(AS,VRASCII ,ASComp)
TYPETOENCODING(AT,VRBINARY,Tag)
TYPETOENCODING(CS,VRASCII ,CSComp)
TYPETOENCODING(DA,VRASCII ,DAComp)
TYPETOENCODING(DS,VRASCII ,double)
TYPETOENCODING(DT,VRASCII ,DTComp)
TYPETOENCODING(FL,VRBINARY,float)
TYPETOENCODING(FD,VRBINARY,double)
TYPETOENCODING(IS,VRASCII ,int32_t)
TYPETOENCODING(LO,VRASCII ,LOComp)
TYPETOENCODING(LT,VRASCII ,LTComp)
TYPETOENCODING(OB,VRBINARY,uint8_t)
TYPETOENCODING(OD,VRBINARY,double)
TYPETOENCODING(OF,VRBINARY,float)
TYPETOENCODING(OL,VRBINARY,uint32_t)
TYPETOENCODING(OV,VRBINARY,uint64_t)
TYPETOENCODING(OW,VRBINARY,uint16_t)
TYPETOENCODING(PN,VRASCII ,PNComp)
TYPETOENCODING(SH,VRASCII ,SHComp)
TYPETOENCODING(SL,VRBINARY,int32_t)
TYPETOENCODING(SQ,VRBINARY,unsigned char) TYPETOENCODING(SS,VRBINARY,int16_t)
TYPETOENCODING(ST,VRASCII ,STComp)
TYPETOENCODING(SV,VRBINARY,int64_t)
TYPETOENCODING(TM,VRASCII ,TMComp)
TYPETOENCODING(UC,VRASCII ,UCComp)
TYPETOENCODING(UI,VRASCII ,UIComp)
TYPETOENCODING(UL,VRBINARY,uint32_t)
TYPETOENCODING(UN,VRBINARY,uint8_t) TYPETOENCODING(UR,VRASCII,URComp)
TYPETOENCODING(US,VRBINARY,uint16_t)
TYPETOENCODING(UT,VRASCII ,UTComp)
TYPETOENCODING(UV,VRBINARY,uint64_t)
#define VRTypeTemplateCase(type) \
case VR::type: \
return sizeof ( VRToType<VR::type>::Type );
inline unsigned int VR::GetSize() const
{
switch(VRField)
{
VRTypeTemplateCase(AE)
VRTypeTemplateCase(AS)
VRTypeTemplateCase(AT)
VRTypeTemplateCase(CS)
VRTypeTemplateCase(DA)
VRTypeTemplateCase(DS)
VRTypeTemplateCase(DT)
VRTypeTemplateCase(FL)
VRTypeTemplateCase(FD)
VRTypeTemplateCase(IS)
VRTypeTemplateCase(LO)
VRTypeTemplateCase(LT)
VRTypeTemplateCase(OB)
VRTypeTemplateCase(OD)
VRTypeTemplateCase(OF)
VRTypeTemplateCase(OL)
VRTypeTemplateCase(OV)
VRTypeTemplateCase(OW)
VRTypeTemplateCase(PN)
VRTypeTemplateCase(SH)
VRTypeTemplateCase(SL)
VRTypeTemplateCase(SQ)
VRTypeTemplateCase(SS)
VRTypeTemplateCase(ST)
VRTypeTemplateCase(SV)
VRTypeTemplateCase(TM)
VRTypeTemplateCase(UC)
VRTypeTemplateCase(UI)
VRTypeTemplateCase(UL)
VRTypeTemplateCase(UN)
VRTypeTemplateCase(UR)
VRTypeTemplateCase(US)
VRTypeTemplateCase(UT)
VRTypeTemplateCase(UV)
case VR::US_SS:
return 2;
case VR::INVALID:
case VR::OB_OW:
case VR::US_SS_OW:
case VR::US_OW:
case VR::VL16:
case VR::VL32:
case VR::VRASCII:
case VR::VRBINARY:
case VR::VR_VM1:
case VR::VRALL:
case VR::VR_END:
default:
gdcm_assert( 0 && "should not" );
}
return 0;
}
#endif
}
#endif