commit 2025-10-25 13:35 add ZtCObjtInitChain in ZCppMain/ZMainHead.H
This commit is contained in:
@ -817,21 +817,40 @@ namespace ZNsMain
|
||||
|
||||
template<typename TDataNow> int ZftPrint(const TDataNow& AR_Data)
|
||||
{
|
||||
#if defined(_DEBUG_LEVEL) && _DEBUG_LEVEL>=100
|
||||
cout<<"# typename TDataNow : "<<typeid(TDataNow).name()<<endl;
|
||||
#endif
|
||||
|
||||
std::cout<<AR_Data; return 0;
|
||||
}/*
|
||||
template<typename TDataNow> int ZftPrint(const TDataNow& AR_Data)*/
|
||||
|
||||
template<typename TDataNow1, typename TDataNow2> int ZftPrint
|
||||
template<typename TDataNow1, typename TDataNow2> int ZftPrint2
|
||||
(const TDataNow1& AR_Data1, const TDataNow2& AR_Data2)
|
||||
{
|
||||
std::cout<<AR_Data1<<AR_Data2; return 0;
|
||||
}/*
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
/*///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
■ template<typename, typename> int ZftPrint2(~)
|
||||
|
||||
만약 위 선언을 template<typename, typename> int ZftPrint(~) 로 하면 어떻게 될까.
|
||||
별로 좋지 않다. 아래 표현에서
|
||||
|
||||
void* myP = &ZftPrint<string, char> ;
|
||||
|
||||
아래 함수와 overload 가 이상해져서,
|
||||
|
||||
template<typename TDataNow, typename TTypeNextChain>
|
||||
int ZftPrint
|
||||
( const ZtCObjtChain<TDataNow, TTypeNextChain>&);
|
||||
template<typename TDataNow, typename TInitVal, typename TTypeNextChain>
|
||||
int ZftPrint
|
||||
( const ZtCObjtInitChain<TDataNow, TInitVal, TTypeNextChain>& AR_CChain )
|
||||
|
||||
적절한 함수를 찾지를 못한다. -- 2025-10-25 13:32
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
|
||||
/*///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -842,8 +861,6 @@ namespace ZNsMain
|
||||
ZtCObjtChain 의 원소를 순회할 때마다 변한다. 그래서 ZCPrint 처럼, 템플릿 함수
|
||||
연산자 () 을 갖는 ZCPrint 가 필요하다.
|
||||
|
||||
ZtCObjtInitChain 에서 사용될 수 있다. -- 2025-10-25 08:27
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
class ZCPrint /*///////////////////////////////////////////////////////////////*/
|
||||
@ -851,7 +868,7 @@ namespace ZNsMain
|
||||
public:
|
||||
template<typename TDataNow> int operator ()
|
||||
(const TDataNow& AR_Data){ ZftPrint(AR_Data); return 0; }
|
||||
template<typename TDataNow> int OnPrevIter
|
||||
template<typename TDataNow> int OnNextIter
|
||||
(const TDataNow& AR_Data){ ZftPrint(", ") ; return 0; }
|
||||
public:
|
||||
};
|
||||
@ -859,17 +876,22 @@ namespace ZNsMain
|
||||
|
||||
|
||||
|
||||
int ZfInitZero(){ return 0; }
|
||||
/*///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
■ int ZfInitZero()
|
||||
■ class ZCInitZero
|
||||
|
||||
템플릿 인자 중에서, 0 으로 초기화하는 functor 가 필요할 때 사용하는 함수.
|
||||
템플릿 인자 중에서, 0 으로 초기화하는 자료형이 필요할 때 사용하는 함수.
|
||||
|
||||
ZtCObjtInitChain 에서 사용될 수 있다. -- 2025-10-25 08:27
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
class ZCInitZero
|
||||
{
|
||||
public: static int Exec(){ return 0; }
|
||||
};/*
|
||||
class ZCInitZero*/
|
||||
|
||||
|
||||
|
||||
class ZCEndian
|
||||
@ -3735,9 +3757,26 @@ namespace ZNsMain
|
||||
|
||||
각 객체에 어떻게 쉽게 접근하는지가 관건이다. -- 2025-10-18 01:41
|
||||
|
||||
현재 각 객체에 아래처럼 갈끔하게 접근하고 있다.
|
||||
|
||||
*VO_ZCObjtChain.GetChainByNo<0>()=('E');
|
||||
*VO_ZCObjtChain.GetChainByNo<1>()=(string("New4 Str"));
|
||||
*VO_ZCObjtChain.GetChainByNo<2>()=(1.8);
|
||||
*VO_ZCObjtChain.GetChainByNo<3>()=(9999);
|
||||
|
||||
여기에 오기까지 참 한 많은 세월이 아니던가... -- 2025-10-25 10:46
|
||||
|
||||
*********************************************************************
|
||||
|
||||
() 을 재정의해서, () 을 필요한 만큼 겹겹이 호출해서 접근하도록 했다.
|
||||
아래 예제:202510200053 참고.
|
||||
|
||||
■ class ZtCObjtInitChain<TDataNow, TInitVal, TTypeNextChain>
|
||||
|
||||
각 원소 TDataNow 객체를 TInitVal::Exec() 로 초기화한다.
|
||||
|
||||
-- 2025-10-25 11:02
|
||||
|
||||
■ 아래 멈버 함수를 추가하고
|
||||
|
||||
template<typename TDataHere>
|
||||
@ -3797,7 +3836,7 @@ namespace ZNsMain
|
||||
-- 2025-10-24 09:09
|
||||
|
||||
|
||||
ZtCPrint 를 추가해서, 멤버함수 IterElement(), IterElemRev() 이
|
||||
ZCPrint 를 추가해서, 멤버함수 IterElement(), IterElemRev() 이
|
||||
functor 를 받을 수 있도록 했다. 이러니까 C++ 이다!
|
||||
|
||||
-- 2025-10-25 08:40
|
||||
@ -4064,7 +4103,7 @@ namespace ZNsMain
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnPrevIter(*this);
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
|
||||
this->TypeChainNext::IterElement(AO_CView);
|
||||
}/*
|
||||
@ -4078,7 +4117,7 @@ namespace ZNsMain
|
||||
this->TypeChainNext::IterElemRev(AO_CView);
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnPrevIter(*this);
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
@ -4232,8 +4271,707 @@ namespace ZNsMain
|
||||
|
||||
|
||||
|
||||
/*///////////////////////////////////////////////////////////////////
|
||||
|
||||
■ class ZtCObjtInitChain<TDataNow, TInitVal, TTypeNextChain>
|
||||
|
||||
각 원소 TDataNow 객체를 TInitVal::Exec() 로 초기화한다.
|
||||
|
||||
-- 2025-10-25 11:02
|
||||
|
||||
///////////////////////////////////////////////////////////////////*/
|
||||
|
||||
template /*########################################################*/
|
||||
<
|
||||
typename TDataNow, typename TInitVal, typename TTypeNextChain
|
||||
>
|
||||
class ZtCObjtInitChain : public TTypeNextChain //////////////////////
|
||||
{
|
||||
public :
|
||||
typedef TDataNow TypeData ;
|
||||
typedef ZtCObjtInitChain TypeChainNow ;
|
||||
typedef TTypeNextChain TypeChainNext ;
|
||||
typedef TInitVal TypeInitVal ;
|
||||
/************************************************************/
|
||||
typedef const TypeChainNow TypeChainNowC ;
|
||||
typedef const TypeChainNext TypeChainNextC;
|
||||
/************************************************************/
|
||||
typedef const TypeData TypeDataC ;
|
||||
/************************************************************/
|
||||
typedef typename TypeChainNext::TypeData TypeNext ;
|
||||
/************************************************************/
|
||||
enum{ZETypeNo = TypeChainNext::ZETypeNo+1};
|
||||
enum{ZEBoolNext = 1 };
|
||||
public :
|
||||
static ZTypIntE Size (){return ZETypeNo;}
|
||||
static ZTypIntE size (){return ZETypeNo;}
|
||||
static ZTypIntE GetNo(){return ZETypeNo;}
|
||||
private:
|
||||
TypeData mo_TypeVar;
|
||||
public :
|
||||
ZtCObjtInitChain() : mo_TypeVar( TypeInitVal::Exec() ){}
|
||||
public :
|
||||
TypeData & GetData () {return mo_TypeVar;}
|
||||
TypeDataC& GetData () const{return mo_TypeVar;}
|
||||
|
||||
TypeData & operator* () {return mo_TypeVar;}
|
||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||
/************************************************************/
|
||||
TypeChainNext & GetChainNext()
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& GetChainNext() const
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
TypeChainNext & operator() ()
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& operator() () const
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
template<typename TDataHere>
|
||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||
{ /*:::::::::::::::*/ return *this;}
|
||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
|
||||
/**************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain TypeChain ;
|
||||
|
||||
return *static_cast<TypeChain *>(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC TypeChainC;
|
||||
|
||||
return *static_cast<TypeChainC*>(this);
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
{
|
||||
if(TTypNo==TypeChainNow::ZETypeNo)
|
||||
{*this=AR_Data; return true;}
|
||||
if(TTypNo>TypeChainNow::ZETypeNo)
|
||||
{/*::::::::::*/ return false;}
|
||||
|
||||
return this->TypeChainNext::template
|
||||
SetDataRecur<TTypNo, TDataHere>(AR_Data);
|
||||
}/*
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data) */
|
||||
|
||||
/************************************************************/
|
||||
|
||||
template<typename TTypeChainNext> typename
|
||||
TTypeChainNext::TypeData & GetData()
|
||||
{ return this->TTypeChainNext::GetData(); }
|
||||
template<typename TTypeChainNext> typename
|
||||
TTypeChainNext::TypeDataC& GetData() const
|
||||
{ return this->TTypeChainNext::GetData(); }
|
||||
|
||||
/* AO_CView.OnMeetData() 은 다음 TypeChainNext 을 호출할
|
||||
때마다 인수 자료형이 변한다. 따라서 고정적인 함수로는
|
||||
적당치 않않다. -- 2025-10-20 00:32
|
||||
*/
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterHead(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterTail(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)*/
|
||||
|
||||
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::
|
||||
IterHead(AO_CView, AO_TypeHelp);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::
|
||||
IterTail(AO_CView, AO_TypeHelp);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
*/
|
||||
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
|
||||
this->TypeChainNext::IterElement(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterElemRev(AO_CView);
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)*/
|
||||
|
||||
public:
|
||||
};/*
|
||||
template ############################################################
|
||||
<
|
||||
typename TDataNow, typename TInitVal, typename TTypeNextChain
|
||||
>
|
||||
class ZtCObjtInitChain : public TTypeNextChain ////////////////////*/
|
||||
|
||||
|
||||
template /*########################################################*/
|
||||
<
|
||||
typename TDataNow, typename TTypeNextChain
|
||||
>
|
||||
class ZtCObjtInitChain
|
||||
<TDataNow, ZCEmpty, TTypeNextChain> : public TTypeNextChain /////
|
||||
{
|
||||
public :
|
||||
typedef ZtCObjtInitChain
|
||||
<TDataNow, ZCEmpty, TTypeNextChain> ZCObjtInitChain;
|
||||
public :
|
||||
typedef TDataNow TypeData ;
|
||||
typedef ZCObjtInitChain TypeChainNow ;
|
||||
typedef TTypeNextChain TypeChainNext ;
|
||||
typedef ZCEmpty TypeInitVal ;
|
||||
/************************************************************/
|
||||
typedef const TypeChainNow TypeChainNowC ;
|
||||
typedef const TypeChainNext TypeChainNextC;
|
||||
/************************************************************/
|
||||
typedef const TypeData TypeDataC ;
|
||||
/************************************************************/
|
||||
typedef typename TypeChainNext::TypeData TypeNext ;
|
||||
/************************************************************/
|
||||
enum{ZETypeNo = TypeChainNext::ZETypeNo+1};
|
||||
enum{ZEBoolNext = 1 };
|
||||
public :
|
||||
static ZTypIntE Size (){return ZETypeNo;}
|
||||
static ZTypIntE size (){return ZETypeNo;}
|
||||
static ZTypIntE GetNo(){return ZETypeNo;}
|
||||
private:
|
||||
TypeData mo_TypeVar;
|
||||
public :
|
||||
ZtCObjtInitChain(){}
|
||||
public :
|
||||
TypeData & GetData () {return mo_TypeVar;}
|
||||
TypeDataC& GetData () const{return mo_TypeVar;}
|
||||
|
||||
TypeData & operator* () {return mo_TypeVar;}
|
||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||
/************************************************************/
|
||||
TypeChainNext & GetChainNext()
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& GetChainNext() const
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
TypeChainNext & operator() ()
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& operator() () const
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
template<typename TDataHere>
|
||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||
{ /*:::::::::::::::*/ return *this;}
|
||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
|
||||
/**************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain TypeChain ;
|
||||
|
||||
return *static_cast<TypeChain *>(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC TypeChainC;
|
||||
|
||||
return *static_cast<TypeChainC*>(this);
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
{
|
||||
if(TTypNo==TypeChainNow::ZETypeNo)
|
||||
{*this=AR_Data; return true;}
|
||||
if(TTypNo>TypeChainNow::ZETypeNo)
|
||||
{/*::::::::::*/ return false;}
|
||||
|
||||
return this->TypeChainNext::template
|
||||
SetDataRecur<TTypNo, TDataHere>(AR_Data);
|
||||
}/*
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data) */
|
||||
|
||||
/************************************************************/
|
||||
|
||||
template<typename TTypeChainNext> typename
|
||||
TTypeChainNext::TypeData & GetData()
|
||||
{ return this->TTypeChainNext::GetData(); }
|
||||
template<typename TTypeChainNext> typename
|
||||
TTypeChainNext::TypeDataC& GetData() const
|
||||
{ return this->TTypeChainNext::GetData(); }
|
||||
|
||||
/* AO_CView.OnMeetData() 은 다음 TypeChainNext 을 호출할
|
||||
때마다 인수 자료형이 변한다. 따라서 고정적인 함수로는
|
||||
적당치 않않다. -- 2025-10-20 00:32
|
||||
*/
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterHead(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterTail(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)*/
|
||||
|
||||
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::
|
||||
IterHead(AO_CView, AO_TypeHelp);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::
|
||||
IterTail(AO_CView, AO_TypeHelp);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
*/
|
||||
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
|
||||
this->TypeChainNext::IterElement(AO_CView);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
}/*
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)
|
||||
{
|
||||
if(TypeChainNow::ZEBoolNext>0)
|
||||
{
|
||||
this->TypeChainNext::IterElemRev(AO_CView);
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnNextIter(*this);
|
||||
}/*
|
||||
if(TypeChainNow::ZEBoolNext>0)*/
|
||||
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)*/
|
||||
|
||||
public:
|
||||
};/*
|
||||
template ############################################################
|
||||
<
|
||||
typename TDataNow, typename TTypeNextChain
|
||||
>
|
||||
class ZtCObjtInitChain<TDataNow, ZCEmpty, TTypeNextChain> ////////*/
|
||||
|
||||
|
||||
template /*########################################################*/
|
||||
< typename TDataNow, typename TInitVal>
|
||||
class ZtCObjtInitChain<TDataNow, TInitVal, ZCEmpty> /////////////////
|
||||
{
|
||||
public :
|
||||
typedef ZtCObjtInitChain
|
||||
<TDataNow, TInitVal, ZCEmpty> ZCObjtInitChain;
|
||||
public :
|
||||
typedef TDataNow TypeData ;
|
||||
typedef ZCObjtInitChain TypeChainNow ;
|
||||
typedef ZCObjtInitChain TypeChainNext ;
|
||||
/************************************************************/
|
||||
typedef ZCObjtInitChain TypeChainLast ; // only here
|
||||
typedef ZCObjtInitChain TypeChainTail ;
|
||||
/************************************************************/
|
||||
typedef ZCEmpty TypeNext ;
|
||||
typedef ZCEmpty TypeInitVal ;
|
||||
/************************************************************/
|
||||
typedef const TypeData TypeDataC ;
|
||||
/************************************************************/
|
||||
typedef const TypeChainNow TypeChainNowC ;
|
||||
typedef const TypeChainNow TypeChainNextC;
|
||||
/************************************************************/
|
||||
enum{ZETypeNo = 1 };
|
||||
enum{ZEBoolNext = 0 };
|
||||
public :
|
||||
static ZTypIntE Size (){return ZETypeNo;}
|
||||
static ZTypIntE size (){return ZETypeNo;}
|
||||
static ZTypIntE GetNo(){return ZETypeNo;}
|
||||
private:
|
||||
TypeData mo_TypeVar;
|
||||
public :
|
||||
ZtCObjtInitChain():mo_TypeVar(TInitVal::Exec()){}
|
||||
public :
|
||||
TypeData & GetData () {return mo_TypeVar;}
|
||||
TypeDataC& GetData () const{return mo_TypeVar;}
|
||||
|
||||
TypeData & operator* () {return mo_TypeVar;}
|
||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||
/************************************************************/
|
||||
TypeChainNext & GetChainNext() { return (*this); }
|
||||
TypeChainNextC& GetChainNext() const{ return (*this); }
|
||||
|
||||
TypeChainNext & operator() () { return (*this); }
|
||||
TypeChainNextC& operator() () const{ return (*this); }
|
||||
|
||||
template<typename TDataHere>
|
||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||
{ /*:::::::::::::::*/ return *this;}
|
||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
/************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
return *(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
return *(this);
|
||||
}/*
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
{
|
||||
if(TTypNo==TypeChainNow::ZETypeNo)
|
||||
{*this=AR_Data; return true ;}
|
||||
{/*::::::::::*/ return false;}
|
||||
}/*
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data) */
|
||||
|
||||
/************************************************************/
|
||||
|
||||
template<typename TTypeChainNext> TypeData & GetData()
|
||||
{ return this->GetData(); }
|
||||
template<typename TTypeChainNext> TypeDataC& GetData() const
|
||||
{ return this->GetData(); }
|
||||
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)*/
|
||||
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
*/
|
||||
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)*/
|
||||
|
||||
public:
|
||||
};/*
|
||||
template ############################################################
|
||||
< typename TDataNow, typename TInitVal>
|
||||
class ZtCObjtInitChain<TDataNow, TInitVal, ZCEmpty> ///////////////*/
|
||||
|
||||
|
||||
template /*########################################################*/
|
||||
< typename TDataNow>
|
||||
class ZtCObjtInitChain<TDataNow, ZCEmpty, ZCEmpty> //////////////////
|
||||
{
|
||||
public :
|
||||
typedef ZtCObjtInitChain
|
||||
<TDataNow, ZCEmpty, ZCEmpty> ZCObjtInitChain;
|
||||
public :
|
||||
typedef TDataNow TypeData ;
|
||||
typedef ZCObjtInitChain TypeChainNow ;
|
||||
typedef ZCObjtInitChain TypeChainNext ;
|
||||
/************************************************************/
|
||||
typedef ZCObjtInitChain TypeChainLast ; // only here
|
||||
typedef ZCObjtInitChain TypeChainTail ;
|
||||
/************************************************************/
|
||||
typedef ZCEmpty TypeNext ;
|
||||
/************************************************************/
|
||||
typedef const TypeData TypeDataC ;
|
||||
/************************************************************/
|
||||
typedef const TypeChainNow TypeChainNowC ;
|
||||
typedef const TypeChainNow TypeChainNextC;
|
||||
/************************************************************/
|
||||
enum{ZETypeNo = 1 };
|
||||
enum{ZEBoolNext = 0 };
|
||||
public :
|
||||
static ZTypIntE Size (){return ZETypeNo;}
|
||||
static ZTypIntE size (){return ZETypeNo;}
|
||||
static ZTypIntE GetNo(){return ZETypeNo;}
|
||||
private:
|
||||
TypeData mo_TypeVar;
|
||||
public :
|
||||
ZtCObjtInitChain(){}
|
||||
public :
|
||||
TypeData & GetData () {return mo_TypeVar;}
|
||||
TypeDataC& GetData () const{return mo_TypeVar;}
|
||||
|
||||
TypeData & operator* () {return mo_TypeVar;}
|
||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||
/************************************************************/
|
||||
TypeChainNext & GetChainNext() { return (*this); }
|
||||
TypeChainNextC& GetChainNext() const{ return (*this); }
|
||||
|
||||
TypeChainNext & operator() () { return (*this); }
|
||||
TypeChainNextC& operator() () const{ return (*this); }
|
||||
|
||||
template<typename TDataHere>
|
||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||
{ /*:::::::::::::::*/ return *this;}
|
||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
/************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
return *(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
return *(this);
|
||||
}/*
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
{
|
||||
if(TTypNo==TypeChainNow::ZETypeNo)
|
||||
{*this=AR_Data; return true ;}
|
||||
{/*::::::::::*/ return false;}
|
||||
}/*
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data) */
|
||||
|
||||
/************************************************************/
|
||||
|
||||
template<typename TTypeChainNext> TypeData & GetData()
|
||||
{ return this->GetData(); }
|
||||
template<typename TTypeChainNext> TypeDataC& GetData() const
|
||||
{ return this->GetData(); }
|
||||
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterHead(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).OnMeetData(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterTail(TViewChain AO_CView)*/
|
||||
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
{
|
||||
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
|
||||
|
||||
ZtCTypeData<TViewChain>::GetObjRef(AO_CView).
|
||||
OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp));
|
||||
}/*
|
||||
template<typename TViewChain, typename TTypeHelp>
|
||||
void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
|
||||
*/
|
||||
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElement(TViewChain AO_CView)*/
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)
|
||||
{
|
||||
ZtCTypeData<TViewChain>::
|
||||
GetObjRef(AO_CView).operator()(*this);
|
||||
}/*
|
||||
template<typename TViewChain> void IterElemRev(TViewChain AO_CView)*/
|
||||
|
||||
public:
|
||||
};/*
|
||||
template ############################################################
|
||||
< typename TDataNow>
|
||||
class ZtCObjtInitChain<TDataNow, ZCEmpty, ZCEmpty> ////////////////*/
|
||||
|
||||
|
||||
|
||||
template<typename TDataNow, typename TTypeNextChain> int ZftPrint /*:::::::*/
|
||||
( const ZtCObjtChain<TDataNow, TTypeNextChain>& AR_CChain )
|
||||
( const ZtCObjtChain <TDataNow, TTypeNextChain>& AR_CChain )
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
{
|
||||
return ZftPrint(*AR_CChain);
|
||||
}
|
||||
template<typename TDataNow, typename TInitVal, typename TTypeNextChain>
|
||||
int ZftPrint
|
||||
( const ZtCObjtInitChain
|
||||
<TDataNow, TInitVal, TTypeNextChain>& AR_CChain
|
||||
)
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
{
|
||||
return ZftPrint(*AR_CChain);
|
||||
@ -4263,6 +5001,28 @@ namespace ZNsMain
|
||||
return AR_COStream;
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
template<typename TDataNow, typename TInitVal, typename TTypeNextChain>
|
||||
std::ostream& operator <<
|
||||
(
|
||||
std::ostream& AR_COStream, const ZtCObjtInitChain
|
||||
<TDataNow, TInitVal, TTypeNextChain>& AR_CChain
|
||||
)
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
{
|
||||
AR_COStream<<AR_CChain.GetData();
|
||||
|
||||
typedef ZtCObjtInitChain
|
||||
<TDataNow, TInitVal, TTypeNextChain> TypeObjtChain;
|
||||
|
||||
if(TypeObjtChain::ZEBoolNext>0)
|
||||
{
|
||||
cout<<", "; return AR_COStream<<AR_CChain.GetChainNext() ;
|
||||
}/*
|
||||
if(TypeObjtChain::ZEBoolNext>0)*/
|
||||
|
||||
return AR_COStream;
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user