commit 2025-10-25 13:35 add ZtCObjtInitChain in ZCppMain/ZMainHead.H

This commit is contained in:
2025-10-25 13:35:43 +09:00
parent d3ccefb8c3
commit b7d7ddca2b
2 changed files with 800 additions and 17 deletions

View File

@ -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;
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/