commit 2025-10-06 08:36 add GetNextPrevPtr() in ZtCLink : ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-06 08:36:21 +09:00
parent d7ed80d1b0
commit b714f5579c
4 changed files with 269 additions and 22 deletions

View File

@ -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 뒤에 연결한다.

View File

@ -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 ;

View File

@ -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));

View File

@ -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;