diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index e8dd07c..d85b20f 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -4204,7 +4204,7 @@ namespace ZNsMain public: };/* - template /*########################################################## + template ############################################################ < typename TTypData, typename TCMiniValChain > @@ -4217,7 +4217,7 @@ namespace ZNsMain template < typename TTypData, typename TTypSize=ZTypLength > - class ZtCTypeSelfLink + class ZtCTypeDataRing { public: enum{ZEUseIteHead=1}; @@ -4303,7 +4303,92 @@ namespace ZNsMain };/* template < typename TTypData, typename TTypSize=ZTypLength > - class ZtCTypeSelfLink */ + class ZtCTypeDataRing */ + + + template + < typename TTypData, typename TTypSize=ZTypLength > + class ZtCTypeDataRingS // single, 단방향. + { + public: + enum{ZEUseIteHead=1}; + enum{ZEUseIteTail=0}; + public: + class ZCDataLink ; + public: + typedef TTypData TypeData ; + typedef ZCDataLink TypeLink ; + typedef TTypSize TypeSize ; + + typedef const TypeData TypeDataC; + typedef const TypeLink TypeLinkC; + public: + + class ZCDataLink : public TypeData + { + protected: + TypeLink* mp_NextLink; + protected: + /* alwayse mp_NextLink!=0 && mp_PrevLink!=0 */ + protected: + static void JoinLink(TypeLink* AP_PrevLink, TypeLink* AP_NextLink) + { + AP_PrevLink->mp_NextLink=AP_NextLink; + }/* + static void JoinLink(TypeLink* AP_PrevLink, TypeLink* AP_NextLink)*/ + static void MakeRing(TypeLink* AP_HeadLink, TypeLink* AP_TailLink) + { + AP_TailLink->mp_NextLink=AP_HeadLink; + }/* + static void MakeRing(TypeLink* AP_HeadLink, TypeLink* AP_TailLink)*/ + public : + TypeData & operator * () {return static_cast(*this);} + TypeData & operator() () {return static_cast(*this);} + operator TypeData & () {return static_cast(*this);} + + TypeDataC& operator * () const{return static_cast(*this);} + TypeDataC& operator() () const{return static_cast(*this);} + operator TypeDataC& () const{return static_cast(*this);} + + TypeData & GetData () {return static_cast(*this);} + TypeDataC& GetData () const{return static_cast(*this);} + + TypeLink & GetNext () {return *mp_NextLink;} + TypeLinkC& GetNext () const{return *mp_NextLink;} + + public : + ZCDataLink() + { + mp_NextLink = 0 ; + }/* + ZCDataLink()*/ + ZCDataLink(TypeLinkC& rhs) + { + mp_NextLink = 0 ; GetData() = rhs.GetData() ; + }/* + ZCDataLink(TypeLinkC& rhs)*/ + ZCDataLink(TypeDataC& AR_Data) + { + mp_NextLink = 0 ; GetData() = AR_Data ; + }/* + ZCDataLink(TypeDataC& AR_Data)*/ + + TypeLink& operator=(TypeLinkC& rhs) + { GetData() = rhs.GetData(); return *this; } + TypeLink& operator=(TypeData & rhs) + { GetData() = rhs ; return *this; } + TypeLink& operator=(TypeDataC& rhs) + { GetData() = rhs ; return *this; } + + public : + };/* + class ZCDataLink : public TypeData*/ + + public: + };/* + template + < typename TTypData, typename TTypSize=ZTypLength > + class ZtCTypeDataRingS */ }/* namespace ZNsType*/ @@ -4313,14 +4398,15 @@ namespace ZNsMain template //////////////////////////////////////////////////////////////// < typename TDataNow, typename TTypeSelfLink = - ZNsType::ZtCTypeSelfLink + ZNsType::ZtCTypeDataRing + //ZNsType::ZtCTypeDataRingS > - class ZCtDataRing : /*#################################################*/ + class ZtCDataRing : /*#################################################*/ public TTypeSelfLink::TypeLink { public : typedef TTypeSelfLink TypeSelf ; - typedef ZCtDataRing TypeThis ; + typedef ZtCDataRing TypeThis ; typedef TDataNow TypeData ; public : typedef typename TTypeSelfLink::TypeLink TypeLink; @@ -4343,7 +4429,7 @@ namespace ZNsMain +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ public : - ZCtDataRing() + ZtCDataRing() { mp_HeadLink=this; mp_TailLink=this; @@ -4352,20 +4438,20 @@ namespace ZNsMain MakeRing(mp_HeadLink, mp_TailLink); }/* - ZCtDataRing()*/ + ZtCDataRing()*/ /*####################################################################### - ZCtDataRing(const ZCtDataRing& rhs) : ZCtDataRing() + ZtCDataRing(const ZtCDataRing& rhs) : ZtCDataRing() { this->GetData() = rhs.GetData() ; } - ZCtDataRing(const TypeLink & rhs) : ZCtDataRing() + ZtCDataRing(const TypeLink & rhs) : ZtCDataRing() { this->GetData() = rhs.GetData() ; } - ZCtDataRing(const TypeData & rhs) : ZCtDataRing() + ZtCDataRing(const TypeData & rhs) : ZtCDataRing() { this->GetData() = rhs ; } - ../ZCppMain/ZMainHead.H: In copy constructor ‘ZNsMain::ZCtDataRing::ZCtDataRing(const ZNsMain::ZCtDataRing&)’: + ../ZCppMain/ZMainHead.H: In copy constructor ‘ZNsMain::ZtCDataRing::ZtCDataRing(const ZNsMain::ZtCDataRing&)’: ../ZCppMain/ZMainHead.H:4242:59: warning: delegating constructors only available with ‘-std=c++11’ or ‘-std=gnu++11’ - 4242 | ZCtDataRing(const ZCtDataRing& rhs) : ZCtDataRing() + 4242 | ZtCDataRing(const ZtCDataRing& rhs) : ZtCDataRing() sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ g++ --version g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 @@ -4377,7 +4463,7 @@ namespace ZNsMain #######################################################################*/ - ZCtDataRing(const ZCtDataRing& rhs) + ZtCDataRing(const ZtCDataRing& rhs) { mp_HeadLink=this; mp_TailLink=this; @@ -4387,8 +4473,8 @@ namespace ZNsMain this->GetData() = rhs.GetData() ; }/* - ZCtDataRing(const ZCtDataRing& rhs)*/ - ZCtDataRing(const TypeLink & rhs) + ZtCDataRing(const ZtCDataRing& rhs)*/ + ZtCDataRing(const TypeLink & rhs) { mp_HeadLink=this; mp_TailLink=this; @@ -4398,8 +4484,8 @@ namespace ZNsMain this->GetData() = rhs.GetData() ; }/* - ZCtDataRing(const TypeLink & rhs)*/ - ZCtDataRing(const TypeData & rhs) + ZtCDataRing(const TypeLink & rhs)*/ + ZtCDataRing(const TypeData & rhs) { mp_HeadLink=this; mp_TailLink=this; @@ -4409,10 +4495,10 @@ namespace ZNsMain this->GetData() = rhs ; /*********/ }/* - ZCtDataRing(const TypeData & rhs)*/ + ZtCDataRing(const TypeData & rhs)*/ - ~ZCtDataRing(){DeleteAll();} + ~ZtCDataRing(){DeleteAll();} TypeSize size () const{return ml_LinkSize ;} @@ -4685,28 +4771,28 @@ namespace ZNsMain template //////////////////////////////////////////////////////////////// < typename TDataNow, typename TTypeSelfLink = - ZNsType::ZtCTypeSelfLink + ZNsType::ZtCTypeDataRing > - class ZCtDataRing : ###################################################*/ + class ZtCDataRing : ###################################################*/ template std::ostream& operator << ( - std::ostream& AR_COStream, const ZCtDataRing& AR_CDataRing + std::ostream& AR_COStream, const ZtCDataRing& AR_CDataRing ) /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ { /*///////////////////////////////////////////////////////////////////////////////////// - ■ ZCtDataRing~ 앞에 const 를 붙이지 않으면, 비 const ZCtDataRing object 에 대하여, 이 + ■ ZtCDataRing~ 앞에 const 를 붙이지 않으면, 비 const ZtCDataRing object 에 대하여, 이 중첩 함수는 호출되지 않는다. 따라서 const 는 아주 중요한 역할을 한다. /////////////////////////////////////////////////////////////////////////////////////*/ AR_COStream< TypeRing ; typedef typename TypeRing::TypeSize TypeSize ; typedef typename TypeRing::TypeLinkC TypeLinkC; @@ -4722,7 +4808,7 @@ namespace ZNsMain }/* template std::ostream& operator << ( - std::ostream& AR_COStream, const ZCtDataRing& AR_CDataRing + std::ostream& AR_COStream, const ZtCDataRing& AR_CDataRing ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ diff --git a/ZCppMainTest/c++_test_006.cpp b/ZCppMainTest/c++_test_006.cpp index d8eec50..b5ea4dc 100644 --- a/ZCppMainTest/c++_test_006.cpp +++ b/ZCppMainTest/c++_test_006.cpp @@ -186,7 +186,7 @@ namespace ZNsMain cout<<"************************************"< ZCDataRing; + typedef ZtCDataRing ZCDataRing; ZCDataRing VO_CDataRing = string("123"); @@ -216,7 +216,7 @@ namespace ZNsMain cout<<"************************************"< ZCViewRing; + typedef ZtCDataRing ZCViewRing; ZCViewRing VO_ZCViewRing;