commit 2025-10-05 14:36 edit ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-05 14:36:50 +09:00
parent 8bfa731e4a
commit 1cb7045ad8

View File

@ -1,7 +1,10 @@

// is editing
#ifndef __ZCPPMAIN__ZMAINHEAD_H__
#define __ZCPPMAIN__ZMAINHEAD_H__
#ifndef __ZCPPMAIN__ZTCLINKLIST_H__
#define __ZCPPMAIN__ZTCLINKLIST_H__
#include "ZCppMain/ZMainHead.H"
@ -32,9 +35,6 @@ namespace ZNsMain
ZtCLink* mp_PrevLink;
protected:
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
@ -77,6 +77,97 @@ namespace ZNsMain
}/*
ZtCLink& operator=(const ZtCLink& rhs)*/
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
const ZtCLink* GetNextPtr() const{return mp_NextLink;}
const ZtCLink* GetPrevPtr() const{return mp_PrevLink;}
ZtCLink* GetNextPtr(TypeSize AL_Distance)
{
TypeSize VL_LoopIndex=0 ;
ZtCLink* VP_TmpLink =this;
while(VL_LoopIndex++ < AL_Distance)
VP_TmpLink = VP_TmpLink->mp_NextLink ;
return VP_TmpLink;
}/*
ZtCLink* GetNextPtr(TypeSize AL_Distance)*/
ZtCLink* GetPrevPtr(TypeSize AL_Distance)
{
TypeSize VL_LoopIndex=0 ;
ZtCLink* VP_TmpLink =this;
while(VL_LoopIndex++ < AL_Distance)
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
return VP_TmpLink;
}/*
ZtCLink* GetPrevPtr(TypeSize AL_Distance)*/
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const
{
TypeSize VL_LoopIndex=0 ;
ZtCLink* VP_TmpLink =const_cast<ZtCLink*>(this);
while(VL_LoopIndex++ < AL_Distance)
VP_TmpLink = VP_TmpLink->mp_NextLink ;
return VP_TmpLink;
}/*
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const*/
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const
{
TypeSize VL_LoopIndex=0 ;
ZtCLink* VP_TmpLink = const_cast<ZtCLink*>(this) ;
while(VL_LoopIndex++ < AL_Distance)
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
return VP_TmpLink;
}/*
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
ZtCLink& operator+(TypeSize AL_Distance)
{
if(AL_Distance>=0)
return *GetNextPtr(AL_Distance);
else return *GetPrevPtr(AL_Distance);
}/*
ZtCLink& operator+(TypeSize AL_Distance)*/
ZtCLink& operator-(TypeSize AL_Distance)
{
if(AL_Distance>=0)
return *GetPrevPtr(AL_Distance);
else return *GetNextPtr(AL_Distance);
}/*
ZtCLink& operator-(TypeSize AL_Distance)*/
const ZtCLink& operator+(TypeSize AL_Distance) const
{
if(AL_Distance>=0)
return *GetNextPtr(AL_Distance);
else return *GetPrevPtr(AL_Distance);
}/*
const ZtCLink& operator+(TypeSize AL_Distance) const*/
const ZtCLink& operator-(TypeSize AL_Distance) const
{
if(AL_Distance>=0)
return *GetPrevPtr(AL_Distance);
else return *GetNextPtr(AL_Distance);
}/*
const ZtCLink& operator-(TypeSize AL_Distance) const*/
public :
};/*
template
@ -100,8 +191,8 @@ namespace ZNsMain
ZtCLink* mp_PrevLink;
public :
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
@ -166,8 +257,8 @@ namespace ZNsMain
ZtCLink* mp_PrevLink;
protected:
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
@ -226,8 +317,8 @@ namespace ZNsMain
ZtCLink* mp_PrevLink;
protected:
ZtCLink* GetNextLinkPtr(){return mp_NextLink;}
ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;}
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
@ -272,11 +363,26 @@ namespace ZNsMain
template
<typename TCLink, typename TTypSize=ZTypLong>
class ZtCLinkList
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize = ZTypLong
, typename TTypeCRTP =
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCLinkList /*#####################################################*/
{
public :
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
<
ZtCLinkList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
>
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
public :
typedef TCLink ZCLink ;
typedef TCLink TypeData;
typedef TTypSize TypeSize;
@ -286,28 +392,266 @@ namespace ZNsMain
TypeSize ml_LinkSize;
private:
TypeChild& GetChildObj()
{
return *static_cast<TypeChild*>(this);
}/*
TypeChild& GetChildObj()*/
private:
_VT_ ZCLink* NewLink()
{
if(TTypeCRTP::ZEUseCRTP<1)
{ return new ZCLink; }
return GetChildObj().NewLink();
}/*
_VT_ ZCLink* NewLink()*/
_VT_ void DelLink(ZCLink* AP_DelLink)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ return delete ZCLink; }
return GetChildObj().DelLink(AP_DelLink);
}/*
_VT_ void DelLink(ZCLink* AP_DelLink)*/
private:
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)
{
// AR_LinkNew 를 AP_LinkStd 뒤에 삽입한다.
// AL_PosStd==0 이면 맨 앞에 삽입한다.
if(AP_LinkStd==0)
{
// 맨 앞에 삽입.
if(++ml_LinkSize==1)
{
mp_HeadLink = &AR_LinkNew ;
mp_TailLink = &AR_LinkNew ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else
{
ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink);
ZCLink::MakeRing(&AR_LinkNew, mp_TailLink);
mp_HeadLink=&AR_LinkNew;
}/*
else*/
}
else
{
++ml_LinkSize;
ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ;
ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew);
ZCLink::JoinLink(&AR_LinkNew, AP_NextStd );
}/*
else*/
return AR_LinkNew;
}/*
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)
{
// AR_LinkNew 를 AP_LinkStd 앞에 삽입한다.
// AL_PosStd==0 이면 맨 뒤에 삽입한다.
if(AP_LinkStd==0)
{
// 맨 뒤에 삽입.
if(++ml_LinkSize==1)
{
mp_HeadLink = &AR_LinkNew ;
mp_TailLink = &AR_LinkNew ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else
{
ZCLink::JoinLink(mp_TailLink, &AR_LinkNew);
ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew);
mp_HeadLink=&AR_LinkNew;
}/*
else*/
}
else
{
++ml_LinkSize;
ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ;
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
ZCLink::JoinLink(&AR_LinkNew, AP_LinkStd);
}/*
else*/
return AR_LinkNew;
}/*
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/
ZCLink& CutLink(ZCLink& AR_CutLink)
{
if(&AR_CutLink==mp_HeadLink)
{
if(mp_HeadLink==mp_TailLink)
mp_HeadLink=0;
else
{
ZCLink::MakeRing ////////////////////////////
(
mp_HeadLink=mp_HeadLink->mp_NextLink,
AR_CutLink.mp_PrevLink
);
/////////////////////////////////////////////
}/*
else*/
}
else if(&AR_CutLink==mp_TailLink)
{
ZCLink* VP_NewTail=AR_CutLink.mp_PrevLink;
ZCLink::MakeRing(mp_HeadLink, VP_NewTail);
mp_TailLink = VP_NewTail ;
}
else ZCLink::JoinLink(AR_CutLink. mp_PrevLink, AR_CutLink.mp_NextLink);
return (--ml_LinkSize, AR_CutLink);
}/*
ZCLink& CutLink(ZCLink& AR_CutLink)*/
public :
ZtCLinkList()
{
mp_HeadLink=0;
mp_TailLink=0;
ml_LinkSize=0;
}/*
ZtCLinkList()*/
ZtCLinkList()
{
mp_HeadLink=0;
mp_TailLink=0;
ml_LinkSize=0;
}/*
ZtCLinkList()*/
ZtCLinkList(const ZtCLinkList& rhs)
{
mp_HeadLink=0;
mp_TailLink=0;
ml_LinkSize=0;
}/*
ZtCLinkList(const ZtCLinkList& rhs)*/
~ZtCLinkList()
{
DeleteAll();
}/*
~ZtCLinkList()*/
// is adding codes
ZtCLinkList& operator=(const ZtCLinkList& rhs)
{
return *this;
}/*
ZtCLinkList& operator=(const ZtCLinkList& rhs)*/
void DeleteAll()
{
if(ml_LinkSize<1) return;
ZCLink VP_DelLink = mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
mp_HeadLink = mp_HeadLink->mp_NextLink;
DelLink(VP_DelLink); VP_DelLink = mp_HeadLink;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
mp_HeadLink=0;
mp_TailLink=0;
ml_LinkSize=0;
}/*
void DeleteAll()*/
void clear(){DeleteAll();}
ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); }
ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); }
void DelHead()
{ if(ml_LinkSize<1) return; DelLink( CutLink(mp_HeadLink) ); }
void DelTail()
{ if(ml_LinkSize<1) return; DelLink( CutLink(mp_TailLink) ); }
void Delete(ZCLink& AR_DelLink)
{
DelLink( &CutLink(AR_DelLink) );
}/*
void Delete(ZCLink& AR_DelLink)*/
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)
{
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다.
// AP_StdLink==0 이면, rhs 의 앞에 삽입한다.
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, AP_StdLink);
}/*
void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)
{
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
// AP_StdLink==0 이면, rhs 의 뒤에 삽입한다.
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, AP_StdLink);
}/*
void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/
void SendOutHead(ZCLink& AR_CutLink, ZtCObjList& rhs)
{
// AR_CutLink 를 잘라서 rhs 의 앞에 연결한다.
SendOutAfter (AR_CutLink, rhs, 0);
}
void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)
{
// AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
SendOutBefore(AR_CutLink, rhs, 0);
}/*
void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)*/
public :
};/*
template
<typename TCLink, typename TTypSize=ZTypLong>
class ZtCLinkList*/
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize = ZTypLong
, typename TTypeCRTP =
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCLinkList #######################################################*/
}/*
namespace ZNsMain*/
#endif //__ZCPPMAIN__ZMAINHEAD_H__
#endif //__ZCPPMAIN__ZTCLINKLIST_H__