commit 2025-10-06 15:02 add Raw() in ZtCObjOpt : ZCppMain/ZMainHead.H
This commit is contained in:
@ -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;}
|
||||
|
||||
|
Reference in New Issue
Block a user