Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef GDCMSEQUENCEOFITEMS_H
00017 #define GDCMSEQUENCEOFITEMS_H
00018
00019 #include "gdcmValue.h"
00020 #include "gdcmItem.h"
00021
00022 #include <vector>
00023
00024 namespace gdcm
00025 {
00026
00039 class GDCM_EXPORT SequenceOfItems : public Value
00040 {
00041 public:
00042
00043 typedef std::vector< Item > ItemVector;
00044 typedef ItemVector::iterator Iterator;
00045 typedef ItemVector::const_iterator ConstIterator;
00046 Iterator Begin() { return Items.begin(); }
00047 Iterator End() { return Items.end(); }
00048 ConstIterator Begin() const { return Items.begin(); }
00049 ConstIterator End() const { return Items.end(); }
00050
00052 SequenceOfItems():SequenceLengthField(0xFFFFFFFF) { }
00053
00054
00056 VL GetLength() const { return SequenceLengthField; }
00058 void SetLength(VL length) {
00059 SequenceLengthField = length;
00060 }
00061 void SetLengthToUndefined() {
00062 SequenceLengthField = 0xFFFFFFFF;
00063 }
00065 bool IsUndefinedLength() const {
00066 return SequenceLengthField.IsUndefined();
00067 }
00068
00069 template <typename TDE>
00070 VL ComputeLength() const;
00071 void Clear() {}
00072
00074 void AddItem(Item const &item);
00075
00076 unsigned int GetNumberOfItems() const { return Items.size(); }
00077 void SetNumberOfItems(unsigned int n) { Items.resize(n); }
00078
00079
00080
00081
00082
00083
00084 const Item &GetItem(unsigned int position) const;
00085 Item &GetItem(unsigned int position);
00086
00087 SequenceOfItems &operator=(const SequenceOfItems &val) {
00088 SequenceLengthField = val.SequenceLengthField;
00089 Items = val.Items;
00090 return *this;
00091 }
00092
00093 template <typename TDE, typename TSwap>
00094 std::istream &Read(std::istream &is)
00095 {
00096 const Tag seqDelItem(0xfffe,0xe0dd);
00097 if( SequenceLengthField.IsUndefined() )
00098 {
00099 Item item;
00100 while( item.Read<TDE,TSwap>(is) && item.GetTag() != seqDelItem )
00101 {
00102
00103 assert( item.GetTag() != seqDelItem );
00104 Items.push_back( item );
00105 item.Clear();
00106 }
00107
00108 }
00109 else
00110 {
00111 Item item;
00112 VL l = 0;
00113
00114 while( l != SequenceLengthField )
00115 {
00116 try
00117 {
00118 item.Read<TDE,TSwap>(is);
00119 }
00120 catch( Exception &ex )
00121 {
00122 if( strcmp( ex.GetDescription(), "Changed Length" ) == 0 )
00123 {
00124 VL newlength = l + item.template GetLength<TDE>();
00125 if( newlength > SequenceLengthField )
00126 {
00127
00128 gdcmWarningMacro( "SQ length is wrong" );
00129 SequenceLengthField = newlength;
00130 }
00131 }
00132 else
00133 {
00134 throw ex;
00135 }
00136 }
00137 if( item.GetTag() == seqDelItem )
00138 {
00139 gdcmWarningMacro( "SegDelItem found in defined length Sequence" );
00140 }
00141
00142 Items.push_back( item );
00143 l += item.template GetLength<TDE>();
00144 if( l > SequenceLengthField ) throw "Length of Item larger than expected";
00145 assert( l <= SequenceLengthField );
00146 #ifdef GDCM_SUPPORT_BROKEN_IMPLEMENTATION
00147
00148
00149 if( SequenceLengthField == 778 && l == 774 )
00150 {
00151 gdcmWarningMacro( "PMS: Super bad hack" );
00152 SequenceLengthField = l;
00153 throw Exception( "Wrong Length" );
00154
00155 }
00156
00157
00158
00159 else if ( SequenceLengthField == 444 && l == 3*71 )
00160 {
00161
00162 gdcmWarningMacro( "PMS: Super bad hack" );
00163 l = SequenceLengthField;
00164 }
00165 #endif
00166 }
00167 assert( l == SequenceLengthField );
00168 }
00169 return is;
00170 }
00171
00172 template <typename TDE,typename TSwap>
00173 std::ostream const &Write(std::ostream &os) const
00174 {
00175 typename ItemVector::const_iterator it = Items.begin();
00176 for(;it != Items.end(); ++it)
00177 {
00178 it->Write<TDE,TSwap>(os);
00179 }
00180 if( SequenceLengthField.IsUndefined() )
00181 {
00182
00183 const Tag seqDelItem(0xfffe,0xe0dd);
00184 seqDelItem.Write<TSwap>(os);
00185 VL zero = 0;
00186 zero.Write<TSwap>(os);
00187 }
00188
00189 return os;
00190 }
00191
00192
00193 void Print(std::ostream &os) const {
00194 os << "\t(" << SequenceLengthField << ")\n";
00195 ItemVector::const_iterator it =
00196 Items.begin();
00197 for(;it != Items.end(); ++it)
00198 {
00199 os << " " << *it;
00200 }
00201 if( SequenceLengthField.IsUndefined() )
00202 {
00203 const Tag seqDelItem(0xfffe,0xe0dd);
00204 VL zero = 0;
00205 os << seqDelItem;
00206 os << "\t" << zero;
00207 }
00208 }
00209
00210 static SmartPointer<SequenceOfItems> New()
00211 {
00212 return new SequenceOfItems;
00213 }
00214 bool FindDataElement(const Tag &t) const;
00215
00216 bool operator==(const Value &val) const
00217 {
00218 const SequenceOfItems &sqi = dynamic_cast<const SequenceOfItems&>(val);
00219 return SequenceLengthField == sqi.SequenceLengthField &&
00220 Items == sqi.Items;
00221 }
00222
00223 private:
00224 public:
00226 VL SequenceLengthField;
00228 ItemVector Items;
00229 };
00230
00231 }
00232
00233 #include "gdcmSequenceOfItems.txx"
00234
00235 #endif //GDCMSEQUENCEOFITEMS_H
00236