Subversion Repositories spk

Rev

Rev 160 | 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();
                void deleteItems();

                T *push_back(T *pItem);
                T *push_front(T *pItem);
                void pop_back();

                iterator insert(iterator itr, T *pItem);
                iterator insertAt(int idx, T* pItem);

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

                T* front() const;
                T* back() const;

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

                T *get(int i) const;

                iterator remove(iterator itr);
                iterator removeAt(int idx);

                T* operator[](size_t idx);
        };


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

        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>
        void CList<T>::deleteItems()
        {
                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>
        void CList<T>::pop_back()
        {
                _lItems->pop_back();
        }

        template <class T>
        typename CList<T>::iterator CList<T>::insert(CList<T>::iterator itr, T *pItem)
        {
                return _lItems->insert(itr, pItem);
        }

        template <class T>
        typename CList<T>::iterator CList<T>::insertAt(int idx, T *pItem)
        {
                return _lItems->insert(_lItems->begin() + idx, pItem);
        }

        template <class T>
        T *CList<T>::push_front(T *pItem)
        {
                _lItems->insert(_lItems->begin(), pItem);
                return pItem;
        }

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

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

        template <class T>
        T* CList<T>::front() const
        {
                if (_lItems->empty()) return NULL;
                return _lItems->front();
        }

        template <class T>
        T* CList<T>::back() const
        {
                if (_lItems->empty()) return NULL;
                return _lItems->back();
        }

        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();
        }

        template <class T>
        T *CList<T>::get(int i) const
        {
                return (*_lItems)[i];
        }

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

        template <class T>
        typename CList<T>::iterator CList<T>::removeAt(int idx)
        {
                return _lItems->erase(_lItems->begin() + idx);
        }

        template <class T>
        T* CList<T>::operator[](size_t idx)
        {
                if(idx < _lItems->size())       
                        return _lItems[idx];
                return nullptr;
        }
}
//}

#endif //__LIST_H__