//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : SelManager.h Data : 19.05.14 Versione : 1.5e7 // Contenuto : Dichiarazione e implementazione della classe SelManager. // // // // Modifiche : 19.03.14 DS Creazione modulo. // 19.05.14 DS La AddObj non controlla eventuale precedente presenza // oggetto in lista, perchè già si fa tramite flag di GdbObj. // //---------------------------------------------------------------------------- #pragma once class GdbObj ; //---------------------------------------------------------------------------- class SelManager { public : SelManager( void) : m_nCount( 0), m_pFirst( nullptr), m_pLast( nullptr), m_pCurr( nullptr) {} int GetSize( void) const { return m_nCount ; } bool AddObj( GdbObj* pGObj) { if ( pGObj == nullptr) return false ; if ( m_pLast == nullptr) { m_pLast = pGObj ; m_pFirst = pGObj ; pGObj->m_pSelNext = nullptr ; pGObj->m_pSelPrev = nullptr ; } else { pGObj->m_pSelNext = nullptr ; pGObj->m_pSelPrev = m_pLast ; m_pLast->m_pSelNext = pGObj ; m_pLast = pGObj ; } ++ m_nCount ; return true ; } bool RemoveObj( GdbObj* pGObj) { if ( pGObj == nullptr) return false ; if ( m_pCurr == pGObj) m_pCurr = nullptr ; if ( m_pFirst == pGObj && m_pLast == pGObj) { m_pFirst = nullptr ; m_pLast = nullptr ; } else if ( m_pFirst == pGObj) { m_pFirst = pGObj->m_pSelNext ; if ( m_pFirst != nullptr) m_pFirst->m_pSelPrev = nullptr ; } else if ( m_pLast == pGObj) { m_pLast = pGObj->m_pSelPrev ; if ( m_pLast != nullptr) m_pLast->m_pSelNext = nullptr ; } else { if ( pGObj->m_pSelNext == nullptr && pGObj->m_pSelPrev == nullptr) return false ; if ( pGObj->m_pSelPrev != nullptr) pGObj->m_pSelPrev->m_pSelNext = pGObj->m_pSelNext ; if ( pGObj->m_pSelNext != nullptr) pGObj->m_pSelNext->m_pSelPrev = pGObj->m_pSelPrev ; } pGObj->m_pSelNext = nullptr ; pGObj->m_pSelPrev = nullptr ; -- m_nCount ; return true ; } GdbObj* GetFirstObj( void) const { m_pCurr = m_pFirst ; return m_pCurr ; } GdbObj* GetNextObj( void) const { if ( m_pCurr != nullptr) m_pCurr = m_pCurr->m_pSelNext ; return m_pCurr ; } GdbObj* GetLastObj( void) const { m_pCurr = m_pLast ; return m_pCurr ; } GdbObj* GetPrevObj( void) const { if ( m_pCurr != nullptr) m_pCurr = m_pCurr->m_pSelPrev ; return m_pCurr ; } private : int m_nCount ; GdbObj* m_pFirst ; GdbObj* m_pLast ; mutable GdbObj* m_pCurr ; } ;