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 ©)
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 ©)
44 {
45 if (this != ©)
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 ©)
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 ©)
182 {
183 if (this != ©)
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