commit 2025-09-28 10:10 template parameter TTypeCRTP in ZtCBaseList : ZCppMain/ZMainHead.H
This commit is contained in:
@ -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 #######################################################*/
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user