commit 2025-10-06 08:36 add GetNextPrevPtr() in ZtCLink : ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-06 08:36:21 +09:00
parent d7ed80d1b0
commit b714f5579c
4 changed files with 269 additions and 22 deletions

View File

@ -108,7 +108,8 @@ namespace ZNsMain
ZtCLink& operator=(TypeBase& AR_CBase)*/
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
ZtCLink* GetNextPtr(){return mp_NextLink;}
@ -168,6 +169,31 @@ namespace ZNsMain
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
{
ZtCLink* VP_TmpLink=this;
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
{
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
ZtCLink& operator+(TypeSize AL_Distance)
{
if(AL_Distance>=0)
@ -281,7 +307,8 @@ namespace ZNsMain
TypeThis& operator=(TypeBase& AR_CBase)*/
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
ZtCLink* GetNextPtr(){return mp_NextLink;}
@ -341,6 +368,31 @@ namespace ZNsMain
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
{
ZtCLink* VP_TmpLink=this;
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
{
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
ZtCLink& operator+(TypeSize AL_Distance)
{
if(AL_Distance>=0)
@ -439,8 +491,8 @@ namespace ZNsMain
TypeThis& operator=(const TypeThis& rhs)*/
TypeThis& operator()(){ return *this; }
/***/ TypeThis& operator()() { return *this; }
const TypeThis& operator()() const{ return *this; }
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
@ -499,6 +551,31 @@ namespace ZNsMain
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
{
ZtCLink* VP_TmpLink=this;
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
{
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
ZtCLink& operator+(TypeSize AL_Distance)
{
if(AL_Distance>=0)
@ -653,6 +730,31 @@ namespace ZNsMain
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
{
ZtCLink* VP_TmpLink=this;
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
{
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
if(AL_Distance>=0)
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
ZtCLink& operator+(TypeSize AL_Distance)
{
if(AL_Distance>=0)
@ -1036,6 +1138,110 @@ namespace ZNsMain
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink)
{
// AP_StdLink 의 뒤에 rhs 를 삽입.
if(this==&rhs ) return *this;
if(rhs.size()<1) return *this;
if(AP_StdLink==0) // 맨 앞에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = rhs.mp_HeadLink ;
mp_TailLink = rhs.mp_TailLink ;
ml_LinkSize = rhs.ml_LinkSize ;
}
else // ml_LinkSize>=1
{
ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink );
ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink );
mp_HeadLink = rhs.mp_HeadLink ;
ml_LinkSize = rhs.ml_LinkSize ;
}/*
else // ml_LinkSize>=1*/
ml_LinkSize += rhs.ml_LinkSize;
rhs.mp_HeadLink = 0 ;
rhs.mp_TailLink = 0 ;
rhs.ml_LinkSize = 0 ;
return *this;
}/*
if(AP_StdLink==0)*/
ZCLink* VP_StdNext=AP_StdLink->mp_NextLink;
ZCLink::JoinLink(AP_StdLink , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext );
if(AP_StdLink==mp_TailLink)
{ mp_TailLink=rhs.mp_TailLink; }
rhs.mp_HeadLink =0 ;
rhs.mp_TailLink =0 ;
rhs.ml_LinkSize =0 ;
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink)
{
// AP_StdLink 의 앞에 rhs 를 삽입.
if(this==&rhs ) return *this;
if(rhs.size()<1) return *this;
if(AP_StdLink==0) // 맨 뒤에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = rhs.mp_HeadLink ;
mp_TailLink = rhs.mp_TailLink ;
ml_LinkSize = rhs.ml_LinkSize ;
}
else // ml_LinkSize>=1
{
ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink );
ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink );
mp_TailLink = rhs.mp_TailLink ;
ml_LinkSize += rhs.ml_LinkSize ;
}/*
else // ml_LinkSize>=1*/
rhs.mp_HeadLink=0;
rhs.mp_TailLink=0;
rhs.ml_LinkSize=0;
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
if(AP_StdLink==0)*/
ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink;
ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink );
if(AP_StdLink==mp_HeadLink)
{ mp_HeadLink = rhs.mp_HeadLink; }
rhs.mp_HeadLink =0 ;
rhs.mp_TailLink =0 ;
rhs.ml_LinkSize =0 ;
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
ZCLink& CutLink(ZCLink& AR_CutLink)
{
if(&AR_CutLink==mp_HeadLink)
@ -1084,6 +1290,8 @@ namespace ZNsMain
mp_HeadLink=0;
mp_TailLink=0;
ml_LinkSize=0;
*this = rhs ;
}/*
ZtCLinkList(const ZtCLinkList& rhs)*/
@ -1154,7 +1362,7 @@ namespace ZNsMain
__for0(TypeSize, i, rhs.size())
{
**VP_LhsLink = **VP_RhsLink ;
*VP_LhsLink = *VP_RhsLink ;
VP_RhsLink = VP_RhsLink->mp_NextLink;
VP_LhsLink = VP_LhsLink->mp_NextLink;
@ -1166,8 +1374,10 @@ namespace ZNsMain
ZtCLinkList& operator=(const ZtCLinkList& rhs)*/
TypeSize GetSize(){return ml_LinkSize;}
TypeSize size (){return ml_LinkSize;}
TypeSize GetSize() const{return ml_LinkSize ;}
TypeSize size () const{return ml_LinkSize ;}
bool IsEmpty() const{return ml_LinkSize<1;}
void DeleteAll()
@ -1225,6 +1435,15 @@ namespace ZNsMain
void Delete(ZCLink& AR_DelLink)*/
ZtCLinkList& JoinAfter (ZtCLinkList& rhs, ZCLink& AR_StdLink)
{ return JoinAfter (rhs, &AR_StdLink); }
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink& AR_StdLink)
{ return JoinBefore(rhs, &AR_StdLink); }
ZtCLinkList& JoinHead(ZtCLinkList& rhs){ return JoinAfter (rhs, 0); }
ZtCLinkList& JoinTail(ZtCLinkList& rhs){ return JoinBefore(rhs, 0); }
void SendOutAfter (ZCLink& AR_CutLink, ZtCLinkList& rhs, ZCLink& AR_StdLink)
{
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.

View File

@ -1221,9 +1221,8 @@ namespace ZNsMain
)
/*#############################################################################*/
{
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치
// 따라서 AL_CutHeadPos <= AL_CutTailPos
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
if(this==&ARR_StoreList) return *this ;
@ -2103,9 +2102,8 @@ namespace ZNsMain
)
/*#############################################################################*/
{
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치
// 따라서 AL_CutHeadPos <= AL_CutTailPos
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
if(this==&ARR_StoreList) return *this ;