Files
RepoMain/ZCppMain/ZtCLinkList.H

1403 lines
43 KiB
C++
Raw Normal View History


#ifndef __ZCPPMAIN__ZTCLINKLIST_H__
#define __ZCPPMAIN__ZTCLINKLIST_H__
#include "ZCppMain/ZMainHead.H"
namespace ZNsMain
{
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize
, typename TTypeCRTP
>
class ZtCLinkList; /*####################################################*/
namespace ZNsIFaceEx
{
template
<typename TTypBase, typename TChild>
class ZtCLink : public TTypBase
{
public :
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize
, typename TTypeCRTP
>
friend class ZNsMain::ZtCLinkList; /*####################################*/
public :
typedef ZtCLink TypeThis ;
typedef TTypBase TypeBase ;
typedef TChild TypeChild;
typedef ZTypLong TypeSize ;
protected:
ZtCLink* mp_NextLink;
ZtCLink* mp_PrevLink;
protected:
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
ZtCLink()
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink()*/
ZtCLink(const ZtCLink& rhs)
{
mp_NextLink=0 ;
mp_PrevLink=0 ;
(*this) = rhs ;
}/*
ZtCLink(const ZtCLink& rhs)*/
ZtCLink(const TTypBase& rhs)
{
mp_NextLink=0 ;
mp_PrevLink=0 ;
(*this) = rhs ;
}/*
ZtCLink(const TTypBase& rhs)*/
ZtCLink& operator=(const ZtCLink& rhs)
{
(*this)() = rhs(); return *this;
}/*
ZtCLink& operator=(const ZtCLink& rhs)*/
ZtCLink& operator=(const TypeBase& AR_CBase)
{
(*this)() = AR_CBase; return *this;
}/*
ZtCLink& operator=(const TypeBase& AR_CBase)*/
ZtCLink& operator=(TypeBase& AR_CBase)
{
(*this)() = AR_CBase; return *this;
}/*
ZtCLink& operator=(TypeBase& AR_CBase)*/
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
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
<typename TTypBase, typename TChild>
class ZtCLink : public TTypBase
*/
template<typename TTypBase>
class ZtCLink<TTypBase, ZCEmpty> : public TTypBase
{
public :
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize
, typename TTypeCRTP
>
friend class ZNsMain::ZtCLinkList; /*####################################*/
public :
typedef ZtCLink<TTypBase, ZCEmpty> TypeThis ;
typedef TTypBase /*+++++++++++++*/ TypeBase ;
typedef ZCEmpty /*+++++++++++++*/ TypeChild;
typedef ZTypLong /*+++++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
ZtCLink* mp_PrevLink;
public :
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
ZtCLink<TTypBase, ZCEmpty>()
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink<TTypBase, ZCEmpty>()*/
ZtCLink<TTypBase, ZCEmpty>(const TypeThis& rhs)
{
mp_NextLink =0 ;
mp_PrevLink =0 ;
(*this)() = rhs();
}/*
ZtCLink<TTypBase, ZCEmpty>(const TypeThis& rhs)*/
TypeThis& operator=(const TypeThis& rhs)
{
(*this)() = rhs(); return *this;
}/*
TypeThis& operator=(const TypeThis& rhs)*/
TypeThis& operator=(const TypeBase& AR_CBase)
{
(*this)() = AR_CBase; return *this;
}/*
TypeThis& operator=(const TypeBase& AR_CBase)*/
TypeThis& operator=(TypeBase& AR_CBase)
{
(*this)() = AR_CBase; return *this;
}/*
TypeThis& operator=(TypeBase& AR_CBase)*/
TypeBase& operator()(){ return *static_cast<TypeBase*>(this); }
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<typename TTypBase>
class ZtCLink<TTypBase, ZCEmpty> : public TTypBase*/
template<typename TChild> class ZtCLink<ZCEmpty, TChild>
{
public :
public :
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize
, typename TTypeCRTP
>
friend class ZNsMain::ZtCLinkList; /*####################################*/
public :
typedef ZtCLink<ZCEmpty, TChild> TypeThis ;
typedef ZCEmpty /*+++++++++++*/ TypeBase ;
typedef TChild /*+++++++++++*/ TypeChild;
typedef ZTypLong /*++++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
ZtCLink* mp_PrevLink;
protected:
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
ZtCLink<ZCEmpty, TChild>()
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink<ZCEmpty, TChild>()*/
ZtCLink<ZCEmpty, TChild>(const TypeThis& rhs)
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink<ZCEmpty, TChild>(const TypeThis& rhs)*/
TypeThis& operator=(const TypeThis& rhs)
{
return *this;
}/*
TypeThis& operator=(const TypeThis& rhs)*/
TypeThis& operator()(){ return *this; }
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<typename TChild> class ZtCLink<ZCEmpty, TChild>*/
template<> class ZtCLink<ZCEmpty, ZCEmpty>
{
public :
public :
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize
, typename TTypeCRTP
>
friend class ZNsMain::ZtCLinkList; /*####################################*/
public :
typedef ZtCLink<ZCEmpty, ZCEmpty> TypeThis ;
typedef ZCEmpty /*++++++++++++*/ TypeBase ;
typedef ZCEmpty /*++++++++++++*/ TypeChild;
typedef ZTypLong /*++++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
ZtCLink* mp_PrevLink;
protected:
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
ZtCLink<ZCEmpty, ZCEmpty>()
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink<ZCEmpty, ZCEmpty>()*/
ZtCLink<ZCEmpty, ZCEmpty>(const TypeThis& rhs)
{
mp_NextLink=0;
mp_PrevLink=0;
}/*
ZtCLink<ZCEmpty, ZCEmpty>(const TypeThis& rhs)*/
TypeThis& operator=(const TypeThis& rhs)
{
return *this;
}/*
TypeThis& operator=(const TypeThis& 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<> class ZtCLink<ZCEmpty, ZCEmpty>*/
}/*
namespace ZNsIFaceEx*/
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 ZtCObjOpt<TCLink> ZCObjOpt;
public :
typedef TCLink ZCLink ;
typedef TCLink TypeData;
typedef TTypSize TypeSize;
private:
ZCLink* mp_HeadLink;
ZCLink* mp_TailLink;
TypeSize ml_LinkSize;
private:
TypeChild& GetChildObj()
{
return *static_cast<TypeChild*>(this);
}/*
TypeChild& GetChildObj()*/
private:
ZCLink* NewLink()
{
return new ZCLink;
}/*
ZCLink* NewLink()*/
ZCLink* NewLink( ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
ZCLink* NewLink(const ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
void NewLink ////////////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
/////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}/*
void NewLink ////////////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
///////////////////////////////////////////////////*/
void NewLinkCopy //////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
void NewLinkCopy //////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
void DelLink(ZCLink* AP_DelLink)
{
delete AP_DelLink;
}/*
void DelLink(ZCLink* AP_DelLink)*/
void DelLink //////////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr() ;
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
///////////////////////////////////////////////////////
/*private:*/
private:
_VT_ ZCLink* SendFreeOut()
{
if(TTypeCRTP::ZEUseCRTP<1) return NewLink();
return GetChildObj().SendFreeOut();
}/*
_VT_ ZCLink* SendFreeOut()*/
_VT_ ZCLink* SendFreeOut(ZCLink& AR_ArgData)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ return NewLink(AR_ArgData); }
return GetChildObj().SendFreeOut(AR_ArgData);
}/*
_VT_ ZCLink* SendFreeOut(ZCLink& AR_ArgData)*/
_VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ return NewLink(AR_ArgData); }
return GetChildObj().SendFreeOut(AR_ArgData);
}/*
_VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData)*/
_VT_ void SendFreeOut
(TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink)
{
if(TTypeCRTP::ZEUseCRTP<1)
{
NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); return;
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
return GetChildObj().SendFreeOut
(AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink));
}/*
_VT_ void SendFreeOut
(TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink)
*/
_VT_ void SendFreeOutCopy /*///////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
if(TTypeCRTP::ZEUseCRTP<1)
{
NewLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); return;
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
return GetChildObj().SendFreeOutCopy
(AP_LinkOrgin, AL_FarNum, RR(APR_HeadCopy), RR(APR_TailCopy));
}/*
_VT_ void SendFreeOutCopy /////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
_VT_ void RecvFreeIn(ZCLink* AP_DelLink)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ DelLink(AP_DelLink); return; }
GetChildObj().RecvFreeIn(AP_DelLink);
}/*
_VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/
_VT_ void RecvFreeIn //////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
if(TTypeCRTP::ZEUseCRTP<1)
{
DelLink
(AL_CutCnt, AP_CutHead, AP_CutTail);
return;
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
GetChildObj().RecvFreeIn(AL_CutCnt, AP_CutHead, AP_CutTail);
}/*
_VT_ void RecvFreeIn //////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
/////////////////////////////////////////////////////*/
/*private:*/
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_TailLink=&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)*/
/*private:*/
public :
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()*/
ZtCLinkList& operator=(const ZtCLinkList& rhs)
{
if(this==&rhs) return *this;
if(rhs.size()<1)
{ this->DeleteAll(); return *this; }
TypeSize VL_MinusSize = this->size() - rhs.size() ;
if (VL_MinusSize>0)
{
RecvFreeIn ////////////////////////////////////////
(
VL_MinusSize,
mp_HeadLink ,
mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1)
);
///////////////////////////////////////////////////
ml_LinkSize -= VL_MinusSize;
}
else if(VL_MinusSize<0)
{
ZCLink* VP_HeadLink=0;
ZCLink* VP_TailLink=0;
SendFreeOut ////////////////////////////////////////
(
-VL_MinusSize ,
RR(VP_HeadLink) ,
RR(VP_TailLink)
);
///////////////////////////////////////////////////
if(ml_LinkSize>0)
{
ZCLink::JoinLink(mp_TailLink, VP_HeadLink);
ZCLink::MakeRing(mp_HeadLink, VP_TailLink);
mp_TailLink = VP_TailLink ;
}
else
{
mp_HeadLink = VP_HeadLink ;
mp_TailLink = VP_TailLink ;
ZCLink::MakeRing(mp_HeadLink, VP_TailLink);
}/*
else*/
ml_LinkSize += (-VL_MinusSize);
}/*
else if(VL_MinusSize<0)*/
ZCLink* VP_RhsLink = rhs.mp_HeadLink ;
ZCLink* VP_LhsLink = mp_HeadLink ;
__for0(TypeSize, i, rhs.size())
{
**VP_LhsLink = **VP_RhsLink ;
VP_RhsLink = VP_RhsLink->mp_NextLink;
VP_LhsLink = VP_LhsLink->mp_NextLink;
}/*
__for0(TypeSize, i, rhs.size())*/
return *this;
}/*
ZtCLinkList& operator=(const ZtCLinkList& rhs)*/
TypeSize GetSize(){return ml_LinkSize;}
TypeSize size (){return ml_LinkSize;}
void DeleteAll()
{
if(ml_LinkSize<1) return;
RecvFreeIn
(ml_LinkSize, mp_HeadLink, mp_TailLink);
mp_HeadLink =0 ;
mp_TailLink =0 ;
ml_LinkSize =0 ;
}/*
void DeleteAll()*/
void clear(){DeleteAll();}
ZCObjOpt GetHeadOpt(){ return ZCObjOpt(mp_HeadLink); }
ZCObjOpt GetTailOpt(){ return ZCObjOpt(mp_TailLink); }
ZCObjOpt GetObjOpt(TypeSize AI_Index)
{
if(ml_LinkSize<1) return ZCObjOpt(0);
return ZCObjOpt( (*mp_HeadLink)+(AI_Index-1) );
}/*
ZCObjOpt GetObjOpt(TypeSize AI_Index)*/
ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); }
ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); }
void DeleteHead()
{ if(ml_LinkSize<1) return; RecvFreeIn( &CutLink(mp_HeadLink) ); }
void DeleteTail()
{ if(ml_LinkSize<1) return; RecvFreeIn( &CutLink(mp_TailLink) ); }
void Delete(ZCLink& AR_DelLink)
{
RecvFreeIn( &CutLink(AR_DelLink) );
}/*
void Delete(ZCLink& AR_DelLink)*/
void SendOutAfter (ZCLink& AR_CutLink, ZtCLinkList& 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, ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
void SendOutBefore(ZCLink& AR_CutLink, ZtCLinkList& 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, ZtCLinkList& rhs, ZCLink* AP_StdLink)*/
void SendOutHead(ZCLink& AR_CutLink, ZtCLinkList& rhs)
{
// AR_CutLink 를 잘라서 rhs 의 앞에 연결한다.
SendOutAfter (AR_CutLink, rhs, 0);
}
void SendOutTail(ZCLink& AR_CutLink, ZtCLinkList& rhs)
{
// AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
SendOutBefore(AR_CutLink, rhs, 0);
}/*
void SendOutTail(ZCLink& AR_CutLink, ZtCLinkList& rhs)*/
template<typename TFunctor> void IterElement(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)( *VP_LoopLink );
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template<typename TFunctor> void IterElement(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef;
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
*VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
);
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template<typename TFunctor, typename TTypeHelp>
void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElement
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
/*#############################################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp1> ZCCheckRef1;
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
ZCLink* VP_LoopLink=mp_HeadLink;
__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_NextLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElement
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
template<typename TFunctor> void IterElemRev(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_Size)*/
}/*
template<typename TFunctor> void IterElemRev(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
void IterElemRev(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_Size)*/
}/*
template<typename TFunctor, typename TTypeHelp>
void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemRev
( 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_Size)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemRev
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
public :
};/*
template //////////////////////////////////////////////////////////////////
<
typename TCLink
, typename TTypSize = ZTypLong
, typename TTypeCRTP =
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCLinkList #######################################################*/
}/*
namespace ZNsMain*/
#endif //__ZCPPMAIN__ZTCLINKLIST_H__