commit 2025-09-28 10:10 template parameter TTypeCRTP in ZtCBaseList : ZCppMain/ZMainHead.H

This commit is contained in:
2025-09-28 10:10:58 +09:00
parent 6c4c4a86e1
commit cf415becc0
4 changed files with 297 additions and 170 deletions

View File

@ -1023,13 +1023,23 @@ namespace ZNsMain
/////////////////////////////////////////////////////////////////////////////////////////*/
/*#########################################################################################
■ 2번 template parameter 가 bool TTypebUseCRTP 인데, 만약 TTypeChild 가 유효한 자료형이라
면, TTypebUseCRTP 이 true 인 것이 맞겠으나, DEBUG 등의 특수한 용도로 TTypebUseCRTP 을
false 로 설정할 수 있게 한 것이다.
-- 2025-09-28 08:41
#########################################################################################*/
template< typename TTypeChild=ZCEmpty, bool TTypebUseCRTP =false
>
class ZtCTypeCRTP ////////////////////////////////////////////////
{
public:
typedef TTypeChild TypeData;
typedef TTypeChild TypeHigh;
public:
enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
public:
@ -1039,6 +1049,17 @@ namespace ZNsMain
class ZtCTypeCRTP //////////////////////////////////////////////*/
#if(_CODE_OLD_)
/*#########################################################################################
■ ZtCTypeCRTP2 이 필요한 곳에 ZtCTypeNowCRTP 을 사용하자. -- 2025-09-28 09:25
ZtCBaseList 에서 ZtCTypeCRTP 와 ZtCTypeNowCRTP 을 사용하고 있다.
#########################################################################################*/
template< typename TTypeChild = ZCEmpty , ////////////////////
typename TTypeBase = ZCEmpty ,
bool TTypebUseCRTP= false
@ -1047,7 +1068,6 @@ namespace ZNsMain
{
public:
typedef TTypeChild TypeData;
typedef TTypeChild TypeHigh;
typedef TTypeBase TypeBase;
public:
enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
@ -1059,6 +1079,8 @@ namespace ZNsMain
>
class ZtCTypeCRTP2 /////////////////////////////////////////////*/
#endif //_CODE_OLD_
/*//////////////////////////////////////////////////////////////////////////////////////////
@ -1067,7 +1089,7 @@ namespace ZNsMain
-- 2012-09-20 09:46:00
■ 해당 코드는 대충 이렇다.-- 2025-09-28 02:41
■ 해당 코드는 대충 이렇다. -- 2025-09-28 02:41
template< typename TWork ,
typename TWorkExec , // 작업(TWork)에 대하여 어떤 처리를 하는 클래스
@ -1148,13 +1170,69 @@ namespace ZNsMain
typedef typename TTypeCtrlAllocWork::CThreadLink CThreadLink;
typedef typename TTypeCtrlAllocWork::CTypeCRTP CTypeCRTP ;
// 이후 아래 코드로
//
// typedef typename CTypeCRTP::TypeData CCtrlAllocWorkEx;
//
// CCtrlAllocWork_T 의 상속 클래스에 접근할 수 있다.
// some code
void SetCloseMark(CWork& ARR_CWork)
{
if(CTypeCRTP::EUseCRTP>0)
{
typedef typename CTypeCRTP::TypeData CCtrlAllocWorkEx;
#if(_CODE_NEW_)
static_cast<CCtrlAllocWorkEx&>(*this). // 코드-CCtrlAllocWork::CRTP2
SetCloseMarkInChild(RR(ARR_CWork)); return;
#else
((CCtrlAllocWorkEx&)(*this)). // 코드-CCtrlAllocWork::CRTP
SetCloseMarkInChild(RR(ARR_CWork)); return;
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////
■ 주석-CCtrlAllocWork::CRTP2
이전에는 상속 클래스의 SetCloseMarkInChild() 을 사용하기 위해 위의 '코드-CCtrlAllocWork::CRTP'
를 사용하였으나 약간의 안전성 상승을 위해, std::NsType::CTypeCRTP2_T<> 을 긴급히 정의하고, NsT
ype::CTypeCtrlAllocWork_T<> 의 템플릿 인수에 typename TTypeCRTP 를 추가한 다음, '코드-CCtrlAll
ocWork::CRTP2' 를 사용하게 되었다. 그래서 class CCtrlAllocWork_T<> 이
TTypeCtrlAllocWork::CTypeCRTP::TypeBase
을 상속하고 있다. 이 TypeBase 는 SetCloseMarkInChild(CWork&) 함수를 가져야 한다.
-- 2012-09-20 09:43:00
■ NsType::CTypeCRTP2_T<> 는 NsType::CTypeCRTP_T<> 에서 TypeBase 가 추가된 것이다.
-- 2012-09-20 09:57:00
//////////////////////////////////////////////////////////////////////////////////////////////////
}
CWorkExec::SetCloseMark(RR(ARR_CWork));
}
//void SetCloseMark(CWork& ARR_CWork)
// some code
}
즉 아래 코드로
typedef typename CTypeCRTP::TypeData CCtrlAllocWorkEx;
CCtrlAllocWork_T 의 상속 클래스에 접근하고 있는데, 이것은 좀 이상하다.
즉 CTypeCRTP::TypeData 은 NsIFace::ICtrlAllocWork 이기 때문이다. 예전
코드라 그런지 나쁜 냄새가 난다.
-- 2025-09-28 07-27
//////////////////////////////////////////////////////////////////////////////////////////*/
@ -5130,29 +5208,39 @@ namespace ZNsMain
// class ZtCBaseList : circular double linked list
template ///////////////////////////////////////////////
template //////////////////////////////////////////////////////////////////
<
typename TType ,
typename TTypArgu = const TType&,
typename TTypCAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TTypArgu = const TType& ,
typename TTypeAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TMoveObj = ZNsMain::
ZtCMoveObj<TType, TTypArgu, true>
ZtCMoveObj<TType, TTypArgu, true> ,
typename TTypeCRTP = ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCBaseList /*##################################*/
class ZtCBaseList /*#####################################################*/
{
public:
class ZCLink;
public:
typedef TType TypeData ;
typedef TTypArgu TypeArg ;
typedef TTypCAlloc TypeAlloc ;
typedef TTypeAlloc TypeAlloc ;
typedef TTypSize TypeSize ;
typedef TMoveObj TypeMoveObj ;
typedef ZCLink* IterEasy ; // 가장 대표적으로 쓰일 수 있는 반복자.
typedef ZCLink* iterator ;
public:
typedef ZNsType::ZtCTypeNowCRTP ///////////////////
<
ZtCBaseList, typename TTypeCRTP::TypeData
>
ZCTypeNowCRTP ; ///////////////////////////////////
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
public :
class ZCLink : public TypeAlloc
{
@ -5163,11 +5251,27 @@ namespace ZNsMain
ZCLink* mp_NextLink ;
ZCLink* mp_PrevLink ;
private:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
ZCLink* GetNextPtr() {return mp_NextLink;}
ZCLink* GetPrevPtr() {return mp_PrevLink;}
const ZCLink* GetNextPtr()const{return mp_NextLink;}
const ZCLink* GetPrevPtr()const{return mp_PrevLink;}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
private:
ZCLink* GetNextPtr() {return mp_NextLink;}
ZCLink* GetPrevPtr() {return mp_PrevLink;}
const ZCLink* GetNextPtr()const{return mp_NextLink;}
const ZCLink* GetPrevPtr()const{return mp_PrevLink;}
static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)*/
static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/
public:
@ -5244,6 +5348,35 @@ namespace ZNsMain
TypeSize ml_LinkCnt ;
private :
ZCLink* NewLink()
{
if(TTypeCRTP::ZEUseCRTP<1) return new ZCLink;
return (*static_cast<TypeChild*>(this)).NewLink();
}/*
ZCLink* NewLink()*/
ZCLink* NewLink(TypeArg AO_ArgData)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ return new ZCLink(AO_ArgData); }
return (*static_cast<TypeChild*>(this)).NewLink(AO_ArgData);
}/*
ZCLink* NewLink(TypeArg AO_ArgData)*/
void DelLink(ZCLink* AP_DelLink)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ delete AP_DelLink; return; }
return (*static_cast<TypeChild*>(this)).DelLink(AP_DelLink);
}/*
void DelLink(ZCLink* AP_DelLink)*/
/*private :*/
private :
ZCLink* AddTailLink(ZCLink* AP_NewLink)
{
if(ml_LinkCnt<1)
@ -5251,22 +5384,19 @@ namespace ZNsMain
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
mp_HeadLink->mp_NextLink = mp_HeadLink ;
mp_HeadLink->mp_PrevLink = mp_HeadLink ;
ZCLink::MakeRing
( mp_HeadLink, mp_TailLink ) ;
ml_LinkCnt= 1; return AP_NewLink;
}/*
if(ml_LinkCnt<1)*/
mp_TailLink->mp_NextLink = AP_NewLink ;
AP_NewLink ->mp_PrevLink = mp_TailLink ;
ZCLink::JoinLink(mp_TailLink, AP_NewLink) ;
ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ;
AP_NewLink ->mp_NextLink = mp_HeadLink ;
mp_HeadLink->mp_PrevLink = AP_NewLink ;
mp_TailLink = AP_NewLink; ++ml_LinkCnt ;
mp_TailLink = AP_NewLink; ++ml_LinkCnt;
return AP_NewLink; /*:::::::::::::::::*/
return AP_NewLink; /*::::::::::::::::::::*/
}/*
ZCLink* AddTailLink(ZCLink* AP_CLink)*/
@ -5277,26 +5407,24 @@ namespace ZNsMain
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
mp_HeadLink->mp_NextLink = mp_HeadLink ;
mp_HeadLink->mp_PrevLink = mp_HeadLink ;
ZCLink::MakeRing
( mp_HeadLink, mp_TailLink ) ;
ml_LinkCnt= 1; return AP_NewLink;
}/*
if(ml_LinkCnt<1)*/
AP_NewLink ->mp_NextLink = mp_HeadLink ;
mp_HeadLink->mp_PrevLink = AP_NewLink ;
ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ;
ZCLink::MakeRing(AP_NewLink, mp_TailLink) ;
AP_NewLink ->mp_PrevLink = mp_TailLink ;
mp_TailLink->mp_NextLink = AP_NewLink ;
mp_HeadLink = AP_NewLink; ++ml_LinkCnt ;
mp_HeadLink = AP_NewLink; ++ml_LinkCnt;
return AP_NewLink; /*:::::::::::::::::*/
return AP_NewLink; /*::::::::::::::::::::*/
}/*
ZCLink* AddHeadLink(ZCLink* AP_CLink)
ZCLink* AddHeadLink(ZCLink* AP_CLink)*/
private :*/
/*private :*/
public :
ZtCBaseList()
@ -5350,7 +5478,7 @@ namespace ZNsMain
ZCLink* VP_NextLink =
VP_NowLink->mp_NextLink ;
delete VP_NowLink;
DelLink(VP_NowLink);
VP_NowLink = VP_NextLink;
}/*
@ -5364,9 +5492,9 @@ namespace ZNsMain
TypeData& AddHead()
{ return AddHeadLink(new ZCLink)->mo_Data; }
{ return AddHeadLink(NewLink())->mo_Data; }
TypeData& AddTail()
{ return AddTailLink(new ZCLink)->mo_Data; }
{ return AddTailLink(NewLink())->mo_Data; }
TypeData& AddHead(TypeArg AO_ArgData) /*########################*/
@ -5374,7 +5502,7 @@ namespace ZNsMain
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
{
ZCLink* VP_NewNode = new ZCLink(AO_ArgData);
ZCLink* VP_NewNode = NewLink(AO_ArgData);
TypeMoveObj::Exec(VP_NewNode->mo_Data, AO_ArgData);
@ -5391,7 +5519,7 @@ namespace ZNsMain
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
{
ZCLink* VP_NewNode = new ZCLink(AO_ArgData);
ZCLink* VP_NewNode = NewLink(AO_ArgData);
TypeMoveObj::Exec(VP_NewNode->mo_Data, AO_ArgData);
@ -5411,7 +5539,7 @@ namespace ZNsMain
ZCLink* VP_TempLink = mp_HeadLink ;
mp_HeadLink = mp_HeadLink->mp_NextLink ;
delete VP_TempLink;
DelLink(VP_TempLink);
if(--ml_LinkCnt<1)
{
@ -5419,8 +5547,7 @@ namespace ZNsMain
}/*
if(--ml_LinkCnt<1)*/
mp_HeadLink->mp_PrevLink = mp_TailLink ;
mp_TailLink->mp_NextLink = mp_HeadLink ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteHead()*/
@ -5432,7 +5559,7 @@ namespace ZNsMain
ZCLink* VP_TempLink = mp_TailLink ;
mp_TailLink = mp_TailLink->mp_PrevLink ;
delete VP_TempLink;
DelLink(VP_TempLink);
if(--ml_LinkCnt<1)
{
@ -5440,8 +5567,7 @@ namespace ZNsMain
}/*
if(--ml_LinkCnt<1)*/
mp_HeadLink->mp_PrevLink = mp_TailLink ;
mp_TailLink->mp_NextLink = mp_HeadLink ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteTail()*/
@ -5666,16 +5792,17 @@ namespace ZNsMain
public :
};/*
template ///////////////////////////////////////////////
template //////////////////////////////////////////////////////////////////
<
typename TType ,
typename TTypArgu = const TType&,
typename TTypCAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TTypArgu = const TType& ,
typename TTypeAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TMoveObj = ZNsMain::
ZtCMoveObj<TType, TTypArgu, true>
ZtCMoveObj<TType, TTypArgu, true> ,
typename TTypeCRTP = ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCBaseList /*##################################*/
class ZtCBaseList #######################################################*/