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
00032
00033
00034
00035 #ifndef DSRTLIST_H
00036 #define DSRTLIST_H
00037
00038 #include "dcmtk/config/osconfig.h"
00039
00040 #include "dcmtk/ofstd/oflist.h"
00041
00042 #include "dcmtk/dcmdata/dcerror.h"
00043
00044
00045
00046
00047
00048
00053 template<class T> class DSRListOfItems
00054 {
00055
00056 public:
00057
00060 DSRListOfItems()
00061 : ItemList()
00062 {
00063 }
00064
00068 DSRListOfItems(const DSRListOfItems<T> &lst)
00069 : ItemList(lst.ItemList)
00070 {
00071 }
00072
00075 virtual ~DSRListOfItems()
00076 {
00077 }
00078
00083 inline DSRListOfItems<T> &operator=(const DSRListOfItems<T> &lst)
00084 {
00085
00086 ItemList.clear();
00087 const OFLIST_TYPENAME OFListConstIterator(T) endPos = lst.ItemList.end();
00088 OFLIST_TYPENAME OFListConstIterator(T) iterator = lst.ItemList.begin();
00089 while (iterator != endPos)
00090 {
00091 ItemList.push_back(*iterator);
00092 iterator++;
00093 }
00094 return *this;
00095 }
00096
00099 inline void clear()
00100 {
00101 ItemList.clear();
00102 }
00103
00107 inline OFBool isEmpty() const
00108 {
00109 return ItemList.empty();
00110 }
00111
00115 inline size_t getNumberOfItems() const
00116 {
00117 return ItemList.size();
00118 }
00119
00124 OFBool isElement(const T &item) const
00125 {
00126 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00127 return gotoItem(item, iterator);
00128 }
00129
00134 const T &getItem(const size_t idx) const
00135 {
00136 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00137 if (gotoItemPos(idx, iterator))
00138 return *iterator;
00139 else
00140 return EmptyItem;
00141 }
00142
00149 OFCondition getItem(const size_t idx,
00150 T &item) const
00151 {
00152 OFCondition result = EC_IllegalParameter;
00153 OFLIST_TYPENAME OFListConstIterator(T) iterator = ItemList.begin();
00154 if (gotoItemPos(idx, iterator))
00155 {
00156 item = *iterator;
00157 result = EC_Normal;
00158 }
00159 return result;
00160 }
00161
00165 inline void addItem(const T &item)
00166 {
00167 ItemList.push_back(item);
00168 }
00169
00173 inline void addOnlyNewItem(const T &item)
00174 {
00175 if (!isElement(item))
00176 ItemList.push_back(item);
00177 }
00178
00184 OFCondition insertItem(const size_t idx,
00185 const T &item)
00186 {
00187 OFCondition result = EC_IllegalParameter;
00188 if (idx == ItemList.size() + 1)
00189 {
00190
00191 ItemList.push_back(item);
00192 result = EC_Normal;
00193 } else {
00194 OFLIST_TYPENAME OFListIterator(T) iterator = ItemList.begin();
00195 if (gotoItemPos(idx, iterator))
00196 {
00197 ItemList.insert(iterator, 1, item);
00198 result = EC_Normal;
00199 }
00200 }
00201 return result;
00202 }
00203
00208 OFCondition removeItem(const size_t idx)
00209 {
00210 OFCondition result = EC_IllegalParameter;
00211 OFLIST_TYPENAME OFListIterator(T) iterator = ItemList.begin();
00212 if (gotoItemPos(idx, iterator))
00213 {
00214 ItemList.erase(iterator);
00215 result = EC_Normal;
00216 }
00217 return result;
00218 }
00219
00223 static const T EmptyItem;
00224
00225
00226 protected:
00227
00233 OFBool gotoItemPos(size_t idx,
00234 OFLIST_TYPENAME OFListConstIterator(T) &iterator) const
00235 {
00236 OFBool result = OFFalse;
00237 if (idx > 0)
00238 {
00239 const OFLIST_TYPENAME OFListConstIterator(T) endPos = ItemList.end();
00240 while ((--idx > 0) && (iterator != endPos))
00241 iterator++;
00242
00243 result = (idx == 0);
00244 }
00245 return result;
00246 }
00247
00253 OFBool gotoItem(const T &item,
00254 OFLIST_TYPENAME OFListConstIterator(T) &iterator) const
00255 {
00256 const OFLIST_TYPENAME OFListConstIterator(T) endPos = ItemList.end();
00257
00258 while ((iterator != endPos) && (!(*iterator == item)))
00259 iterator++;
00260 return (iterator != endPos);
00261 }
00262
00263 protected:
00264
00266 OFList<T> ItemList;
00267 };
00268
00269
00270 #endif
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
00318