--- linuxsampler/trunk/src/common/Pool.h 2004/10/08 20:51:39 271 +++ linuxsampler/trunk/src/common/Pool.h 2005/03/17 19:54:51 472 @@ -35,9 +35,12 @@ #if USE_EXCEPTIONS # include # include -const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated"; #endif // USE_EXCEPTIONS +#if DEVMODE +const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated"; +#endif + // just symbol prototyping template class Pool; template class RTList; @@ -45,13 +48,13 @@ template class RTListBase { protected: - template + template struct _Node { - _Node<_T>* next; - _Node<_T>* prev; - _T* data; + _Node* next; + _Node* prev; + T1* data; #if DEVMODE - RTListBase<_T>* list; // list to which this node currently belongs to + RTListBase* list; // list to which this node currently belongs to #endif // DEVMODE _Node() { @@ -66,7 +69,7 @@ typedef _Node Node; public: - template + template class _Iterator { public: _Iterator() { @@ -79,12 +82,15 @@ /// prefix increment op. inline _Iterator& operator++() { - #if DEVMODE - #if USE_EXCEPTIONS - if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated); - #else - if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated - #endif // USE_EXCEPTIONS + #if DEVMODE + if (!isValid()) { + #if USE_EXCEPTIONS + throw std::runtime_error(__err_msg_iterator_invalidated); + #else + std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; + return *(_Iterator*)NULL; // force segfault if iterator became invalidated + #endif // USE_EXCEPTIONS + } #endif // DEVMODE fallback = current; current = current->next; @@ -94,18 +100,21 @@ /// postfix increment op. inline _Iterator operator++(int) { _Iterator preval = *this; - ++*this; + ++*this; // use prefix operator implementation return preval; } /// prefix decrement op. inline _Iterator& operator--() { - #if DEVMODE - #if USE_EXCEPTIONS - if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated); - #else - if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated - #endif // USE_EXCEPTIONS + #if DEVMODE + if (!isValid()) { + #if USE_EXCEPTIONS + throw std::runtime_error(__err_msg_iterator_invalidated); + #else + std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; + return *(_Iterator*)NULL; // force segfault if iterator became invalidated + #endif // USE_EXCEPTIONS + } #endif // DEVMODE fallback = current; current = current->prev; @@ -115,41 +124,44 @@ /// postfix decrement op. inline _Iterator operator--(int) { _Iterator preval = *this; - --*this; + --*this; // use prefix operator implementation return preval; } - inline _T& operator*() { - #if DEVMODE - #if USE_EXCEPTIONS - if (isValid()) return *current->data; - else throw std::runtime_error(__err_msg_iterator_invalidated); - #else - return *(isValid() ? current->data : (_T*)NULL); // force segfault if iterator became invalidated - #endif // USE_EXCEPTIONS - #else - return *current->data; + inline T1& operator*() { + #if DEVMODE + if (!isValid()) { // if iterator became invalidated + #if USE_EXCEPTIONS + throw std::runtime_error(__err_msg_iterator_invalidated); + #else + std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; + return *((T1*)NULL); // force segfault if iterator became invalidated + #endif // USE_EXCEPTIONS + } #endif // DEVMODE + return *current->data; + } - inline _T* operator->() { + inline T1* operator->() { #if DEVMODE - #if USE_EXCEPTIONS - if (isValid()) return current->data; - else throw std::runtime_error(__err_msg_iterator_invalidated); - #else - return isValid() ? current->data : (_T*)NULL; // force segfault if iterator became invalidated - #endif // USE_EXCEPTIONS - #else - return current->data; + if (!isValid()) { // if iterator became invalidated + #if USE_EXCEPTIONS + throw std::runtime_error(__err_msg_iterator_invalidated); + #else + std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; + return (T1*)NULL; // force segfault if iterator became invalidated + #endif // USE_EXCEPTIONS + } #endif // DEVMODE + return current->data; } - inline bool operator==(const _Iterator<_T> other) { + inline bool operator==(const _Iterator other) { return current == other.current; } - inline bool operator!=(const _Iterator<_T> other) { + inline bool operator!=(const _Iterator other) { return current != other.current; } @@ -161,7 +173,7 @@ return !(current && current->data); } - inline _Iterator moveToEndOf(RTListBase<_T>* pDstList) { + inline _Iterator moveToEndOf(RTListBase* pDstList) { detach(); pDstList->append(*this); _Iterator iterOnDstList = _Iterator(current); @@ -169,7 +181,7 @@ return iterOnDstList; } - inline _Iterator moveToBeginOf(RTListBase<_T>* pDstList) { + inline _Iterator moveToBeginOf(RTListBase* pDstList) { detach(); pDstList->prepend(*this); _Iterator iterOnDstList = _Iterator(current); @@ -191,7 +203,7 @@ dir_backward }; #if DEVMODE - RTListBase<_T>* list; + RTListBase* list; #endif // DEVMODE _Iterator(Node* pNode, dir_t direction = dir_forward) { @@ -216,12 +228,12 @@ } inline void detach() { - RTListBase<_T>::detach(*this); + RTListBase::detach(*this); } - friend class RTListBase<_T>; - friend class RTList<_T>; - friend class Pool<_T>; + friend class RTListBase; + friend class RTList; + friend class Pool; }; typedef _Iterator Iterator; @@ -334,6 +346,8 @@ next->prev = prev; } + friend class _Iterator; + friend class RTList; friend class Pool; };