#ifndef __LEDSDATA_H__ #define __LEDSDATA_H__ #include "datalib.h" // (Steve) #include #include using namespace std; #include template class DataFileIter; template class DataFile { ////////////////////////////////////////////////// // Friends // friend DataFileIter; ////////////////////////////////////////////////// // Enumerated Types // ////////////////////////////////////////////////// // Initialization // public: inline DataFile(); inline ~DataFile(); //inline VOID Init(); inline VOID Init(UINT_32 = 32); inline VOID Expand(UINT_32); inline DataFile *Copy(); ////////////////////////////////////////////////// // Input functions // public: inline UINT_32 AddItem(const compType &item); inline VOID SetNextItem(const compType &item); //inline VOID SetCurrentIndex(UINT_32); inline VOID Sort(int (*compar)(const void *, const void *)); ////////////////////////////////////////////////// // Output Functions // public: inline VOID DisplayAll() const; ////////////////////////////////////////////////// // Accessor Functions // public: inline compType *GetCurrentItem(); inline compType *GetItem(UINT_32); inline UINT_32 GetCurrentIndex() const; inline UINT_32 GetSize() const; inline compType *GetDataPtr() const; ////////////////////////////////////////////////// // Class Variables // ////////////////////////////////////////////////// // Member Variables // protected: UINT_32 m_uiSize; UINT_32 m_uiCurrent; compType *m_pTData; }; template inline DataFile::DataFile() { m_uiSize = 0; m_uiCurrent = 0; m_pTData = NULL; } template inline DataFile::~DataFile() { delete [] m_pTData; } /* template inline VOID DataFile::Init() { m_uiSize = 0; m_uiCurrent = 0; m_pTData = NULL; } */ template inline VOID DataFile::Init(UINT_32 uiSize) { m_uiSize = uiSize; m_pTData = new compType[uiSize]; } template inline DataFile *DataFile::Copy() { DataFile *pCopy; UINT_32 i; pCopy = new DataFile; pCopy->Init(m_uiSize); for (i = 0; i < m_uiSize; i++) { pCopy->SetNextItem(m_pTData[i]); } return pCopy; } template inline VOID DataFile::Expand(UINT_32 uiNewSize) { ASSERT (uiNewSize > m_uiSize); compType *pNewData; pNewData = new compType[uiNewSize]; // Is there some block copy we could use? UINT_32 i; for (i = 0; i < m_uiSize; i++) { pNewData[i] = m_pTData[i]; } delete [] m_pTData; m_pTData = pNewData; m_uiSize = uiNewSize; } template inline UINT_32 DataFile::AddItem(const compType &item) { if (m_uiCurrent >= m_uiSize) { if (m_uiSize == 0) m_uiSize = 1; Expand(2*m_uiSize); } m_pTData[m_uiCurrent] = item; return (m_uiCurrent++); } template inline VOID DataFile::SetNextItem(const compType &item) { m_pTData[m_uiCurrent++] = item; } // I assume that Current is number actually written, which currently seems // safe since I disabled SetCurrentIndex. template inline VOID DataFile:: Sort(int (*compar)(const void *, const void *)) { qsort((void *)(m_pTData), m_uiCurrent, sizeof(compType), compar); } // We don't actually want anyone mucking with this /* template inline VOID DataFile::SetCurrentIndex(UINT_32 Index) { m_uiCurrent = Index; } */ template inline UINT_32 DataFile::GetCurrentIndex() const { return m_uiCurrent; } template inline UINT_32 DataFile::GetSize() const { return m_uiSize; } template inline compType *DataFile::GetCurrentItem() { return &(m_pTData[m_uiCurrent - 1]); } template inline compType *DataFile::GetItem(UINT_32 Index) { if (Index < m_uiCurrent) return &(m_pTData[Index]); else return NULL; } template inline VOID DataFile::DisplayAll() const { UINT_32 i; for (i = 0; i < m_uiCurrent; i++) { cout << m_pTData[i] << "\n"; } } template inline compType *DataFile::GetDataPtr() const { return (m_pTData); } template class DataFileIter { public: inline DataFileIter(); inline ~DataFileIter(); inline VOID Init(DataFile *pDataFile); //protected: inline VOID Uninit(); inline BOOL Valid(); public: // Iteration Functions inline Type *PeekFirstItem(); inline Type *PeekNextItem(); // inline Type *PeekLastItem(); // inline Type *PeekPrevItem(); inline VOID BackUp(); protected: UINT_32 m_uiCurr; DataFile *m_pDataFile; }; template inline DataFileIter::DataFileIter() { m_uiCurr = 0; m_pDataFile = NULL; } template inline DataFileIter::~DataFileIter() { } template inline VOID DataFileIter::Init(DataFile *pDataFile) { m_pDataFile = pDataFile; m_uiCurr = 0; } template inline VOID DataFileIter::Uninit() { } template inline BOOL DataFileIter::Valid() { if (!m_pDataFile) return FALSE; if ((m_uiCurr < m_pDataFile->GetCurrentIndex()) )// && (m_iCurr >= 0)) return TRUE; else return FALSE; } template inline Type *DataFileIter::PeekFirstItem() { m_uiCurr = 0; return m_pDataFile->GetItem(m_uiCurr++); } template inline Type *DataFileIter::PeekNextItem() { return m_pDataFile->GetItem(m_uiCurr++); } /* template inline Type *DataFileIter::PeekLastItem() { m_uiCurr = m_pDataFile->GetCurrentIndex() - 1; return m_pDataFile->GetItem(m_uiCurr--); } template inline Type *DataFileIter::PeekPrevItem() { return m_pDataFile->GetItem(m_uiCurr--); } */ template inline VOID DataFileIter::BackUp() { m_uiCurr--; } // (compType = composite type) // Have to declare compType separately instead of deriving it from // Types 1 & 2 so that inheritance for Triples will work template class DataPairFile : public DataFile { ////////////////////////////////////////////////// // Initialization // public: inline DataPairFile(); inline ~DataPairFile(); inline DataPairFile *Copy(); ////////////////////////////////////////////////// // Input functions // public: inline VOID AddPair(Type1, Type2); //inline VOID Sort(int (*compar)(const void *, const void *)); }; ////////////////////////////////////////////////////////////////////////////// // Inlined Functions // template inline DataPairFile::DataPairFile() { } template inline DataPairFile::~DataPairFile() { } template inline VOID DataPairFile::AddPair(Type1 First, Type2 Second){ if (m_uiCurrent >= m_uiSize) Expand(2*m_uiSize); m_pTData[m_uiCurrent].SetFirst(First); m_pTData[m_uiCurrent++].SetSecond(Second); } template inline DataPairFile *DataPairFile::Copy() { DataPairFile *pCopy; UINT_32 i; pCopy = new DataPairFile; pCopy->Init(m_uiSize); for (i = 0; i < m_uiSize; i++) { pCopy->SetNextItem(m_pTData[i]); } return pCopy; } template class DataTripleFile : public DataPairFile { public: inline DataTripleFile(); inline ~DataTripleFile(); inline VOID AddTriple(Type1, Type2, Type3); }; ////////////////////////////////////////////////////////////////////////////// // Inlined Functions // template inline DataTripleFile::DataTripleFile() { } template inline DataTripleFile::~DataTripleFile() { } template inline VOID DataTripleFile:: AddTriple(Type1 First, Type2 Second, Type3 Third){ if (m_uiCurrent >= m_uiSize) Expand(2*m_uiSize); m_pTData[m_uiCurrent].SetFirst(First); m_pTData[m_uiCurrent].SetSecond(Second); m_pTData[m_uiCurrent++].SetThird(Third); } #endif // __LEDSDATA_H__