MeVisLab Toolbox Reference
SbList.h
Go to the documentation of this file.
1 /*************************************************************************************
2 **
3 ** Copyright 2007, MeVis Medical Solutions AG
4 **
5 ** The user may use this file in accordance with the license agreement provided with
6 ** the Software or, alternatively, in accordance with the terms contained in a
7 ** written agreement between the user and MeVis Medical Solutions AG.
8 **
9 ** For further information use the contact form at https://www.mevislab.de/contact
10 **
11 **************************************************************************************/
12 
13 #ifndef SB_LIST_H
14 #define SB_LIST_H
15 
16 #include "SoShaderSystem.h"
17 
21 
22 // This class is loosely derived from class SbPList.
23 
24 template <class Type>
25 class SbList
26 {
27  public:
28 
29  // Constructor
30  SbList() {
31  ptrs = nullptr;
32  nPtrs = ptrsSize = 0;
33 
34  setSize(0);
35  }
36 
37  // Constructor allocates enough room for the given number of pointers
38  SbList(int initSize) {
39  ptrs = NULL;
40  nPtrs = ptrsSize = 0;
41 
42  setSize(initSize); // Makes enough room for initSize entries
43  setSize(0); // Sets nPtrs back to 0
44  }
45 
46  // Constructor for copying
47  SbList(const SbList &pl) {
48  nPtrs = pl.nPtrs;
49  ptrsSize = pl.ptrsSize;
50  ptrs = new Type[ptrsSize];
51 
52  for(int i = 0; i < nPtrs; i++)
53  ptrs[i] = pl.ptrs[i];
54  }
55 
56  // Destructor
57  ~SbList() {
58  delete [] ptrs;
59  }
60 
61  // Adds given pointer to end of list
62  void append(const Type &value) {
63  if(nPtrs + 1 > ptrsSize) expand(nPtrs + 1);
64  ptrs[nPtrs++] = value;
65  }
66 
67  // Returns index of given pointer in list, or -1 if not found
68  int find(const Type &value) const {
69  for(int i = 0; i < nPtrs; i++)
70  if(ptrs[i] == value)
71  return(i);
72 
73  return -1; // Not found
74  }
75 
76  // Inserts given pointer in list before pointer with given index
77  void insert(const Type &value, int addBefore) {
78  // If addBefore is off the end of the list, grow the list (and
79  // initialize any new elements to NULL)
80  if(addBefore > nPtrs) grow(addBefore);
81 
82  // Make room for one more
83  setSize(nPtrs + 1);
84 
85  // Move pointers forward to make room
86  for(int i = nPtrs - 1; i > addBefore; --i)
87  ptrs[i] = ptrs[i - 1];
88 
89  // Insert the new one
90  ptrs[addBefore] = value;
91  }
92 
93  // Removes pointer with given index
94  void remove(int which) {
95  // Move all pointers after the ith one backward
96  for(int i = which; i < nPtrs - 1; i++)
97  ptrs[i] = ptrs[i + 1];
98 
99  // Shrink the list
100  setSize(nPtrs - 1);
101  }
102 
103  // Returns number of pointers in list
104  int getLength() const {
105  return nPtrs;
106  }
107 
108  // Removes all pointers after one with given index, inclusive
109  // ??? should really be an error check in here
110  void truncate(int start) {
111  nPtrs = start;
112  }
113 
114  // Copy a PList
115  void copy(const SbList &pl) {
116  setSize(pl.nPtrs);
117 
118  for(int i = 0; i < nPtrs; i++)
119  ptrs[i] = pl.ptrs[i];
120  }
121 
122  SbList &operator =(const SbList &pl) {
123  copy(pl); return *this;
124  }
125 
126  // Returns pointer with given index
127  Type &operator [](int i) const {
128  if(i >= nPtrs) grow(i);
129  return ptrs[i];
130  }
131 
132  // equality tests
133  int operator ==(const SbList &pl) const {
134  return pl.nPtrs == nPtrs ? compare(pl) : FALSE;
135  }
136  int operator !=(const SbList &pl) const {
137  return pl.nPtrs == nPtrs ? ! compare(pl) : TRUE;
138  }
139 
140  // Internal versions of [] that do not check for bounds:
141  SoINTERNAL public:
142 
143  void * get(int i) const {
144  return ptrs[i];
145  }
146  void set(int i, void *j) {
147  ptrs[i] = j;
148  }
149 
150  private:
151 
152  // NOTE: this must be called only if the number of elements in the two
153  // lists is the same, otherwise badness could result
154  int compare(const SbList &pl) const {
155  for(int i = 0; i < nPtrs; i++)
156  if((*this)[i] != pl[i])
157  return FALSE;
158 
159  return TRUE;
160  }
161 
162  Type *ptrs; // The collection of pointers
163  int nPtrs; // Number of pointers used
164  int ptrsSize; // Number of pointers allocated
165 
166  // There are three(!) methods to expand the list. grow() is used
167  // when space is dynamically created, and needs to be initialized
168  // to NULL:
169  void grow(int max) const {
170  int newSize = max+1;
171  int oldSize = nPtrs;
172 
173 #ifdef DEBUG
174  if(newSize <= oldSize)
175  SoDebugError::post("(internal) SbList::grow", "newSize <= oldSize!");
176 #endif // DEBUG
177 
178  // Get around the const thing:
179  SbList *me = static_cast<SbList *>(this);
180 
181  me->setSize(newSize);
182 
183  for(int i = oldSize; i < newSize; i++)
184  me->ptrs[i] = NULL;
185  }
186 
187  // setSize is used by grow and in other places internally where we
188  // know that nothing needs to be initialized to NULL.
189  void setSize(int size) {
190  if(size > ptrsSize) expand(size);
191  nPtrs = size;
192  }
193 
194  // expand is the lowest level routine. It just reallocates the
195  // array and copies over the old values.
196  void expand(int size) {
197  if(ptrsSize == 0)
198  ptrsSize = 4;
199 
200  while(size > ptrsSize) {
201 #ifdef DEBUG
202  // check for overflow
203  int oldPtrsSize = ptrsSize;
204  ptrsSize *= 2;
205  if(ptrsSize < oldPtrsSize)
206  SoDebugError::post("SbList::expand", "Attempt to expand list beyond capacity;\n A core dump is likely");
207 #else
208  ptrsSize *= 2;
209 #endif
210  }
211 
212  Type *newPtrs = new Type[ptrsSize];
213 
214  if(ptrs != nullptr) {
215  for(int i = 0; i < nPtrs; i++)
216  newPtrs[i] = ptrs[i];
217  delete [] ptrs;
218  }
219 
220  ptrs = newPtrs;
221  }
222 };
223 
224 #endif // _SB_LIST_
This contains the definition of the SbList generic pointer list class; an SbList is a list of (void *...
Definition: SbList.h:26
void append(const Type &value)
Definition: SbList.h:62
SbList & operator=(const SbList &pl)
Definition: SbList.h:122
void * get(int i) const
Definition: SbList.h:143
int operator==(const SbList &pl) const
Definition: SbList.h:133
void copy(const SbList &pl)
Definition: SbList.h:115
SbList()
Definition: SbList.h:30
SbList(const SbList &pl)
Definition: SbList.h:47
void remove(int which)
Definition: SbList.h:94
int find(const Type &value) const
Definition: SbList.h:68
void truncate(int start)
Definition: SbList.h:110
SbList(int initSize)
Definition: SbList.h:38
int operator!=(const SbList &pl) const
Definition: SbList.h:136
Type & operator[](int i) const
Definition: SbList.h:127
void insert(const Type &value, int addBefore)
Definition: SbList.h:77
int getLength() const
Definition: SbList.h:104
void set(int i, void *j)
Definition: SbList.h:146
~SbList()
Definition: SbList.h:57