Thread: Base container class question

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User
    Join Date
    Nov 2005
    Posts
    673

    Base container class question

    I made this container, and it seems to work, but I may be missing something.

    I was wondering if you all could critique it, and let me know what you think.

    All input is greatly appreciated.
    Code:
    #pragma once
    #include "VariaMacros.h"
    #include "cSingletonBase.h"
    
    #include <map>
    #include <list>
    #include <string>
    
    template <typename T>
    class cMapBase : public cSingletonBase<cMapBase<T> >
    {
    	EnableSingleton(cMapBase);
    	DisableClassCopying(cMapBase);
    private:
    	cMapBase():m_CurIndex(0){};
    	virtual ~cMapBase(){Clear();};
    
    	mutable std::map<unsigned long, T*> m_Map;
    	mutable std::list<unsigned long> m_Indices;
    	mutable unsigned long m_CurIndex;
    
    	virtual bool _Free(T*& p_Element) const
    	{
    		if ( !p_Element )
    			return false;
    		else
    		{
    			delete p_Element;
    			p_Element = 0;
    			return true;
    		}
    	}
    
    	unsigned long _GetIndex() const
    	{
    		if ( m_Indices.empty() )
    		{
    			++m_CurIndex;
    			return m_CurIndex;
    		}
    		unsigned long Index = m_Indices.back();
    		m_Indices.pop_back();
    		return Index;
    	}
    public:
    	/*
    		This should add a element, and return its index
    			- All things that are to be placed in this container have to have a copy constructor(unless unsafe_add is used)
    	*/
    	virtual unsigned long Add(const T& p_NewElement) const
    	{
    		T* temp = new T(p_NewElement);
    		unsigned long Index = _GetIndex();
    		if ( m_Map.find(Index) != m_Map.end() )
    		{
    			_Free(temp);
    			return 0;
    		}
    		else
    			m_Map[Index] = temp;
    		return Index;
    	}
    
    	/*
    		This should add an element, and return its index
    			- This is a unsafe function, and has such warning attached. This function can produce memory leaks if used
    			incorrectly.
    	*/
    #ifndef CCONTAINER_NO_WARNINGS
    	virtual unsigned long UNSAFE(cMapBase<T>::Add(const T&)) 
    		Add(T* p_NewElement) const
    #else
    	virtual unsigned long
    		Add(T* p_NewElement) const
    #endif
    	{
    		unsigned long Index = _GetIndex();
    		if ( m_Map.find(Index) != m_Map.end() )
    		{
    			return 0;
    		}
    		else
    			m_Map[Index] = p_NewElement;
    		return Index;
    	}
    
    	/*
    		This should remove an element at the given index.
    	*/
    	virtual bool Remove(int p_Index) const
    	{
    		std::map<unsigned long, T*>::iterator find_iter = m_Map.find(p_Index);
    		if ( find_iter == m_Map.end() )
    			return false;
    		else
    		{
    			m_Indices.push_back(p_Index);
    			return _Free(m_Map[p_Index]);
    		}
    	}
    
    	/*
    		This should delete(free memory) of all elements.
    	*/
    	virtual void Clear() const
    	{
    		std::map<unsigned long, T*>::iterator free_iter = m_Map.begin();
    		for ( /**/; free_iter != m_Map.end(); ++free_iter )
    		{
    			_Free((*free_iter).second);
    		}
    		m_Indices.clear();
    		m_Map.clear();
    		m_CurIndex = 0;
    	}
    
    	/*
    		These should access the element at given index.
    	*/
    	virtual T* operator[](unsigned long p_Index) const
    	{
    		std::map<unsigned long, T*>::iterator find_iter = m_Map.find(p_Index);
    
    		try
    		{
    			if ( find_iter == m_Map.end() )
    			{
    				throw (std::string("Bad index provided. cContainerBase<")+std::string(typeid(T).name())+std::string(">::operator[](unsigned long)"));
    			}
    		}
    		catch(const std::string& str)
    		{
    			std::cout << "\n" << str << "\n";
    			return NULL;
    		}
    		return (*find_iter).second;
    	}
    };
    This is the cSingletonBase class as well
    Code:
    #pragma once
    #include "VariaMacros.h"
    
    template< class T >
    class cSingletonBase
    {
    public:
        static T* Create()
        {
            if ( m_Singleton )
            {
                ++m_RefCount;
                return m_Singleton;
            }
            m_RefCount = 1;
            m_Singleton = new T;
            return m_Singleton;
        }
    
        static bool Free()
        {
            if ( m_Singleton )
            {
                //Bad ref count check
                if ( m_RefCount <= 0 )
                    _asm int 3
    
                --m_RefCount;
                if ( !m_RefCount )
                {
                    delete m_Singleton; m_Singleton = 0;
                    return true;
                }
                return false;
            }
            return true;
        }
    protected:
        cSingletonBase()
        { }
        virtual ~cSingletonBase()
        { }
    
    private:
        DisableClassCopying(cSingletonBase);
    
        static T* m_Singleton;
        static unsigned int m_RefCount;
    };
    
    template< class T > T* cSingletonBase< T >::m_Singleton = 0;
    template< class T > unsigned int cSingletonBase< T >::m_RefCount = 0;
    Last edited by Raigne; 11-03-2008 at 10:24 PM. Reason: small typo in code

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Inheritance: assign base class to derived class
    By MWAAAHAAA in forum C++ Programming
    Replies: 15
    Last Post: 01-22-2007, 04:31 PM
  2. deriving classes
    By l2u in forum C++ Programming
    Replies: 12
    Last Post: 01-15-2007, 05:01 PM
  3. Replies: 3
    Last Post: 10-31-2005, 12:05 PM
  4. dynamic array of base class pointers
    By Corrington_j in forum C++ Programming
    Replies: 1
    Last Post: 11-16-2003, 05:58 AM
  5. Difficulty superclassing EDIT window class
    By cDir in forum Windows Programming
    Replies: 7
    Last Post: 02-21-2002, 05:06 PM