2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
#ifndef __ZCPPMAIN__ZTCLINKLIST_H__
|
|
|
|
|
#define __ZCPPMAIN__ZTCLINKLIST_H__
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "ZCppMain/ZMainHead.H"
|
|
|
|
|
|
|
|
|
|
|
2025-10-06 15:25:20 +09:00
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
■ class ZtCLinkList 는 링크를 외부에서 미리 정의하고, 그 링크를 template parameter 로
|
|
|
|
|
받는다. 이렇게 외부에서 어떤 자료를 (주로 상속으로) 가지는 링크를 정의하면, 링크 자
|
|
|
|
|
체가 일종의 링크를 가진 자료이기 때문에, 자료를 다른 리스트로 이동하기가 쉽다.
|
|
|
|
|
|
|
|
|
|
그러니까 ZtCLinkList 는 자료를 다른 리스트로 이동하는 것이 쉽도록 설계되었다.
|
|
|
|
|
|
|
|
|
|
-- 2025-10-06 15:22
|
|
|
|
|
|
2025-10-07 12:25:36 +09:00
|
|
|
|
■ ZtCLinkList 의 링크를 주로 정의하는 ZNsIFaceEx::ZtCLink 은 operator() 을 가지는 것이
|
|
|
|
|
좋다.
|
|
|
|
|
|
|
|
|
|
const TypeBase& operator()() const
|
|
|
|
|
{ return *static_cast<const TypeBase*>(this); }
|
|
|
|
|
|
|
|
|
|
그래서 ZtCLink 가 가지고 있는, 링크 포인터 이외의 데이타에 접근할 수 있는 장치를 제공
|
|
|
|
|
하는 것이 좋다.
|
|
|
|
|
|
|
|
|
|
-- 2025-10-07 12:23
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
|
|
|
|
|
ZNsIFaceEx::ZtCLink 는 TypeData 라는 자료형을 갖는데, ZtCLink 이
|
|
|
|
|
|
|
|
|
|
상속 클래스가 있다면, 그 상속 클래스
|
|
|
|
|
기반 클래스만 있다면, 그 기반 클래스
|
|
|
|
|
|
|
|
|
|
를 나타낸다. 상속 클래스도 기반 클래스도 없다면, 자기 자신을 나타낸다.
|
|
|
|
|
|
|
|
|
|
-- 2025-10-07 17:18
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZNsIFaceEx::ZtCLink 는 TypeMain 이라는 자료형을 갖는데, ZtCLink 이
|
|
|
|
|
|
|
|
|
|
상속 클래스가 있다면, 그 상속 클래스
|
|
|
|
|
상속 클래스가 없다면, 클래스 자기 자신
|
|
|
|
|
|
|
|
|
|
를 나타낸다. 그래서 ZtCLinkList 에서 new 로 객체를 만들 때,
|
|
|
|
|
|
|
|
|
|
ZtCLink* my=new TypeMain;
|
|
|
|
|
|
|
|
|
|
처럼 쓸 수 있게 한다.
|
|
|
|
|
|
|
|
|
|
-- 2025-10-07 17:49
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
■ class ZtCLinkMoveList 은 고정적으로 맨 앞과 맨 뒤를 가상으로 표시하는 링크 객체를 멤
|
|
|
|
|
버로 가지고 있다. 그래서 중간에서 링크 자료를 떼어 내어 다른 리스트로 옮길 때, 그 링
|
2025-10-06 23:29:23 +09:00
|
|
|
|
크가 리스트의 앞이나 뒤가 아닌, 무조건 중간에 존재한다고 가정하고 빠르게 떼어낼 수 있
|
2025-10-06 22:53:19 +09:00
|
|
|
|
도록 했다. 이렇지 않다면 떼어 내려는 링크가 처음 링크인지 마지막 링크인지를 판단하는
|
2025-10-06 23:29:23 +09:00
|
|
|
|
코드를 집어 넣어야 한다. 그러니까 ZtCLinkList 보다 좀 더 빠르게 리스트간 자료 이동이
|
|
|
|
|
가능하게 설계한 것이다.
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체
|
|
|
|
|
ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체
|
|
|
|
|
|
|
|
|
|
실제 사용되는 링크의 머리는 mo_HeadFake.mp_NextLink 이고
|
|
|
|
|
실제 사용되는 링크의 꼬리는 mo_TailFake.mp_PrevLink 이다.
|
|
|
|
|
|
|
|
|
|
물론 이동하려는 링크가 mo_HeadFake 이나 mo_TailFake 을 가리키지 않도록 조심할 필요는
|
|
|
|
|
있다.
|
|
|
|
|
|
|
|
|
|
-- 2025-10-06 22:18
|
|
|
|
|
|
2025-10-06 15:25:20 +09:00
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
namespace ZNsMain
|
|
|
|
|
{
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
class ZtCLinkList; /*####################################################*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
class ZtCLinkMoveList; /*################################################*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
namespace ZNsIFaceEx
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template
|
|
|
|
|
<typename TTypBase, typename TChild>
|
|
|
|
|
class ZtCLink : public TTypBase
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
|
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkList; /*####################################*/
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkMoveList; /*################################*/
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef ZtCLink TypeThis ;
|
|
|
|
|
typedef TTypBase TypeBase ;
|
|
|
|
|
typedef TChild TypeChild;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
typedef TChild TypeData ;
|
|
|
|
|
typedef TChild TypeMain ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
/*protected:*/
|
|
|
|
|
public :
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink()
|
|
|
|
|
{
|
|
|
|
|
mp_NextLink=0;
|
|
|
|
|
mp_PrevLink=0;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink()*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink(const ZtCLink& rhs)
|
|
|
|
|
{
|
|
|
|
|
mp_NextLink=0 ;
|
|
|
|
|
mp_PrevLink=0 ;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
(*this) = rhs ;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink(const ZtCLink& rhs)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink(const TTypBase& rhs)
|
|
|
|
|
{
|
|
|
|
|
mp_NextLink=0 ;
|
|
|
|
|
mp_PrevLink=0 ;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
(*this) = rhs ;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink(const TTypBase& rhs)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
virtual ~ZtCLink()
|
|
|
|
|
{
|
|
|
|
|
}/*
|
|
|
|
|
virtual ~ZtCLink()*/
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink& operator=(const ZtCLink& rhs)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = rhs(); return *this;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink& operator=(const ZtCLink& rhs)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink& operator=(const TypeBase& AR_CBase)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = AR_CBase; return *this;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink& operator=(const TypeBase& AR_CBase)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink& operator=(TypeBase& AR_CBase)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = AR_CBase; return *this;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink& operator=(TypeBase& AR_CBase)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
/***/ TypeData& operator()() { return *static_cast< TypeData*>(this); }
|
|
|
|
|
const TypeData& operator()() const{ return *static_cast<const TypeData*>(this); }
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
|
|
|
|
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
const ZtCLink* GetNextPtr() const{return mp_NextLink;}
|
|
|
|
|
const ZtCLink* GetPrevPtr() const{return mp_PrevLink;}
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetNextPtr(TypeSize AL_Distance)
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink =this;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_NextLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return VP_TmpLink;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink* GetNextPtr(TypeSize AL_Distance)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetPrevPtr(TypeSize AL_Distance)
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink =this;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return VP_TmpLink;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink* GetPrevPtr(TypeSize AL_Distance)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink =const_cast<ZtCLink*>(this);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_NextLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return VP_TmpLink;
|
|
|
|
|
}/*
|
|
|
|
|
const ZtCLink* GetNextPtr(TypeSize AL_Distance) const*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink = const_cast<ZtCLink*>(this) ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return VP_TmpLink;
|
|
|
|
|
}/*
|
|
|
|
|
const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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 :
|
|
|
|
|
};/*
|
2025-10-04 22:55:41 +09:00
|
|
|
|
template
|
2025-10-05 20:29:21 +09:00
|
|
|
|
<typename TTypBase, typename TChild>
|
|
|
|
|
class ZtCLink : public TTypBase
|
|
|
|
|
*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template<typename TTypBase>
|
|
|
|
|
class ZtCLink<TTypBase, ZCEmpty> : public TTypBase
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkList; /*####################################*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkMoveList; /*################################*/
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef ZtCLink<TTypBase, ZCEmpty> TypeThis ;
|
|
|
|
|
typedef TTypBase /*+++++++++++++*/ TypeBase ;
|
|
|
|
|
typedef ZCEmpty /*+++++++++++++*/ TypeChild;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
typedef TypeBase /*+++++++++++++*/ TypeData ;
|
|
|
|
|
typedef TypeThis /*+++++++++++++*/ TypeMain ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
/*protected:*/
|
|
|
|
|
public :
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink<TTypBase, ZCEmpty>()
|
|
|
|
|
{
|
|
|
|
|
mp_NextLink=0;
|
|
|
|
|
mp_PrevLink=0;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink<TTypBase, ZCEmpty>()*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink<TTypBase, ZCEmpty>(const TypeThis& rhs)
|
|
|
|
|
{
|
|
|
|
|
mp_NextLink =0 ;
|
|
|
|
|
mp_PrevLink =0 ;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
(*this)() = rhs();
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink<TTypBase, ZCEmpty>(const TypeThis& rhs)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = rhs(); return *this;
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
TypeThis& operator=(const TypeBase& AR_CBase)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = AR_CBase; return *this;
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& operator=(const TypeBase& AR_CBase)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
TypeThis& operator=(TypeBase& AR_CBase)
|
|
|
|
|
{
|
|
|
|
|
(*this)() = AR_CBase; return *this;
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& operator=(TypeBase& AR_CBase)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
|
|
|
|
|
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetNextPtr(){return mp_NextLink;}
|
|
|
|
|
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
const ZtCLink* GetNextPtr() const{return mp_NextLink;}
|
|
|
|
|
const ZtCLink* GetPrevPtr() const{return mp_PrevLink;}
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetNextPtr(TypeSize AL_Distance)
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink =this;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_NextLink ;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return VP_TmpLink;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink* GetNextPtr(TypeSize AL_Distance)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink* GetPrevPtr(TypeSize AL_Distance)
|
|
|
|
|
{
|
|
|
|
|
TypeSize VL_LoopIndex=0 ;
|
|
|
|
|
ZtCLink* VP_TmpLink =this;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
while(VL_LoopIndex++ < AL_Distance)
|
|
|
|
|
VP_TmpLink = VP_TmpLink->mp_PrevLink ;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZtCLink& operator+(TypeSize AL_Distance)
|
|
|
|
|
{
|
|
|
|
|
if(AL_Distance>=0)
|
|
|
|
|
return *GetNextPtr(AL_Distance);
|
|
|
|
|
else return *GetPrevPtr(AL_Distance);
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLink& operator+(TypeSize AL_Distance)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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>
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
public :
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkList; /*####################################*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkMoveList; /*################################*/
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef ZtCLink<ZCEmpty, TChild> TypeThis ;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
typedef ZCEmpty /*++++++++++*/ TypeBase ;
|
|
|
|
|
typedef TChild /*++++++++++*/ TypeChild;
|
|
|
|
|
typedef TypeChild /*++++++++++*/ TypeData ;
|
|
|
|
|
typedef TypeChild /*++++++++++*/ TypeMain ;
|
|
|
|
|
typedef ZTypLong /*++++++++++*/ TypeSize ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
protected:
|
|
|
|
|
ZtCLink* mp_NextLink;
|
|
|
|
|
ZtCLink* mp_PrevLink;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
protected: ////////////////////////////////////
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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)*/
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
protected: /////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
TypeChild& GetChildObj()
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
TypeChild& GetChildObj()*/
|
|
|
|
|
|
|
|
|
|
const TypeChild& GetChildObj() const
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<const TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
const TypeChild& GetChildObj() const*/
|
|
|
|
|
|
|
|
|
|
protected: /////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
// 생성자와 복사 생성자를 protected 영역에 두어서,
|
|
|
|
|
// 상속 클래스를 만드는 것을 강제한다.
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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)*/
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
public : /////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
virtual ~ZtCLink<ZCEmpty, TChild>()
|
|
|
|
|
{
|
|
|
|
|
/*/////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
■ ZtCLink<ZCEmpty, TChild> 는 상속을 하려고
|
|
|
|
|
설계한 것이라, 소멸자를 virtual 로 만든다.
|
|
|
|
|
그러니까 아래 코드처럼 작성해야 할 때가 있
|
|
|
|
|
을 것이다.
|
|
|
|
|
|
|
|
|
|
TypeThis* myp = new TypeChild;
|
|
|
|
|
|
|
|
|
|
// some code
|
|
|
|
|
|
|
|
|
|
delete myp;
|
|
|
|
|
|
|
|
|
|
-- 2025-10-07 16:31
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////*/
|
|
|
|
|
}/*
|
|
|
|
|
virtual ~ZtCLink<ZCEmpty, TChild>()*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)
|
|
|
|
|
{
|
2025-10-07 18:27:05 +09:00
|
|
|
|
this->GetChildObj() = rhs.GetChildObj(); return *this;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
}/*
|
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
/***/ TypeData& operator()() { return GetChildObj(); }
|
|
|
|
|
const TypeData& operator()() const{ return GetChildObj(); }
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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>
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkList; /*####################################*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize
|
|
|
|
|
, typename TTypeCRTP
|
|
|
|
|
>
|
|
|
|
|
friend class ZNsMain::ZtCLinkMoveList; /*################################*/
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef ZtCLink<ZCEmpty, ZCEmpty> TypeThis ;
|
|
|
|
|
typedef ZCEmpty /*++++++++++++*/ TypeBase ;
|
|
|
|
|
typedef ZCEmpty /*++++++++++++*/ TypeChild;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
typedef TypeThis /*++++++++++++*/ TypeData ;
|
|
|
|
|
typedef TypeThis /*++++++++++++*/ TypeMain ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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)*/
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
/*protected: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
|
public : /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
/***/ TypeThis& operator()() { return *this; }
|
|
|
|
|
const TypeThis& operator()() const{ return *this; }
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
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*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize = ZTypLong
|
|
|
|
|
, typename TTypeCRTP =
|
|
|
|
|
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
|
|
|
|
|
>
|
|
|
|
|
class ZtCLinkList /*#####################################################*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
{
|
|
|
|
|
public :
|
2025-10-07 10:11:48 +09:00
|
|
|
|
typedef ZtCLinkList TypeThis;
|
|
|
|
|
public :
|
2025-10-05 14:36:50 +09:00
|
|
|
|
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
|
|
|
|
|
<
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
|
2025-10-05 14:36:50 +09:00
|
|
|
|
>
|
|
|
|
|
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
public :
|
2025-10-06 11:48:10 +09:00
|
|
|
|
typedef ZtCObjOpt<TCLink> ZCDataOpt;
|
|
|
|
|
typedef ZtCObjOpt<TCLink> ZCLinkOpt;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
public :
|
2025-10-04 22:55:41 +09:00
|
|
|
|
typedef TCLink ZCLink ;
|
|
|
|
|
typedef TCLink TypeData;
|
|
|
|
|
typedef TTypSize TypeSize;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef typename TCLink::TypeMain TypeMain;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
private:
|
|
|
|
|
ZCLink* mp_HeadLink;
|
|
|
|
|
ZCLink* mp_TailLink;
|
|
|
|
|
TypeSize ml_LinkSize;
|
|
|
|
|
private:
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
TypeChild& GetChildObj()
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
TypeChild& GetChildObj()*/
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
const TypeChild& GetChildObj() const
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<const TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
const TypeChild& GetChildObj() const*/
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
private:
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
ZCLink* NewLink()
|
|
|
|
|
{
|
2025-10-07 18:27:05 +09:00
|
|
|
|
return new TypeMain;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
}/*
|
|
|
|
|
ZCLink* NewLink()*/
|
|
|
|
|
|
|
|
|
|
ZCLink* NewLink( ZCLink& AR_ArgData)
|
2025-10-07 18:27:05 +09:00
|
|
|
|
{ return new TypeMain(AR_ArgData); }
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
ZCLink* NewLink(const ZCLink& AR_ArgData)
|
2025-10-07 18:27:05 +09:00
|
|
|
|
{ return new TypeMain(AR_ArgData); }
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
void NewLink ////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
TypeSize AL_NeedCnt ,
|
|
|
|
|
ZCLink*& APR_HeadLink ,
|
|
|
|
|
ZCLink*& APR_TailLink
|
|
|
|
|
)
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
{
|
2025-10-07 18:27:05 +09:00
|
|
|
|
APR_HeadLink = new TypeMain;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
ZCLink* VP_MakeLink = 0 ;
|
|
|
|
|
ZCLink* VP_TailLink = APR_HeadLink;
|
|
|
|
|
|
|
|
|
|
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
|
|
|
|
|
{
|
|
|
|
|
// AL_NeedCnt - 1 번 순환
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
VP_MakeLink = new TypeMain;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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 =
|
2025-10-07 18:27:05 +09:00
|
|
|
|
new TypeMain(*AP_LinkOrgin) ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
APR_HeadCopy = VP_MakeLink;
|
|
|
|
|
|
|
|
|
|
while(--AL_FarNum >= 0)
|
|
|
|
|
{
|
2025-10-07 18:27:05 +09:00
|
|
|
|
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr() ;
|
|
|
|
|
VP_MakeLink = new TypeMain(*AP_LinkOrgin);
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
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)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
if(TTypeCRTP::ZEUseCRTP<1)
|
2025-10-05 20:29:21 +09:00
|
|
|
|
{ return NewLink(AR_ArgData); }
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return GetChildObj().SendFreeOut(AR_ArgData);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-05 20:29:21 +09:00
|
|
|
|
_VT_ ZCLink* SendFreeOut(ZCLink& AR_ArgData)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
_VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
if(TTypeCRTP::ZEUseCRTP<1)
|
2025-10-05 20:29:21 +09:00
|
|
|
|
{ return NewLink(AR_ArgData); }
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
return GetChildObj().SendFreeOut(AR_ArgData);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-05 20:29:21 +09:00
|
|
|
|
_VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
_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:*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
private:
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-06 22:53:19 +09:00
|
|
|
|
// AR_LinkNew 를 AP_StdLink 뒤에 삽입한다.
|
2025-10-05 14:36:50 +09:00
|
|
|
|
// AL_PosStd==0 이면 맨 앞에 삽입한다.
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
if(AP_StdLink==0)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
// 맨 앞에 삽입.
|
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
if(ml_LinkSize==0)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
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*/
|
|
|
|
|
}
|
2025-10-06 22:53:19 +09:00
|
|
|
|
else if(AP_StdLink==mp_TailLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-06 10:50:25 +09:00
|
|
|
|
ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ;
|
|
|
|
|
ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
mp_TailLink = &AR_LinkNew;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink* AP_NextStd = AP_StdLink->mp_NextLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink::JoinLink(AP_StdLink , &AR_LinkNew);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
ZCLink::JoinLink(&AR_LinkNew, AP_NextStd );
|
|
|
|
|
}/*
|
|
|
|
|
else*/
|
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
++ml_LinkSize; return AR_LinkNew;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-06 22:53:19 +09:00
|
|
|
|
// AR_LinkNew 를 AP_StdLink 앞에 삽입한다.
|
2025-10-05 14:36:50 +09:00
|
|
|
|
// AL_PosStd==0 이면 맨 뒤에 삽입한다.
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
if(AP_StdLink==0)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
// 맨 뒤에 삽입.
|
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
if(ml_LinkSize==0)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
mp_TailLink=&AR_LinkNew;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
|
|
|
|
else*/
|
|
|
|
|
}
|
2025-10-06 22:53:19 +09:00
|
|
|
|
else if(AP_StdLink==mp_HeadLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-06 10:50:25 +09:00
|
|
|
|
ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink);
|
|
|
|
|
ZCLink::MakeRing(&AR_LinkNew, mp_TailLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
mp_HeadLink = &AR_LinkNew;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink* AP_PrevStd = AP_StdLink->mp_PrevLink ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink::JoinLink(&AR_LinkNew, AP_StdLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
|
|
|
|
else*/
|
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
++ml_LinkSize; return AR_LinkNew;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter(TypeThis& rhs, ZCLink* AP_StdLink)
|
2025-10-06 08:36:21 +09:00
|
|
|
|
{
|
|
|
|
|
// 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 ;
|
|
|
|
|
}
|
|
|
|
|
else // ml_LinkSize>=1
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink );
|
|
|
|
|
ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink );
|
|
|
|
|
|
|
|
|
|
mp_HeadLink = rhs.mp_HeadLink ;
|
|
|
|
|
}/*
|
|
|
|
|
else // ml_LinkSize>=1*/
|
|
|
|
|
|
|
|
|
|
ml_LinkSize += rhs.ml_LinkSize;
|
|
|
|
|
|
|
|
|
|
rhs.mp_HeadLink = 0 ;
|
|
|
|
|
rhs.mp_TailLink = 0 ;
|
|
|
|
|
rhs.ml_LinkSize = 0 ;
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
return *this; /////////////////
|
2025-10-06 08:36:21 +09:00
|
|
|
|
}/*
|
|
|
|
|
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;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter(TypeThis& rhs, ZCLink* AP_StdLink)*/
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink* AP_StdLink)
|
2025-10-06 08:36:21 +09:00
|
|
|
|
{
|
|
|
|
|
// 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 ;
|
|
|
|
|
}
|
|
|
|
|
else // ml_LinkSize>=1
|
|
|
|
|
{
|
2025-10-07 15:40:40 +09:00
|
|
|
|
ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink);
|
|
|
|
|
ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink);
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
mp_TailLink = rhs.mp_TailLink ;
|
|
|
|
|
}/*
|
|
|
|
|
else // ml_LinkSize>=1*/
|
|
|
|
|
|
2025-10-07 15:40:40 +09:00
|
|
|
|
ml_LinkSize += rhs.ml_LinkSize;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
rhs.mp_HeadLink=0;
|
|
|
|
|
rhs.mp_TailLink=0;
|
|
|
|
|
rhs.ml_LinkSize=0;
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
return *this; /////////////////
|
2025-10-06 08:36:21 +09:00
|
|
|
|
}/*
|
|
|
|
|
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)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{ mp_HeadLink = rhs.mp_HeadLink; }
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
rhs.mp_HeadLink =0 ;
|
|
|
|
|
rhs.mp_TailLink =0 ;
|
|
|
|
|
rhs.ml_LinkSize =0 ;
|
|
|
|
|
|
|
|
|
|
ml_LinkSize += rhs.ml_LinkSize; return *this;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink* AP_StdLink)*/
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
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 ;
|
|
|
|
|
}
|
2025-10-05 20:29:21 +09:00
|
|
|
|
else ZCLink::JoinLink
|
2025-10-07 11:25:50 +09:00
|
|
|
|
(AR_CutLink.mp_PrevLink, AR_CutLink.mp_NextLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
return (--ml_LinkSize, AR_CutLink);
|
|
|
|
|
}/*
|
|
|
|
|
ZCLink& CutLink(ZCLink& AR_CutLink)*/
|
|
|
|
|
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& CutLinkRangeOut /*##########################################*/
|
2025-10-06 10:50:25 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead , ZCLink& AR_CutTail ,
|
|
|
|
|
TypeSize AL_CutSize , TypeThis& rhs ,
|
|
|
|
|
ZCLink* AP_RhsStd , bool AB_After=true
|
2025-10-06 10:50:25 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
/*///////////////////////////////////////////////////////////
|
|
|
|
|
|
2025-10-06 15:03:06 +09:00
|
|
|
|
■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크.
|
|
|
|
|
AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크.
|
|
|
|
|
|
|
|
|
|
AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고,
|
2025-10-07 10:11:48 +09:00
|
|
|
|
rhs 의 AP_RhsStd 의 뒤에 삽입한다.
|
|
|
|
|
|
|
|
|
|
AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16
|
|
|
|
|
|
|
|
|
|
■ bool AB_After=true 추가 -- 2025-10-07 09:37
|
|
|
|
|
|
|
|
|
|
AB_After==true 이면, AP_RhsStd 의 뒤에 연결.
|
|
|
|
|
AB_After==false 이면, AP_RhsStd 의 앞에 연결.
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
|
|
if(this==&rhs ) return rhs;
|
|
|
|
|
if(ml_LinkSize<1) return rhs;
|
|
|
|
|
|
|
|
|
|
if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때.
|
|
|
|
|
{
|
|
|
|
|
mp_HeadLink=0;
|
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else if(&AR_CutHead==mp_HeadLink)
|
2025-10-06 10:50:25 +09:00
|
|
|
|
{
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink::MakeRing ////////////
|
|
|
|
|
(
|
|
|
|
|
mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink
|
|
|
|
|
);
|
|
|
|
|
/////////////////////////////
|
2025-10-06 10:50:25 +09:00
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else if(&AR_CutTail==mp_TailLink)
|
2025-10-06 10:50:25 +09:00
|
|
|
|
{
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink::MakeRing ////////////
|
|
|
|
|
(
|
|
|
|
|
mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink
|
|
|
|
|
);
|
|
|
|
|
/////////////////////////////
|
2025-10-06 10:50:25 +09:00
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else
|
2025-10-06 10:50:25 +09:00
|
|
|
|
{
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink::JoinLink ////////////
|
|
|
|
|
(
|
|
|
|
|
AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink
|
|
|
|
|
);
|
|
|
|
|
/////////////////////////////
|
2025-10-06 10:50:25 +09:00
|
|
|
|
}/*
|
|
|
|
|
else*/
|
|
|
|
|
|
|
|
|
|
ml_LinkSize -= AL_CutSize;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(rhs.size()<1)
|
|
|
|
|
{
|
|
|
|
|
ZCLink::MakeRing(&AR_CutHead, &AR_CutTail);
|
|
|
|
|
|
|
|
|
|
rhs.mp_HeadLink = &AR_CutHead ;
|
|
|
|
|
rhs.mp_TailLink = &AR_CutTail ;
|
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else if(AB_After) // AP_RhsStd 뒤에 삽입.
|
2025-10-06 10:50:25 +09:00
|
|
|
|
{
|
2025-10-07 10:11:48 +09:00
|
|
|
|
if(AP_RhsStd==0) // 맨 앞에 삽입.
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink);
|
|
|
|
|
ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink);
|
|
|
|
|
|
|
|
|
|
rhs.mp_HeadLink = &AR_CutHead;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(AP_RhsStd , &AR_CutHead );
|
|
|
|
|
ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext);
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
if(AP_RhsStd==rhs.mp_TailLink)
|
|
|
|
|
{ rhs.mp_TailLink = &AR_CutTail; }
|
|
|
|
|
}
|
2025-10-06 10:50:25 +09:00
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else // !AB_After : AP_RhsStd 앞에 삽입.
|
2025-10-06 10:50:25 +09:00
|
|
|
|
{
|
2025-10-07 10:11:48 +09:00
|
|
|
|
if(AP_RhsStd==0) // 맨 뒤에 삽입.
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(rhs.mp_TailLink, &AR_CutHead);
|
|
|
|
|
ZCLink::MakeRing(rhs.mp_HeadLink, &AR_CutTail);
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
rhs.mp_TailLink = &AR_CutTail;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ZCLink* VP_RhsStdPrev = AP_RhsStd->mp_PrevLink ;
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead);
|
|
|
|
|
ZCLink::JoinLink(&AR_CutTail , AP_RhsStd );
|
|
|
|
|
|
|
|
|
|
if(AP_RhsStd==rhs.mp_HeadLink)
|
|
|
|
|
{ rhs.mp_HeadLink = &AR_CutHead; }
|
|
|
|
|
}
|
2025-10-06 10:50:25 +09:00
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
else // !AB_After : AP_RhsStd 앞에 삽입.*/
|
2025-10-06 10:50:25 +09:00
|
|
|
|
|
|
|
|
|
rhs.ml_LinkSize += AL_CutSize; return rhs;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& CutLinkRangeOut ###########################################
|
2025-10-06 10:50:25 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead , ZCLink& AR_CutTail ,
|
|
|
|
|
TypeSize AL_CutSize , TypeThis& rhs ,
|
|
|
|
|
ZCLink* AP_RhsStd , bool AB_After=true
|
2025-10-06 10:50:25 +09:00
|
|
|
|
)
|
|
|
|
|
#######################################################################*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
/*private:*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
public :
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
ZtCLinkList()
|
|
|
|
|
{
|
|
|
|
|
mp_HeadLink=0;
|
|
|
|
|
mp_TailLink=0;
|
|
|
|
|
ml_LinkSize=0;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLinkList()*/
|
|
|
|
|
|
|
|
|
|
ZtCLinkList(const ZtCLinkList& rhs)
|
|
|
|
|
{
|
|
|
|
|
mp_HeadLink=0;
|
|
|
|
|
mp_TailLink=0;
|
|
|
|
|
ml_LinkSize=0;
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
*this = rhs ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
|
|
|
|
ZtCLinkList(const ZtCLinkList& rhs)*/
|
|
|
|
|
|
|
|
|
|
~ZtCLinkList()
|
|
|
|
|
{
|
|
|
|
|
DeleteAll();
|
|
|
|
|
}/*
|
|
|
|
|
~ZtCLinkList()*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
if(this==&rhs) return *this;
|
|
|
|
|
|
|
|
|
|
if(rhs.size()<1)
|
|
|
|
|
{ this->DeleteAll(); return *this; }
|
|
|
|
|
|
|
|
|
|
TypeSize VL_MinusSize = this->size() - rhs.size() ;
|
|
|
|
|
|
|
|
|
|
if (VL_MinusSize>0)
|
|
|
|
|
{
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink* VP_CutTail =
|
|
|
|
|
mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1);
|
|
|
|
|
ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ;
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
RecvFreeIn ////////////////////////////////////////
|
|
|
|
|
(
|
2025-10-06 22:53:19 +09:00
|
|
|
|
VL_MinusSize, mp_HeadLink, VP_CutTail
|
2025-10-05 20:29:21 +09:00
|
|
|
|
);
|
|
|
|
|
///////////////////////////////////////////////////
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
mp_HeadLink = VP_CutTailNext;
|
|
|
|
|
ml_LinkSize -= VL_MinusSize ;
|
|
|
|
|
|
|
|
|
|
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
|
2025-10-05 20:29:21 +09:00
|
|
|
|
}
|
|
|
|
|
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 ;
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
|
2025-10-05 20:29:21 +09:00
|
|
|
|
}/*
|
|
|
|
|
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())
|
|
|
|
|
{
|
2025-10-06 08:36:21 +09:00
|
|
|
|
*VP_LhsLink = *VP_RhsLink ;
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
VP_RhsLink = VP_RhsLink->mp_NextLink;
|
|
|
|
|
VP_LhsLink = VP_LhsLink->mp_NextLink;
|
|
|
|
|
}/*
|
|
|
|
|
__for0(TypeSize, i, rhs.size())*/
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
return *this;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-06 08:36:21 +09:00
|
|
|
|
TypeSize GetSize() const{return ml_LinkSize ;}
|
|
|
|
|
TypeSize size () const{return ml_LinkSize ;}
|
|
|
|
|
|
|
|
|
|
bool IsEmpty() const{return ml_LinkSize<1;}
|
2025-10-06 23:26:10 +09:00
|
|
|
|
bool empty () const{return ml_LinkSize<1;}
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
void DeleteAll()
|
|
|
|
|
{
|
|
|
|
|
if(ml_LinkSize<1) return;
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
RecvFreeIn
|
|
|
|
|
(ml_LinkSize, mp_HeadLink, mp_TailLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
mp_HeadLink =0 ;
|
|
|
|
|
mp_TailLink =0 ;
|
|
|
|
|
ml_LinkSize =0 ;
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
|
|
|
|
void DeleteAll()*/
|
|
|
|
|
|
|
|
|
|
void clear(){DeleteAll();}
|
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-06 11:48:10 +09:00
|
|
|
|
ZCDataOpt GetHeadOpt(){ return ZCDataOpt(mp_HeadLink); }
|
|
|
|
|
ZCDataOpt GetTailOpt(){ return ZCDataOpt(mp_TailLink); }
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
2025-10-06 11:48:10 +09:00
|
|
|
|
ZCDataOpt GetObjOpt(TypeSize AI_Index)
|
2025-10-05 20:29:21 +09:00
|
|
|
|
{
|
2025-10-06 11:48:10 +09:00
|
|
|
|
if(ml_LinkSize<1) return ZCDataOpt(0);
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
2025-10-06 11:48:10 +09:00
|
|
|
|
return ZCDataOpt( (*mp_HeadLink)+(AI_Index-1) );
|
2025-10-05 20:29:21 +09:00
|
|
|
|
}/*
|
2025-10-06 11:48:10 +09:00
|
|
|
|
ZCDataOpt GetObjOpt(TypeSize AI_Index)*/
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); }
|
|
|
|
|
ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); }
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 22:37:10 +09:00
|
|
|
|
ZCLink& AddHead(const ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinAfter (*NewLink(AR_CLink), 0); }
|
|
|
|
|
ZCLink& AddTail(const ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinBefore(*NewLink(AR_CLink), 0); }
|
|
|
|
|
|
|
|
|
|
ZCLink& AddHead(ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinAfter (*NewLink(AR_CLink), 0); }
|
|
|
|
|
ZCLink& AddTail(ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinBefore(*NewLink(AR_CLink), 0); }
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
void DeleteHead()
|
|
|
|
|
{ if(ml_LinkSize<1) return; RecvFreeIn( &CutLink(mp_HeadLink) ); }
|
|
|
|
|
void DeleteTail()
|
|
|
|
|
{ if(ml_LinkSize<1) return; RecvFreeIn( &CutLink(mp_TailLink) ); }
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Delete(ZCLink& AR_DelLink)
|
|
|
|
|
{
|
2025-10-05 20:29:21 +09:00
|
|
|
|
RecvFreeIn( &CutLink(AR_DelLink) );
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
|
|
|
|
void Delete(ZCLink& AR_DelLink)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter (TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 08:36:21 +09:00
|
|
|
|
{ return JoinAfter (rhs, &AR_StdLink); }
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 08:36:21 +09:00
|
|
|
|
{ return JoinBefore(rhs, &AR_StdLink); }
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinHead(TypeThis& rhs){ return JoinAfter (rhs, 0); }
|
|
|
|
|
TypeThis& JoinTail(TypeThis& rhs){ return JoinBefore(rhs, 0); }
|
2025-10-06 08:36:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
2025-10-05 22:47:35 +09:00
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-05 22:47:35 +09:00
|
|
|
|
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, &AR_StdLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
|
|
|
|
|
|
2025-10-05 22:47:35 +09:00
|
|
|
|
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, &AR_StdLink);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
|
2025-10-05 14:36:50 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 앞에 연결한다.
|
|
|
|
|
|
2025-10-05 22:47:35 +09:00
|
|
|
|
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, 0);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)
|
2025-10-05 14:36:50 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
|
|
|
|
|
|
2025-10-05 22:47:35 +09:00
|
|
|
|
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, 0);
|
2025-10-05 14:36:50 +09:00
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeThis& SendRangeOut //////////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs ,
|
|
|
|
|
ZCLinkOpt AO_LinkOpt, bool AB_After
|
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), AB_After
|
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs ,
|
|
|
|
|
ZCLinkOpt AO_LinkOpt, bool AB_After
|
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
2025-10-05 20:29:21 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
|
2025-10-06 10:50:25 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
2025-10-06 10:50:25 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
|
|
|
|
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), true
|
2025-10-06 10:50:25 +09:00
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
2025-10-07 10:17:47 +09:00
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& SendRangeOutBefore ////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 앞에 연결한다.
|
|
|
|
|
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), false
|
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& SendRangeOutBefore ////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
2025-10-06 10:50:25 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 19:40:21 +09:00
|
|
|
|
TypeThis& CopyThis(TypeThis& ARR_Rhs)
|
|
|
|
|
{
|
|
|
|
|
// *this 를 복사해서, ARR_Rhs 의 끝에 연결한다.
|
|
|
|
|
|
|
|
|
|
if(size()<1) return ARR_Rhs;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_HeadCopy=0;
|
|
|
|
|
ZCLink* VP_TailCopy=0;
|
|
|
|
|
|
|
|
|
|
SendFreeOutCopy ////////////////////////
|
|
|
|
|
(
|
|
|
|
|
mp_HeadLink , size()-1,
|
|
|
|
|
RR(VP_HeadCopy), RR(VP_TailCopy)
|
|
|
|
|
);
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
TypeThis VO_TempList;
|
|
|
|
|
|
|
|
|
|
VO_TempList.mp_HeadLink=VP_HeadCopy;
|
|
|
|
|
VO_TempList.mp_TailLink=VP_TailCopy;
|
|
|
|
|
VO_TempList.ml_LinkSize=size() ;
|
|
|
|
|
|
|
|
|
|
ARR_Rhs.JoinTail(VO_TempList); return *this;
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& CopyThis(TypeThis& ARR_Rhs)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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;
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-05 20:29:21 +09:00
|
|
|
|
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 )
|
|
|
|
|
###############################################################################*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
public :
|
|
|
|
|
};/*
|
2025-10-05 14:36:50 +09:00
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize = ZTypLong
|
|
|
|
|
, typename TTypeCRTP =
|
|
|
|
|
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
|
|
|
|
|
>
|
|
|
|
|
class ZtCLinkList #######################################################*/
|
2025-10-04 22:55:41 +09:00
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template //////////////////////////////////////////////////////////////////
|
|
|
|
|
<
|
|
|
|
|
typename TCLink
|
|
|
|
|
, typename TTypSize = ZTypLong
|
|
|
|
|
, typename TTypeCRTP =
|
|
|
|
|
ZNsType::ZtCTypeCRTP<ZCEmpty, false>
|
|
|
|
|
>
|
|
|
|
|
class ZtCLinkMoveList /*#################################################*/
|
|
|
|
|
{
|
|
|
|
|
public :
|
2025-10-07 10:11:48 +09:00
|
|
|
|
typedef ZtCLinkMoveList TypeThis;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
|
|
|
|
|
<
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
|
2025-10-06 22:53:19 +09:00
|
|
|
|
>
|
|
|
|
|
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
|
|
|
|
|
public :
|
|
|
|
|
typedef ZtCObjOpt<TCLink> ZCDataOpt;
|
|
|
|
|
typedef ZtCObjOpt<TCLink> ZCLinkOpt;
|
|
|
|
|
public :
|
|
|
|
|
typedef TCLink ZCLink ;
|
|
|
|
|
typedef TCLink TypeData;
|
|
|
|
|
typedef TTypSize TypeSize;
|
2025-10-07 18:27:05 +09:00
|
|
|
|
public :
|
|
|
|
|
typedef typename TCLink::TypeMain TypeMain;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
private:
|
|
|
|
|
ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체
|
|
|
|
|
ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체
|
|
|
|
|
TypeSize ml_LinkSize;
|
|
|
|
|
//////////////////////////////////////////////////////////
|
|
|
|
|
// 실제 맨 앞 링크는 mo_HeadFake.mp_NextLink
|
|
|
|
|
// 실제 맨 뒤 링크는 mo_TailFake.mp_PrevLink
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
TypeChild& GetChildObj()
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
TypeChild& GetChildObj()*/
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
const TypeChild& GetChildObj() const
|
|
|
|
|
{
|
|
|
|
|
return *static_cast<const TypeChild*>(this);
|
|
|
|
|
}/*
|
|
|
|
|
const TypeChild& GetChildObj() const*/
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
ZCLink* NewLink()
|
|
|
|
|
{
|
|
|
|
|
return new ZCLink;
|
|
|
|
|
}/*
|
|
|
|
|
ZCLink* NewLink()*/
|
|
|
|
|
|
|
|
|
|
ZCLink* NewLink( ZCLink& AR_ArgData)
|
2025-10-07 18:27:05 +09:00
|
|
|
|
{ return new TypeMain(AR_ArgData); }
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink* NewLink(const ZCLink& AR_ArgData)
|
2025-10-07 18:27:05 +09:00
|
|
|
|
{ return new TypeMain(AR_ArgData); }
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
void NewLink ////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
TypeSize AL_NeedCnt ,
|
|
|
|
|
ZCLink*& APR_HeadLink ,
|
|
|
|
|
ZCLink*& APR_TailLink
|
|
|
|
|
)
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
{
|
2025-10-07 18:27:05 +09:00
|
|
|
|
APR_HeadLink = new TypeMain;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink* VP_MakeLink = 0 ;
|
|
|
|
|
ZCLink* VP_TailLink = APR_HeadLink;
|
|
|
|
|
|
|
|
|
|
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
|
|
|
|
|
{
|
|
|
|
|
// AL_NeedCnt - 1 번 순환
|
|
|
|
|
|
2025-10-07 18:27:05 +09:00
|
|
|
|
VP_MakeLink = new TypeMain;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
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 =
|
2025-10-07 18:27:05 +09:00
|
|
|
|
new TypeMain(*AP_LinkOrgin) ;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
APR_HeadCopy = VP_MakeLink;
|
|
|
|
|
|
|
|
|
|
while(--AL_FarNum >= 0)
|
|
|
|
|
{
|
|
|
|
|
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
|
2025-10-07 18:27:05 +09:00
|
|
|
|
VP_MakeLink = new TypeMain(*AP_LinkOrgin);
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
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_StdLink)
|
|
|
|
|
{
|
|
|
|
|
// AR_LinkNew 를 AP_StdLink 뒤에 삽입한다.
|
|
|
|
|
// AL_PosStd==0 이면 맨 앞에 삽입한다.
|
|
|
|
|
|
|
|
|
|
if(AP_StdLink==0) AP_StdLink=&mo_HeadFake ;
|
|
|
|
|
|
|
|
|
|
ZCLink* AP_NextStd = AP_StdLink->mp_NextLink;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(AP_StdLink , &AR_LinkNew);
|
|
|
|
|
ZCLink::JoinLink(&AR_LinkNew, AP_NextStd );
|
|
|
|
|
|
|
|
|
|
++ml_LinkSize; return AR_LinkNew;
|
|
|
|
|
}/*
|
|
|
|
|
ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)
|
|
|
|
|
{
|
|
|
|
|
// AR_LinkNew 를 AP_StdLink 앞에 삽입한다.
|
|
|
|
|
// AL_PosStd==0 이면 맨 뒤에 삽입한다.
|
|
|
|
|
|
|
|
|
|
if(AP_StdLink==0) AP_StdLink= &mo_TailFake;
|
|
|
|
|
|
|
|
|
|
ZCLink* AP_PrevStd = AP_StdLink->mp_PrevLink ;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew);
|
|
|
|
|
ZCLink::JoinLink(&AR_LinkNew, AP_StdLink);
|
|
|
|
|
|
|
|
|
|
++ml_LinkSize; return AR_LinkNew;
|
|
|
|
|
}/*
|
|
|
|
|
ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter (TypeThis& rhs, ZCLink* AP_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AP_StdLink 의 뒤에 rhs 를 삽입.
|
|
|
|
|
// AP_StdLink==0 이면 맨 앞에 삽입.
|
|
|
|
|
|
|
|
|
|
if(this==&rhs ) return *this;
|
|
|
|
|
if(rhs.size()<1) return *this;
|
|
|
|
|
|
|
|
|
|
if(AP_StdLink==0) AP_StdLink=&mo_HeadFake ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_RhsHead = rhs.mo_HeadFake.mp_NextLink;
|
|
|
|
|
ZCLink* VP_RhsTail = rhs.mo_TailFake.mp_PrevLink;
|
|
|
|
|
ZCLink* VP_StdNext = AP_StdLink-> mp_NextLink;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(AP_StdLink, VP_RhsHead);
|
|
|
|
|
ZCLink::JoinLink(VP_RhsTail, VP_StdNext);
|
|
|
|
|
|
|
|
|
|
this->ml_LinkSize += rhs.ml_LinkSize;
|
2025-10-07 10:22:47 +09:00
|
|
|
|
rhs. ml_LinkSize = 0 ;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
(&rhs.mo_HeadFake, &rhs.mo_TailFake);
|
|
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter (TypeThis& rhs, ZCLink* AP_StdLink)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink* AP_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AP_StdLink 의 앞에 rhs 를 삽입.
|
|
|
|
|
// AP_StdLink==0 이면 맨 뒤에 삽입.
|
|
|
|
|
|
|
|
|
|
if(this==&rhs ) return *this;
|
|
|
|
|
if(rhs.size()<1) return *this;
|
|
|
|
|
|
|
|
|
|
if(AP_StdLink==0) AP_StdLink=&mo_TailFake ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_RhsHead = rhs.mo_HeadFake.mp_NextLink;
|
|
|
|
|
ZCLink* VP_RhsTail = rhs.mo_TailFake.mp_PrevLink;
|
|
|
|
|
ZCLink* VP_StdPrev = AP_StdLink-> mp_PrevLink;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(VP_StdPrev, VP_RhsHead);
|
|
|
|
|
ZCLink::JoinLink(VP_RhsTail, AP_StdLink);
|
|
|
|
|
|
|
|
|
|
this->ml_LinkSize += rhs.ml_LinkSize;
|
|
|
|
|
rhs. ml_LinkSize = 0 ;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
(&rhs.mo_HeadFake, &rhs.mo_TailFake);
|
|
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink* AP_StdLink)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZCLink& CutLink(ZCLink& AR_CutLink)
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
(AR_CutLink->mp_PrevLink, AR_CutLink->mp_NextLink);
|
|
|
|
|
|
|
|
|
|
return (--ml_LinkSize, AR_CutLink);
|
|
|
|
|
}/*
|
|
|
|
|
ZCLink& CutLink(ZCLink& AR_CutLink)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& CutLinkRangeOut /*##########################################*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead ,
|
|
|
|
|
ZCLink& AR_CutTail ,
|
|
|
|
|
TypeSize AL_CutSize ,
|
|
|
|
|
TypeThis& rhs ,
|
|
|
|
|
ZCLink* AP_RhsStd ,
|
|
|
|
|
bool AB_After=true
|
2025-10-06 22:53:19 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
/*///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크.
|
|
|
|
|
AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크.
|
|
|
|
|
|
|
|
|
|
AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고,
|
2025-10-06 23:46:47 +09:00
|
|
|
|
rhs 의 AP_RhsStd 의 뒤에 삽입한다.
|
|
|
|
|
|
|
|
|
|
AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
■ bool AB_After=true 추가. -- 2025-10-07 09:26
|
|
|
|
|
|
|
|
|
|
AB_After==true 이면 AP_RhsStd 의 뒤에 삽입.
|
|
|
|
|
AB_After==false 이면 AP_RhsStd 의 앞에 삽입.
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
///////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
|
|
if(this==&rhs ) return rhs;
|
|
|
|
|
if(ml_LinkSize<1) return rhs;
|
|
|
|
|
|
2025-10-07 20:52:22 +09:00
|
|
|
|
ZCLink* VP_CutHeadPrev = AR_CutHead.mp_PrevLink ;
|
|
|
|
|
ZCLink* VP_CutTailNext = AR_CutTail.mp_NextLink ;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(VP_CutHeadPrev, VP_CutTailNext);
|
|
|
|
|
|
|
|
|
|
ml_LinkSize -= AL_CutSize;
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
if(AB_After)
|
|
|
|
|
{
|
|
|
|
|
// rhs 의 AP_RhsStd 의 뒤에 삽입.
|
|
|
|
|
// AP_RhsStd==0 이면 rhs 의 맨 앞에 삽입.
|
|
|
|
|
|
|
|
|
|
if(AP_RhsStd==0) AP_RhsStd=&rhs.mo_HeadFake ;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_RhsStdNext=AP_RhsStd->mp_NextLink;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(AP_RhsStd , &AR_CutHead );
|
|
|
|
|
ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// rhs 의 AP_RhsStd 의 앞에 삽입.
|
|
|
|
|
// AP_RhsStd==0 이면 rhs 의 맨 뒤에 삽입.
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
if(AP_RhsStd==0) AP_RhsStd=&rhs.mo_TailFake ;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink* VP_RhsStdPrev=AP_RhsStd->mp_PrevLink;
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead);
|
|
|
|
|
ZCLink::JoinLink(&AR_CutTail , AP_RhsStd );
|
|
|
|
|
}
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
rhs.ml_LinkSize += AL_CutSize; return rhs;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& CutLinkRangeOut ##############################################
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead ,
|
|
|
|
|
ZCLink& AR_CutTail ,
|
|
|
|
|
TypeSize AL_CutSize ,
|
|
|
|
|
TypeThis& rhs ,
|
|
|
|
|
ZCLink* AP_RhsStd ,
|
|
|
|
|
bool AB_After=true
|
2025-10-06 22:53:19 +09:00
|
|
|
|
)
|
|
|
|
|
#######################################################################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*private:*/
|
|
|
|
|
public :
|
|
|
|
|
|
|
|
|
|
ZtCLinkMoveList()
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(&mo_HeadFake, &mo_TailFake);
|
|
|
|
|
ZCLink::MakeRing(&mo_HeadFake, &mo_TailFake);
|
|
|
|
|
|
|
|
|
|
ml_LinkSize=0;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLinkMoveList()*/
|
|
|
|
|
|
|
|
|
|
ZtCLinkMoveList(const ZtCLinkMoveList& rhs)
|
|
|
|
|
{
|
|
|
|
|
ZCLink::JoinLink(&mo_HeadFake, &mo_TailFake);
|
|
|
|
|
ZCLink::MakeRing(&mo_HeadFake, &mo_TailFake);
|
|
|
|
|
|
|
|
|
|
ml_LinkSize=0; *this = rhs ;
|
|
|
|
|
}/*
|
|
|
|
|
ZtCLinkMoveList(const ZtCLinkMoveList& rhs)*/
|
|
|
|
|
|
|
|
|
|
~ZtCLinkMoveList()
|
|
|
|
|
{
|
|
|
|
|
DeleteAll();
|
|
|
|
|
}/*
|
|
|
|
|
~ZtCLinkMoveList()*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
if(this==&rhs) return *this;
|
|
|
|
|
|
|
|
|
|
if(rhs.size()<1)
|
|
|
|
|
{ this->DeleteAll(); return *this; }
|
|
|
|
|
|
|
|
|
|
TypeSize VL_MinusSize = this->size() - rhs.size() ;
|
|
|
|
|
|
|
|
|
|
if (VL_MinusSize>0)
|
|
|
|
|
{
|
|
|
|
|
ZCLink* VP_CutHead = mo_HeadFake.mp_NextLink ;
|
|
|
|
|
ZCLink* VP_CutTail =
|
|
|
|
|
VP_CutHead->GetNextPrevPtr( VL_MinusSize-1 ) ;
|
|
|
|
|
ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ;
|
|
|
|
|
|
2025-10-06 23:51:52 +09:00
|
|
|
|
RecvFreeIn ///////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
|
|
|
|
VL_MinusSize, VP_CutHead, VP_CutTail
|
|
|
|
|
);
|
2025-10-06 23:51:52 +09:00
|
|
|
|
//////////////////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ml_LinkSize -= VL_MinusSize ;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(&mo_HeadFake, VP_CutTailNext);
|
|
|
|
|
}
|
|
|
|
|
else if(VL_MinusSize<0)
|
|
|
|
|
{
|
|
|
|
|
ZCLink* VP_HeadLink=0;
|
|
|
|
|
ZCLink* VP_TailLink=0;
|
|
|
|
|
|
2025-10-06 23:51:52 +09:00
|
|
|
|
SendFreeOut //////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
|
|
|
|
-VL_MinusSize ,
|
|
|
|
|
RR(VP_HeadLink) ,
|
|
|
|
|
RR(VP_TailLink)
|
|
|
|
|
);
|
2025-10-06 23:51:52 +09:00
|
|
|
|
//////////////////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
ZCLink* VP_CurrTail = mo_TailFake.mp_PrevLink ;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink(VP_CurrTail, VP_HeadLink);
|
|
|
|
|
ZCLink::JoinLink(VP_TailLink, &mo_TailFake);
|
|
|
|
|
|
|
|
|
|
ml_LinkSize += (-VL_MinusSize);
|
|
|
|
|
}/*
|
|
|
|
|
else if(VL_MinusSize<0)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_RhsLink = rhs.mo_HeadFake.mp_NextLink ;
|
|
|
|
|
ZCLink* VP_LhsLink = mo_HeadFake.mp_NextLink ;
|
|
|
|
|
|
|
|
|
|
__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;
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& operator=(const TypeThis& rhs)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeSize GetSize() const{return ml_LinkSize ;}
|
|
|
|
|
TypeSize size () const{return ml_LinkSize ;}
|
|
|
|
|
|
|
|
|
|
bool IsEmpty() const{return ml_LinkSize<1;}
|
2025-10-06 23:26:10 +09:00
|
|
|
|
bool empty () const{return ml_LinkSize<1;}
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DeleteAll()
|
|
|
|
|
{
|
|
|
|
|
if(ml_LinkSize<1) return;
|
|
|
|
|
|
|
|
|
|
RecvFreeIn /////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ml_LinkSize ,
|
|
|
|
|
mo_HeadFake.mp_NextLink ,
|
|
|
|
|
mo_TailFake.mp_PrevLink
|
|
|
|
|
);
|
|
|
|
|
////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
(&mo_HeadFake, &mo_TailFake);
|
|
|
|
|
|
|
|
|
|
ml_LinkSize =0 ;
|
|
|
|
|
}/*
|
|
|
|
|
void DeleteAll()*/
|
|
|
|
|
|
|
|
|
|
void clear(){DeleteAll();}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZCDataOpt GetHeadOpt()
|
|
|
|
|
{
|
|
|
|
|
return size()<1 ? ZCDataOpt(0) :
|
|
|
|
|
ZCDataOpt(mo_HeadFake.mp_NextLink);
|
|
|
|
|
}
|
|
|
|
|
ZCDataOpt GetTailOpt()
|
|
|
|
|
{
|
|
|
|
|
return size()<1 ? ZCDataOpt(0) :
|
|
|
|
|
ZCDataOpt(mo_TailFake.mp_PrevLink);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ZCDataOpt GetObjOpt(TypeSize AI_Index)
|
|
|
|
|
{
|
|
|
|
|
if(ml_LinkSize<1 || AI_Index<1 || AI_Index>ml_LinkSize)
|
|
|
|
|
return ZCDataOpt(0);
|
|
|
|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
|
|
|
|
|
|
|
|
|
return ZCDataOpt( mo_HeadFake+AI_Index );
|
|
|
|
|
}/*
|
|
|
|
|
ZCDataOpt GetObjOpt(TypeSize AI_Index)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); }
|
|
|
|
|
ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); }
|
|
|
|
|
|
|
|
|
|
ZCLink& AddHead(const ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinAfter (*NewLink(AR_CLink), 0); }
|
|
|
|
|
ZCLink& AddTail(const ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinBefore(*NewLink(AR_CLink), 0); }
|
|
|
|
|
|
|
|
|
|
ZCLink& AddHead(ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinAfter (*NewLink(AR_CLink), 0); }
|
|
|
|
|
ZCLink& AddTail(ZCLink& AR_CLink)
|
|
|
|
|
{ return JoinBefore(*NewLink(AR_CLink), 0); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DeleteHead()
|
|
|
|
|
{
|
|
|
|
|
if(ml_LinkSize<1) return; RecvFreeIn
|
|
|
|
|
( &CutLink(mo_HeadFake.mp_NextLink) );
|
|
|
|
|
}
|
|
|
|
|
void DeleteTail()
|
|
|
|
|
{
|
|
|
|
|
if(ml_LinkSize<1) return; RecvFreeIn
|
|
|
|
|
( &CutLink(mo_TailFake.mp_PrevLink) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Delete(ZCLink& AR_DelLink)
|
|
|
|
|
{
|
|
|
|
|
RecvFreeIn( &CutLink(AR_DelLink) );
|
|
|
|
|
}/*
|
|
|
|
|
void Delete(ZCLink& AR_DelLink)*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinAfter (TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{ return JoinAfter (rhs, &AR_StdLink); }
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinBefore(TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{ return JoinBefore(rhs, &AR_StdLink); }
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& JoinHead(TypeThis& rhs){ return JoinAfter (rhs, 0); }
|
|
|
|
|
TypeThis& JoinTail(TypeThis& rhs){ return JoinBefore(rhs, 0); }
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
|
|
|
|
|
|
|
|
|
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, &AR_StdLink);
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
|
|
|
|
|
|
|
|
|
|
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, &AR_StdLink);
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 앞에 연결한다.
|
|
|
|
|
|
|
|
|
|
CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, 0);
|
|
|
|
|
}
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)
|
2025-10-06 22:53:19 +09:00
|
|
|
|
{
|
|
|
|
|
// AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
|
|
|
|
|
|
|
|
|
|
CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, 0);
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)*/
|
2025-10-06 22:53:19 +09:00
|
|
|
|
|
|
|
|
|
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& SendRangeOut //////////////////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
2025-10-07 10:17:47 +09:00
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs ,
|
2025-10-07 10:17:47 +09:00
|
|
|
|
ZCLinkOpt AO_LinkOpt, bool AB_After
|
2025-10-07 10:11:48 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), AB_After
|
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& SendRangeOut //////////////////////////////////////////////////
|
|
|
|
|
(
|
2025-10-07 10:17:47 +09:00
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs ,
|
2025-10-07 10:17:47 +09:00
|
|
|
|
ZCLinkOpt AO_LinkOpt, bool AB_After
|
2025-10-07 10:11:48 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeThis& SendRangeOutAfter /////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
2025-10-06 22:53:19 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
|
|
|
|
|
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), true
|
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
|
|
|
|
}
|
|
|
|
|
TypeThis& SendRangeOutBefore ////////////////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
{
|
|
|
|
|
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 앞에 연결한다.
|
|
|
|
|
|
|
|
|
|
return CutLinkRangeOut
|
|
|
|
|
(
|
|
|
|
|
AR_CutHead, AR_CutTail , AI_CutSize,
|
|
|
|
|
rhs , AO_LinkOpt.Raw(), false
|
2025-10-06 22:53:19 +09:00
|
|
|
|
);
|
|
|
|
|
//////////////////////
|
|
|
|
|
}/*
|
2025-10-07 10:11:48 +09:00
|
|
|
|
TypeThis& SendRangeOutBefore ////////////////////////////////////////////
|
2025-10-06 22:53:19 +09:00
|
|
|
|
(
|
2025-10-07 10:11:48 +09:00
|
|
|
|
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
|
|
|
|
|
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
|
2025-10-06 22:53:19 +09:00
|
|
|
|
)
|
|
|
|
|
/*#####################################################################*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-07 19:40:21 +09:00
|
|
|
|
TypeThis& CopyThis(TypeThis& ARR_Rhs)
|
|
|
|
|
{
|
|
|
|
|
// *this 를 복사해서, ARR_Rhs 의 끝에 연결한다.
|
|
|
|
|
|
|
|
|
|
if(size()<1) return ARR_Rhs;
|
|
|
|
|
|
|
|
|
|
ZCLink* VP_HeadCopy=0;
|
|
|
|
|
ZCLink* VP_TailCopy=0;
|
|
|
|
|
|
|
|
|
|
SendFreeOutCopy ////////////////////////////////
|
|
|
|
|
(
|
|
|
|
|
mo_HeadFake.mp_NextLink, size()-1,
|
|
|
|
|
RR(VP_HeadCopy) , RR(VP_TailCopy)
|
|
|
|
|
);
|
|
|
|
|
////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
TypeThis VO_TempList;
|
|
|
|
|
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
( &VO_TempList.mo_HeadFake, VP_HeadCopy );
|
|
|
|
|
ZCLink::JoinLink
|
|
|
|
|
( VP_TailCopy, &VO_TempList.mo_TailFake );
|
|
|
|
|
|
|
|
|
|
VO_TempList.ml_LinkSize = size() ;
|
|
|
|
|
|
|
|
|
|
ARR_Rhs.JoinTail(VO_TempList); return *this;
|
|
|
|
|
}/*
|
|
|
|
|
TypeThis& CopyThis(TypeThis& ARR_Rhs)*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-06 22:53:19 +09:00
|
|
|
|
template<typename TFunctor> void IterElement(TFunctor AO_Functor)
|
|
|
|
|
{
|
|
|
|
|
ZCLink* VP_LoopLink=mo_HeadFake.mp_NextLink;
|
|
|
|
|
|
|
|
|
|
__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=mo_HeadFake.mp_NextLink;
|
|
|
|
|
|
|
|
|
|
__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=mo_HeadFake.mp_NextLink;
|
|
|
|
|
|
|
|
|
|
__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=mo_TailFake.mp_PrevLink;
|
|
|
|
|
|
|
|
|
|
__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=mo_TailFake.mp_PrevLink;
|
|
|
|
|
|
|
|
|
|
__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=mo_TailFake.mp_PrevLink;
|
|
|
|
|
|
|
|
|
|
__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 ZtCLinkMoveList ###################################################*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-04 22:55:41 +09:00
|
|
|
|
}/*
|
|
|
|
|
namespace ZNsMain*/
|
|
|
|
|
|
|
|
|
|
|
2025-10-05 14:36:50 +09:00
|
|
|
|
#endif //__ZCPPMAIN__ZTCLINKLIST_H__
|