commit 2025-10-16 01:58 add ZtCLinkList::MoveLinkIn() & MoveRangeIn() : ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-16 01:58:39 +09:00
parent 023e1d8a0a
commit 4838bb74ef
4 changed files with 335 additions and 124 deletions

View File

@ -2576,45 +2576,225 @@ namespace ZNsMain
TypeThis& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/
TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)
{
if(size()<=1 || &AR_MoveLink==&AR_StdLink){return *this;}
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) /////////////////////////////////////////////
{
// AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결.
ZCLink VO_FakeHead ;
ZCLink VO_FakeTail ;
ZCLink* VP_FakeHead = &VO_FakeHead ;
ZCLink* VP_FakeTail = &VO_FakeTail ;
ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ;
ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ;
ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink;
ZCLink::JoinLink(VP_MovePrev, VP_MoveNext);
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AR_MoveLink 떼어 내기 완료.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink );
}
mp_HeadLink = VP_FakeHead->mp_NextLink;
mp_TailLink = VP_FakeTail->mp_PrevLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
return *this; /***************************/
}/*
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) ///////////////////////////////////////////*/
if( AB_After && AR_MoveLink.mp_PrevLink==&AR_StdLink)
{ return *this; }
if(!AB_After && AR_MoveLink.mp_NextLink==&AR_StdLink)
{ return *this; }
/*:::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink;
ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ;
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink );
}
return *this; /*::::::::::::::::::::::::::::::::*/
}/*
TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)*/
TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)
{
ZCLink* VP_LinkStd = AO_StdOpt.Raw();
if(VP_LinkStd==0)
{
if(AB_After)
{ VP_LinkStd = mp_HeadLink; AB_After=false; }
else{ VP_LinkStd = mp_TailLink; AB_After=true ; }
}/*
if(VP_LinkStd==0)*/
return MoveLinkIn(AR_MoveLink, *VP_LinkStd, AB_After);
}/*
TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)*/
TypeThis& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)
{
if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;}
if(size()<=1){return *this;} AddLinkAfter
( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ;
return *this; /**************************/
}/*
TypeThis& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/
{ return MoveLinkIn(AR_MoveLink, AO_StdOpt, true ); }
TypeThis& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)
{ return MoveLinkIn(AR_MoveLink, AO_StdOpt, false); }
TypeThis& MoveLinkHead(ZCLink& AR_MoveLink)
{ return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), true ); }
TypeThis& MoveLinkTail(ZCLink& AR_MoveLink)
{ return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); }
TypeThis& MoveRangeIn /*///////////////////////////////////////////////*/
(
ZCLink& AR_MoveHead , ZCLink& AR_MoveTail ,
ZCLink& AR_StdLink , bool AB_After
)
/*#####################################################################*/
{
if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;}
// AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다.
// AR_MoveHead 이 AR_MoveTail 위에 와서는 안 된다.
if(size()<=1){return *this;} AddLinkBefore
( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ;
if(size() <= 1 ){return *this;}
if(&AR_MoveHead == &AR_StdLink){return *this;}
if(&AR_MoveTail == &AR_StdLink){return *this;}
return *this; /**************************/
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink ||
&AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) /////////////////////////////////////////////
{
// AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결.
ZCLink VO_FakeHead ;
ZCLink VO_FakeTail ;
ZCLink* VP_FakeHead = &VO_FakeHead ;
ZCLink* VP_FakeTail = &VO_FakeTail ;
ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ;
ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ;
ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink;
ZCLink::JoinLink(VP_MovePrev, VP_MoveNext);
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AR_MoveHead~AR_MoveTail 떼어 내기 완료.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink );
}
mp_HeadLink = VP_FakeHead->mp_NextLink;
mp_TailLink = VP_FakeTail->mp_PrevLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
return *this; /***************************/
}/*
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink ||
&AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) ///////////////////////////////////////////*/
if( AB_After && AR_MoveHead.mp_PrevLink==&AR_StdLink)
{ return *this; }
if(!AB_After && AR_MoveTail.mp_NextLink==&AR_StdLink)
{ return *this; }
/*:::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink;
ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ;
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink );
}
return *this; /*::::::::::::::::::::::::::::::::*/
}/*
TypeThis& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/
TypeThis& MoveLinkHead(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/
{
if(&AR_MoveLink==mp_HeadLink){return *this;}
if(size()<=1){return *this;} AddLinkAfter
( 0, CutLink(&AR_MoveLink) ) ;
return *this; /**************************/
}/*
TypeThis& MoveLinkHead(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/
TypeThis& MoveLinkTail(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/
{
if(&AR_MoveLink==mp_TailLink){return *this;}
if(size()<=1){return *this;} AddLinkBefore
( 0, CutLink(&AR_MoveLink) ) ;
return *this; /**************************/
}/*
TypeThis& MoveLinkTail(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/
TypeThis& MoveRangeIn ///////////////////////////////////////////////////
(
ZCLink& AR_MoveHead, ZCLink& AR_MoveTail,
ZCLink& AR_StdLink , bool AB_After
)
#######################################################################*/
TypeThis& SendRangeIn ///////////////////////////////////////////////////