
#include <stdlib.h>


#ifndef _JL_POINTER_LIST_NODE_
#define _JL_POINTER_LIST_NODE_

class _PointerList_Node {
	public:
		void				*_data;
		_PointerList_Node	*_next;
};

#endif


class CLASS_NAME {

	private:
		_PointerList_Node	*_head, *_tail;
		int					_size;

		static _PointerList_Node	*_free_list_head;
		static int					_alloc_chunk_size;

	private:
		_PointerList_Node* NewNode();
		void DeleteNode(_PointerList_Node*);

	public:
		CLASS_NAME();
		CLASS_NAME(const CLASS_NAME &C)
				{ _head=_tail=NULL; _size=0; CopyFrom(C); }
		~CLASS_NAME() { Kill(); }

		void CopyFrom(const CLASS_NAME&);
		void Kill();

		CLASS_NAME& operator=(const CLASS_NAME &C) { CopyFrom(C); return *this;}
		CLASS_NAME& operator+=(const CLASS_NAME &C);


		int Size() const { return _size; }
		int GetSize() const { return _size; }

		CLASS_TYPE* First()
				{ return (CLASS_TYPE*)((_head) ? (_head->_data) : NULL); }
		const CLASS_TYPE* First() const
				{ return (CLASS_TYPE*)((_head) ? (_head->_data) : NULL); }

		void Reset(void *&curr) const { curr = (void*) _head; }
//		void Reset(const void *&curr) const { curr = (void*) _head; }

		void Next(void *&curr) const
				{ if (curr) curr = (*((_PointerList_Node*)(curr)))._next; }
//		void Next(const void *&curr) const
//				{ if (curr) curr = (*((_PointerList_Node*)(curr)))._next; }

		CLASS_TYPE* Peek(void *curr) const
				{ return (CLASS_TYPE*)((curr)
						? (((_PointerList_Node*)curr)->_data)
						: NULL); }
//		CLASS_TYPE* Peek(const void *curr) const
//				{ return (CLASS_TYPE*)((curr)
//						? (((_PointerList_Node*)curr)->_data)
//						: NULL); }

		void PlaceInList(CLASS_TYPE *C);
