comparison OrthancServer/DicomProtocol/DicomFindAnswers.cpp @ 1789:bdcc1dba4a53 worklists

optimization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 18 Nov 2015 16:38:08 +0100
parents 1b1d5470233f
children 23722a191e4e
comparison
equal deleted inserted replaced
1788:6a2d507ef064 1789:bdcc1dba4a53
36 #include "../FromDcmtkBridge.h" 36 #include "../FromDcmtkBridge.h"
37 #include "../ToDcmtkBridge.h" 37 #include "../ToDcmtkBridge.h"
38 #include "../../Core/OrthancException.h" 38 #include "../../Core/OrthancException.h"
39 39
40 #include <memory> 40 #include <memory>
41 #include <dcmtk/dcmdata/dcfilefo.h>
42
41 43
42 namespace Orthanc 44 namespace Orthanc
43 { 45 {
46 class DicomFindAnswers::Answer
47 {
48 private:
49 ParsedDicomFile* dicom_;
50 DicomMap* map_;
51
52 public:
53 Answer(ParsedDicomFile& dicom) :
54 dicom_(dicom.Clone()),
55 map_(NULL)
56 {
57 }
58
59 Answer(const char* dicom,
60 size_t size) :
61 dicom_(new ParsedDicomFile(dicom, size)),
62 map_(NULL)
63 {
64 }
65
66 Answer(const DicomMap& map) :
67 dicom_(NULL),
68 map_(map.Clone())
69 {
70 }
71
72 ~Answer()
73 {
74 if (dicom_ != NULL)
75 {
76 delete dicom_;
77 }
78
79 if (map_ != NULL)
80 {
81 delete map_;
82 }
83 }
84
85 ParsedDicomFile& GetDicomFile()
86 {
87 if (dicom_ == NULL)
88 {
89 assert(map_ != NULL);
90 dicom_ = new ParsedDicomFile(*map_);
91 }
92
93 return *dicom_;
94 }
95
96 DcmDataset* ExtractDcmDataset() const
97 {
98 if (dicom_ != NULL)
99 {
100 return new DcmDataset(*dicom_->GetDcmtkObject().getDataset());
101 }
102 else
103 {
104 assert(map_ != NULL);
105 return ToDcmtkBridge::Convert(*map_);
106 }
107 }
108 };
109
110
44 void DicomFindAnswers::Clear() 111 void DicomFindAnswers::Clear()
45 { 112 {
46 for (size_t i = 0; i < items_.size(); i++) 113 for (size_t i = 0; i < answers_.size(); i++)
47 { 114 {
48 assert(items_[i] != NULL); 115 assert(answers_[i] != NULL);
49 delete items_[i]; 116 delete answers_[i];
50 } 117 }
51 118
52 items_.clear(); 119 answers_.clear();
53 } 120 }
121
54 122
55 void DicomFindAnswers::Reserve(size_t size) 123 void DicomFindAnswers::Reserve(size_t size)
56 { 124 {
57 if (size > items_.size()) 125 if (size > answers_.size())
58 { 126 {
59 items_.reserve(size); 127 answers_.reserve(size);
60 } 128 }
61 } 129 }
62 130
63 131
64 void DicomFindAnswers::Add(const DicomMap& map) 132 void DicomFindAnswers::Add(const DicomMap& map)
65 { 133 {
66 items_.push_back(new ParsedDicomFile(map)); 134 answers_.push_back(new Answer(map));
67 } 135 }
136
68 137
69 void DicomFindAnswers::Add(ParsedDicomFile& dicom) 138 void DicomFindAnswers::Add(ParsedDicomFile& dicom)
70 { 139 {
71 items_.push_back(dicom.Clone()); 140 answers_.push_back(new Answer(dicom));
72 } 141 }
142
73 143
74 void DicomFindAnswers::Add(const char* dicom, 144 void DicomFindAnswers::Add(const char* dicom,
75 size_t size) 145 size_t size)
76 { 146 {
77 items_.push_back(new ParsedDicomFile(dicom, size)); 147 answers_.push_back(new Answer(dicom, size));
148 }
149
150
151 DicomFindAnswers::Answer& DicomFindAnswers::GetAnswerInternal(size_t index) const
152 {
153 if (index < answers_.size())
154 {
155 return *answers_.at(index);
156 }
157 else
158 {
159 throw OrthancException(ErrorCode_ParameterOutOfRange);
160 }
78 } 161 }
79 162
80 163
81 ParsedDicomFile& DicomFindAnswers::GetAnswer(size_t index) const 164 ParsedDicomFile& DicomFindAnswers::GetAnswer(size_t index) const
82 { 165 {
83 if (index < items_.size()) 166 return GetAnswerInternal(index).GetDicomFile();
84 { 167 }
85 return *items_.at(index); 168
86 } 169
87 else 170 DcmDataset* DicomFindAnswers::ExtractDcmDataset(size_t index) const
88 { 171 {
89 throw OrthancException(ErrorCode_ParameterOutOfRange); 172 return GetAnswerInternal(index).ExtractDcmDataset();
90 }
91 } 173 }
92 174
93 175
94 void DicomFindAnswers::ToJson(Json::Value& target, 176 void DicomFindAnswers::ToJson(Json::Value& target,
95 size_t index, 177 size_t index,