Mercurial > hg > orthanc
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, |