42 Tag(uint16_t group, uint16_t element) {
43 ElementTag.tags[0] = group; ElementTag.tags[1] = element;
47 Tag(uint32_t tag = 0) {
51 friend std::ostream&
operator<<(std::ostream &_os,
const Tag &_val);
52 friend std::istream&
operator>>(std::istream &_is,
Tag &_val);
55 uint16_t
GetGroup()
const {
return ElementTag.tags[0]; }
57 uint16_t
GetElement()
const {
return ElementTag.tags[1]; }
59 void SetGroup(uint16_t group) { ElementTag.tags[0] = group; }
61 void SetElement(uint16_t element) { ElementTag.tags[1] = element; }
64 ElementTag.tags[0] = group; ElementTag.tags[1] = element;
69 #ifndef GDCM_WORDS_BIGENDIAN
70 return (ElementTag.tag<<16) | (ElementTag.tag>>16);
72 return ElementTag.tag;
78 #ifndef GDCM_WORDS_BIGENDIAN
79 tag = ( (tag<<16) | (tag>>16) );
85 const uint16_t &operator[](
const unsigned int &_id)
const
88 return ElementTag.tags[_id];
91 uint16_t &operator[](
const unsigned int &_id)
94 return ElementTag.tags[_id];
99 ElementTag.
tag = _val.ElementTag.
tag;
105 return ElementTag.tag == _val.ElementTag.
tag;
109 return ElementTag.tag != _val.ElementTag.
tag;
119 bool operator<(
const Tag &_val)
const
121 #ifndef GDCM_WORDS_BIGENDIAN
122 if( ElementTag.tags[0] < _val.ElementTag.
tags[0] )
124 if( ElementTag.tags[0] == _val.ElementTag.
tags[0]
125 && ElementTag.tags[1] < _val.ElementTag.
tags[1] )
130 return ( ElementTag.tag < _val.ElementTag.
tag );
133 bool operator<=(
const Tag &t2)
const
135 const Tag &t1 = *
this;
136 return t1 == t2 || t1 < t2;
141 ElementTag.
tag = _val.ElementTag.
tag;
150 bool IsPublic()
const {
return !(ElementTag.tags[0] % 2); }
159 template <
typename TSwap>
160 std::istream &Read(std::istream &is)
162 if( is.read(ElementTag.bytes, 4) )
163 TSwap::SwapArray(ElementTag.tags, 2);
168 template <
typename TSwap>
169 const std::ostream &Write(std::ostream &os)
const
172 copy[0]= ElementTag.tags[0];
173 copy[1]= ElementTag.tags[1];
174 TSwap::SwapArray(copy, 2);
175 return os.write((
char*)(©), 4);
179 Tag GetPrivateCreator()
const
183 assert( IsPrivate() && !IsPrivateCreator() );
185 r.
SetElement( (uint16_t)(GetElement() >> 8) );
189 void SetPrivateCreator(
Tag const &t)
194 uint16_t element = (uint16_t)(t.
GetElement() << 8);
195 uint16_t base = (uint16_t)(GetElement() << 8);
196 SetElement( (uint16_t)((base >> 8) + element) );
201 bool IsPrivateCreator()
const
203 return IsPrivate() && (GetElement() <= 0xFF && GetElement() >= 0x10);
207 bool IsIllegal()
const
210 return GetGroup() == 0x0001 || GetGroup() == 0x0003 || GetGroup() == 0x0005 || GetGroup() == 0x0007
213 || (IsPrivate() && GetElement() > 0x0 && GetElement() < 0x10 );
217 bool IsGroupLength()
const
219 return GetElement() == 0x0;
223 bool IsGroupXX(
const Tag &t)
const
228 uint16_t group = (uint16_t)((GetGroup() >> 8 ) << 8);
239 bool ReadFromCommaSeparatedString(
const char *str);
243 bool ReadFromPipeSeparatedString(
const char *str);
247 std::string PrintAsPipeSeparatedString()
const;
250 union { uint32_t tag; uint16_t tags[2];
char bytes[4]; } ElementTag;
258 _is >> std::hex >> a;
264 _is >> std::hex >> b;
273 _os.setf( std::ios::right);
274 _os << std::hex <<
'(' << std::setw( 4 ) << std::setfill(
'0' )
275 << _val[0] <<
',' << std::setw( 4 ) << std::setfill(
'0' )
276 << _val[1] <<
')' << std::setfill(
' ' ) << std::dec;