commit 2025-10-06 15:02 add Raw() in ZtCObjOpt : ZCppMain/ZMainHead.H

This commit is contained in:
2025-10-06 15:03:06 +09:00
parent b5cf36be19
commit 80c7b85ec2
6 changed files with 483 additions and 289 deletions

View File

@ -4522,6 +4522,8 @@ namespace ZNsMain
/***/ TypeData& value() {return *mp_TypeData;}
const TypeData& value() const{return *mp_TypeData;}
TypeData* Raw() const{return mp_TypeData;}
public :
};/*
template<typename TType> class ZtCObjOpt */
@ -5303,6 +5305,9 @@ namespace ZNsMain
typedef ZCLink* IterEasy ; // 가장 대표적으로 쓰일 수 있는 반복자.
typedef ZCLink* iterator ;
public:
typedef ZtCObjOpt<ZCLink > ZCLinkOpt;
typedef ZtCObjOpt<TypeData> ZCDataOpt;
public:
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
<
@ -5820,6 +5825,92 @@ namespace ZNsMain
void CutLink(ZCLink* AP_StdLink)*/
ZtCBaseList& CutLinkRangeOut /*#######################################*/
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCBaseList& rhs ,
ZCLink* AP_RhsStd
)
/*#####################################################################*/
{
/*///////////////////////////////////////////////////////////
■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크.
AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크.
AR_CutHead 의 앞과 AR_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;
}/*
ZtCBaseList& CutLinkRangeOut ###########################################
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCBaseList& rhs ,
ZCLink* AP_RhsStd
)
#######################################################################*/
/*private :*/
public :
@ -6102,13 +6193,15 @@ namespace ZNsMain
void DeleteTail(TTypSize AL_DelSize)*/
ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLink* AP_StdLink)
ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_StdLink 의 뒤에 rhs 를 삽입.
if(rhs.ml_LinkSize<1) return *this;
if(AP_StdLink==0) // 맨 앞에 삽입
ZCLink* VP_StdLink = AO_StdOpt.Raw();
if(VP_StdLink==0) // 맨 앞에 삽입
{
if(ml_LinkSize<1)
{
@ -6134,15 +6227,15 @@ namespace ZNsMain
return *this;
}/*
if(AP_StdLink==0)*/
if(VP_StdLink==0)*/
ZCLink* VP_StdNext=AP_StdLink->mp_NextLink;
ZCLink* VP_StdNext=VP_StdLink->mp_NextLink;
ZCLink::JoinLink(AP_StdLink , rhs.mp_HeadLink );
ZCLink::JoinLink(VP_StdLink , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext );
if(AP_StdLink==mp_TailLink)
if(VP_StdLink==mp_TailLink)
{ mp_TailLink=rhs.mp_TailLink; }
rhs.mp_HeadLink =0 ;
@ -6151,16 +6244,18 @@ namespace ZNsMain
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLink* AP_StdLink)*/
ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/
ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLink* AP_StdLink)
ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_StdLink 의 앞에 rhs 를 삽입.
if(rhs.size()<1) return *this;
if(AP_StdLink==0) // 맨 뒤에 삽입
ZCLink* VP_StdLink = AO_StdOpt.Raw();
if(VP_StdLink==0) // 맨 뒤에 삽입
{
if(ml_LinkSize<1)
{
@ -6184,15 +6279,15 @@ namespace ZNsMain
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
if(AP_StdLink==0)*/
if(VP_StdLink==0)*/
ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink;
ZCLink* VP_StdPrev = VP_StdLink->mp_PrevLink;
ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink );
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdLink );
if(AP_StdLink==mp_HeadLink)
if(VP_StdLink==mp_HeadLink)
{ mp_HeadLink = rhs.mp_HeadLink; }
rhs.mp_HeadLink =0 ;
@ -6201,47 +6296,75 @@ namespace ZNsMain
ml_LinkSize += rhs.ml_LinkSize; return *this;
}/*
ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLink* AP_StdLink)*/
ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/
ZtCBaseList& JoinHead(ZtCBaseList& rhs)
{ if(this==&rhs) return *this; return JoinAfter (rhs, 0); }
{ if(this==&rhs) return *this; return JoinAfter (rhs, ZCLinkOpt(0)); }
ZtCBaseList& JoinTail(ZtCBaseList& rhs)
{ if(this==&rhs) return *this; return JoinBefore(rhs, 0); }
{ if(this==&rhs) return *this; return JoinBefore(rhs, ZCLinkOpt(0)); }
void SendOutAfter(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)
void SendOutAfter (ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다.
CutLink(AP_CutLink); rhs.AddLinkAfter(AP_StdLink, AP_CutLink);
CutLink(&AR_CutLink); rhs.AddLinkAfter(AO_StdOpt.Raw(), &AR_CutLink);
}/*
void SendOutAfter(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)*/
void SendOutAfter (ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/
void SendOutBefore(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)
void SendOutBefore(ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
CutLink(AP_CutLink); rhs.AddLinkBefore(AP_StdLink, AP_CutLink);
CutLink(&AR_CutLink); rhs.AddLinkBefore(AO_StdOpt.Raw(), &AR_CutLink);
}/*
void SendOutBefore(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)*/
void SendOutBefore(ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/
void SendOutHead(ZCLink* AP_CutLink, ZtCBaseList& rhs)
void SendOutHead(ZCLink& AR_CutLink, ZtCBaseList& rhs)
{
// AP_CutLink 를 잘라서 rhs 의 앞에 연결한다.
SendOutAfter (AP_CutLink, rhs, 0);
SendOutAfter (AR_CutLink, rhs, ZCLinkOpt(0));
}
void SendOutTail(ZCLink* AP_CutLink, ZtCBaseList& rhs)
void SendOutTail(ZCLink& AR_CutLink, ZtCBaseList& rhs)
{
// AP_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
SendOutBefore(AP_CutLink, rhs, 0);
SendOutBefore(AR_CutLink, rhs, ZCLinkOpt(0));
}/*
void SendOutTail(ZCLink* AP_CutLink, ZtCBaseList& rhs)*/
void SendOutTail(ZCLink& AR_CutLink, ZtCBaseList& rhs)*/
ZtCBaseList& SendRangeOutAfter //////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCBaseList& rhs ,
ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
return CutLinkRangeOut
(
AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw()
);
//////////////////////
}/*
ZtCBaseList& SendRangeOutAfter //////////////////////////////////////////
(
ZCLink& AR_CutHead,
ZCLink& AR_CutTail,
TypeSize AI_CutSize,
ZtCBaseList& rhs ,
ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
TypeData& GetHeadData(){return mp_HeadLink->mo_DataObjt;}
TypeData& GetTailData(){return mp_TailLink->mo_DataObjt;}
@ -6252,6 +6375,37 @@ namespace ZNsMain
operator TypeData&() { return AddTail() ; }
ZCDataOpt GetHeadDataOpt()
{
if(mp_HeadLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_HeadLink->mo_DataObjt);
}
ZCDataOpt GetTailDataOpt()
{
if(mp_TailLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_TailLink->mo_DataObjt);
}/*
ZCDataOpt GetTailDataOpt()*/
const ZCDataOpt GetHeadDataOpt() const
{
if(mp_HeadLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_HeadLink->mo_DataObjt);
}
const ZCDataOpt GetTailDataOpt() const
{
if(mp_TailLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_TailLink->mo_DataObjt);
}/*
const ZCDataOpt GetTailDataOpt()*/
TypeSize size() const{ return ml_LinkSize; }
TypeSize GetSize() const{ return ml_LinkSize; }
@ -6534,6 +6688,21 @@ namespace ZNsMain
const ZCLink* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);}
ZCLinkOpt GetLinkOpt(TypeSize AI_Index)
{
if(mp_HeadLink==0) return ZCLinkOpt(0);
return ZCLinkOpt(GetLinkPtr(AI_Index));
}
const ZCLinkOpt GetLinkOpt(TypeSize AI_Index) const
{
if(mp_HeadLink==0) return ZCLinkOpt(0);
return ZCLinkOpt(GetLinkPtr(AI_Index));
}/*
const ZCLinkOpt GetLinkOpt(TypeSize AI_Index) const*/
ZCLink& GetHeadLink(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;}
ZCLink& GetTailLink(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;}