00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef DSRTLIST_H
00032 #define DSRTLIST_H
00033
00034 #include "dcmtk/config/osconfig.h"
00035
00036 #include "dcmtk/ofstd/oflist.h"
00037
00038 #include "dcmtk/dcmdata/dcerror.h"
00039
00040
00041
00042
00043
00044
00049 template<class T> class DSRListOfItems
00050 {
00051
00052 public:
00053
00056 DSRListOfItems()
00057 : ItemList()
00058 {
00059 }
00060
00064 DSRListOfItems(const DSRListOfItems<T> &lst)
00065 : ItemList(lst.ItemList)
00066 {
00067 }
00068
00071 virtual ~DSRListOfItems()
00072 {
00073 }
00074
00079 inline DSRListOfItems<T> &operator=(const DSRListOfItems<T> &lst)
00080 {
00081
00082 ItemList.clear();
00083 const OFLIST_TYPENAME OFListConstIterator(T) endPos = lst.ItemList.end();
00084 OFLIST_TYPENAME OFListConstIterator(T) iterator = lst.ItemList.begin();
00085 while (iterator != endPos)
00086 {
00087 ItemList.push_back(*iterator);
00088 iterator++;
00089 }
00090 return *this;
00091 }
00092
00095 inline void clear()
00096 {
00097 ItemList.clear();
00098 }
00099
00103 inline OFBool isEmpty() const
00104 {
00105 return ItemList.empty();
00106 }
00107
00111 inline size_t getNumberOfItems() const
00112 {
00113 return ItemList.size();
00114 }
00115
00120 OFBool isElement(const T &item) const
00121 {
00122 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00123 return gotoItem(item, iterator);
00124 }
00125
00130 const T &getItem(const size_t idx) const
00131 {
00132 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00133 if (gotoItemPos(idx, iterator))
00134 return *iterator;
00135 else
00136 return EmptyItem;
00137 }
00138
00145 OFCondition getItem(const size_t idx,
00146 T &item) const
00147 {
00148 OFCondition result = EC_IllegalParameter;
00149 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00150 if (gotoItemPos(idx, iterator))
00151 {
00152 item = *iterator;
00153 result = EC_Normal;
00154 }
00155 return result;
00156 }
00157
00161 inline void addItem(const T &item)
00162 {
00163 ItemList.push_back(item);
00164 }
00165
00169 inline void addOnlyNewItem(const T &item)
00170 {
00171 if (!isElement(item))
00172 ItemList.push_back(item);
00173 }
00174
00180 OFCondition insertItem(const size_t idx,
00181 const T &item)
00182 {
00183 OFCondition result = EC_IllegalParameter;
00184 if (idx == ItemList.size() + 1)
00185 {
00186
00187 ItemList.push_back(item);
00188 result = EC_Normal;
00189 } else {
00190 OFLIST_TYPENAME OFListIterator(T) iterator = ItemList.begin();
00191 if (gotoItemPos(idx, iterator))
00192 {
00193 ItemList.insert(iterator, 1, item);
00194 result = EC_Normal;
00195 }
00196 }
00197 return result;
00198 }
00199
00204 OFCondition removeItem(const size_t idx)
00205 {
00206 OFCondition result = EC_IllegalParameter;
00207 OFLIST_TYPENAME OFListIterator(T) iterator = ItemList.begin();
00208 if (gotoItemPos(idx, iterator))
00209 {
00210 ItemList.erase(iterator);
00211 result = EC_Normal;
00212 }
00213 return result;
00214 }
00215
00219 static const T EmptyItem;
00220
00221
00222 protected:
00223
00229 OFBool gotoItemPos(size_t idx,
00230 OFLIST_TYPENAME OFListConstIterator(T) &iterator) const
00231 {
00232 OFBool result = OFFalse;
00233 if (idx > 0)
00234 {
00235 const OFLIST_TYPENAME OFListConstIterator(T) endPos = ItemList.end();
00236 while ((--idx > 0) && (iterator != endPos))
00237 iterator++;
00238
00239 result = (idx == 0);
00240 }
00241 return result;
00242 }
00243
00249 OFBool gotoItem(const T &item,
00250 OFLIST_TYPENAME OFListConstIterator(T) &iterator) const
00251 {
00252 const OFLIST_TYPENAME OFListConstIterator(T) endPos = ItemList.end();
00253
00254 while ((iterator != endPos) && (!(*iterator == item)))
00255 iterator++;
00256 return (iterator != endPos);
00257 }
00258
00259 protected:
00260
00262 OFList<T> ItemList;
00263 };
00264
00265
00266 #endif
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317