// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _JBIG2_LIST_H_
#define _JBIG2_LIST_H_
#include "JBig2_Define.h"
#include "JBig2_Object.h"
template <class TYPE>
class CJBig2_List : public CJBig2_Object
{
public:

    CJBig2_List(FX_INT32 nSize = 8)
    {
        m_nSize = nSize;
        m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);
        m_nLength = 0;
    }

    ~CJBig2_List()
    {
        clear();
        m_pModule->JBig2_Free(m_pArray);
    }

    void clear()
    {
        FX_INT32 i;
        for(i = 0; i < m_nLength; i++) {
            delete m_pArray[i];
        }
        m_nLength = 0;
    }

    void addItem(TYPE *pItem)
    {
        if(m_nLength >= m_nSize) {
            m_nSize += 8;
            m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);
        }
        m_pArray[m_nLength++] = pItem;
    }


    FX_INT32 getLength()
    {
        return m_nLength;
    }

    TYPE *getAt(FX_INT32 nIndex)
    {
        return m_pArray[nIndex];
    }

    TYPE *getLast()
    {
        return m_pArray[m_nLength - 1];
    }
private:
    FX_INT32 m_nSize;
    TYPE **m_pArray;
    FX_INT32 m_nLength;
};
#endif
