/[svn]/linuxsampler/trunk/src/common/Pool.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/common/Pool.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 271 by schoenebeck, Fri Oct 8 20:51:39 2004 UTC revision 478 by persson, Sat Mar 19 09:31:46 2005 UTC
# Line 35  Line 35 
35  #if USE_EXCEPTIONS  #if USE_EXCEPTIONS
36  # include <stdexcept>  # include <stdexcept>
37  # include <string>  # include <string>
 const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated";  
38  #endif // USE_EXCEPTIONS  #endif // USE_EXCEPTIONS
39    
40    #if DEVMODE
41    const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated";
42    # include <iostream>
43    #endif
44    
45  // just symbol prototyping  // just symbol prototyping
46  template<typename T> class Pool;  template<typename T> class Pool;
47  template<typename T> class RTList;  template<typename T> class RTList;
# Line 45  template<typename T> class RTList; Line 49  template<typename T> class RTList;
49  template<typename T>  template<typename T>
50  class RTListBase {  class RTListBase {
51      protected:      protected:
52          template<typename _T>          template<typename T1>
53          struct _Node {          struct _Node {
54              _Node<_T>* next;              _Node<T1>* next;
55              _Node<_T>* prev;              _Node<T1>* prev;
56              _T* data;              T1* data;
57              #if DEVMODE              #if DEVMODE
58              RTListBase<_T>* list; // list to which this node currently belongs to              RTListBase<T1>* list; // list to which this node currently belongs to
59              #endif // DEVMODE              #endif // DEVMODE
60    
61              _Node() {              _Node() {
# Line 66  class RTListBase { Line 70  class RTListBase {
70          typedef _Node<T> Node;          typedef _Node<T> Node;
71    
72      public:      public:
73          template<typename _T>          template<typename T1>
74          class _Iterator {          class _Iterator {
75              public:              public:
76                  _Iterator() {                  _Iterator() {
# Line 79  class RTListBase { Line 83  class RTListBase {
83    
84                  /// prefix increment op.                  /// prefix increment op.
85                  inline _Iterator& operator++() {                  inline _Iterator& operator++() {
86                      #if DEVMODE                      #if DEVMODE                    
87                      #if USE_EXCEPTIONS                      if (!isValid()) {
88                      if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated);                          #if USE_EXCEPTIONS
89                      #else                          throw std::runtime_error(__err_msg_iterator_invalidated);
90                      if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated                          #else
91                      #endif // USE_EXCEPTIONS                          std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush;
92                            return *(_Iterator*)NULL; // force segfault if iterator became invalidated
93                            #endif // USE_EXCEPTIONS
94                        }
95                      #endif // DEVMODE                      #endif // DEVMODE
96                      fallback = current;                      fallback = current;
97                      current  = current->next;                      current  = current->next;
# Line 94  class RTListBase { Line 101  class RTListBase {
101                  /// postfix increment op.                  /// postfix increment op.
102                  inline _Iterator operator++(int) {                  inline _Iterator operator++(int) {
103                      _Iterator preval = *this;                      _Iterator preval = *this;
104                      ++*this;                      ++*this; // use prefix operator implementation
105                      return preval;                      return preval;
106                  }                  }
107    
108                  /// prefix decrement op.                  /// prefix decrement op.
109                  inline _Iterator& operator--() {                  inline _Iterator& operator--() {
110                      #if DEVMODE                      #if DEVMODE                    
111                      #if USE_EXCEPTIONS                      if (!isValid()) {
112                      if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated);                          #if USE_EXCEPTIONS
113                      #else                          throw std::runtime_error(__err_msg_iterator_invalidated);
114                      if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated                          #else
115                      #endif // USE_EXCEPTIONS                          std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush;
116                            return *(_Iterator*)NULL; // force segfault if iterator became invalidated
117                            #endif // USE_EXCEPTIONS
118                        }                    
119                      #endif // DEVMODE                      #endif // DEVMODE
120                      fallback = current;                      fallback = current;
121                      current  = current->prev;                      current  = current->prev;
# Line 115  class RTListBase { Line 125  class RTListBase {
125                  /// postfix decrement op.                  /// postfix decrement op.
126                  inline _Iterator operator--(int) {                  inline _Iterator operator--(int) {
127                      _Iterator preval = *this;                      _Iterator preval = *this;
128                      --*this;                      --*this; // use prefix operator implementation
129                      return preval;                      return preval;
130                  }                  }
131    
132                  inline _T& operator*() {                  inline T1& operator*() {
133                      #if DEVMODE                      #if DEVMODE                    
134                      #if USE_EXCEPTIONS                      if (!isValid()) { // if iterator became invalidated
135                      if (isValid()) return *current->data;                          #if USE_EXCEPTIONS
136                      else throw std::runtime_error(__err_msg_iterator_invalidated);                          throw std::runtime_error(__err_msg_iterator_invalidated);
137                      #else                          #else
138                      return *(isValid() ? current->data : (_T*)NULL); // force segfault if iterator became invalidated                          std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush;
139                      #endif // USE_EXCEPTIONS                          return *((T1*)NULL); // force segfault if iterator became invalidated
140                      #else                          #endif // USE_EXCEPTIONS
141                      return *current->data;                      }
142                      #endif // DEVMODE                      #endif // DEVMODE
143                        return *current->data;
144                        
145                  }                  }
146    
147                  inline _T* operator->() {                  inline T1* operator->() {
148                      #if DEVMODE                      #if DEVMODE
149                      #if USE_EXCEPTIONS                      if (!isValid()) { // if iterator became invalidated
150                      if (isValid()) return current->data;                          #if USE_EXCEPTIONS
151                      else throw std::runtime_error(__err_msg_iterator_invalidated);                          throw std::runtime_error(__err_msg_iterator_invalidated);
152                      #else                          #else
153                      return isValid() ? current->data : (_T*)NULL; // force segfault if iterator became invalidated                          std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush;
154                      #endif // USE_EXCEPTIONS                          return (T1*)NULL; // force segfault if iterator became invalidated
155                      #else                          #endif // USE_EXCEPTIONS
156                      return current->data;                      }
157                      #endif // DEVMODE                      #endif // DEVMODE
158                        return current->data;                    
159                  }                  }
160    
161                  inline bool operator==(const _Iterator<_T> other) {                  inline bool operator==(const _Iterator<T1> other) {
162                      return current == other.current;                      return current == other.current;
163                  }                  }
164    
165                  inline bool operator!=(const _Iterator<_T> other) {                  inline bool operator!=(const _Iterator<T1> other) {
166                      return current != other.current;                      return current != other.current;
167                  }                  }
168    
# Line 161  class RTListBase { Line 174  class RTListBase {
174                      return !(current && current->data);                      return !(current && current->data);
175                  }                  }
176    
177                  inline _Iterator moveToEndOf(RTListBase<_T>* pDstList) {                  inline _Iterator moveToEndOf(RTListBase<T1>* pDstList) {
178                      detach();                      detach();
179                      pDstList->append(*this);                      pDstList->append(*this);
180                      _Iterator iterOnDstList = _Iterator(current);                      _Iterator iterOnDstList = _Iterator(current);
# Line 169  class RTListBase { Line 182  class RTListBase {
182                      return iterOnDstList;                      return iterOnDstList;
183                  }                  }
184    
185                  inline _Iterator moveToBeginOf(RTListBase<_T>* pDstList) {                  inline _Iterator moveToBeginOf(RTListBase<T1>* pDstList) {
186                      detach();                      detach();
187                      pDstList->prepend(*this);                      pDstList->prepend(*this);
188                      _Iterator iterOnDstList = _Iterator(current);                      _Iterator iterOnDstList = _Iterator(current);
# Line 191  class RTListBase { Line 204  class RTListBase {
204                      dir_backward                      dir_backward
205                  };                  };
206                  #if DEVMODE                  #if DEVMODE
207                  RTListBase<_T>* list;                  RTListBase<T1>* list;
208                  #endif // DEVMODE                  #endif // DEVMODE
209    
210                  _Iterator(Node* pNode, dir_t direction = dir_forward) {                  _Iterator(Node* pNode, dir_t direction = dir_forward) {
# Line 216  class RTListBase { Line 229  class RTListBase {
229                  }                  }
230    
231                  inline void detach() {                  inline void detach() {
232                      RTListBase<_T>::detach(*this);                      RTListBase<T1>::detach(*this);
233                  }                  }
234    
235                  friend class RTListBase<_T>;                  friend class RTListBase<T1>;
236                  friend class RTList<_T>;                  friend class RTList<T1>;
237                  friend class Pool<_T>;                  friend class Pool<T1>;
238          };          };
239          typedef _Iterator<T> Iterator;          typedef _Iterator<T> Iterator;
240    
# Line 334  class RTListBase { Line 347  class RTListBase {
347              next->prev = prev;              next->prev = prev;
348          }          }
349    
350            friend class _Iterator<T>;
351            friend class RTList<T>;
352          friend class Pool<T>;          friend class Pool<T>;
353  };  };
354    

Legend:
Removed from v.271  
changed lines
  Added in v.478

  ViewVC Help
Powered by ViewVC