// // File: hzTmplVect.h // // Legal Notice: This file is part of the HadronZoo C++ Class Library. // // Copyright 2025 HadronZoo Project (http://www.hadronzoo.com) // // The HadronZoo C++ Class Library is free software: You can redistribute it, and/or modify it under the terms of the GNU Lesser General Public License, as published by the Free // Software Foundation, either version 3 of the License, or any later version. // // The HadronZoo C++ Class Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR // A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with the HadronZoo C++ Class Library. If not, see http://www.gnu.org/licenses. //
#ifndef hzTmplVect_h #define hzTmplVect_h
#include "hzString.h" #include "hzLock.h" #include "hzProcess.h" #include "hzIsamT.h"
/* ** The Vector Template */
template <class OBJ> class hzVect { _hz_tmpl_ISAM base ; // The base index OBJ m_Null ; // NULL Object mutable OBJ m_Default ; // Default (null) object
// Prevent copies hzVect<OBJ> (const hzVect<OBJ>&) ; hzVect<OBJ>& operator= (const hzVect<OBJ>&) ;
public: hzVect (void) { base.Start(sizeof(OBJ), 0) ; base.SetLock(HZ_NOLOCK) ; memset(&m_Null, 0, sizeof(OBJ)) ; _hzGlobal_Memstats.m_numVectors++ ; }
hzVect (hzLockOpt eLock) { base.Start(sizeof(OBJ), 0) ; base.SetLock(eLock) ; memset(&m_Null, 0, sizeof(OBJ)) ; _hzGlobal_Memstats.m_numVectors++ ; }
hzVect (const hzString& name) { base.Start(sizeof(OBJ), 0) ; base.SetLock(HZ_NOLOCK) ; base.SetName(name) ; memset(&m_Null, 0, sizeof(OBJ)) ; _hzGlobal_Memstats.m_numVectors++ ; }
hzVect (hzLockOpt eLock, const hzString& name) { base.Start(sizeof(OBJ), 0) ; base.SetLock(eLock) ; base.SetName(name) ; memset(&m_Null, 0, sizeof(OBJ)) ; _hzGlobal_Memstats.m_numVectors++ ; }
~hzVect (void) { _hzGlobal_Memstats.m_numVectors-- ; }
// Set functions void SetLock (hzLockOpt eLock) { base.SetLock(eLock) ; } void SetName (const hzString& name) { base.SetName(name) ; } void LockRead (void) { base.LockRead() ; } void LockWrite (void) { base.LockWrite() ; } void Unlock (void) { base.Unlock() ; }
// Get functions uint32_t Count (void) const { return base.Count() ; } uint32_t Nodes (void) const { return base.Nodes() ; } uint32_t Level (void) const { return base.Level() ; } uint32_t IsamId (void) const { return base.IsamId() ; } hzString Name (void) const { return base.Name() ; }
// Modify data functions hzEcode Add (OBJ key) { _hzfunc("hzVect::Add") ;
_hz_set_bkt<OBJ>* pBuck ;
_hz_vn_Dat* pDN ; int32_t nSlot ;
pDN = base.InsertPosn(nSlot, Count()) ; if (pDN) { pBuck = (_hz_set_bkt<OBJ>*) pDN->m_pElements ; pBuck->m_Keys[nSlot] = key ; return E_OK ; } return E_CORRUPT ; }
hzEcode Insert (OBJ key, uint32_t nPosn) { _hzfunc("hzVect::Insert") ;
_hz_set_bkt<OBJ>* pBuck ;
_hz_vn_Dat* pDN ; int32_t nSlot ;
pDN = base.InsertPosn(nSlot, nPosn) ; if (pDN) { pBuck = (_hz_set_bkt<OBJ>*) pDN->m_pElements ; pBuck->m_Keys[nSlot] = key ; return E_OK ; } return E_CORRUPT ; }
hzEcode Delete (uint32_t nPosn) { _hzfunc("hzVect::Delete") ;
_hz_set_bkt<OBJ>* pBuck ;
_hz_vn_Dat* pDN ; int32_t nSlot ;
pDN = base._findDnodeByPos(nSlot, nPosn, false) ; if (pDN) { pBuck = (_hz_set_bkt<OBJ>*) pDN->m_pElements ; pBuck->m_Keys[nSlot] = m_Null ; }
return base.DeletePosn(nPosn) ; }
void Clear (void) { base.Clear() ; }
OBJ& operator[] (uint32_t nIndex) const { _hz_set_bkt<OBJ>* pBuck ;
_hz_vn_Dat* pDN ; int32_t nSlot ;
pDN = base._findDnodeByPos(nSlot, nIndex, false) ; if (!pDN) { m_Default = m_Null ; return m_Default ; }
pBuck = (_hz_set_bkt<OBJ>*) pDN->m_pElements ; return pBuck->m_Keys[nSlot] ; }
OBJ* InSitu (uint32_t nIndex) const { // Return pointer to the actual in-situ object
_hz_set_bkt<OBJ>* pBuck ; OBJ* pObj ; // Object pointer
_hz_vn_Dat* pDN ; int32_t nSlot ;
pDN = base._findDnodeByPos(nSlot, nIndex, false) ; if (!pDN) return 0 ;
pBuck = (_hz_set_bkt<OBJ>*) pDN->m_pElements ; pObj = (OBJ*) pBuck->m_Keys ; pObj += nSlot ; return pObj ; }
} ;
#endif // hzIsamVect_h