commit 2025-10-07 10:01 add SendRangeOut() : ZCppMain/ZtCLinkList.H & ZtCObjList.H & ZMainHead.H etc

This commit is contained in:
2025-10-07 10:11:48 +09:00
parent 138dc8f5ac
commit 557c18cb3f
7 changed files with 607 additions and 250 deletions

View File

@ -790,6 +790,8 @@ namespace ZNsMain
typedef TTypSize TypeSize ;
typedef TMoveObj TypeMoveObj;
public:
typedef ZtCObjList TypeThis ;
public:
class ZCIterator;
class ZCLink ;
public:
@ -1213,17 +1215,18 @@ namespace ZNsMain
protected: ZCLink* CutLink(ZCLink* AP_CutLink)*/
ZtCObjList& CutLink /*########################################################*/
TypeThis& CutLink /*##########################################################*/
(
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
ZtCObjList& ARR_StoreList
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
TypeThis& ARR_StoreList
)
/*#############################################################################*/
{
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
// ARR_StoreList 은 비어 있어야 한다.
if(this==&ARR_StoreList) return *this ;
@ -1235,72 +1238,76 @@ namespace ZNsMain
{
mp_HeadLink=0; // 모든 링크를 삭제할 때.
}
else if(AP_CutHead==mp_HeadLink) // 잘라내려는 링크가 처음 링크를 포함할 때.
else if(AP_CutHead==mp_HeadLink)
{
ZCLink::MakeRing
(mp_HeadLink=AP_CutTail->mp_NextLink, VP_TailLink);
(
mp_HeadLink=AP_CutTail->mp_NextLink, VP_TailLink
);
////////////////
}
else if(AP_CutTail==VP_TailLink) // 잘라내려는 링크가 끝 링크를 포함할 때.
else if(AP_CutTail==VP_TailLink)
{
ZCLink::MakeRing(mp_HeadLink, AP_CutHead->mp_PrevLink);
ZCLink::MakeRing
(
mp_HeadLink, AP_CutHead->mp_PrevLink
);
////////////////
}
else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때.
else
{
ZCLink::JoinLink(AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink);
}/*
else*/
ZCLink::JoinLink
(
AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink
);
////////////////
}
ml_LinkSize -= AL_CutSize; ZCLink::MakeRing(AP_CutHead, AP_CutTail);
ml_LinkSize -= AL_CutSize;
#ifdef _DEBUG
// ARR_StoreList 은 비어 있어야 한다.
if(ARR_StoreList.IsEmpty()!=true)
{
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
fileout<<"Error In 'ZtCObjList& CutLink( ZCLink* AP_CutHead , ZCLink* AP_CutTail," <<std::endl;
fileout<<" TypeSize AL_CutSize, ZtCObjList& ARR_StoreList" <<std::endl;
fileout<<" /****************/ )" <<std::endl;
fileout<<"Object ARR_StoreList is not EMPTY !"<<std::endl;
fileout.close();
::exit(1); return ARR_StoreList;
}/*
if(ARR_StoreList.IsEmpty()!=true)*/
#endif //_DEBUG
ZCLink::MakeRing(AP_CutHead, AP_CutTail);
ARR_StoreList.mp_HeadLink = AP_CutHead ;
ARR_StoreList.ml_LinkSize = AL_CutSize ;
return ARR_StoreList;
}/*
ZtCObjList& CutLink ############################################################
TypeThis& CutLink ##############################################################
(
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
ZtCObjList& ARR_StoreList
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
TypeThis& ARR_StoreList
)
###############################################################################*/
ZtCObjList& CutLinkRangeOut /*################################################*/
TypeThis& CutLinkRangeOut /*##################################################*/
(
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
ZtCObjList& rhs ,
ZCLink* AP_RhsStd
ZCLink* AP_CutHead , ZCLink* AP_CutTail ,
TypeSize AL_CutSize , TypeThis& rhs ,
ZCLink* AP_RhsStd , bool AB_After=true
)
/*#############################################################################*/
{
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
// 이 범위의 링크를 AP_RhsStd 뒤에 붙인다.
// AP_RhsStd 이 0 이면, rhs 의 앞에 붙인다.
/*//////////////////////////////////////////////////
■ AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
이 범위의 링크를 AP_RhsStd 뒤에 붙인다.
AP_RhsStd 이 0 이면, rhs 의 앞에 붙인다.
■ bool AB_After 추가. -- 2025-10-07 09:36
AB_After==true 이면, AP_RhsStd 의 뒤에 연결.
AB_After==false 이면, AP_RhsStd 의 앞에 연결.
//////////////////////////////////////////////////*/
if(this==&rhs ) return *this;
if(ml_LinkSize<1) return rhs ;
@ -1311,60 +1318,95 @@ namespace ZNsMain
{
mp_HeadLink=0; // 모든 링크를 삭제할 때.
}
else if(AP_CutHead==mp_HeadLink) // 잘라내려는 링크가 처음 링크를 포함할 때.
else if(AP_CutHead==mp_HeadLink)
{
ZCLink::MakeRing
(mp_HeadLink=AP_CutTail->mp_NextLink, VP_TailLink);
ZCLink::MakeRing ///////////////
(
mp_HeadLink =
AP_CutTail->mp_NextLink,
VP_TailLink
);
////////////////////////////////
}
else if(AP_CutTail==VP_TailLink) // 잘라내려는 링크가 끝 링크를 포함할 때.
else if(AP_CutTail==VP_TailLink)
{
ZCLink::MakeRing(mp_HeadLink, AP_CutHead->mp_PrevLink);
ZCLink::MakeRing ///////////////
(
mp_HeadLink,
AP_CutHead->mp_PrevLink
);
////////////////////////////////
}
else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때.
else
{
ZCLink::JoinLink(AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink);
}/*
else*/
ZCLink::JoinLink ///////////////
(
AP_CutHead->mp_PrevLink,
AP_CutTail->mp_NextLink
);
////////////////////////////////
}
ml_LinkSize -= AL_CutSize;
if(rhs.size()<1)
{
// AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다.
ZCLink::MakeRing(AP_CutHead, AP_CutTail);
ZCLink::MakeRing
( AP_CutHead, AP_CutTail ) ;
rhs.mp_HeadLink = AP_CutHead ;
}
else if(AP_RhsStd==0) // 맨 앞에 삽입.
else if(AB_After)
{
ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink;
if(AP_RhsStd==0) // 맨 앞에 삽입.
{
ZCLink* VP_RhsHead = rhs.mp_HeadLink ;
ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink ;
ZCLink::JoinLink(AP_CutTail, rhs.mp_HeadLink);
ZCLink::MakeRing(AP_CutHead, VP_RhsTail );
ZCLink::JoinLink(AP_CutTail, VP_RhsHead);
ZCLink::MakeRing(AP_CutHead, VP_RhsTail);
rhs.mp_HeadLink = AP_CutHead;
rhs.mp_HeadLink = AP_CutHead;
}
else // AP_RhsStd 의 뒤에 삽입.
{
ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ;
ZCLink::JoinLink(AP_RhsStd , AP_CutHead );
ZCLink::JoinLink(AP_CutTail, VP_RhsStdNext);
}
}
else // AP_RhsStd 의 뒤에 삽입.
else // !AB_After
{
ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ;
if(AP_RhsStd==0) // 맨 뒤에 삽입.
{
ZCLink* VP_RhsHead = rhs.mp_HeadLink ;
ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink ;
ZCLink::JoinLink(AP_RhsStd , AP_CutHead );
ZCLink::JoinLink(AP_CutTail, VP_RhsStdNext);
ZCLink::JoinLink(VP_RhsTail, AP_CutHead);
ZCLink::MakeRing(VP_RhsHead, AP_CutTail);
}
else // AP_RhsStd 의 앞에 삽입.
{
ZCLink* VP_RhsStdPrev = AP_RhsStd->mp_PrevLink ;
ZCLink::JoinLink(VP_RhsStdPrev, AP_CutHead);
ZCLink::JoinLink(AP_CutTail , AP_RhsStd );
if(AP_RhsStd==rhs.mp_HeadLink)
rhs.mp_HeadLink = AP_CutHead ;
}
}/*
else*/
else // !AB_After*/
rhs.ml_LinkSize += AL_CutSize; return rhs;
}/*
ZtCObjList& CutLinkRangeOut ####################################################
TypeThis& CutLinkRangeOut ######################################################
(
ZCLink* AP_CutHead ,
ZCLink* AP_CutTail ,
TypeSize AL_CutSize ,
ZtCObjList& rhs ,
ZCLink* AP_RhsStd
ZCLink* AP_CutHead , ZCLink* AP_CutTail ,
TypeSize AL_CutSize , TypeThis& rhs ,
ZCLink* AP_RhsStd , bool AB_After=true
)
###############################################################################*/
@ -2121,37 +2163,55 @@ namespace ZNsMain
###############################################################################*/
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink& AR_StdLink)
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
{
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
CutLink(&AR_CutLink); rhs.JoinAfter(&AR_CutLink, &AR_StdLink);
}/*
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink& AR_StdLink)*/
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink& AR_StdLink)
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
{
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 앞에 연결한다.
CutLink(&AR_CutLink); rhs.JoinBefore(&AR_CutLink, &AR_StdLink);
}/*
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink& AR_StdLink)*/
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
void SendOutHead(ZCLink& AR_CutLink, ZtCObjList& rhs)
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs)
{ CutLink(&AR_CutLink); rhs.JoinAfter (&AR_CutLink, 0); }
void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)
{ CutLink(&AR_CutLink); rhs.JoinBefore(&AR_CutLink, 0); }
ZtCObjList& SendRangeOutAfter ///////////////////////////////////////////
TypeThis& SendRangeOut //////////////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCObjList& rhs ,
ZCLinkOpt AO_LinkOpt
ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize,
TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After
)
/*#####################################################################*/
{
return CutLinkRangeOut
(
&AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), AB_After
);
//////////////////////
}/*
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
{
@ -2159,17 +2219,29 @@ namespace ZNsMain
return CutLinkRangeOut
(
&AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw()
&AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true
);
//////////////////////
}
TypeThis& SendRangeOutBefore ////////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AO_ObjOpt 뒤에 연결한다.
return CutLinkRangeOut
(
&AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), false
);
//////////////////////
}/*
ZtCObjList& SendRangeOutAfter //////////////////////////////////////////
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCObjList& rhs ,
ZCLinkOpt AO_LinkOpt
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/