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

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

  ViewVC Help
Powered by ViewVC