1 /*
2  *
3  *  Copyright (C) 2008-2012, OFFIS e.V. and ICSMED AG, Oldenburg, Germany
4  *  Copyright (C) 2013-2017, J. Riesmeier, Oldenburg, Germany
5  *  All rights reserved.  See COPYRIGHT file for details.
6  *
7  *  Source file for class DRTROIElementalCompositionSequence
8  *
9  *  Generated automatically from DICOM PS 3.3-2017e
10  *  File created on 2017-12-05 09:30:54
11  *
12  */
13 
14 
15 #include "dcmtk/config/osconfig.h"     // make sure OS specific configuration is included first
16 
17 #include "dcmtk/dcmrt/seq/drtrecs.h"
18 
19 
20 // --- item class ---
21 
Item(const OFBool emptyDefaultItem)22 DRTROIElementalCompositionSequence::Item::Item(const OFBool emptyDefaultItem)
23   : EmptyDefaultItem(emptyDefaultItem),
24     ROIElementalCompositionAtomicMassFraction(DCM_ROIElementalCompositionAtomicMassFraction),
25     ROIElementalCompositionAtomicNumber(DCM_ROIElementalCompositionAtomicNumber)
26 {
27 }
28 
29 
Item(const Item & copy)30 DRTROIElementalCompositionSequence::Item::Item(const Item &copy)
31   : EmptyDefaultItem(copy.EmptyDefaultItem),
32     ROIElementalCompositionAtomicMassFraction(copy.ROIElementalCompositionAtomicMassFraction),
33     ROIElementalCompositionAtomicNumber(copy.ROIElementalCompositionAtomicNumber)
34 {
35 }
36 
37 
~Item()38 DRTROIElementalCompositionSequence::Item::~Item()
39 {
40 }
41 
42 
operator =(const Item & copy)43 DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::Item::operator=(const Item &copy)
44 {
45     if (this != &copy)
46     {
47         EmptyDefaultItem = copy.EmptyDefaultItem;
48         ROIElementalCompositionAtomicMassFraction = copy.ROIElementalCompositionAtomicMassFraction;
49         ROIElementalCompositionAtomicNumber = copy.ROIElementalCompositionAtomicNumber;
50     }
51     return *this;
52 }
53 
54 
clear()55 void DRTROIElementalCompositionSequence::Item::clear()
56 {
57     if (!EmptyDefaultItem)
58     {
59         /* clear all DICOM attributes */
60         ROIElementalCompositionAtomicNumber.clear();
61         ROIElementalCompositionAtomicMassFraction.clear();
62     }
63 }
64 
65 
isEmpty()66 OFBool DRTROIElementalCompositionSequence::Item::isEmpty()
67 {
68     return ROIElementalCompositionAtomicNumber.isEmpty() &&
69            ROIElementalCompositionAtomicMassFraction.isEmpty();
70 }
71 
72 
isValid() const73 OFBool DRTROIElementalCompositionSequence::Item::isValid() const
74 {
75     return !EmptyDefaultItem;
76 }
77 
78 
read(DcmItem & item)79 OFCondition DRTROIElementalCompositionSequence::Item::read(DcmItem &item)
80 {
81     OFCondition result = EC_IllegalCall;
82     if (!EmptyDefaultItem)
83     {
84         /* re-initialize object */
85         clear();
86         getAndCheckElementFromDataset(item, ROIElementalCompositionAtomicNumber, "1", "1", "ROIElementalCompositionSequence");
87         getAndCheckElementFromDataset(item, ROIElementalCompositionAtomicMassFraction, "1", "1", "ROIElementalCompositionSequence");
88         result = EC_Normal;
89     }
90     return result;
91 }
92 
93 
write(DcmItem & item)94 OFCondition DRTROIElementalCompositionSequence::Item::write(DcmItem &item)
95 {
96     OFCondition result = EC_IllegalCall;
97     if (!EmptyDefaultItem)
98     {
99         result = EC_Normal;
100         addElementToDataset(result, item, new DcmUnsignedShort(ROIElementalCompositionAtomicNumber), "1", "1", "ROIElementalCompositionSequence");
101         addElementToDataset(result, item, new DcmFloatingPointSingle(ROIElementalCompositionAtomicMassFraction), "1", "1", "ROIElementalCompositionSequence");
102     }
103     return result;
104 }
105 
106 
getROIElementalCompositionAtomicMassFraction(Float32 & value,const unsigned long pos) const107 OFCondition DRTROIElementalCompositionSequence::Item::getROIElementalCompositionAtomicMassFraction(Float32 &value, const unsigned long pos) const
108 {
109     if (EmptyDefaultItem)
110         return EC_IllegalCall;
111     else
112         return OFconst_cast(DcmFloatingPointSingle &, ROIElementalCompositionAtomicMassFraction).getFloat32(value, pos);
113 }
114 
115 
getROIElementalCompositionAtomicNumber(Uint16 & value,const unsigned long pos) const116 OFCondition DRTROIElementalCompositionSequence::Item::getROIElementalCompositionAtomicNumber(Uint16 &value, const unsigned long pos) const
117 {
118     if (EmptyDefaultItem)
119         return EC_IllegalCall;
120     else
121         return OFconst_cast(DcmUnsignedShort &, ROIElementalCompositionAtomicNumber).getUint16(value, pos);
122 }
123 
124 
setROIElementalCompositionAtomicMassFraction(const Float32 value,const unsigned long pos)125 OFCondition DRTROIElementalCompositionSequence::Item::setROIElementalCompositionAtomicMassFraction(const Float32 value, const unsigned long pos)
126 {
127     if (EmptyDefaultItem)
128         return EC_IllegalCall;
129     else
130         return ROIElementalCompositionAtomicMassFraction.putFloat32(value, pos);
131 }
132 
133 
setROIElementalCompositionAtomicNumber(const Uint16 value,const unsigned long pos)134 OFCondition DRTROIElementalCompositionSequence::Item::setROIElementalCompositionAtomicNumber(const Uint16 value, const unsigned long pos)
135 {
136     if (EmptyDefaultItem)
137         return EC_IllegalCall;
138     else
139         return ROIElementalCompositionAtomicNumber.putUint16(value, pos);
140 }
141 
142 
143 // --- sequence class ---
144 
DRTROIElementalCompositionSequence(const OFBool emptyDefaultSequence)145 DRTROIElementalCompositionSequence::DRTROIElementalCompositionSequence(const OFBool emptyDefaultSequence)
146   : EmptyDefaultSequence(emptyDefaultSequence),
147     SequenceOfItems(),
148     CurrentItem(),
149     EmptyItem(OFTrue /*emptyDefaultItem*/)
150 {
151     CurrentItem = SequenceOfItems.end();
152 }
153 
154 
DRTROIElementalCompositionSequence(const DRTROIElementalCompositionSequence & copy)155 DRTROIElementalCompositionSequence::DRTROIElementalCompositionSequence(const DRTROIElementalCompositionSequence &copy)
156   : EmptyDefaultSequence(copy.EmptyDefaultSequence),
157     SequenceOfItems(),
158     CurrentItem(),
159     EmptyItem(OFTrue /*emptyDefaultItem*/)
160 {
161     /* create a copy of the internal sequence of items */
162     Item *item = NULL;
163     OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
164     const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
165     while (current != last)
166     {
167         item = new Item(**current);
168         if (item != NULL)
169         {
170             SequenceOfItems.push_back(item);
171         } else {
172             /* memory exhausted, there is nothing we can do about it */
173             break;
174         }
175         ++current;
176     }
177     CurrentItem = SequenceOfItems.begin();
178 }
179 
180 
operator =(const DRTROIElementalCompositionSequence & copy)181 DRTROIElementalCompositionSequence &DRTROIElementalCompositionSequence::operator=(const DRTROIElementalCompositionSequence &copy)
182 {
183     if (this != &copy)
184     {
185         clear();
186         EmptyDefaultSequence = copy.EmptyDefaultSequence;
187         /* create a copy of the internal sequence of items */
188         Item *item = NULL;
189         OFListConstIterator(Item *) current = copy.SequenceOfItems.begin();
190         const OFListConstIterator(Item *) last = copy.SequenceOfItems.end();
191         while (current != last)
192         {
193             item = new Item(**current);
194             if (item != NULL)
195             {
196                 SequenceOfItems.push_back(item);
197             } else {
198                 /* memory exhausted, there is nothing we can do about it */
199                 break;
200             }
201             ++current;
202         }
203         CurrentItem = SequenceOfItems.begin();
204     }
205     return *this;
206 }
207 
208 
~DRTROIElementalCompositionSequence()209 DRTROIElementalCompositionSequence::~DRTROIElementalCompositionSequence()
210 {
211     clear();
212 }
213 
214 
clear()215 void DRTROIElementalCompositionSequence::clear()
216 {
217     if (!EmptyDefaultSequence)
218     {
219         CurrentItem = SequenceOfItems.begin();
220         const OFListConstIterator(Item *) last = SequenceOfItems.end();
221         /* delete all items and free memory */
222         while (CurrentItem != last)
223         {
224             delete (*CurrentItem);
225             CurrentItem = SequenceOfItems.erase(CurrentItem);
226         }
227         /* make sure that the list is empty */
228         SequenceOfItems.clear();
229         CurrentItem = SequenceOfItems.end();
230     }
231 }
232 
233 
isEmpty()234 OFBool DRTROIElementalCompositionSequence::isEmpty()
235 {
236     return SequenceOfItems.empty();
237 }
238 
239 
isValid() const240 OFBool DRTROIElementalCompositionSequence::isValid() const
241 {
242     return !EmptyDefaultSequence;
243 }
244 
245 
getNumberOfItems() const246 size_t DRTROIElementalCompositionSequence::getNumberOfItems() const
247 {
248     return SequenceOfItems.size();
249 }
250 
251 
gotoFirstItem()252 OFCondition DRTROIElementalCompositionSequence::gotoFirstItem()
253 {
254     OFCondition result = EC_IllegalCall;
255     if (!SequenceOfItems.empty())
256     {
257         CurrentItem = SequenceOfItems.begin();
258         result = EC_Normal;
259     }
260     return result;
261 }
262 
263 
gotoNextItem()264 OFCondition DRTROIElementalCompositionSequence::gotoNextItem()
265 {
266     OFCondition result = EC_IllegalCall;
267     if (CurrentItem != SequenceOfItems.end())
268     {
269         ++CurrentItem;
270         result = EC_Normal;
271     }
272     return result;
273 }
274 
275 
gotoItem(const size_t num,OFListIterator (Item *)& iterator)276 OFCondition DRTROIElementalCompositionSequence::gotoItem(const size_t num, OFListIterator(Item *) &iterator)
277 {
278     OFCondition result = EC_IllegalCall;
279     if (!SequenceOfItems.empty())
280     {
281         size_t idx = num + 1;
282         iterator = SequenceOfItems.begin();
283         const OFListConstIterator(Item *) last = SequenceOfItems.end();
284         while ((--idx > 0) && (iterator != last))
285             ++iterator;
286         /* specified list item found? */
287         if ((idx == 0) && (iterator != last))
288             result = EC_Normal;
289         else
290             result = EC_IllegalParameter;
291     }
292     return result;
293 }
294 
295 
gotoItem(const size_t num,OFListConstIterator (Item *)& iterator) const296 OFCondition DRTROIElementalCompositionSequence::gotoItem(const size_t num, OFListConstIterator(Item *) &iterator) const
297 {
298     OFCondition result = EC_IllegalCall;
299     if (!SequenceOfItems.empty())
300     {
301         size_t idx = num + 1;
302         iterator = SequenceOfItems.begin();
303         const OFListConstIterator(Item *) last = SequenceOfItems.end();
304         while ((--idx > 0) && (iterator != last))
305             ++iterator;
306         /* specified list item found? */
307         if ((idx == 0) && (iterator != last))
308             result = EC_Normal;
309         else
310             result = EC_IllegalParameter;
311     }
312     return result;
313 }
314 
315 
gotoItem(const size_t num)316 OFCondition DRTROIElementalCompositionSequence::gotoItem(const size_t num)
317 {
318     return gotoItem(num, CurrentItem);
319 }
320 
321 
getCurrentItem(Item * & item) const322 OFCondition DRTROIElementalCompositionSequence::getCurrentItem(Item *&item) const
323 {
324     OFCondition result = EC_IllegalCall;
325     if (CurrentItem != SequenceOfItems.end())
326     {
327         item = *CurrentItem;
328         result = EC_Normal;
329     }
330     return result;
331 }
332 
333 
getCurrentItem()334 DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::getCurrentItem()
335 {
336     if (CurrentItem != SequenceOfItems.end())
337         return **CurrentItem;
338     else
339         return EmptyItem;
340 }
341 
342 
getCurrentItem() const343 const DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::getCurrentItem() const
344 {
345     if (CurrentItem != SequenceOfItems.end())
346         return **CurrentItem;
347     else
348         return EmptyItem;
349 }
350 
351 
getItem(const size_t num,Item * & item)352 OFCondition DRTROIElementalCompositionSequence::getItem(const size_t num, Item *&item)
353 {
354     OFListIterator(Item *) iterator;
355     OFCondition result = gotoItem(num, iterator);
356     if (result.good())
357         item = *iterator;
358     return result;
359 }
360 
361 
getItem(const size_t num)362 DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::getItem(const size_t num)
363 {
364     OFListIterator(Item *) iterator;
365     if (gotoItem(num, iterator).good())
366         return **iterator;
367     else
368         return EmptyItem;
369 }
370 
371 
getItem(const size_t num) const372 const DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::getItem(const size_t num) const
373 {
374     OFListConstIterator(Item *) iterator;
375     if (gotoItem(num, iterator).good())
376         return **iterator;
377     else
378         return EmptyItem;
379 }
380 
381 
operator [](const size_t num)382 DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::operator[](const size_t num)
383 {
384     return getItem(num);
385 }
386 
387 
operator [](const size_t num) const388 const DRTROIElementalCompositionSequence::Item &DRTROIElementalCompositionSequence::operator[](const size_t num) const
389 {
390     return getItem(num);
391 }
392 
393 
addItem(Item * & item)394 OFCondition DRTROIElementalCompositionSequence::addItem(Item *&item)
395 {
396     OFCondition result = EC_IllegalCall;
397     if (!EmptyDefaultSequence)
398     {
399         item = new Item();
400         if (item != NULL)
401         {
402             SequenceOfItems.push_back(item);
403             result = EC_Normal;
404         } else
405             result = EC_MemoryExhausted;
406     }
407     return result;
408 }
409 
410 
insertItem(const size_t pos,Item * & item)411 OFCondition DRTROIElementalCompositionSequence::insertItem(const size_t pos, Item *&item)
412 {
413     OFCondition result = EC_IllegalCall;
414     if (!EmptyDefaultSequence)
415     {
416         OFListIterator(Item *) iterator;
417         result = gotoItem(pos, iterator);
418         if (result.good())
419         {
420             item = new Item();
421             if (item != NULL)
422             {
423                 SequenceOfItems.insert(iterator, 1, item);
424                 result = EC_Normal;
425             } else
426                 result = EC_MemoryExhausted;
427         } else
428             result = addItem(item);
429     }
430     return result;
431 }
432 
433 
removeItem(const size_t pos)434 OFCondition DRTROIElementalCompositionSequence::removeItem(const size_t pos)
435 {
436     OFCondition result = EC_IllegalCall;
437     if (!EmptyDefaultSequence)
438     {
439         OFListIterator(Item *) iterator;
440         if (gotoItem(pos, iterator).good())
441         {
442             delete *iterator;
443             iterator = SequenceOfItems.erase(iterator);
444             result = EC_Normal;
445         } else
446             result = EC_IllegalParameter;
447     }
448     return result;
449 }
450 
451 
read(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)452 OFCondition DRTROIElementalCompositionSequence::read(DcmItem &dataset,
453                                                      const OFString &card,
454                                                      const OFString &type,
455                                                      const char *moduleName)
456 {
457     OFCondition result = EC_IllegalCall;
458     if (!EmptyDefaultSequence)
459     {
460         /* re-initialize object */
461         clear();
462         /* retrieve sequence element from dataset */
463         DcmSequenceOfItems *sequence;
464         result = dataset.findAndGetSequence(DCM_ROIElementalCompositionSequence, sequence);
465         if (sequence != NULL)
466         {
467             if (checkElementValue(*sequence, card, type, result, moduleName))
468             {
469                 DcmStack stack;
470                 OFBool first = OFTrue;
471                 /* iterate over all sequence items */
472                 while (result.good() && sequence->nextObject(stack, first /*intoSub*/).good())
473                 {
474                     DcmItem *ditem = OFstatic_cast(DcmItem *, stack.top());
475                     if (ditem != NULL)
476                     {
477                         Item *item = new Item();
478                         if (item != NULL)
479                         {
480                             result = item->read(*ditem);
481                             if (result.good())
482                             {
483                                 /* append new item to the end of the list */
484                                 SequenceOfItems.push_back(item);
485                                 first = OFFalse;
486                             }
487                         } else
488                             result = EC_MemoryExhausted;
489                     } else
490                         result = EC_CorruptedData;
491                 }
492             }
493         } else {
494             DcmSequenceOfItems element(DCM_ROIElementalCompositionSequence);
495             checkElementValue(element, card, type, result, moduleName);
496         }
497     }
498     return result;
499 }
500 
501 
write(DcmItem & dataset,const OFString & card,const OFString & type,const char * moduleName)502 OFCondition DRTROIElementalCompositionSequence::write(DcmItem &dataset,
503                                                       const OFString &card,
504                                                       const OFString &type,
505                                                       const char *moduleName)
506 {
507     OFCondition result = EC_IllegalCall;
508     if (!EmptyDefaultSequence)
509     {
510         result = EC_MemoryExhausted;
511         DcmSequenceOfItems *sequence = new DcmSequenceOfItems(DCM_ROIElementalCompositionSequence);
512         if (sequence != NULL)
513         {
514             result = EC_Normal;
515             /* an empty optional sequence is not written */
516             if ((type == "2") || !SequenceOfItems.empty())
517             {
518                 OFListIterator(Item *) iterator = SequenceOfItems.begin();
519                 const OFListConstIterator(Item *) last = SequenceOfItems.end();
520                 /* iterate over all sequence items */
521                 while (result.good() && (iterator != last))
522                 {
523                     DcmItem *item = new DcmItem();
524                     if (item != NULL)
525                     {
526                         /* append new item to the end of the sequence */
527                         result = sequence->append(item);
528                         if (result.good())
529                         {
530                             result = (*iterator)->write(*item);
531                             ++iterator;
532                         } else
533                             delete item;
534                     } else
535                         result = EC_MemoryExhausted;
536                 }
537                 if (result.good())
538                 {
539                     /* insert sequence element into the dataset */
540                     result = dataset.insert(sequence, OFTrue /*replaceOld*/);
541                 }
542                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
543                     checkElementValue(*sequence, card, type, result, moduleName);
544                 if (result.good())
545                 {
546                     /* forget reference to sequence object (avoid deletion below) */
547                     sequence = NULL;
548                 }
549             }
550             else if (type == "1")
551             {
552                 /* empty type 1 sequence not allowed */
553                 result = RT_EC_InvalidValue;
554                 if (DCM_dcmrtLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
555                     checkElementValue(*sequence, card, type, result, moduleName);
556             }
557             /* delete sequence (if not inserted into the dataset) */
558             delete sequence;
559         }
560     }
561     return result;
562 }
563 
564 
565 // end of source file
566