GDCM  2.4.5
gdcmDataElement.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: GDCM (Grassroots DICOM). A DICOM library
4 
5  Copyright (c) 2006-2011 Mathieu Malaterre
6  All rights reserved.
7  See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
8 
9  This software is distributed WITHOUT ANY WARRANTY; without even
10  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  PURPOSE. See the above copyright notice for more information.
12 
13 =========================================================================*/
14 #ifndef GDCMDATAELEMENT_H
15 #define GDCMDATAELEMENT_H
16 
17 #include "gdcmTag.h"
18 #include "gdcmVL.h"
19 #include "gdcmVR.h"
20 #include "gdcmByteValue.h"
21 #include "gdcmSmartPointer.h"
22 
23 #include <set>
24 
25 namespace gdcm_ns
26 {
27 // Data Element
28 // Contains multiple fields:
29 // -> Tag
30 // -> Optional VR (Explicit Transfer Syntax)
31 // -> ValueLength
32 // -> Value
33 // TODO: This class SHOULD be pure virtual. I don't want a user
34 // to shoot himself in the foot.
35 
36 class SequenceOfItems;
37 class SequenceOfFragments;
59 {
60 public:
61  DataElement(const Tag& t = Tag(0), const VL& vl = 0, const VR &vr = VR::INVALID):TagField(t),ValueLengthField(vl),VRField(vr),ValueField(0) {}
62  //DataElement( Attribute const &att );
63 
64  friend std::ostream& operator<<(std::ostream &_os, const DataElement &_val);
65 
67  const Tag& GetTag() const { return TagField; }
68  Tag& GetTag() { return TagField; }
71  void SetTag(const Tag &t) { TagField = t; }
72 
74  const VL& GetVL() const { return ValueLengthField; }
75  VL& GetVL() { return ValueLengthField; }
79  void SetVL(const VL &vl) { ValueLengthField = vl; }
80  void SetVLToUndefined();
81 
84  VR const &GetVR() const { return VRField; }
88  void SetVR(VR const &vr) {
89  if( vr.IsVRFile() )
90  VRField = vr;
91  }
92 
94  Value const &GetValue() const { return *ValueField; }
95  Value &GetValue() { return *ValueField; }
97  void SetValue(Value const & vl) {
98  //assert( ValueField == 0 );
99  ValueField = vl;
100  ValueLengthField = vl.GetLength();
101  }
103  bool IsEmpty() const { return ValueField == 0 || (GetByteValue() && GetByteValue()->IsEmpty()); }
104 
106  void Empty() { ValueField = 0; ValueLengthField = 0; }
107 
109  void Clear()
110  {
111  TagField = 0;
112  VRField = VR::INVALID;
113  ValueField = 0;
114  ValueLengthField = 0;
115  }
116 
117  // Helper:
123  void SetByteValue(const char *array, VL length)
124  {
125  ByteValue *bv = new ByteValue(array,length);
126  SetValue( *bv );
127  }
130  const ByteValue* GetByteValue() const {
131  // Get the raw pointer from the gdcm::SmartPointer
132  const ByteValue *bv = dynamic_cast<const ByteValue*>(ValueField.GetPointer());
133  return bv; // Will return NULL if not ByteValue
134  }
135 
142  SmartPointer<SequenceOfItems> GetValueAsSQ() const;
143 
146  const SequenceOfFragments* GetSequenceOfFragments() const;
147  SequenceOfFragments* GetSequenceOfFragments();
148 
150  bool IsUndefinedLength() const {
151  return ValueLengthField.IsUndefined();
152  }
153 
155  {
156  if( this != &_val)
157  {
158  *this = _val;
159  }
160  }
161 
162  bool operator<(const DataElement &de) const
163  {
164  return GetTag() < de.GetTag();
165  }
167  {
168  TagField = de.TagField;
169  ValueLengthField = de.ValueLengthField;
170  VRField = de.VRField;
171  ValueField = de.ValueField; // Pointer copy
172  return *this;
173  }
174 
175  bool operator==(const DataElement &de) const
176  {
177  bool b = TagField == de.TagField
178  && ValueLengthField == de.ValueLengthField
179  && VRField == de.VRField;
180  if( !ValueField && !de.ValueField )
181  {
182  return b;
183  }
184  if( ValueField && de.ValueField )
185  {
186  return b && (*ValueField == *de.ValueField);
187  }
188  // ValueField != de.ValueField
189  return false;
190  }
191 
192  // The following fonctionalities are dependant on:
193  // # The Transfer Syntax: Explicit or Implicit
194  // # The Byte encoding: Little Endian / Big Endian
195 
196  /*
197  * The following was inspired by a C++ idiom: Curiously Recurring Template Pattern
198  * Ref: http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern
199  * The typename TDE is typically a derived class *without* any data
200  * while TSwap is a simple template parameter to achieve byteswapping (and allow factorization of
201  * highly identical code)
202  */
203  template <typename TDE>
204  VL GetLength() const {
205  return static_cast<const TDE*>(this)->GetLength();
206  }
207 
208  template <typename TDE, typename TSwap>
209  std::istream &Read(std::istream &is) {
210  return static_cast<TDE*>(this)->template Read<TSwap>(is);
211  }
212 
213  template <typename TDE, typename TSwap>
214  std::istream &ReadOrSkip(std::istream &is, std::set<Tag> const &skiptags) {
215  (void)skiptags;
216  return static_cast<TDE*>(this)->template Read<TSwap>(is);
217  }
218 
219  template <typename TDE, typename TSwap>
220  std::istream &ReadPreValue(std::istream &is, std::set<Tag> const &skiptags) {
221  (void)skiptags;
222  return static_cast<TDE*>(this)->template ReadPreValue<TSwap>(is);
223  }
224  template <typename TDE, typename TSwap>
225  std::istream &ReadValue(std::istream &is, std::set<Tag> const &skiptags) {
226  (void)skiptags;
227  return static_cast<TDE*>(this)->template ReadValue<TSwap>(is);
228  }
229  template <typename TDE, typename TSwap>
230  std::istream &ReadValueWithLength(std::istream &is, VL & length, std::set<Tag> const &skiptags) {
231  (void)skiptags;
232  return static_cast<TDE*>(this)->template ReadValueWithLength<TSwap>(is, length);
233  }
234 
235  template <typename TDE, typename TSwap>
236  std::istream &ReadWithLength(std::istream &is, VL &length) {
237  return static_cast<TDE*>(this)->template ReadWithLength<TSwap>(is,length);
238  }
239 
240  template <typename TDE, typename TSwap>
241  const std::ostream &Write(std::ostream &os) const {
242  return static_cast<const TDE*>(this)->template Write<TSwap>(os);
243  }
244 
245 protected:
247  // This is the value read from the file, might be different from the length of Value Field
248  VL ValueLengthField; // Can be 0xFFFFFFFF
249 
250  // Value Representation
253  ValuePtr ValueField;
254 
255  void SetValueFieldLength( VL vl, bool readvalues );
256 };
257 //-----------------------------------------------------------------------------
258 inline std::ostream& operator<<(std::ostream &os, const DataElement &val)
259 {
260  os << val.TagField;
261  os << "\t" << val.VRField;
262  os << "\t" << val.ValueLengthField;
263  if( val.ValueField )
264  {
265  val.ValueField->Print( os << "\t" );
266  }
267  return os;
268 }
269 
270 inline bool operator!=(const DataElement& lhs, const DataElement& rhs)
271 {
272  return ! ( lhs == rhs );
273 }
274 
275 } // end namespace gdcm_ns
276 
277 #endif //GDCMDATAELEMENT_H
void SetVR(VR const &vr)
Definition: gdcmDataElement.h:88
void SetValue(Value const &vl)
Definition: gdcmDataElement.h:97
bool IsEmpty() const
Check if Data Element is empty.
Definition: gdcmDataElement.h:103
void SetTag(const Tag &t)
Definition: gdcmDataElement.h:71
std::istream & ReadWithLength(std::istream &is, VL &length)
Definition: gdcmDataElement.h:236
void SetByteValue(const char *array, VL length)
Definition: gdcmDataElement.h:123
std::istream & ReadValue(std::istream &is, std::set< Tag > const &skiptags)
Definition: gdcmDataElement.h:225
DataElement(const DataElement &_val)
Definition: gdcmDataElement.h:154
Class to represent the value of a Data Element.
Definition: gdcmValue.h:31
const VL & GetVL() const
Get VL.
Definition: gdcmDataElement.h:74
#define GDCM_EXPORT
Definition: gdcmWin32.h:34
DataElement(const Tag &t=Tag(0), const VL &vl=0, const VR &vr=VR::INVALID)
Definition: gdcmDataElement.h:61
Value Length.
Definition: gdcmVL.h:29
Class to represent a Sequence Of Fragments.
Definition: gdcmSequenceOfFragments.h:31
VL ValueLengthField
Definition: gdcmDataElement.h:248
bool operator<(const DataElement &de) const
Definition: gdcmDataElement.h:162
const ByteValue * GetByteValue() const
Definition: gdcmDataElement.h:130
void SetVL(const VL &vl)
Definition: gdcmDataElement.h:79
VR VRField
Definition: gdcmDataElement.h:251
DataElement & operator=(const DataElement &de)
Definition: gdcmDataElement.h:166
const std::ostream & Write(std::ostream &os) const
Definition: gdcmDataElement.h:241
Class to represent a Data Element either Implicit or Explicit.
Definition: gdcmDataElement.h:58
Class to represent binary value (array of bytes)
Definition: gdcmByteValue.h:35
Value & GetValue()
Definition: gdcmDataElement.h:95
bool operator==(const DataElement &de) const
Definition: gdcmDataElement.h:175
std::istream & ReadPreValue(std::istream &is, std::set< Tag > const &skiptags)
Definition: gdcmDataElement.h:220
VR const & GetVR() const
Definition: gdcmDataElement.h:84
std::istream & Read(std::istream &is)
Definition: gdcmDataElement.h:209
Value const & GetValue() const
Set/Get Value (bytes array, SQ of items, SQ of fragments):
Definition: gdcmDataElement.h:94
void Clear()
Clear Data Element (make Value empty and invalidate Tag & VR)
Definition: gdcmDataElement.h:109
Class for Smart Pointer.
Definition: gdcmObject.h:26
VL & GetVL()
Definition: gdcmDataElement.h:75
bool IsUndefinedLength() const
return if Value Length if of undefined length
Definition: gdcmDataElement.h:150
virtual VL GetLength() const =0
Tag & GetTag()
Definition: gdcmDataElement.h:68
const Tag & GetTag() const
Get Tag.
Definition: gdcmDataElement.h:67
ValuePtr ValueField
Definition: gdcmDataElement.h:253
std::istream & ReadOrSkip(std::istream &is, std::set< Tag > const &skiptags)
Definition: gdcmDataElement.h:214
bool operator!=(const DataElement &lhs, const DataElement &rhs)
Definition: gdcmDataElement.h:270
virtual void Print(std::ostream &) const
Definition: gdcmObject.h:87
Class to represent a DICOM Data Element (Attribute) Tag (Group, Element). Basically an uint32_t which...
Definition: gdcmTag.h:38
VL GetLength() const
Definition: gdcmDataElement.h:204
Tag TagField
Definition: gdcmDataElement.h:246
VR class This is adapted from DICOM standard The biggest difference is the INVALID VR and the composi...
Definition: gdcmVR.h:54
bool IsVRFile() const
void Empty()
Make Data Element empty (no Value)
Definition: gdcmDataElement.h:106
std::ostream & operator<<(std::ostream &os, const DataElement &val)
Definition: gdcmDataElement.h:258
std::istream & ReadValueWithLength(std::istream &is, VL &length, std::set< Tag > const &skiptags)
Definition: gdcmDataElement.h:230
SmartPointer< Value > ValuePtr
Definition: gdcmDataElement.h:252

Generated on Fri Sep 25 2015 17:58:22 for GDCM by doxygen 1.8.9.1
SourceForge.net Logo