commit 2025-10-11 16:51 add ZtCBaseList::SwapLinkNext() : ZCppMain/ZMainHead.H
This commit is contained in:
@ -5686,17 +5686,20 @@ namespace ZNsMain
|
|||||||
class ZtCBaseList /*#####################################################*/
|
class ZtCBaseList /*#####################################################*/
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class ZCLink;
|
class ZCLink; class ZCLinkPoint; class ZCLinkRange;
|
||||||
public:
|
public:
|
||||||
typedef ZtCBaseList TypeThis ;
|
typedef ZtCBaseList TypeThis ;
|
||||||
|
typedef ZtCBaseList TypeList ;
|
||||||
typedef TType TypeData ;
|
typedef TType TypeData ;
|
||||||
typedef TTypArgu TypeArg ;
|
typedef TTypArgu TypeArg ;
|
||||||
typedef TTypeAlloc TypeAlloc ;
|
typedef TTypeAlloc TypeAlloc ;
|
||||||
typedef TTypSize TypeSize ;
|
typedef TTypSize TypeSize ;
|
||||||
typedef TMoveObj TypeMoveObj ;
|
typedef TMoveObj TypeMoveObj ;
|
||||||
typedef ZCLink TypeLink ;
|
typedef ZCLink TypeLink ;
|
||||||
typedef ZCLink* IterEasy ; // 가장 대표적으로 쓰일 수 있는 반복자.
|
typedef ZCLinkPoint TypeLinkPoint ;
|
||||||
typedef ZCLink* iterator ;
|
typedef ZCLinkRange TypeLinkRange ;
|
||||||
|
typedef ZCLink* IterEasy ; // 가장 쉽게 쓸 수 있는 반복자.
|
||||||
|
typedef TypeLinkPoint iterator ; // 다양한 기능을 가진 반복자.
|
||||||
public:
|
public:
|
||||||
typedef ZtCObjOpt<ZCLink > ZCLinkOpt;
|
typedef ZtCObjOpt<ZCLink > ZCLinkOpt;
|
||||||
typedef ZtCObjOpt<TypeData> ZCDataOpt;
|
typedef ZtCObjOpt<TypeData> ZCDataOpt;
|
||||||
@ -5827,6 +5830,377 @@ namespace ZNsMain
|
|||||||
class ZCLink*/
|
class ZCLink*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ZCLinkPoint
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
TypeLink* mp_CurrLink; // 사실상 mp_CurrLink!=0
|
||||||
|
TypeSize ml_CurrPos ;
|
||||||
|
TypeList& mr_CurrList;
|
||||||
|
public:
|
||||||
|
ZCLinkPoint(TypeList& AR_TypeList) :
|
||||||
|
mr_CurrList(AR_TypeList)
|
||||||
|
{
|
||||||
|
mp_CurrLink = AR_TypeList.HeadPtr();
|
||||||
|
ml_CurrPos = 1 ;
|
||||||
|
}
|
||||||
|
ZCLinkPoint(const ZCLinkPoint& rhs) :
|
||||||
|
mr_CurrList(rhs.mr_CurrList),
|
||||||
|
mp_CurrLink(rhs.mp_CurrLink),
|
||||||
|
ml_CurrPos (rhs.ml_CurrPos )
|
||||||
|
{}
|
||||||
|
public:
|
||||||
|
|
||||||
|
TypeList& GetList(){return mr_CurrList;}
|
||||||
|
TypeLink& GetLink(){return *mp_CurrLink;}
|
||||||
|
/***************************************************/
|
||||||
|
TypeSize GetPos () const{ return ml_CurrPos; }
|
||||||
|
/***************************************************/
|
||||||
|
|
||||||
|
const TypeList& GetList() const{return mr_CurrList;}
|
||||||
|
const TypeLink& GetLink() const{return *mp_CurrLink;}
|
||||||
|
|
||||||
|
|
||||||
|
bool IsValid() const{return mr_CurrList.size()>0;}
|
||||||
|
bool IsEmpty() const{return mr_CurrList.size()<1;}
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkPoint& operator= (const ZCLinkPoint& rhs){ return *this; }
|
||||||
|
|
||||||
|
ZCLinkPoint& operator++()
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
mp_CurrLink = mp_CurrLink->mp_NextLink ;
|
||||||
|
|
||||||
|
if(++ml_CurrPos>mr_CurrList.size())
|
||||||
|
{ ml_CurrPos -= mr_CurrList.size(); }
|
||||||
|
return *this; /*******************/
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& operator++()*/
|
||||||
|
|
||||||
|
ZCLinkPoint& operator--()
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
mp_CurrLink = mp_CurrLink->mp_PrevLink ;
|
||||||
|
|
||||||
|
if(--ml_CurrPos<1)
|
||||||
|
{ ml_CurrPos += mr_CurrList.size(); }
|
||||||
|
return *this;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& operator--()*/
|
||||||
|
|
||||||
|
ZCLinkPoint operator++(int)
|
||||||
|
{
|
||||||
|
ZCLinkPoint VO_NowPoint(*this);
|
||||||
|
|
||||||
|
if(IsEmpty()){return VO_NowPoint;}
|
||||||
|
|
||||||
|
mp_CurrLink = mp_CurrLink->mp_NextLink ;
|
||||||
|
|
||||||
|
if(++ml_CurrPos>mr_CurrList.size())
|
||||||
|
{ ml_CurrPos -= mr_CurrList.size(); }
|
||||||
|
return VO_NowPoint; /*************/
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint operator++(int)*/
|
||||||
|
|
||||||
|
ZCLinkPoint operator--(int)
|
||||||
|
{
|
||||||
|
ZCLinkPoint VO_NowPoint(*this);
|
||||||
|
|
||||||
|
if(IsEmpty()){return VO_NowPoint;}
|
||||||
|
|
||||||
|
mp_CurrLink = mp_CurrLink->mp_PrevLink ;
|
||||||
|
|
||||||
|
if(--ml_CurrPos<1)
|
||||||
|
{ ml_CurrPos += mr_CurrList.size(); }
|
||||||
|
return VO_NowPoint;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint operator--(int)*/
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkPoint& operator+=(TypeSize AL_Distance)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
mp_CurrLink = &((*mp_CurrLink)+AL_Distance) ;
|
||||||
|
|
||||||
|
if(ml_CurrPos+=AL_Distance > mr_CurrList.size())
|
||||||
|
{ ml_CurrPos %= mr_CurrList.size(); }
|
||||||
|
else if(ml_CurrPos<1) // AL_Distance<0
|
||||||
|
{ while(ml_CurrPos+= mr_CurrList.size()<1){} }
|
||||||
|
return *this; /**********************/
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& operator+=(TypeSize AL_Distance)*/
|
||||||
|
|
||||||
|
ZCLinkPoint& operator-=(TypeSize AL_Distance)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
mp_CurrLink = &((*mp_CurrLink)-AL_Distance);
|
||||||
|
|
||||||
|
if(ml_CurrPos-=AL_Distance > mr_CurrList.size())
|
||||||
|
{ ml_CurrPos %= mr_CurrList.size(); }
|
||||||
|
else if(ml_CurrPos<1) // AL_Distance>=0
|
||||||
|
{ while(ml_CurrPos+= mr_CurrList.size()<1){} }
|
||||||
|
return *this; /***********************/
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& operator-=(TypeSize AL_Distance)*/
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkPoint& MoveAfter(ZCLinkPoint& rhs, bool AB_Forward=true)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
ZCLink* VP_HereLink = /////////////////
|
||||||
|
(
|
||||||
|
AB_Forward
|
||||||
|
? mp_CurrLink->mp_NextLink
|
||||||
|
: mp_CurrLink->mp_PrevLink
|
||||||
|
) ;
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutAfter /********/
|
||||||
|
(
|
||||||
|
*mp_CurrLink ,
|
||||||
|
rhs.mr_CurrList ,
|
||||||
|
ZCLinkOpt(*rhs.mp_CurrLink)
|
||||||
|
);
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}/*
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)*/
|
||||||
|
|
||||||
|
|
||||||
|
// &mr_CurrList == &rhs.mr_CurrList
|
||||||
|
|
||||||
|
else if(rhs.mp_CurrLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
if(AB_Forward){++ml_CurrPos;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(rhs.mp_CurrLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else if(rhs.mp_CurrLink->mp_NextLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
// 이미 rhs 의 뒤에 *this 가 있는 경우.
|
||||||
|
|
||||||
|
if(AB_Forward){++ml_CurrPos;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(rhs.mp_CurrLink->mp_NextLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else if(mp_CurrLink->mp_NextLink==rhs.mp_CurrLink)
|
||||||
|
{
|
||||||
|
// *this 뒤에 rhs 가 있어서 위치를 맞바꾸는 경우.
|
||||||
|
|
||||||
|
mr_CurrList.SwapLinkNext( *mp_CurrLink ) ;
|
||||||
|
|
||||||
|
if(--rhs.ml_CurrPos<1)
|
||||||
|
{ rhs.ml_CurrPos += rhs.mr_CurrList.size(); }
|
||||||
|
|
||||||
|
if(AB_Forward)
|
||||||
|
{
|
||||||
|
++ml_CurrPos; VP_HereLink = mp_CurrLink;
|
||||||
|
}
|
||||||
|
else{ --ml_CurrPos; }
|
||||||
|
}/*
|
||||||
|
else if(mp_CurrLink->mp_NextLink==rhs.mp_CurrLink)*/
|
||||||
|
|
||||||
|
else //////////////////////////////////////////
|
||||||
|
{
|
||||||
|
if(ml_CurrPos<rhs.ml_CurrPos)
|
||||||
|
{ --rhs.ml_CurrPos; }
|
||||||
|
|
||||||
|
mr_CurrList.SendOutAfter /****************/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, mr_CurrList, ZCLinkOpt(*mp_CurrLink)
|
||||||
|
);
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}
|
||||||
|
rhs.mp_CurrLink = VP_HereLink ; return *this ;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& MoveAfter (ZCLinkPoint& rhs, bool AB_Forward=true)*/
|
||||||
|
|
||||||
|
ZCLinkPoint& MoveBefore(ZCLinkPoint& rhs, bool AB_Forward=true)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
ZCLink* VP_HereLink = /////////////////
|
||||||
|
(
|
||||||
|
AB_Forward
|
||||||
|
? mp_CurrLink->mp_NextLink
|
||||||
|
: mp_CurrLink->mp_PrevLink
|
||||||
|
) ;
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutBefore /*******/
|
||||||
|
(
|
||||||
|
*mp_CurrLink ,
|
||||||
|
rhs.mr_CurrList ,
|
||||||
|
ZCLinkOpt(*rhs.mp_CurrLink)
|
||||||
|
);
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
|
if(!AB_Forward)
|
||||||
|
{ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
|
||||||
|
++rhs.ml_CurrPos ;
|
||||||
|
}/*
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)*/
|
||||||
|
|
||||||
|
|
||||||
|
// &mr_CurrList == &rhs.mr_CurrList
|
||||||
|
|
||||||
|
else if(rhs.mp_CurrLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
if(AB_Forward){++ml_CurrPos;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(rhs.mp_CurrLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else if(rhs.mp_CurrLink->mp_PrevLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
// 이미 rhs 의 앞에 *this 가 있는 경우.
|
||||||
|
|
||||||
|
if(AB_Forward){++ml_CurrPos;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(rhs.mp_CurrLink->mp_PrevLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else if(mp_CurrLink->mp_PrevLink==rhs.mp_CurrLink)
|
||||||
|
{
|
||||||
|
// *this 앞에 rhs 가 있어서 위치를 맞바꾸는 경우.
|
||||||
|
|
||||||
|
rhs.mr_CurrList.SwapLinkNext(*rhs.mp_CurrLink) ;
|
||||||
|
|
||||||
|
if(++rhs.ml_CurrPos>rhs.mr_CurrList.size())
|
||||||
|
{ rhs.ml_CurrPos -= rhs.mr_CurrList.size(); }
|
||||||
|
|
||||||
|
if(AB_Forward){ ++ml_CurrPos; } else
|
||||||
|
{ --ml_CurrPos; VP_HereLink = mp_CurrLink; }
|
||||||
|
}/*
|
||||||
|
else if(mp_CurrLink->mp_PrevLink==rhs.mp_CurrLink)*/
|
||||||
|
|
||||||
|
else //////////////////////////////////////////
|
||||||
|
{
|
||||||
|
if(ml_CurrPos>rhs.ml_CurrPos)
|
||||||
|
{ ++rhs.ml_CurrPos; }
|
||||||
|
|
||||||
|
mr_CurrList.SendOutBefore /***************/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, mr_CurrList, ZCLinkOpt(*mp_CurrLink)
|
||||||
|
);
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}
|
||||||
|
rhs.mp_CurrLink = VP_HereLink ; return *this ;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& MoveBefore(ZCLinkPoint& rhs, bool AB_Forward=true)*/
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkPoint& MoveHead(TypeList& AR_RhsList, bool AB_Forward=true)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
ZCLink* VP_HereLink = /////////////////
|
||||||
|
(
|
||||||
|
AB_Forward
|
||||||
|
? mp_CurrLink->mp_NextLink
|
||||||
|
: mp_CurrLink->mp_PrevLink
|
||||||
|
) ;
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
if(&mr_CurrList!=&AR_RhsList)
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutAfter /********/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, AR_RhsList, ZCLinkOpt(0)
|
||||||
|
);
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}/*
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)*/
|
||||||
|
|
||||||
|
|
||||||
|
// &mr_CurrList == &rhs.mr_CurrList
|
||||||
|
|
||||||
|
else if(mr_CurrList.mp_HeadLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
// *this 가 이미 머리인 경우.
|
||||||
|
|
||||||
|
if(AB_Forward){++ml_CurrPos;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(rhs.mp_CurrLink->mp_NextLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else //////////////////////////////////////////
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutAfter /****************/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, mr_CurrList, ZCLinkOpt(*mp_CurrLink)
|
||||||
|
);
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}
|
||||||
|
mp_CurrLink = VP_HereLink ; return *this ;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& MoveHead(TypeList& AR_RhsList, bool AB_Forward=true)*/
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkPoint& MoveTail(TypeList& AR_RhsList, bool AB_Forward=true)
|
||||||
|
{
|
||||||
|
if(IsEmpty()){return *this;}
|
||||||
|
|
||||||
|
ZCLink* VP_HereLink = /////////////////
|
||||||
|
(
|
||||||
|
AB_Forward
|
||||||
|
? mp_CurrLink->mp_NextLink
|
||||||
|
: mp_CurrLink->mp_PrevLink
|
||||||
|
) ;
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
if(&mr_CurrList!=&AR_RhsList)
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutBefore /*******/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, AR_RhsList, ZCLinkOpt(0)
|
||||||
|
);
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}/*
|
||||||
|
if(&mr_CurrList!=&rhs.mr_CurrList)*/
|
||||||
|
|
||||||
|
|
||||||
|
// &mr_CurrList == &rhs.mr_CurrList
|
||||||
|
|
||||||
|
else if(AR_RhsList.mp_TailLink==mp_CurrLink)
|
||||||
|
{
|
||||||
|
// 이미 *this 가 꼬리인 경우.
|
||||||
|
|
||||||
|
if(AB_Forward){ml_CurrPos=1;}else{--ml_CurrPos;}
|
||||||
|
}/*
|
||||||
|
else if(AR_RhsList.mp_TailLink==mp_CurrLink)*/
|
||||||
|
|
||||||
|
else //////////////////////////////////////////
|
||||||
|
{
|
||||||
|
mr_CurrList.SendOutAfter /****************/
|
||||||
|
(
|
||||||
|
*mp_CurrLink, mr_CurrList, ZCLinkOpt(*mp_CurrLink)
|
||||||
|
);
|
||||||
|
if(!AB_Forward){ml_CurrPos = ml_CurrPos-1;}
|
||||||
|
}
|
||||||
|
mp_CurrLink = VP_HereLink ; return *this ;
|
||||||
|
}/*
|
||||||
|
ZCLinkPoint& MoveTail(TypeList& AR_RhsList, bool AB_Forward=true)*/
|
||||||
|
|
||||||
|
public:
|
||||||
|
};/*
|
||||||
|
class ZCLinkPoint*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public :
|
public :
|
||||||
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
||||||
private :
|
private :
|
||||||
@ -6770,6 +7144,86 @@ namespace ZNsMain
|
|||||||
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
|
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
|
||||||
|
|
||||||
|
|
||||||
|
ZtCBaseList& SwapLinkNext(ZCLink& AR_LinkPrev)
|
||||||
|
{
|
||||||
|
// 다음 링크와 위치를 맞바꾼다.
|
||||||
|
|
||||||
|
ZCLink* VP_LinkNext = AR_LinkPrev.mp_NextLink;
|
||||||
|
|
||||||
|
if(&AR_LinkPrev == VP_LinkNext){ return *this; }
|
||||||
|
|
||||||
|
if(size()==2)
|
||||||
|
{
|
||||||
|
if(&AR_LinkPrev==mp_HeadLink)
|
||||||
|
{
|
||||||
|
// VP_LinkNext==mp_TailLink
|
||||||
|
|
||||||
|
mp_HeadLink = VP_LinkNext ;
|
||||||
|
mp_TailLink = &AR_LinkPrev;
|
||||||
|
}
|
||||||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||||
|
|
||||||
|
else // VP_LinkNext==mp_HeadLink
|
||||||
|
{
|
||||||
|
mp_HeadLink = &AR_LinkPrev ;
|
||||||
|
mp_TailLink = VP_LinkNext ;
|
||||||
|
}
|
||||||
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||||
|
}
|
||||||
|
else if(&AR_LinkPrev==mp_HeadLink)
|
||||||
|
{
|
||||||
|
// VP_LinkNext == mp_HeadLink.mp_NextLink;
|
||||||
|
|
||||||
|
ZCLink* VP_HeadNext2 =
|
||||||
|
VP_LinkNext->mp_NextLink ;
|
||||||
|
|
||||||
|
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev);
|
||||||
|
ZCLink::JoinLink(&AR_LinkPrev, VP_HeadNext2);
|
||||||
|
ZCLink::MakeRing(VP_LinkNext , mp_TailLink );
|
||||||
|
|
||||||
|
mp_HeadLink = VP_LinkNext ;
|
||||||
|
}
|
||||||
|
else if(&AR_LinkPrev==mp_TailLink)
|
||||||
|
{
|
||||||
|
// VP_LinkNext==mp_HeadLink
|
||||||
|
|
||||||
|
ZCLink* VP_HeadNext =
|
||||||
|
mp_HeadLink->mp_NextLink ;
|
||||||
|
ZCLink* VP_TailPrev =
|
||||||
|
mp_TailLink->mp_PrevLink ;
|
||||||
|
|
||||||
|
ZCLink::JoinLink(mp_TailLink, VP_HeadNext);
|
||||||
|
ZCLink::JoinLink(VP_TailPrev, mp_HeadLink);
|
||||||
|
ZCLink::MakeRing(mp_TailLink, mp_HeadLink);
|
||||||
|
|
||||||
|
mp_HeadLink = &AR_LinkPrev ;
|
||||||
|
mp_TailLink = VP_LinkNext ;
|
||||||
|
}
|
||||||
|
else if(VP_LinkNext==mp_TailLink)
|
||||||
|
{
|
||||||
|
ZCLink* VP_TailPrev2 =
|
||||||
|
AR_LinkPrev.mp_PrevLink ;
|
||||||
|
|
||||||
|
ZCLink::JoinLink(VP_TailPrev2, VP_LinkNext );
|
||||||
|
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev );
|
||||||
|
ZCLink::MakeRing(mp_HeadLink , &AR_LinkPrev );
|
||||||
|
|
||||||
|
mp_TailLink = &AR_LinkPrev ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ZCLink* VP_SwapPrev = AR_LinkPrev. mp_PrevLink;
|
||||||
|
ZCLink* VP_SwapNext = VP_LinkNext->mp_NextLink;
|
||||||
|
|
||||||
|
ZCLink::JoinLink(VP_SwapPrev , VP_LinkNext ) ;
|
||||||
|
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ) ;
|
||||||
|
ZCLink::JoinLink(&AR_LinkPrev, VP_SwapNext ) ;
|
||||||
|
}
|
||||||
|
return *this; /***********************************/
|
||||||
|
}/*
|
||||||
|
ZtCBaseList& SwapLinkNext(ZCLink& AR_LinkPrev)*/
|
||||||
|
|
||||||
|
|
||||||
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs)
|
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs)
|
||||||
{
|
{
|
||||||
// AP_CutLink 를 잘라서 rhs 의 앞에 연결한다.
|
// AP_CutLink 를 잘라서 rhs 의 앞에 연결한다.
|
||||||
@ -6820,11 +7274,11 @@ namespace ZNsMain
|
|||||||
{
|
{
|
||||||
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
||||||
|
|
||||||
return CutLinkRangeOut
|
return CutLinkRangeOut /////////////
|
||||||
(
|
(
|
||||||
AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true
|
AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true
|
||||||
);
|
);
|
||||||
//////////////////////
|
////////////////////////////////////
|
||||||
}
|
}
|
||||||
ZtCBaseList& SendRangeOutBefore /////////////////////////////////////////
|
ZtCBaseList& SendRangeOutBefore /////////////////////////////////////////
|
||||||
(
|
(
|
||||||
@ -7191,6 +7645,77 @@ namespace ZNsMain
|
|||||||
###############################################################################*/
|
###############################################################################*/
|
||||||
|
|
||||||
|
|
||||||
|
template<typename TFunctor> void IterElemLinkRev(TFunctor AO_Functor)
|
||||||
|
{
|
||||||
|
ZCLink* VP_LoopLink = mp_TailLink ;
|
||||||
|
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)
|
||||||
|
{
|
||||||
|
ZtCTypeData<TFunctor>::
|
||||||
|
GetObjRef(AO_Functor)( *VP_LoopLink );
|
||||||
|
|
||||||
|
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
|
||||||
|
}/*
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)*/
|
||||||
|
}/*
|
||||||
|
template<typename TFunctor> void IterElemLinkRev(TFunctor AO_Functor) */
|
||||||
|
|
||||||
|
|
||||||
|
template<typename TFunctor, typename TTypeHelp>
|
||||||
|
void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
|
||||||
|
{
|
||||||
|
typedef ZNsMain::
|
||||||
|
ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||||
|
|
||||||
|
ZCLink* VP_LoopLink=mp_TailLink;
|
||||||
|
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)
|
||||||
|
{
|
||||||
|
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
|
||||||
|
(
|
||||||
|
*VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
|
||||||
|
);
|
||||||
|
////////////////////////////////////////////
|
||||||
|
|
||||||
|
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
|
||||||
|
}/*
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)*/
|
||||||
|
}/*
|
||||||
|
template<typename TFunctor, typename TTypeHelp>
|
||||||
|
void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
|
||||||
|
|
||||||
|
|
||||||
|
template
|
||||||
|
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
|
||||||
|
void IterElemLinkRev
|
||||||
|
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
|
||||||
|
/*#############################################################################*/
|
||||||
|
{
|
||||||
|
typedef ZNsMain::ZtCCheckRef<TTypeHelp1> ZCCheckRef1;
|
||||||
|
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
|
||||||
|
|
||||||
|
ZCLink* VP_LoopLink=mp_TailLink;
|
||||||
|
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)
|
||||||
|
{
|
||||||
|
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
|
||||||
|
(
|
||||||
|
*VP_LoopLink
|
||||||
|
, ZCCheckRef1::PassData(AO_TypeHelp1)
|
||||||
|
, ZCCheckRef2::PassData(AO_TypeHelp2)
|
||||||
|
);
|
||||||
|
////////////////////////////////////////////
|
||||||
|
|
||||||
|
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
|
||||||
|
}/*
|
||||||
|
__for0(TypeSize, i, ml_LinkSize)*/
|
||||||
|
}/*
|
||||||
|
template
|
||||||
|
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
|
||||||
|
void IterElemLinkRev
|
||||||
|
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
|
||||||
|
###############################################################################*/
|
||||||
|
|
||||||
|
|
||||||
ZCLink* GetHeadLinkPtr(){return mp_HeadLink;}
|
ZCLink* GetHeadLinkPtr(){return mp_HeadLink;}
|
||||||
ZCLink* GetTailLinkPtr(){return mp_TailLink;}
|
ZCLink* GetTailLinkPtr(){return mp_TailLink;}
|
||||||
@ -7202,21 +7727,6 @@ namespace ZNsMain
|
|||||||
const ZCLink* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);}
|
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& GetHeadLink(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;}
|
||||||
ZCLink& GetTailLink(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;}
|
ZCLink& GetTailLink(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;}
|
||||||
|
|
||||||
@ -7228,6 +7738,70 @@ namespace ZNsMain
|
|||||||
const ZCLink& GetLink(TypeSize AI_Index) const{return (*mp_HeadLink)+(AI_Index-1);}
|
const ZCLink& GetLink(TypeSize AI_Index) const{return (*mp_HeadLink)+(AI_Index-1);}
|
||||||
|
|
||||||
|
|
||||||
|
ZCLink* HeadPtr(){return mp_HeadLink;}
|
||||||
|
ZCLink* TailPtr(){return mp_TailLink;}
|
||||||
|
|
||||||
|
ZCLink* HeadPtr(TypeSize AI_Distance){return &((*mp_HeadLink)+AI_Distance);}
|
||||||
|
ZCLink* TailPtr(TypeSize AI_Distance){return &((*mp_TailLink)-AI_Distance);}
|
||||||
|
|
||||||
|
const ZCLink* HeadPtr() const{return mp_HeadLink;}
|
||||||
|
const ZCLink* TailPtr() const{return mp_TailLink;}
|
||||||
|
|
||||||
|
const ZCLink* HeadPtr(TypeSize AI_Distance) const{return &((*mp_HeadLink)+AI_Distance);}
|
||||||
|
const ZCLink* TailPtr(TypeSize AI_Distance) const{return &((*mp_TailLink)-AI_Distance);}
|
||||||
|
|
||||||
|
|
||||||
|
ZCLink& HeadRef(){return *mp_HeadLink;}
|
||||||
|
ZCLink& TailRef(){return *mp_TailLink;}
|
||||||
|
|
||||||
|
ZCLink& HeadRef(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;}
|
||||||
|
ZCLink& TailRef(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;}
|
||||||
|
|
||||||
|
const ZCLink& HeadRef() const{return *mp_HeadLink;}
|
||||||
|
const ZCLink& TailRef() const{return *mp_TailLink;}
|
||||||
|
|
||||||
|
const ZCLink& HeadRef(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;}
|
||||||
|
const ZCLink& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ZCLinkOpt HeadOpt(){return ZCLinkOpt(mp_HeadLink);}
|
||||||
|
ZCLinkOpt TailOpt(){return ZCLinkOpt(mp_TailLink);}
|
||||||
|
|
||||||
|
ZCLinkOpt HeadOpt(TypeSize AI_Distance)
|
||||||
|
{if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);}
|
||||||
|
ZCLinkOpt TailOpt(TypeSize AI_Distance)
|
||||||
|
{if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);}
|
||||||
|
|
||||||
|
const ZCLinkOpt HeadOpt() const{return ZCLinkOpt(mp_HeadLink);}
|
||||||
|
const ZCLinkOpt TailOpt() const{return ZCLinkOpt(mp_TailLink);}
|
||||||
|
|
||||||
|
const ZCLinkOpt HeadOpt(TypeSize AI_Distance) const
|
||||||
|
{if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);}
|
||||||
|
const ZCLinkOpt TailOpt(TypeSize AI_Distance) const
|
||||||
|
{if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);}
|
||||||
|
|
||||||
|
|
||||||
|
ZCLink& _1(){return HeadRef();}
|
||||||
|
ZCLink& _0(){return TailRef();}
|
||||||
|
|
||||||
|
ZCLink& _1(TypeSize AI_Distance){return HeadRef(AI_Distance);}
|
||||||
|
ZCLink& _0(TypeSize AI_Distance){return TailRef(AI_Distance);}
|
||||||
|
|
||||||
|
const ZCLink& _1() const{return HeadRef();}
|
||||||
|
const ZCLink& _0() const{return TailRef();}
|
||||||
|
|
||||||
|
const ZCLink& _1(TypeSize AI_Distance) const{return HeadRef(AI_Distance);}
|
||||||
|
const ZCLink& _0(TypeSize AI_Distance) const{return TailRef(AI_Distance);}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ 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)); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IterEasy GetHeadIterEasy (){return GetHeadLinkPtr();}
|
IterEasy GetHeadIterEasy (){return GetHeadLinkPtr();}
|
||||||
IterEasy GetTailIterEasy (){return GetTailLinkPtr();}
|
IterEasy GetTailIterEasy (){return GetTailLinkPtr();}
|
||||||
IterEasyID GetHeadIterEasyID (){return (IterEasyID)GetHeadLinkPtr();}
|
IterEasyID GetHeadIterEasyID (){return (IterEasyID)GetHeadLinkPtr();}
|
||||||
|
@ -548,6 +548,25 @@ namespace ZNsMain
|
|||||||
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
||||||
|
|
||||||
|
|
||||||
|
cout<<endl<<"# after VO_ZCBaseListEx10_2.SwapLinkNext(1th)"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.SwapLinkNext(VO_ZCBaseListEx10_2.HeadRef());
|
||||||
|
cout<<"*****************************************************"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
||||||
|
|
||||||
|
cout<<endl<<"# after VO_ZCBaseListEx10_2.SwapLinkNext(last)"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.SwapLinkNext(VO_ZCBaseListEx10_2.TailRef());
|
||||||
|
cout<<"*****************************************************"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
||||||
|
|
||||||
|
cout<<endl<<"# after VO_ZCBaseListEx10_2.SwapLinkNext(last-1)"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.SwapLinkNext(VO_ZCBaseListEx10_2.TailRef(1));
|
||||||
|
cout<<"*****************************************************"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.IterElemLink(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
||||||
|
|
||||||
|
cout<<endl<<"# after VO_ZCBaseListEx10_2 : Iter Rev"<<endl;
|
||||||
|
cout<<"*****************************************************"<<endl;
|
||||||
|
VO_ZCBaseListEx10_2.IterElemLinkRev(&ShowNode10_3, ZftMCP(VI_CallCnt=0));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}/*
|
}/*
|
||||||
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
||||||
|
Reference in New Issue
Block a user