commit 2025-10-06 10:50 add SendRangeOutAfter() : ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-06 10:50:25 +09:00
parent b714f5579c
commit afe609c463
2 changed files with 165 additions and 8 deletions

View File

@ -1065,7 +1065,7 @@ namespace ZNsMain
{
// 맨 앞에 삽입.
if(++ml_LinkSize==1)
if(ml_LinkSize==0)
{
mp_HeadLink = &AR_LinkNew ;
mp_TailLink = &AR_LinkNew ;
@ -1081,10 +1081,15 @@ namespace ZNsMain
}/*
else*/
}
else if(AP_LinkStd==mp_TailLink)
{
ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ;
ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ;
mp_TailLink = &AR_LinkNew;
}
else
{
++ml_LinkSize;
ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ;
ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew);
@ -1092,7 +1097,7 @@ namespace ZNsMain
}/*
else*/
return AR_LinkNew;
++ml_LinkSize; return AR_LinkNew;
}/*
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
@ -1106,7 +1111,7 @@ namespace ZNsMain
{
// 맨 뒤에 삽입.
if(++ml_LinkSize==1)
if(ml_LinkSize==0)
{
mp_HeadLink = &AR_LinkNew ;
mp_TailLink = &AR_LinkNew ;
@ -1122,10 +1127,15 @@ namespace ZNsMain
}/*
else*/
}
else if(AP_LinkStd==mp_HeadLink)
{
ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink);
ZCLink::MakeRing(&AR_LinkNew, mp_TailLink);
mp_HeadLink = &AR_LinkNew;
}
else
{
++ml_LinkSize;
ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ;
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
@ -1133,7 +1143,7 @@ namespace ZNsMain
}/*
else*/
return AR_LinkNew;
++ml_LinkSize; return AR_LinkNew;
}/*
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
@ -1274,6 +1284,93 @@ namespace ZNsMain
}/*
ZCLink& CutLink(ZCLink& AR_CutLink)*/
ZtCLinkList& CutLinkRangeOut /*#######################################*/
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCLinkList& rhs ,
ZCLink* AP_RhsStd
)
/*#####################################################################*/
{
/*///////////////////////////////////////////////////////////
■ AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크.
AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크.
AP_CutHead 의 앞과 AP_CutTail 의 뒤에서 연결 상태를 끊고,
rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면
맨 앞에 삽입한다. -- 2025-10-06 09:16
///////////////////////////////////////////////////////////*/
if(this==&rhs ) return rhs;
if(ml_LinkSize<1) return rhs;
if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때.
{
mp_HeadLink=0;
}
else if(&AR_CutHead==mp_HeadLink) // 잘라내려는 링크가 처음 링크를 포함할 때.
{
ZCLink::MakeRing
(mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink);
}
else if(&AR_CutTail==mp_TailLink) // 잘라내려는 링크가 끝 링크를 포함할 때.
{
ZCLink::MakeRing(mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink);
}
else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때.
{
ZCLink::JoinLink(AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink);
}/*
else*/
ml_LinkSize -= AL_CutSize;
if(rhs.size()<1)
{
// AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다.
ZCLink::MakeRing(&AR_CutHead, &AR_CutTail);
rhs.mp_HeadLink = &AR_CutHead ;
rhs.mp_TailLink = &AR_CutTail ;
}
else if(AP_RhsStd==0) // 맨 앞에 삽입.
{
ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink);
ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink);
rhs.mp_HeadLink = &AR_CutHead;
}
else // AP_RhsStd 의 뒤에 삽입.
{
ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ;
ZCLink::JoinLink(AP_RhsStd , &AR_CutHead );
ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext);
if(AP_RhsStd==rhs.mp_TailLink)
{ rhs.mp_TailLink = &AR_CutTail; }
}/*
else*/
rhs.ml_LinkSize += AL_CutSize; return rhs;
}/*
ZtCLinkList& CutLinkRangeOut ###########################################
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCLinkList& rhs ,
ZCLink* AP_RhsStd
)
#######################################################################*/
/*private:*/
public :
@ -1476,6 +1573,36 @@ namespace ZNsMain
void SendOutTail(ZCLink& AR_CutLink, ZtCLinkList& rhs)*/
ZtCLinkList& SendRangeOutAfter //////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCLinkList& rhs ,
ZCObjOpt AO_ObjOpt
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
return CutLinkRangeOut
(
AR_CutHead, AR_CutTail, AI_CutSize, rhs,
( bool(AO_ObjOpt) ? &AO_ObjOpt.value() : 0 )
);
//////////////////////
}/*
ZtCLinkList& SendRangeOutAfter //////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCLinkList& rhs ,
ZCObjOpt AO_ObjOpt
)
/*#####################################################################*/
template<typename TFunctor> void IterElement(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink=mp_HeadLink;