#ifndef __ZCPPMAIIN__ZTCARRAY_H__ #define __ZCPPMAIIN__ZTCARRAY_H__ #include "ZCppMain/ZMainHead.H" namespace ZNsMain { template< typename TType , typename TTypArg=const TType&, typename TSize =long > class ZtCArray ////////////////////////// { public: typedef TType Type ; typedef TType TypeData ; typedef TTypArg TypeArg ; typedef TSize TypeSize ; public: class ZCNodePoint; class ZCNodePointN ; public: typedef TypeData* IterEasy ; typedef TypeData* TypeNode ; // ZCLinkPoint::GetNode() 의 반환형. typedef ZCNodePoint TypeIter ; typedef ZtCArray TypeThis ; typedef const TypeThis TypeThisC ; typedef const TypeData TypeDataC ; typedef const TypeNode TypeNodeC ; // ZCLinkPoint::GetNode() const 의 반환형. typedef const TypeIter TypeIterC ; typedef const IterEasy IterEasyC ; /**********************************************/ typedef const ZCNodePoint ZCNodePointC; typedef const ZCNodePoint iteratorC ; /**********************************************/ typedef ZCNodePoint iterator ; typedef ZCNodePointN const_iterator; typedef ZCNodePointN iteratorN ; typedef ZCNodePointN TypeIterN ; public: class ZCNodePoint { private: ZtCArray& mr_CArray; mutable TypeData* mp_Data ; mutable TypeSize ml_ElePos; // *mp_Data 가 배열에서 차지하는 위치 public: static ZCNodePoint MakeTailPoint(ZtCArray & AR_CArray) { ZCNodePoint VO_ZCLinkPoint(AR_CArray); if(AR_CArray.size()>0) /****************************/ { VO_ZCLinkPoint.mp_Data = &AR_CArray.mp_TypeArr[AR_CArray.size()-1] ; VO_ZCLinkPoint.ml_ElePos = AR_CArray.size() ; } return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePoint MakeTailPoint(ZtCArray & AR_CArray)*/ static ZCNodePoint MakeTailPoint(TypeIterC& AR_TypeIter) { ZCNodePoint VO_ZCLinkPoint(AR_TypeIter); const TypeSize VL_ArrSize = AR_TypeIter.mr_CArray.size(); if(VL_ArrSize>0) /**********************************/ { VO_ZCLinkPoint.mp_Data = &AR_TypeIter.mr_CArray[VL_ArrSize-1] ; VO_ZCLinkPoint.ml_ElePos = VL_ArrSize ; } return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePoint MakeTailPoint(TypeIterC& AR_TypeIter)*/ public: ZCNodePoint(ZtCArray& AR_CArray, Type& AR_CData, TSize AL_ElePos) : mr_CArray(AR_CArray) /*****************************************************************/ { mp_Data =&AR_CData ; ml_ElePos=AL_ElePos ; }/* ZCNodePoint(ZtCArray& AR_CArray, Type& AR_CData, TSize AL_ElePos)*/ ZCNodePoint(ZtCArray& AR_CArray) : mr_CArray(AR_CArray) { mp_Data = AR_CArray.mp_TypeArr ; ml_ElePos=(AR_CArray.size()>0 ? 1 : 0 ) ; }/* ZCNodePoint(ZtCArray& AR_CArray)*/ ZCNodePoint(const ZCNodePoint& rhs) : mr_CArray(rhs.mr_CArray) { mp_Data = rhs.mp_Data ; ml_ElePos= (mr_CArray.size()>0 ? 1 : 0 ); }/* ZCNodePoint(const ZCNodePoint& rhs)*/ TypeThis & GetMain() {return mr_CArray ;} TypeNode GetNode() {return mp_Data ;} TypeThisC& GetMain() const{return mr_CArray ;} TypeNodeC GetNode() const{return mp_Data ;} TypeSize GetPos () const{return ml_ElePos ;} TypeSize size () const{return mr_CArray.size();} TypeData & operator* () {return *mp_Data;} TypeData * operator->() {return mp_Data;} TypeDataC& operator* () const{return *mp_Data;} TypeDataC* operator->() const{return mp_Data;} TypeIter & operator++( ) {++mp_Data; ++ml_ElePos; return *this;} TypeIter operator++(int) {++mp_Data; ++ml_ElePos; return *this;} TypeIter & operator--( ) {--mp_Data; --ml_ElePos; return *this;} TypeIter operator--(int) {--mp_Data; --ml_ElePos; return *this;} ZCNodePointC& operator++( ) const{++mp_Data; ++ml_ElePos; return *this;} ZCNodePointC operator++(int) const{++mp_Data; ++ml_ElePos; return *this;} ZCNodePointC& operator--( ) const{--mp_Data; --ml_ElePos; return *this;} ZCNodePointC operator--(int) const{--mp_Data; --ml_ElePos; return *this;} TypeIter operator+(TSize AL_AddPos) const { return ZCNodePoint(*this, mp_Data+AL_AddPos, ml_ElePos+AL_AddPos); }/* TypeIter operator+(TSize AL_AddPos) const*/ bool operator == (ZCNodePointC& rhs) const { return ml_ElePos == rhs.ml_ElePos; } bool operator != (ZCNodePointC& rhs) const { return ml_ElePos != rhs.ml_ElePos; } bool operator > (ZCNodePointC& rhs) const { return ml_ElePos > rhs.ml_ElePos; } bool operator >= (ZCNodePointC& rhs) const { return ml_ElePos >= rhs.ml_ElePos; } bool operator < (ZCNodePointC& rhs) const { return ml_ElePos < rhs.ml_ElePos; } bool operator <= (ZCNodePointC& rhs) const { return ml_ElePos <= rhs.ml_ElePos; } bool operator == (TypeSize AL_Size) const { return ml_ElePos == AL_Size; } bool operator != (TypeSize AL_Size) const { return ml_ElePos != AL_Size; } bool operator > (TypeSize AL_Size) const { return ml_ElePos > AL_Size; } bool operator >= (TypeSize AL_Size) const { return ml_ElePos >= AL_Size; } bool operator < (TypeSize AL_Size) const { return ml_ElePos < AL_Size; } bool operator <= (TypeSize AL_Size) const { return ml_ElePos <= AL_Size; } public: };/* class ZCNodePoint*/ class ZCNodePointN { private: mutable TypeData* mp_Data ; mutable TypeSize ml_ElePos; // *mp_Data 가 배열에서 차지하는 위치 const ZtCArray& mr_CArray; public: static ZCNodePointN MakeTailPoint(ZtCArray & AR_CArray) { ZCNodePointN VO_ZCLinkPoint(AR_CArray); if(AR_CArray.size()>0) /****************************/ { VO_ZCLinkPoint.mp_Data = &AR_CArray.mp_TypeArr[AR_CArray.size()-1] ; VO_ZCLinkPoint.ml_ElePos = AR_CArray.size() ; } return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePointN MakeTailPoint(ZtCArray & AR_CArray)*/ static ZCNodePointN MakeTailPoint(TypeIterC& AR_TypeIter) { ZCNodePointN VO_ZCLinkPoint(AR_TypeIter); const TypeSize VL_ArrSize = AR_TypeIter.mr_CArray.size(); if(VL_ArrSize>0) /**********************************/ { VO_ZCLinkPoint.mp_Data = &AR_TypeIter.mr_CArray[VL_ArrSize-1] ; VO_ZCLinkPoint.ml_ElePos = VL_ArrSize ; } return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePointN MakeTailPoint(TypeIterC& AR_TypeIter)*/ static ZCNodePointN MakeTailPoint(TypeIterN& AR_TypeIter) { ZCNodePointN VO_ZCLinkPoint(AR_TypeIter); const TypeSize VL_ArrSize = AR_TypeIter.mr_CArray.size(); if(VL_ArrSize>0) /**********************************/ { VO_ZCLinkPoint.mp_Data = &AR_TypeIter.mr_CArray[VL_ArrSize-1] ; VO_ZCLinkPoint.ml_ElePos = VL_ArrSize ; } return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePointN MakeTailPoint(TypeIterN& AR_TypeIter)*/ public: ZCNodePointN(const ZtCArray& AR_CArray, Type& AR_CData, TSize AL_ElePos) : mr_CArray(AR_CArray) /*****************************************************************/ { mp_Data =&AR_CData ; ml_ElePos=AL_ElePos ; }/* ZCNodePointN(ZtCArray& AR_CArray, Type& AR_CData, TSize AL_ElePos)*/ ZCNodePointN(ZtCArray& AR_CArray) : mr_CArray(AR_CArray) { mp_Data = AR_CArray.mp_Data ; ml_ElePos=(AR_CArray.size()>0 ? 1 : 0 ) ; }/* ZCNodePointN(ZtCArray& AR_CArray)*/ ZCNodePointN(const ZCNodePointN& rhs) : mr_CArray(rhs.mr_CArray) { mp_Data = rhs.mp_Data ; ml_ElePos=(mr_CArray.size()>0 ? 1 : 0 ) ; }/* ZCNodePointN(const ZCNodePointN& rhs)*/ ZCNodePointN(const ZCNodePoint & rhs) : mr_CArray(rhs.mr_CArray) { mp_Data = rhs.mp_Data ; ml_ElePos=(mr_CArray.size()>0 ? 1 : 0 ) ; }/* ZCNodePointN(const ZCNodePoint & rhs)*/ TypeSize size () const{return mr_CArray.size();} TypeSize GetPos() const{return ml_ElePos ;} TypeDataC& operator* () const{return *mp_Data;} TypeDataC* operator->() const{return mp_Data;} TypeIterN& operator++( ) const{++mp_Data; ++ml_ElePos; return *this;} TypeIterN operator++(int) const{++mp_Data; ++ml_ElePos; return *this;} TypeIterN operator+(TSize AL_AddPos) const { return ZCNodePointN(*this, mp_Data+AL_AddPos, ml_ElePos+AL_AddPos); }/* TypeIterN operator+(TSize AL_AddPos) const*/ bool operator == (const ZCNodePointN& rhs) const { return ml_ElePos == rhs.ml_ElePos; } bool operator != (const ZCNodePointN& rhs) const { return ml_ElePos != rhs.ml_ElePos; } bool operator > (const ZCNodePointN& rhs) const { return ml_ElePos > rhs.ml_ElePos; } bool operator >= (const ZCNodePointN& rhs) const { return ml_ElePos >= rhs.ml_ElePos; } bool operator < (const ZCNodePointN& rhs) const { return ml_ElePos < rhs.ml_ElePos; } bool operator <= (const ZCNodePointN& rhs) const { return ml_ElePos <= rhs.ml_ElePos; } bool operator == (TypeSize AL_Size) const { return ml_ElePos == AL_Size; } bool operator != (TypeSize AL_Size) const { return ml_ElePos != AL_Size; } bool operator > (TypeSize AL_Size) const { return ml_ElePos > AL_Size; } bool operator >= (TypeSize AL_Size) const { return ml_ElePos >= AL_Size; } bool operator < (TypeSize AL_Size) const { return ml_ElePos < AL_Size; } bool operator <= (TypeSize AL_Size) const { return ml_ElePos <= AL_Size; } public: };/* class ZCNodePointN*/ public : /**************************************************************************/ protected: enum{ZEAddSize=20}; protected: Type* mp_TypeArr ; TypeSize ml_AllSize ; TypeSize ml_UseSize ; TypeSize ml_AddSize ; /* TSize ml_AddSize 는 추가 메모리를 지정. 한 개의 원소가 삽입되서 재할당해야 할 경우, ml_AddSize 개 만큼을 미리 할당한다. protected:*/ public : ZtCArray() { mp_TypeArr =0; ml_AllSize =0; ml_UseSize =0; ml_AddSize =ZEAddSize; }/* ZtCArray()*/ ZtCArray(const ZtCArray& rhs) { mp_TypeArr =0; ml_AllSize =0; ml_UseSize =0; ml_AddSize =ZEAddSize; *this=rhs; }/* ZtCArray(const ZtCArray& rhs)*/ ~ZtCArray() { Delete(); }/* ~ZtCArray()*/ ZtCArray& operator=(const ZtCArray& rhs) { if(this==&rhs) return *this ; ReAlloc(rhs.ml_UseSize, false); ml_UseSize = rhs.ml_UseSize; ml_AllSize = rhs.ml_AllSize; for(TypeSize i=0; i=1) ml_AddSize=AL_NewAddSize; }/* void SetAddSize(TypeSize AL_NewAddSize)*/ void SetUseSize(TypeSize AL_NewUseSize) { if(AL_NewUseSize>=0 && AL_NewUseSize<=ml_AllSize) { ml_UseSize = AL_NewUseSize; }/* if(AL_NewUseSize>=0 && AL_NewUseSize<=ml_AllSize)*/ }/* void SetUseSize(TypeSize AL_NewUseSize)*/ void ReAlloc(TypeSize AL_AllocSize, bool AB_DoKeep=true) { if(AL_AllocSize<1) return ; if(AL_AllocSize::assign(size_type _Count, const type&); void assign(TypeSize AL_AllocSize, bool AB_DoKeep=true) { this->ReAlloc(AL_AllocSize, AB_DoKeep); this->SetUseSize(AL_AllocSize); }/* void assign(TypeSize AL_AllocSize, bool AB_DoKeep=true)*/ Type& operator[](TypeSize AL_Index) { return mp_TypeArr[AL_Index] ; }/* Type& operator[](TypeSize AL_Index)*/ const Type& operator[](TypeSize AL_Index) const { return mp_TypeArr[AL_Index] ; }/* const Type& operator[](TypeSize AL_Index) const*/ Type& GetData(TypeSize AL_Index) { return mp_TypeArr[AL_Index] ; }/* Type& GetData(TypeSize AL_Index)*/ const Type& GetData(TypeSize AL_Index) const { return mp_TypeArr[AL_Index]; }/* const Type& GetData(TypeSize AL_Index) const*/ void AddHead(TypeArg AR_TypeArg) { ReAlloc((ml_UseSize++)+1); for(TypeSize i=ml_UseSize-2; i>=0; --i) { mp_TypeArr[i+1]=mp_TypeArr[i] ; } /*:::::::::::::::::::::::::::::::::::*/ mp_TypeArr[0]=AR_TypeArg ; }/* void AddHead(TypeArg AR_TypeArg)*/ Type& AddHead() { // 앞에 빈 원소를 삽입하고 그 원소를 반환한다. ReAlloc((ml_UseSize++)+1); for(TypeSize i=ml_UseSize-2; i>=0; --i) { mp_TypeArr[i+1]=mp_TypeArr[i] ; } /*:::::::::::::::::::::::::::::::::::*/ return mp_TypeArr[0] ; }/* Type& AddHead()*/ void AddTail(TypeArg AR_TypeArg) { ReAlloc((ml_UseSize++)+1); mp_TypeArr[ml_UseSize-1]=AR_TypeArg ; }/* void AddTail(TypeArg AR_TypeArg)*/ Type& AddTail() { // 끝에 빈 원소를 삽입하고 그 원소를 반환한다. ReAlloc((ml_UseSize++)+1); return mp_TypeArr[ml_UseSize-1]; }/* Type& AddTail()*/ operator Type&() { return AddTail(); }/* operator Type&()*/ void push_front(TypeArg AR_TypeArg){AddHead(AR_TypeArg);} void push_back (TypeArg AR_TypeArg){AddTail(AR_TypeArg);} TypeData& push_front(){return AddHead();} TypeData& push_back (){return AddTail();} TypeIter begin () {return ZCNodePoint (*this);} TypeIterN begin () const{return ZCNodePointN(*this);} iterator end () { return ZCNodePoint ::MakeTailPoint(*this); } iteratorN end () const{ return ZCNodePointN::MakeTailPoint(*this); } iteratorN cbegin() const{ return ZCNodePointN(*this); } iteratorN cend () const{ return ZCNodePointN::MakeTailPoint(*this); } template void IterElement(TFunctor AO_Functor) { Type* VP_TypeArr = mp_TypeArr; __for0(TypeSize, i, ml_UseSize) { ZNsMain::ZtCTypeData:: GetObjRef(AO_Functor)( *VP_TypeArr ); ++VP_TypeArr; ////////////////// }/* __for0(TypeSize, i, ml_UseSize)*/ }/* template void IterElement(TFunctor AO_Functor)*/ template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) { typedef ZNsMain:: ZtCCheckRef ZCCheckRef; Type* VP_TypeArr = mp_TypeArr; __for0(TypeSize, i, ml_UseSize) { ZNsMain::ZtCTypeData::GetObjRef(AO_Functor) ( *VP_TypeArr, ZCCheckRef::PassData(AO_TypeHelp) ); ++VP_TypeArr; /////////////////////////////////////// }/* __for0(TypeSize, i, ml_UseSize)*/ }/* template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)*/ template /*#####################################################*/ < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElement ( TFunctor AO_Functor , TTypeHelp1 AO_TypeHelp1 , TTypeHelp2 AO_TypeHelp2 ) /*##############################################################*/ { typedef ZNsMain::ZtCCheckRef ZCCheckRef1; typedef ZNsMain::ZtCCheckRef ZCCheckRef2; Type* VP_TypeArr = mp_TypeArr; __for0(TypeSize, i, ml_UseSize) { ZNsMain::ZtCTypeData::GetObjRef(AO_Functor) ( *VP_TypeArr , ZCCheckRef1::PassData(AO_TypeHelp1) , ZCCheckRef2::PassData(AO_TypeHelp2) ); ++VP_TypeArr; /////////////////////////////////////// }/* __for0(TypeSize, i, ml_UseSize)*/ }/* template ######################################################### < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElement ( TFunctor AO_Functor , TTypeHelp1 AO_TypeHelp1 , TTypeHelp2 AO_TypeHelp2 ) ################################################################*/ /*/////////////////////////////////////////////////////////////////////////// ■ IterElement() 예제. #include #include "ZCppMain/ZtCArray.H" using namespace std ; using namespace ZNsMain; int main() { typedef ZtCArray CArray ; typedef CArray::IterEasy IterEasy; CArray VO_Array; VO_Array.AddTail(10); VO_Array.AddTail(20); VO_Array.AddTail(30); VO_Array.AddTail(40); class CHelpObj { public: CHelpObj() { } CHelpObj(const CHelpObj& rhs) { cout<<"* CHelpObj(const CHelpObj& rhs)"<