commit 2025-10-05 14:36 edit ZCppMain/ZtCLinkList.H
This commit is contained in:
@ -1,7 +1,10 @@
|
||||
|
||||
|
||||
// is editing
|
||||
|
||||
|
||||
#ifndef __ZCPPMAIN__ZMAINHEAD_H__
|
||||
#define __ZCPPMAIN__ZMAINHEAD_H__
|
||||
#ifndef __ZCPPMAIN__ZTCLINKLIST_H__
|
||||
#define __ZCPPMAIN__ZTCLINKLIST_H__
|
||||
|
||||
|
||||
#include "ZCppMain/ZMainHead.H"
|
||||
@ -32,9 +35,6 @@ namespace ZNsMain
|
||||
ZtCLink* mp_PrevLink;
|
||||
protected:
|
||||
|
||||
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
|
||||
|
||||
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
|
||||
{
|
||||
AP_PrevLink->mp_NextLink=AP_NextLink;
|
||||
@ -77,6 +77,97 @@ namespace ZNsMain
|
||||
}/*
|
||||
ZtCLink& operator=(const ZtCLink& rhs)*/
|
||||
|
||||
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
||||
|
||||
const ZtCLink* GetNextPtr() const{return mp_NextLink;}
|
||||
const ZtCLink* GetPrevPtr() const{return mp_PrevLink;}
|
||||
|
||||
|
||||
ZtCLink* GetNextPtr(TypeSize AL_Distance)
|
||||
{
|
||||
TypeSize VL_LoopIndex=0 ;
|
||||
ZtCLink* VP_TmpLink =this;
|
||||
|
||||
while(VL_LoopIndex++ < AL_Distance)
|
||||
VP_TmpLink = VP_TmpLink->mp_NextLink ;
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetNextPtr(TypeSize AL_Distance)*/
|
||||
|
||||
ZtCLink* GetPrevPtr(TypeSize AL_Distance)
|
||||
{
|
||||
TypeSize VL_LoopIndex=0 ;
|
||||
ZtCLink* VP_TmpLink =this;
|
||||
|
||||
while(VL_LoopIndex++ < AL_Distance)
|
||||
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetPrevPtr(TypeSize AL_Distance)*/
|
||||
|
||||
|
||||
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
TypeSize VL_LoopIndex=0 ;
|
||||
ZtCLink* VP_TmpLink =const_cast<ZtCLink*>(this);
|
||||
|
||||
while(VL_LoopIndex++ < AL_Distance)
|
||||
VP_TmpLink = VP_TmpLink->mp_NextLink ;
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
TypeSize VL_LoopIndex=0 ;
|
||||
ZtCLink* VP_TmpLink = const_cast<ZtCLink*>(this) ;
|
||||
|
||||
while(VL_LoopIndex++ < AL_Distance)
|
||||
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink& operator+(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
return *GetNextPtr(AL_Distance);
|
||||
else return *GetPrevPtr(AL_Distance);
|
||||
}/*
|
||||
ZtCLink& operator+(TypeSize AL_Distance)*/
|
||||
|
||||
ZtCLink& operator-(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
return *GetPrevPtr(AL_Distance);
|
||||
else return *GetNextPtr(AL_Distance);
|
||||
}/*
|
||||
ZtCLink& operator-(TypeSize AL_Distance)*/
|
||||
|
||||
|
||||
const ZtCLink& operator+(TypeSize AL_Distance) const
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
return *GetNextPtr(AL_Distance);
|
||||
else return *GetPrevPtr(AL_Distance);
|
||||
}/*
|
||||
const ZtCLink& operator+(TypeSize AL_Distance) const*/
|
||||
|
||||
const ZtCLink& operator-(TypeSize AL_Distance) const
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
return *GetPrevPtr(AL_Distance);
|
||||
else return *GetNextPtr(AL_Distance);
|
||||
}/*
|
||||
const ZtCLink& operator-(TypeSize AL_Distance) const*/
|
||||
|
||||
public :
|
||||
};/*
|
||||
template
|
||||
@ -100,8 +191,8 @@ namespace ZNsMain
|
||||
ZtCLink* mp_PrevLink;
|
||||
public :
|
||||
|
||||
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
||||
|
||||
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
|
||||
{
|
||||
@ -166,8 +257,8 @@ namespace ZNsMain
|
||||
ZtCLink* mp_PrevLink;
|
||||
protected:
|
||||
|
||||
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
||||
|
||||
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
|
||||
{
|
||||
@ -226,8 +317,8 @@ namespace ZNsMain
|
||||
ZtCLink* mp_PrevLink;
|
||||
protected:
|
||||
|
||||
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
||||
|
||||
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
|
||||
{
|
||||
@ -272,11 +363,26 @@ namespace ZNsMain
|
||||
|
||||
|
||||
|
||||
template
|
||||
<typename TCLink, typename TTypSize=ZTypLong>
|
||||
class ZtCLinkList
|
||||
template //////////////////////////////////////////////////////////////////
|
||||
<
|
||||
typename TCLink
|
||||
, typename TTypSize = ZTypLong
|
||||
, typename TTypeCRTP =
|
||||
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
|
||||
>
|
||||
class ZtCLinkList /*#####################################################*/
|
||||
{
|
||||
public :
|
||||
|
||||
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
|
||||
<
|
||||
ZtCLinkList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
|
||||
>
|
||||
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
|
||||
|
||||
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
|
||||
|
||||
public :
|
||||
typedef TCLink ZCLink ;
|
||||
typedef TCLink TypeData;
|
||||
typedef TTypSize TypeSize;
|
||||
@ -286,28 +392,266 @@ namespace ZNsMain
|
||||
TypeSize ml_LinkSize;
|
||||
private:
|
||||
|
||||
TypeChild& GetChildObj()
|
||||
{
|
||||
return *static_cast<TypeChild*>(this);
|
||||
}/*
|
||||
TypeChild& GetChildObj()*/
|
||||
|
||||
private:
|
||||
|
||||
_VT_ ZCLink* NewLink()
|
||||
{
|
||||
if(TTypeCRTP::ZEUseCRTP<1)
|
||||
{ return new ZCLink; }
|
||||
|
||||
return GetChildObj().NewLink();
|
||||
}/*
|
||||
_VT_ ZCLink* NewLink()*/
|
||||
|
||||
_VT_ void DelLink(ZCLink* AP_DelLink)
|
||||
{
|
||||
if(TTypeCRTP::ZEUseCRTP<1)
|
||||
{ return delete ZCLink; }
|
||||
|
||||
return GetChildObj().DelLink(AP_DelLink);
|
||||
}/*
|
||||
_VT_ void DelLink(ZCLink* AP_DelLink)*/
|
||||
|
||||
private:
|
||||
|
||||
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)
|
||||
{
|
||||
// AR_LinkNew 를 AP_LinkStd 뒤에 삽입한다.
|
||||
// AL_PosStd==0 이면 맨 앞에 삽입한다.
|
||||
|
||||
if(AP_LinkStd==0)
|
||||
{
|
||||
// 맨 앞에 삽입.
|
||||
|
||||
if(++ml_LinkSize==1)
|
||||
{
|
||||
mp_HeadLink = &AR_LinkNew ;
|
||||
mp_TailLink = &AR_LinkNew ;
|
||||
|
||||
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
|
||||
}
|
||||
else
|
||||
{
|
||||
ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink);
|
||||
ZCLink::MakeRing(&AR_LinkNew, mp_TailLink);
|
||||
|
||||
mp_HeadLink=&AR_LinkNew;
|
||||
}/*
|
||||
else*/
|
||||
}
|
||||
else
|
||||
{
|
||||
++ml_LinkSize;
|
||||
|
||||
ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ;
|
||||
|
||||
ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew);
|
||||
ZCLink::JoinLink(&AR_LinkNew, AP_NextStd );
|
||||
}/*
|
||||
else*/
|
||||
|
||||
return AR_LinkNew;
|
||||
}/*
|
||||
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
||||
|
||||
|
||||
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)
|
||||
{
|
||||
// AR_LinkNew 를 AP_LinkStd 앞에 삽입한다.
|
||||
// AL_PosStd==0 이면 맨 뒤에 삽입한다.
|
||||
|
||||
if(AP_LinkStd==0)
|
||||
{
|
||||
// 맨 뒤에 삽입.
|
||||
|
||||
if(++ml_LinkSize==1)
|
||||
{
|
||||
mp_HeadLink = &AR_LinkNew ;
|
||||
mp_TailLink = &AR_LinkNew ;
|
||||
|
||||
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
|
||||
}
|
||||
else
|
||||
{
|
||||
ZCLink::JoinLink(mp_TailLink, &AR_LinkNew);
|
||||
ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew);
|
||||
|
||||
mp_HeadLink=&AR_LinkNew;
|
||||
}/*
|
||||
else*/
|
||||
}
|
||||
else
|
||||
{
|
||||
++ml_LinkSize;
|
||||
|
||||
ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ;
|
||||
|
||||
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
|
||||
ZCLink::JoinLink(&AR_LinkNew, AP_LinkStd);
|
||||
}/*
|
||||
else*/
|
||||
|
||||
return AR_LinkNew;
|
||||
}/*
|
||||
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
||||
|
||||
|
||||
ZCLink& CutLink(ZCLink& AR_CutLink)
|
||||
{
|
||||
if(&AR_CutLink==mp_HeadLink)
|
||||
{
|
||||
if(mp_HeadLink==mp_TailLink)
|
||||
mp_HeadLink=0;
|
||||
else
|
||||
{
|
||||
ZCLink::MakeRing ////////////////////////////
|
||||
(
|
||||
mp_HeadLink=mp_HeadLink->mp_NextLink,
|
||||
AR_CutLink.mp_PrevLink
|
||||
);
|
||||
/////////////////////////////////////////////
|
||||
}/*
|
||||
else*/
|
||||
}
|
||||
else if(&AR_CutLink==mp_TailLink)
|
||||
{
|
||||
ZCLink* VP_NewTail=AR_CutLink.mp_PrevLink;
|
||||
|
||||
ZCLink::MakeRing(mp_HeadLink, VP_NewTail);
|
||||
|
||||
mp_TailLink = VP_NewTail ;
|
||||
}
|
||||
else ZCLink::JoinLink(AR_CutLink. mp_PrevLink, AR_CutLink.mp_NextLink);
|
||||
|
||||
return (--ml_LinkSize, AR_CutLink);
|
||||
}/*
|
||||
ZCLink& CutLink(ZCLink& AR_CutLink)*/
|
||||
|
||||
|
||||
public :
|
||||
|
||||
ZtCLinkList()
|
||||
{
|
||||
mp_HeadLink=0;
|
||||
mp_TailLink=0;
|
||||
ml_LinkSize=0;
|
||||
}/*
|
||||
ZtCLinkList()*/
|
||||
ZtCLinkList()
|
||||
{
|
||||
mp_HeadLink=0;
|
||||
mp_TailLink=0;
|
||||
ml_LinkSize=0;
|
||||
}/*
|
||||
ZtCLinkList()*/
|
||||
|
||||
ZtCLinkList(const ZtCLinkList& rhs)
|
||||
{
|
||||
mp_HeadLink=0;
|
||||
mp_TailLink=0;
|
||||
ml_LinkSize=0;
|
||||
}/*
|
||||
ZtCLinkList(const ZtCLinkList& rhs)*/
|
||||
|
||||
~ZtCLinkList()
|
||||
{
|
||||
DeleteAll();
|
||||
}/*
|
||||
~ZtCLinkList()*/
|
||||
|
||||
|
||||
// is adding codes
|
||||
ZtCLinkList& operator=(const ZtCLinkList& rhs)
|
||||
{
|
||||
return *this;
|
||||
}/*
|
||||
ZtCLinkList& operator=(const ZtCLinkList& rhs)*/
|
||||
|
||||
|
||||
void DeleteAll()
|
||||
{
|
||||
if(ml_LinkSize<1) return;
|
||||
|
||||
ZCLink VP_DelLink = mp_HeadLink;
|
||||
|
||||
__for0(TypeSize, i, ml_LinkSize)
|
||||
{
|
||||
mp_HeadLink = mp_HeadLink->mp_NextLink;
|
||||
|
||||
DelLink(VP_DelLink); VP_DelLink = mp_HeadLink;
|
||||
}/*
|
||||
__for0(TypeSize, i, ml_LinkSize)*/
|
||||
|
||||
mp_HeadLink=0;
|
||||
mp_TailLink=0;
|
||||
ml_LinkSize=0;
|
||||
}/*
|
||||
void DeleteAll()*/
|
||||
|
||||
void clear(){DeleteAll();}
|
||||
|
||||
|
||||
ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); }
|
||||
ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); }
|
||||
|
||||
void DelHead()
|
||||
{ if(ml_LinkSize<1) return; DelLink( CutLink(mp_HeadLink) ); }
|
||||
void DelTail()
|
||||
{ if(ml_LinkSize<1) return; DelLink( CutLink(mp_TailLink) ); }
|
||||
|
||||
|
||||
void Delete(ZCLink& AR_DelLink)
|
||||
{
|
||||
DelLink( &CutLink(AR_DelLink) );
|
||||
}/*
|
||||
void Delete(ZCLink& AR_DelLink)*/
|
||||
|
||||
|
||||
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)
|
||||
{
|
||||
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다.
|
||||
// AP_StdLink==0 이면, rhs 의 앞에 삽입한다.
|
||||
|
||||
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, AP_StdLink);
|
||||
}/*
|
||||
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/
|
||||
|
||||
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)
|
||||
{
|
||||
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
|
||||
// AP_StdLink==0 이면, rhs 의 뒤에 삽입한다.
|
||||
|
||||
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, AP_StdLink);
|
||||
}/*
|
||||
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/
|
||||
|
||||
|
||||
void SendOutHead(ZCLink& AR_CutLink, ZtCObjList& rhs)
|
||||
{
|
||||
// AR_CutLink 를 잘라서 rhs 의 앞에 연결한다.
|
||||
|
||||
SendOutAfter (AR_CutLink, rhs, 0);
|
||||
}
|
||||
void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)
|
||||
{
|
||||
// AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
|
||||
|
||||
SendOutBefore(AR_CutLink, rhs, 0);
|
||||
}/*
|
||||
void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)*/
|
||||
|
||||
|
||||
public :
|
||||
};/*
|
||||
template
|
||||
<typename TCLink, typename TTypSize=ZTypLong>
|
||||
class ZtCLinkList*/
|
||||
template //////////////////////////////////////////////////////////////////
|
||||
<
|
||||
typename TCLink
|
||||
, typename TTypSize = ZTypLong
|
||||
, typename TTypeCRTP =
|
||||
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
|
||||
>
|
||||
class ZtCLinkList #######################################################*/
|
||||
|
||||
}/*
|
||||
namespace ZNsMain*/
|
||||
|
||||
|
||||
#endif //__ZCPPMAIN__ZMAINHEAD_H__
|
||||
#endif //__ZCPPMAIN__ZTCLINKLIST_H__
|
||||
|
Reference in New Issue
Block a user