Subversion Repositories spk

Rev

Rev 112 | Rev 121 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef __LIST_H__
#define __LIST_H__

#include "../spkdll.h"
#include <vector>

//namespace SPK {
namespace Utils {


        template <class T>
        class CList
        {
        public:
                typedef typename std::vector<T *>::iterator iterator ;

        private:
                std::vector<T *> *_lItems;
                bool                     _bDontClear;
                typename std::vector<T *>::iterator _pItr;

        public:
                CList(bool bDontClear = false);
                ~CList();

                void clear();
                T *push_back(T *pItem);

                iterator begin();
                iterator end();
                T *first();
                T *next();

                bool empty() const;
                size_t size() const;
        };


        ///////////////////////////////////////////////////////////////////////////

        template<class T>
        CList<T>::CList(bool bDontClear) : _bDontClear(bDontClear)
        {
                _lItems = new std::vector<T *>();
                _pItr = _lItems->end();
        }

        template <class T>
        CList<T>::~CList()
        {
                clear();
                delete _lItems;
        }

        template <class T>
        void CList<T>::clear()
        {
                if ( !_bDontClear ) {
                        for(std::vector<T *>::iterator itr = _lItems->begin(); itr != _lItems->end(); itr++) {
                                T *data = (*itr);
                                delete (*itr);
                        }
                }

                _lItems->clear();
        }

        template <class T>
        T *CList<T>::push_back(T *pItem)
        {
                _lItems->push_back(pItem);
                return pItem;
        }


        template <class T>
        typename CList<T>::iterator CList<T>::begin()
        {
                return _lItems->begin();
        }

        template <class T>
        typename CList<T>::iterator CList<T>::end()
        {
                return _lItems->end();
        }

        template <class T>
        T *CList<T>::first()
        {
                if ( _lItems->empty() ) return NULL;
                _pItr = _lItems->begin();
                return *_pItr;
        }

        template <class T>
        T *CList<T>::next()
        {
                if ( _lItems->empty() ) return NULL;
                if ( _pItr == _lItems->end() ) return NULL;
                ++_pItr;
                if ( _pItr == _lItems->end() ) return NULL;
                return *_pItr;
        }

        template <class T>
        bool CList<T>::empty() const
        {
                return _lItems->empty();
        }

        template <class T>
        size_t CList<T>::size() const
        {
                return _lItems->size();
        }
}
//}

#endif //__LIST_H__