commit 2025-10-06 08:36 add GetNextPrevPtr() in ZtCLink : ZCppMain/ZtCLinkList.H
This commit is contained in:
@ -108,7 +108,8 @@ namespace ZNsMain
|
||||
ZtCLink& operator=(TypeBase& AR_CBase)*/
|
||||
|
||||
|
||||
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
|
||||
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
|
||||
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
|
||||
|
||||
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
@ -168,6 +169,31 @@ namespace ZNsMain
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
|
||||
{
|
||||
ZtCLink* VP_TmpLink=this;
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
|
||||
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink& operator+(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
@ -281,7 +307,8 @@ namespace ZNsMain
|
||||
TypeThis& operator=(TypeBase& AR_CBase)*/
|
||||
|
||||
|
||||
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
|
||||
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
|
||||
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
|
||||
|
||||
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
@ -341,6 +368,31 @@ namespace ZNsMain
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
|
||||
{
|
||||
ZtCLink* VP_TmpLink=this;
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
|
||||
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink& operator+(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
@ -439,8 +491,8 @@ namespace ZNsMain
|
||||
TypeThis& operator=(const TypeThis& rhs)*/
|
||||
|
||||
|
||||
TypeThis& operator()(){ return *this; }
|
||||
|
||||
/***/ TypeThis& operator()() { return *this; }
|
||||
const TypeThis& operator()() const{ return *this; }
|
||||
|
||||
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
||||
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
||||
@ -499,6 +551,31 @@ namespace ZNsMain
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
|
||||
{
|
||||
ZtCLink* VP_TmpLink=this;
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
|
||||
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink& operator+(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
@ -653,6 +730,31 @@ namespace ZNsMain
|
||||
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)
|
||||
{
|
||||
ZtCLink* VP_TmpLink=this;
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/
|
||||
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const
|
||||
{
|
||||
ZtCLink* VP_TmpLink=const_cast<ZtCLink*>(this);
|
||||
|
||||
if(AL_Distance>=0)
|
||||
{ while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
|
||||
else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
|
||||
|
||||
return VP_TmpLink;
|
||||
}/*
|
||||
const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/
|
||||
|
||||
|
||||
ZtCLink& operator+(TypeSize AL_Distance)
|
||||
{
|
||||
if(AL_Distance>=0)
|
||||
@ -1036,6 +1138,110 @@ namespace ZNsMain
|
||||
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
|
||||
|
||||
|
||||
ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink)
|
||||
{
|
||||
// AP_StdLink 의 뒤에 rhs 를 삽입.
|
||||
|
||||
if(this==&rhs ) return *this;
|
||||
if(rhs.size()<1) return *this;
|
||||
|
||||
if(AP_StdLink==0) // 맨 앞에 삽입
|
||||
{
|
||||
if(ml_LinkSize<1)
|
||||
{
|
||||
mp_HeadLink = rhs.mp_HeadLink ;
|
||||
mp_TailLink = rhs.mp_TailLink ;
|
||||
ml_LinkSize = rhs.ml_LinkSize ;
|
||||
}
|
||||
else // ml_LinkSize>=1
|
||||
{
|
||||
ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink );
|
||||
ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink );
|
||||
|
||||
mp_HeadLink = rhs.mp_HeadLink ;
|
||||
ml_LinkSize = rhs.ml_LinkSize ;
|
||||
}/*
|
||||
else // ml_LinkSize>=1*/
|
||||
|
||||
ml_LinkSize += rhs.ml_LinkSize;
|
||||
|
||||
rhs.mp_HeadLink = 0 ;
|
||||
rhs.mp_TailLink = 0 ;
|
||||
rhs.ml_LinkSize = 0 ;
|
||||
|
||||
return *this;
|
||||
}/*
|
||||
if(AP_StdLink==0)*/
|
||||
|
||||
|
||||
ZCLink* VP_StdNext=AP_StdLink->mp_NextLink;
|
||||
|
||||
ZCLink::JoinLink(AP_StdLink , rhs.mp_HeadLink );
|
||||
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext );
|
||||
|
||||
if(AP_StdLink==mp_TailLink)
|
||||
{ mp_TailLink=rhs.mp_TailLink; }
|
||||
|
||||
rhs.mp_HeadLink =0 ;
|
||||
rhs.mp_TailLink =0 ;
|
||||
rhs.ml_LinkSize =0 ;
|
||||
|
||||
ml_LinkSize += rhs.ml_LinkSize; return *this;
|
||||
}/*
|
||||
ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
|
||||
|
||||
|
||||
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink)
|
||||
{
|
||||
// AP_StdLink 의 앞에 rhs 를 삽입.
|
||||
|
||||
if(this==&rhs ) return *this;
|
||||
if(rhs.size()<1) return *this;
|
||||
|
||||
if(AP_StdLink==0) // 맨 뒤에 삽입
|
||||
{
|
||||
if(ml_LinkSize<1)
|
||||
{
|
||||
mp_HeadLink = rhs.mp_HeadLink ;
|
||||
mp_TailLink = rhs.mp_TailLink ;
|
||||
ml_LinkSize = rhs.ml_LinkSize ;
|
||||
}
|
||||
else // ml_LinkSize>=1
|
||||
{
|
||||
ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink );
|
||||
ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink );
|
||||
|
||||
mp_TailLink = rhs.mp_TailLink ;
|
||||
ml_LinkSize += rhs.ml_LinkSize ;
|
||||
}/*
|
||||
else // ml_LinkSize>=1*/
|
||||
|
||||
rhs.mp_HeadLink=0;
|
||||
rhs.mp_TailLink=0;
|
||||
rhs.ml_LinkSize=0;
|
||||
|
||||
ml_LinkSize += rhs.ml_LinkSize; return *this;
|
||||
}/*
|
||||
if(AP_StdLink==0)*/
|
||||
|
||||
|
||||
ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink;
|
||||
|
||||
ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink );
|
||||
ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink );
|
||||
|
||||
if(AP_StdLink==mp_HeadLink)
|
||||
{ mp_HeadLink = rhs.mp_HeadLink; }
|
||||
|
||||
rhs.mp_HeadLink =0 ;
|
||||
rhs.mp_TailLink =0 ;
|
||||
rhs.ml_LinkSize =0 ;
|
||||
|
||||
ml_LinkSize += rhs.ml_LinkSize; return *this;
|
||||
}/*
|
||||
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
|
||||
|
||||
|
||||
ZCLink& CutLink(ZCLink& AR_CutLink)
|
||||
{
|
||||
if(&AR_CutLink==mp_HeadLink)
|
||||
@ -1084,6 +1290,8 @@ namespace ZNsMain
|
||||
mp_HeadLink=0;
|
||||
mp_TailLink=0;
|
||||
ml_LinkSize=0;
|
||||
|
||||
*this = rhs ;
|
||||
}/*
|
||||
ZtCLinkList(const ZtCLinkList& rhs)*/
|
||||
|
||||
@ -1154,7 +1362,7 @@ namespace ZNsMain
|
||||
|
||||
__for0(TypeSize, i, rhs.size())
|
||||
{
|
||||
**VP_LhsLink = **VP_RhsLink ;
|
||||
*VP_LhsLink = *VP_RhsLink ;
|
||||
|
||||
VP_RhsLink = VP_RhsLink->mp_NextLink;
|
||||
VP_LhsLink = VP_LhsLink->mp_NextLink;
|
||||
@ -1166,8 +1374,10 @@ namespace ZNsMain
|
||||
ZtCLinkList& operator=(const ZtCLinkList& rhs)*/
|
||||
|
||||
|
||||
TypeSize GetSize(){return ml_LinkSize;}
|
||||
TypeSize size (){return ml_LinkSize;}
|
||||
TypeSize GetSize() const{return ml_LinkSize ;}
|
||||
TypeSize size () const{return ml_LinkSize ;}
|
||||
|
||||
bool IsEmpty() const{return ml_LinkSize<1;}
|
||||
|
||||
|
||||
void DeleteAll()
|
||||
@ -1225,6 +1435,15 @@ namespace ZNsMain
|
||||
void Delete(ZCLink& AR_DelLink)*/
|
||||
|
||||
|
||||
ZtCLinkList& JoinAfter (ZtCLinkList& rhs, ZCLink& AR_StdLink)
|
||||
{ return JoinAfter (rhs, &AR_StdLink); }
|
||||
ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink& AR_StdLink)
|
||||
{ return JoinBefore(rhs, &AR_StdLink); }
|
||||
|
||||
ZtCLinkList& JoinHead(ZtCLinkList& rhs){ return JoinAfter (rhs, 0); }
|
||||
ZtCLinkList& JoinTail(ZtCLinkList& rhs){ return JoinBefore(rhs, 0); }
|
||||
|
||||
|
||||
void SendOutAfter (ZCLink& AR_CutLink, ZtCLinkList& rhs, ZCLink& AR_StdLink)
|
||||
{
|
||||
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
||||
|
@ -1221,9 +1221,8 @@ namespace ZNsMain
|
||||
)
|
||||
/*#############################################################################*/
|
||||
{
|
||||
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치
|
||||
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치
|
||||
// 따라서 AL_CutHeadPos <= AL_CutTailPos
|
||||
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
|
||||
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
|
||||
|
||||
if(this==&ARR_StoreList) return *this ;
|
||||
|
||||
@ -2103,9 +2102,8 @@ namespace ZNsMain
|
||||
)
|
||||
/*#############################################################################*/
|
||||
{
|
||||
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치
|
||||
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치
|
||||
// 따라서 AL_CutHeadPos <= AL_CutTailPos
|
||||
// AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크
|
||||
// AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크
|
||||
|
||||
if(this==&ARR_StoreList) return *this ;
|
||||
|
||||
|
@ -458,6 +458,7 @@ namespace ZNsMain
|
||||
|
||||
cout<<endl<<"# after VO_ZCBaseListEx10_2's 2th link to VO_ZCBaseListEx10's tail"<<endl;
|
||||
|
||||
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
|
||||
VO_ZCBaseListEx10 .IterElemLink(&ShowNode10);
|
||||
cout<<"*****************************************************"<<endl;
|
||||
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_2, ZftMCP(cout));
|
||||
|
@ -45,17 +45,22 @@ namespace ZNsMain
|
||||
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)
|
||||
{
|
||||
ZTypLong VI_CallCnt = 0 ;
|
||||
ZCLinkStrList VO_ZCLinkStrLis;
|
||||
ZCStrLinkOpt VO_StrLinkOpt = VO_ZCLinkStrLis.GetObjOpt(1);
|
||||
ZCLinkStrList VO_ZCLinkStrLis1;
|
||||
ZCLinkStrList VO_ZCLinkStrLis2;
|
||||
ZCStrLinkOpt VO_StrLinkOpt = VO_ZCLinkStrLis1.GetObjOpt(1);
|
||||
|
||||
cout<<"# VO_StrLinkOpt.has_value()="<<VO_StrLinkOpt.has_value()<<endl;
|
||||
cout<<"# VO_StrLinkOpt.bool() ="<<bool(VO_StrLinkOpt) <<endl;
|
||||
|
||||
VO_ZCLinkStrLis.AddTail()()=string("123");
|
||||
VO_ZCLinkStrLis.AddTail()()=string("ABC");
|
||||
VO_ZCLinkStrLis.AddTail()()=string("xyz");
|
||||
VO_ZCLinkStrLis1.AddTail()()=string("123");
|
||||
VO_ZCLinkStrLis1.AddTail()()=string("ABC");
|
||||
VO_ZCLinkStrLis1.AddTail()()=string("xyz");
|
||||
|
||||
VO_StrLinkOpt = VO_ZCLinkStrLis.GetObjOpt(1);
|
||||
VO_ZCLinkStrLis2.AddTail()()=string("Z01");
|
||||
VO_ZCLinkStrLis2.AddTail()()=string("Z02");
|
||||
VO_ZCLinkStrLis2.AddTail()()=string("Z03");
|
||||
|
||||
VO_StrLinkOpt = VO_ZCLinkStrLis1.GetObjOpt(1);
|
||||
|
||||
cout<<"# VO_StrLinkOpt.GetObjOpt(1) : has_value()="<<VO_StrLinkOpt.has_value()<<endl;
|
||||
cout<<"# VO_StrLinkOpt.GetObjOpt(1) : bool ()="<<bool(VO_StrLinkOpt) <<endl;
|
||||
@ -63,7 +68,7 @@ namespace ZNsMain
|
||||
if(VO_StrLinkOpt.has_value())
|
||||
cout<<"# value by VO_StrLinkOpt : "<<VO_StrLinkOpt.value()<<endl;
|
||||
|
||||
VO_StrLinkOpt = VO_ZCLinkStrLis.GetTailOpt();
|
||||
VO_StrLinkOpt = VO_ZCLinkStrLis1.GetTailOpt();
|
||||
|
||||
cout<<"# VO_StrLinkOpt.GetTailOpt() : has_value()="<<VO_StrLinkOpt.has_value()<<endl;
|
||||
cout<<"# VO_StrLinkOpt.GetTailOpt() : bool ()="<<bool(VO_StrLinkOpt) <<endl;
|
||||
@ -72,9 +77,33 @@ namespace ZNsMain
|
||||
cout<<"# value by VO_StrLinkOpt : "<<VO_StrLinkOpt.value()<<endl;
|
||||
|
||||
|
||||
VO_ZCLinkStrLis.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode1, ZftMCP(VI_CallCnt=0));
|
||||
|
||||
|
||||
VO_ZCLinkStrLis1.JoinHead(VO_ZCLinkStrLis2);
|
||||
|
||||
cout<<"# after VO_ZCLinkStrLis1.JoinHead(VO_ZCLinkStrLis2)"<<endl;
|
||||
|
||||
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
|
||||
VO_ZCLinkStrLis2.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode1, ZftMCP(VI_CallCnt=0));
|
||||
|
||||
|
||||
VO_ZCLinkStrLis2 = VO_ZCLinkStrLis1 ;
|
||||
|
||||
cout<<"# after VO_ZCLinkStrLis2 = VO_ZCLinkStrLis1"<<endl;
|
||||
|
||||
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
|
||||
VO_ZCLinkStrLis2.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis1.IterElement(&ShowNode0, ZftMCP(VI_CallCnt=0));
|
||||
cout<<"***********************************************"<<endl;
|
||||
VO_ZCLinkStrLis.IterElement(&ShowNode1, ZftMCP(VI_CallCnt=0));
|
||||
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user