+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: No names yet.
-// Purpose: Contrib. demo
-// Author: Aleksandras Gluchovas
-// Modified by:
-// Created: 27/09/98
-// RCS-ID: $Id$
-// Copyright: (c) Aleskandars Gluchovas
-// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef __WXSTLLST_G__
-#define __WXSTLLST_G__
-
-#include <stddef.h>
-#include <sys/types.h>
-#include <memory.h>
-#include <limits.h>
-#include <new>
-
-// VERSION:: 0.2 (copy-constructor/adign-op added)
-
-// FOR NOW:: class-member operators "new" and "delete"
-// are ignored by list class, memory allocated
-// and freed using global operators
-
-typedef int Type;
-
-
-// the below macro used internally (see actual interface after this macro)
-
-#define __DEFINE_STL_LIST(listClass,Type) class \
- listClass \
-{\
-public:\
-\
- typedef Type value_type;\
- typedef value_type* pointer;\
- typedef const value_type* const_pointer;\
- typedef value_type& reference;\
- typedef const value_type& const_reference;\
- typedef size_t size_type;\
- typedef ptrdiff_t difference_type;\
-\
-protected:\
- struct list_node\
- {\
- list_node* mpNext;\
- list_node* mpPrev;\
- value_type mData;\
- };\
-\
- typedef list_node* node_ref_type;\
-\
- node_ref_type mpFreeListHead;\
- node_ref_type mpTerminator;\
- size_type mSize;\
-\
- inline node_ref_type AllocNode() \
- { \
- if ( mpFreeListHead ) \
- {\
- node_ref_type pFreeNode = mpFreeListHead;\
- mpFreeListHead = mpFreeListHead->mpPrev;\
-\
- return pFreeNode;\
- }\
- else\
- {\
- char* pHeapBlock = new char[sizeof(list_node)];\
-\
- return (node_ref_type)pHeapBlock;\
- }\
- }\
-\
- inline void DestroyFreeList()\
- {\
- while ( mpFreeListHead )\
- {\
- node_ref_type tmp = mpFreeListHead;\
- mpFreeListHead = mpFreeListHead->mpPrev;\
-\
- delete [](char*)tmp;\
- }\
- }\
-\
- inline void RecycleNode( node_ref_type pNode ) \
- {\
- pNode->mpPrev = mpFreeListHead;\
- mpFreeListHead = pNode;\
- }\
-\
-public:\
-\
- class iterator \
- {\
- public:\
- node_ref_type mpNode;\
- friend class listClass;\
- friend class const_iterator;\
- friend class const_reverse_iterator;\
-\
- protected:\
- iterator( node_ref_type pNode )\
- {\
- mpNode = pNode;\
- }\
- \
- public:\
- iterator() {}\
- int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
- int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
- inline iterator( const iterator& other )\
- {\
- mpNode = other.mpNode;\
- }\
-\
- inline const iterator& operator--() \
- {\
- mpNode = mpNode->mpPrev;\
- return *this;\
- }\
-\
- inline iterator operator--(int)\
- {\
- iterator tmp = *this;\
- mpNode = mpNode->mpPrev;\
- return tmp;\
- }\
-\
- inline const iterator& operator++() \
- {\
- mpNode = mpNode->mpNext;\
- return *this;\
- }\
-\
- inline iterator operator++(int)\
- {\
- iterator tmp = *this;\
- mpNode = mpNode->mpNext;\
- return tmp;\
- }\
-\
- inline reference operator*() const { return mpNode->mData; }\
- };\
-\
-\
- class const_iterator \
- {\
- protected:\
- node_ref_type mpNode;\
- friend class listClass;\
-\
- protected:\
- const_iterator( node_ref_type pNode )\
- {\
- mpNode = pNode;\
- }\
- \
- public:\
- \
- const_iterator() {}\
- int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
- int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
-\
- inline const_iterator( const iterator& other )\
- {\
- mpNode = other.mpNode;\
- }\
-\
- inline const const_iterator& operator--() \
- {\
- mpNode = mpNode->mpPrev;\
- return *this;\
- }\
-\
- inline const_iterator operator--(int)\
- {\
- const_iterator tmp = *this;\
- mpNode = mpNode->mpPrev;\
- return tmp;\
- }\
-\
- inline const const_iterator& operator++() \
- {\
- mpNode = mpNode->mpNext;\
- return *this;\
- }\
-\
- inline const_iterator operator++(int)\
- {\
- const_iterator tmp = *this;\
- mpNode = mpNode->mpNext;\
- return tmp;\
- }\
-\
- inline const_reference operator*() const { return mpNode->mData; }\
- };\
-\
- typedef iterator OutputIterator;\
- typedef const_iterator InputIterator;\
-\
- class reverse_iterator \
- {\
- public:\
- node_ref_type mpNode;\
- friend class listClass;\
- friend class const_reverse_iterator;\
-\
- protected:\
- reverse_iterator ( node_ref_type pNode )\
- {\
- mpNode = pNode;\
- }\
- \
- public:\
-\
- reverse_iterator() {}\
- int operator==( const reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
- int operator!=( const reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
- inline reverse_iterator( const reverse_iterator& other )\
- {\
- mpNode = other.mpNode;\
- }\
-\
- inline const reverse_iterator& operator--() \
- {\
- mpNode = mpNode->mpNext;\
- return *this;\
- }\
-\
- inline reverse_iterator operator--(int)\
- {\
- reverse_iterator tmp = *this;\
- mpNode = mpNode->mpPrev;\
- return tmp;\
- }\
-\
- inline const reverse_iterator & operator++() \
- {\
- mpNode = mpNode->mpNext;\
- return *this;\
- }\
-\
- inline reverse_iterator operator++(int)\
- {\
- reverse_iterator tmp = *this;\
- mpNode = mpNode->mpPrev;\
- return tmp;\
- }\
-\
- inline const_reference operator*() const { return mpNode->mData; }\
- };\
-\
-\
- class const_reverse_iterator \
- {\
- protected:\
- node_ref_type mpNode;\
- friend class listClass;\
-\
- protected:\
- const_reverse_iterator( node_ref_type pNode )\
- {\
- mpNode = pNode;\
- }\
- \
- public:\
-\
- const_reverse_iterator() {}\
- int operator==( const const_reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
- int operator!=( const const_reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
-\
- inline const_reverse_iterator( const reverse_iterator& other )\
- {\
- mpNode = other.mpNode;\
- }\
-\
- inline const const_reverse_iterator& operator--() \
- {\
- mpNode = mpNode->mpNext;\
- return *this;\
- }\
-\
- inline const_reverse_iterator operator--(int)\
- {\
- const_reverse_iterator tmp = *this;\
- mpNode = mpNode->mpNext;\
- return tmp;\
- }\
-\
- inline const const_reverse_iterator& operator++() \
- {\
- mpNode = mpNode->mpPrev;\
- return *this;\
- }\
-\
- inline const_reverse_iterator operator++(int)\
- {\
- const_reverse_iterator tmp = *this;\
- mpNode = mpNode->mpPrev;\
- return tmp;\
- }\
-\
- inline const_reference operator*() const { return mpNode->mData; }\
- };\
-\
-public:\
-\
- inline listClass()\
- : mpFreeListHead( 0 ),\
- mSize(0)\
- {\
- mpTerminator = AllocNode();\
- mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
- }\
-\
- listClass( const listClass& other )\
- {\
- mpTerminator = AllocNode();\
- mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
-\
- for( listClass::const_iterator i = other.begin(); i != other.end(); ++i )\
-\
- push_back( (*i) );\
- }\
-\
- inline const listClass& operator=( const listClass& rhs ) \
- {\
- erase( begin(), end() );\
-\
- for( listClass::const_iterator i = rhs.begin(); i != rhs.end(); ++i )\
-\
- push_back( (*i) );\
-\
- return *this;\
- }\
-\
- inline listClass(const_iterator first, const_iterator last)\
- : mpFreeListHead( 0 ),\
- mSize(0)\
- \
- { while( first != last ) push_back( *first++ ); }\
-\
- inline listClass( size_type n, const value_type& value = value_type() )\
- \
- { for( size_t i = 0; i != n; ++n ) push_back( value ); }\
-\
- inline ~listClass() \
- { \
- erase( begin(), end() ); \
-\
- RecycleNode( mpTerminator );\
- DestroyFreeList();\
- }\
-\
- inline iterator begin() { return iterator(mpTerminator->mpNext); }\
- \
- inline const_iterator begin() const \
- { return const_iterator(mpTerminator->mpNext); }\
- \
- inline iterator end() { return iterator(mpTerminator); }\
-\
- inline const_iterator end() const { return const_iterator(mpTerminator); }\
-\
- inline reverse_iterator rbegin() \
- { return reverse_iterator(mpTerminator->mpPrev); }\
-\
- inline reverse_iterator rend() \
- { return reverse_iterator(mpTerminator); }\
-\
- inline const_reverse_iterator rbegin() const\
- { return const_reverse_iterator(mpTerminator->mpPrev); }\
-\
- inline const_reverse_iterator rend() const\
- { return const_reverse_iterator(mpTerminator); }\
-\
- inline int empty() const { return (mSize == 0); }\
-\
- inline size_type size() const { return mSize; }\
-\
- inline size_type max_size() const { return UINT_MAX/sizeof(list_node); }\
-\
- inline reference front() { return mpTerminator->mData; }\
-\
- inline const_reference front() const { return mpTerminator->mData; }\
-\
- inline reference back() { return mpTerminator->mpPrev->mData; }\
-\
- inline const_reference back() const { return mpTerminator->mpPrev->mData; }\
-\
- inline void push_front(const value_type& x) { insert( begin(), x ); }\
-\
- inline void push_back(const value_type& x) { insert( end(), x ); }\
-\
- iterator insert(iterator position, const value_type& x = value_type())\
- {\
- node_ref_type pNew = AllocNode();\
-\
- node_ref_type pos = *((node_ref_type*)&position);\
-\
- pNew->mpNext = pos;\
- pNew->mpPrev = pos->mpPrev;\
- pos->mpPrev->mpNext = pNew;\
- pos->mpPrev = pNew;\
-\
- new (&pNew->mData) value_type(x);\
-\
- ++mSize;\
-\
- return iterator(pNew);\
- }\
-\
- inline void insert(iterator position, const_iterator first, const_iterator last )\
- {\
- while( first != last ) insert( position, *first++ );\
- }\
-\
- inline void splice( iterator position, listClass& other )\
- {\
- if ( other.begin() == other.end() ) return;\
-\
- node_ref_type pTill = other.mpTerminator->mpPrev;\
- node_ref_type pFrom = other.begin().mpNode;\
-\
- mpTerminator->mpPrev->mpNext = pFrom;\
- pFrom->mpPrev = mpTerminator->mpPrev->mpNext;\
-\
- pTill->mpNext = mpTerminator;\
- mpTerminator->mpPrev = pTill;\
-\
- other.mpTerminator->mpNext = \
- other.mpTerminator->mpPrev = other.mpTerminator;\
-\
- mSize += other.mSize;\
- other.mSize = 0;\
- }\
-\
- inline void splice( iterator position, listClass& other, iterator first, iterator last )\
- {\
- if ( first == last ) return;\
-\
- size_type sz = 0;\
- iterator tmp = first;\
- while( tmp != last ) \
- {\
- ++tmp;\
- ++sz;\
- }\
-\
- mSize += sz;\
- other.mSize -= sz;\
-\
- node_ref_type pPos = position.mpNode;\
- node_ref_type pFirst = first.mpNode;\
- node_ref_type pLast = last.mpNode;\
- node_ref_type pTill = last.mpNode->mpPrev;\
-\
- pPos->mpPrev->mpNext = pFirst;\
- pPos->mpPrev = pTill;\
-\
- pFirst->mpPrev->mpNext = last.mpNode;\
- pLast->mpPrev = pTill;\
-\
- pFirst->mpPrev = pPos->mpPrev;\
- pTill->mpNext = pPos;\
- }\
-\
- inline void pop_front() { erase( begin() ); }\
- inline void pop_back() { erase( --end() ); }\
- \
- inline void erase(iterator position)\
- {\
- erase( position, ++position );\
- }\
- \
- inline void erase(iterator first, iterator last)\
- {\
- node_ref_type firstNode = *((node_ref_type*)&first);\
- node_ref_type lastNode = *((node_ref_type*)&last);\
-\
- firstNode->mpPrev->mpNext = lastNode;\
- lastNode->mpPrev = firstNode->mpPrev;\
-\
- while( firstNode != lastNode )\
- {\
- node_ref_type next = firstNode->mpNext;\
-\
- typedef value_type value_type_local;\
- firstNode->mData.value_type_local::~value_type_local();\
-\
- RecycleNode( firstNode );\
-\
- firstNode = next;\
-\
- --mSize;\
- }\
- }\
-\
- inline void remove(const value_type& value)\
- {\
- for( iterator i = begin(); i != end(); ++i )\
- \
- if ( (*i) == value ) \
- {\
- erase( i ); break;\
- }\
- }\
-\
- void sort()\
- {\
- if ( mSize < 2 ) return;\
-\
- iterator from = begin();\
- iterator other_end = end();\
- --other_end;\
-\
- for( size_type i = 0; i != mSize; ++i )\
- {\
- size_type nSwaps = 0;\
-\
- iterator next = begin();\
- ++next;\
-\
- for( iterator j = begin(); j != other_end; ++j )\
- {\
-\
- if ( (*next) < (*j) )\
- {\
- value_type tmp = (*j);\
- (*j) = (*next);\
- (*next) = tmp;\
-\
- ++nSwaps;\
- }\
-\
- ++next;\
- }\
-\
- if ( !nSwaps) break;\
-\
- --other_end;\
- }\
- }\
-}
-
-// defines list class with the given element type
-#define WXSTL_LIST(ELEMENT_CLASS) __DEFINE_STL_LIST(\
-\
-_WXSTL_LIST_##ELEMENT_CLASS, ELEMENT_CLASS )
-
-#endif
\ No newline at end of file