commit 2025-10-07 18:26 add TypeMain in ZCppMain/ZtCLinkList.H

This commit is contained in:
2025-10-07 18:27:05 +09:00
parent cf870b5c9c
commit 3db771e9d9
3 changed files with 425 additions and 29 deletions

View File

@ -28,6 +28,30 @@
-- 2025-10-07 12:23
ZNsIFaceEx::ZtCLink 는 TypeData 라는 자료형을 갖는데, ZtCLink 이
상속 클래스가 있다면, 그 상속 클래스
기반 클래스만 있다면, 그 기반 클래스
를 나타낸다. 상속 클래스도 기반 클래스도 없다면, 자기 자신을 나타낸다.
-- 2025-10-07 17:18
ZNsIFaceEx::ZtCLink 는 TypeMain 이라는 자료형을 갖는데, ZtCLink 이
상속 클래스가 있다면, 그 상속 클래스
상속 클래스가 없다면, 클래스 자기 자신
를 나타낸다. 그래서 ZtCLinkList 에서 new 로 객체를 만들 때,
ZtCLink* my=new TypeMain;
처럼 쓸 수 있게 한다.
-- 2025-10-07 17:49
■ class ZtCLinkMoveList 은 고정적으로 맨 앞과 맨 뒤를 가상으로 표시하는 링크 객체를 멤
버로 가지고 있다. 그래서 중간에서 링크 자료를 떼어 내어 다른 리스트로 옮길 때, 그 링
크가 리스트의 앞이나 뒤가 아닌, 무조건 중간에 존재한다고 가정하고 빠르게 떼어낼 수 있
@ -99,6 +123,8 @@ namespace ZNsMain
typedef ZtCLink TypeThis ;
typedef TTypBase TypeBase ;
typedef TChild TypeChild;
typedef TChild TypeData ;
typedef TChild TypeMain ;
typedef ZTypLong TypeSize ;
protected:
ZtCLink* mp_NextLink;
@ -147,6 +173,11 @@ namespace ZNsMain
}/*
ZtCLink(const TTypBase& rhs)*/
virtual ~ZtCLink()
{
}/*
virtual ~ZtCLink()*/
ZtCLink& operator=(const ZtCLink& rhs)
{
@ -167,8 +198,8 @@ namespace ZNsMain
ZtCLink& operator=(TypeBase& AR_CBase)*/
/***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); }
const TypeBase& operator()() const{ return *static_cast<const TypeBase*>(this); }
/***/ TypeData& operator()() { return *static_cast< TypeData*>(this); }
const TypeData& operator()() const{ return *static_cast<const TypeData*>(this); }
ZtCLink* GetNextPtr(){return mp_NextLink;}
@ -318,6 +349,8 @@ namespace ZNsMain
typedef ZtCLink<TTypBase, ZCEmpty> TypeThis ;
typedef TTypBase /*+++++++++++++*/ TypeBase ;
typedef ZCEmpty /*+++++++++++++*/ TypeChild;
typedef TypeBase /*+++++++++++++*/ TypeData ;
typedef TypeThis /*+++++++++++++*/ TypeMain ;
typedef ZTypLong /*+++++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
@ -524,13 +557,15 @@ namespace ZNsMain
public :
typedef ZtCLink<ZCEmpty, TChild> TypeThis ;
typedef ZCEmpty /*+++++++++++*/ TypeBase ;
typedef TChild /*+++++++++++*/ TypeChild;
typedef ZTypLong /*++++++++++++*/ TypeSize ;
typedef ZCEmpty /*++++++++++*/ TypeBase ;
typedef TChild /*++++++++++*/ TypeChild;
typedef TypeChild /*++++++++++*/ TypeData ;
typedef TypeChild /*++++++++++*/ TypeMain ;
typedef ZTypLong /*++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
ZtCLink* mp_PrevLink;
protected:
protected: ////////////////////////////////////
static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)
{
@ -546,8 +581,24 @@ namespace ZNsMain
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
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 영역에 두어서,
// 상속 클래스를 만드는 것을 강제한다.
ZtCLink<ZCEmpty, TChild>()
{
@ -563,15 +614,39 @@ namespace ZNsMain
}/*
ZtCLink<ZCEmpty, TChild>(const TypeThis& rhs)*/
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>()*/
TypeThis& operator=(const TypeThis& rhs)
{
return *this;
this->GetChildObj() = rhs.GetChildObj(); return *this;
}/*
TypeThis& operator=(const TypeThis& rhs)*/
/***/ TypeThis& operator()() { return *this; }
const TypeThis& operator()() const{ return *this; }
/***/ TypeData& operator()() { return GetChildObj(); }
const TypeData& operator()() const{ return GetChildObj(); }
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
@ -717,6 +792,8 @@ namespace ZNsMain
typedef ZtCLink<ZCEmpty, ZCEmpty> TypeThis ;
typedef ZCEmpty /*++++++++++++*/ TypeBase ;
typedef ZCEmpty /*++++++++++++*/ TypeChild;
typedef TypeThis /*++++++++++++*/ TypeData ;
typedef TypeThis /*++++++++++++*/ TypeMain ;
typedef ZTypLong /*++++++++++++*/ TypeSize ;
protected:
ZtCLink* mp_NextLink;
@ -737,8 +814,8 @@ namespace ZNsMain
}/*
static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/
/*protected:*/
public :
/*protected: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public : /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
ZtCLink<ZCEmpty, ZCEmpty>()
{
@ -761,6 +838,10 @@ namespace ZNsMain
TypeThis& operator=(const TypeThis& rhs)*/
/***/ TypeThis& operator()() { return *this; }
const TypeThis& operator()() const{ return *this; }
ZtCLink* GetNextPtr(){return mp_NextLink;}
ZtCLink* GetPrevPtr(){return mp_PrevLink;}
@ -911,6 +992,8 @@ namespace ZNsMain
typedef TCLink ZCLink ;
typedef TCLink TypeData;
typedef TTypSize TypeSize;
public :
typedef typename TCLink::TypeMain TypeMain;
private:
ZCLink* mp_HeadLink;
ZCLink* mp_TailLink;
@ -923,19 +1006,25 @@ namespace ZNsMain
}/*
TypeChild& GetChildObj()*/
const TypeChild& GetChildObj() const
{
return *static_cast<const TypeChild*>(this);
}/*
const TypeChild& GetChildObj() const*/
private:
ZCLink* NewLink()
{
return new ZCLink;
return new TypeMain;
}/*
ZCLink* NewLink()*/
ZCLink* NewLink( ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
{ return new TypeMain(AR_ArgData); }
ZCLink* NewLink(const ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
{ return new TypeMain(AR_ArgData); }
void NewLink ////////////////////////////////////////
(
@ -945,7 +1034,7 @@ namespace ZNsMain
)
/////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
APR_HeadLink = new TypeMain;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
@ -954,7 +1043,7 @@ namespace ZNsMain
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
VP_MakeLink = new TypeMain;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
@ -986,14 +1075,14 @@ namespace ZNsMain
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
new TypeMain(*AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr() ;
VP_MakeLink = new TypeMain(*AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
@ -1943,6 +2032,8 @@ namespace ZNsMain
typedef TCLink ZCLink ;
typedef TCLink TypeData;
typedef TTypSize TypeSize;
public :
typedef typename TCLink::TypeMain TypeMain;
private:
ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체
ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체
@ -1958,6 +2049,12 @@ namespace ZNsMain
}/*
TypeChild& GetChildObj()*/
const TypeChild& GetChildObj() const
{
return *static_cast<const TypeChild*>(this);
}/*
const TypeChild& GetChildObj() const*/
private:
ZCLink* NewLink()
@ -1967,10 +2064,10 @@ namespace ZNsMain
ZCLink* NewLink()*/
ZCLink* NewLink( ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
{ return new TypeMain(AR_ArgData); }
ZCLink* NewLink(const ZCLink& AR_ArgData)
{ return new ZCLink(AR_ArgData); }
{ return new TypeMain(AR_ArgData); }
void NewLink ////////////////////////////////////////
(
@ -1980,7 +2077,7 @@ namespace ZNsMain
)
/////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
APR_HeadLink = new TypeMain;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
@ -1989,7 +2086,7 @@ namespace ZNsMain
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
VP_MakeLink = new TypeMain;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
@ -2021,14 +2118,14 @@ namespace ZNsMain
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
new TypeMain(*AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
VP_MakeLink = new TypeMain(*AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);