commit 2025-09-28 10:30 edit a bit ZCppMain/ZtCSortObjList.H

This commit is contained in:
2025-09-28 10:30:50 +09:00
parent ed0ab398db
commit 290b72d362
3 changed files with 109 additions and 108 deletions

View File

@ -5609,6 +5609,12 @@ namespace ZNsMain
ZtCTypeData<TFunctor>:: ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)(VP_LoopLink->mo_Data); GetObjRef(AO_Functor)(VP_LoopLink->mo_Data);
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라,
operator() 연산자를 가진 object 포인터일 때도 사용할 수
있게 되었다.
이제는 ZftMCP() 템플릿 함수를 사용해도 된다. -- 2025-09-27 00:38
*/
VP_LoopLink = VP_LoopLink->mp_NextLink ; VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/* }/*
__for0(TypeSize, i, ml_Size)*/ __for0(TypeSize, i, ml_Size)*/
@ -5618,6 +5624,28 @@ namespace ZNsMain
template<typename TFunctor, typename TTypeHelp> template<typename TFunctor, typename TTypeHelp>
void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{ {
/*/////////////////////////////////////////////////////////////////////////////
■ TTypeHelp 가 class 일 경우, 크기가 커서 참조로 넘어가야 한다면,
IterElement<myFunctor, myClass&>(myFunctor_obj, myClass_Obj);
의 형태로 호출할 게 아니라, ZtCObjectPtr<> 을 사용하여,
myClass myClass_Obj; ZtCObjectPtr<myClass> myCObjPtr(myClass_Obj);
IterElement(myFunctor_obj, ZtCObjectPtr<myClass>(myClass_Obj));
형태를 사용하면 좋을 것 같다. -- 2014-06-16 23:11:00
이제는 ZtCRef 과 ZCCheckRef 클래스 템플릿을 사용하면 된다. -- 2021-03-11 11:00
다시 말하면 ZftMCP() 템플릿 함수를 사용하면 된다. -- 2025-09-27 01:01
/////////////////////////////////////////////////////////////////////////////*/
typedef ZNsMain:: typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef; ZtCCheckRef<TTypeHelp> ZCCheckRef;
@ -5631,6 +5659,12 @@ namespace ZNsMain
); );
//////////////////////////////////////////// ////////////////////////////////////////////
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라, operator()
연산자를 가진 object 포인터일 때도 사용할 수 있게 되었다. */
/* ZCCheckRef::PassData() 으로 인해, 인수를 ZtCRef 클래스를 이용해
인수를 참조로 넘길 수 있게 되었다. -- 2021-03-10 16:56 */
VP_LoopLink = VP_LoopLink->mp_NextLink ; VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/* }/*
__for0(TypeSize, i, ml_Size)*/ __for0(TypeSize, i, ml_Size)*/

View File

@ -2327,12 +2327,6 @@ namespace ZNsMain
ZtCTypeData<TFunctor>:: ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)( VP_LoopLink->mo_Data ); GetObjRef(AO_Functor)( VP_LoopLink->mo_Data );
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라,
operator() 연산자를 가진 object 포인터일 때도 사용할 수
있게 되었다.
이제는 ZftMCP() 템플릿 함수를 사용해도 된다. -- 2025-09-27 00:38
*/
VP_LoopLink = VP_LoopLink->mp_NextLink ; VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/* }/*
__for0(TypeSize, i, ml_Size)*/ __for0(TypeSize, i, ml_Size)*/
@ -2343,28 +2337,6 @@ namespace ZNsMain
template<typename TFunctor, typename TTypeHelp> template<typename TFunctor, typename TTypeHelp>
void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{ {
/*/////////////////////////////////////////////////////////////////////////////
■ TTypeHelp 가 class 일 경우, 크기가 커서 참조로 넘어가야 한다면,
IterElement<myFunctor, myClass&>(myFunctor_obj, myClass_Obj);
의 형태로 호출할 게 아니라, ZtCObjectPtr<> 을 사용하여,
myClass myClass_Obj; ZtCObjectPtr<myClass> myCObjPtr(myClass_Obj);
IterElement(myFunctor_obj, ZtCObjectPtr<myClass>(myClass_Obj));
형태를 사용하면 좋을 것 같다. -- 2014-06-16 23:11:00
이제는 ZtCRef 과 ZCCheckRef 클래스 템플릿을 사용하면 된다. -- 2021-03-11 11:00
다시 말하면 ZftMCP() 템플릿 함수를 사용하면 된다. -- 2025-09-27 01:01
/////////////////////////////////////////////////////////////////////////////*/
typedef ZNsMain:: typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef; ZtCCheckRef<TTypeHelp> ZCCheckRef;
@ -2378,12 +2350,6 @@ namespace ZNsMain
); );
//////////////////////////////////////////// ////////////////////////////////////////////
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라, operator()
연산자를 가진 object 포인터일 때도 사용할 수 있게 되었다. */
/* ZCCheckRef::PassData() 으로 인해, 인수를 ZtCRef 클래스를 이용해
인수를 참조로 넘길 수 있게 되었다. -- 2021-03-10 16:56 */
VP_LoopLink = VP_LoopLink->mp_NextLink ; VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/* }/*
__for0(TypeSize, i, ml_Size)*/ __for0(TypeSize, i, ml_Size)*/

View File

@ -69,39 +69,39 @@ namespace ZNsMain
TTypFuncIsMore APF_IsMore , TTypFuncIsMore APF_IsMore ,
TTypFuncIsLess APF_IsLess , TTypFuncIsLess APF_IsLess ,
ZCLink* APA_LinkPtrArr[], ZCLink* APA_LinkPtrArr[],
TypeSize AL_FirstIndex , TypeSize AL_HeadIndex ,
TypeSize AL_LastIndex TypeSize AL_TailIndex
) )
/*##################################################*/ /*##################################################*/
{ {
if(AL_FirstIndex<AL_LastIndex) if(AL_HeadIndex<AL_TailIndex)
{ {
TypeSize i=AL_FirstIndex ; TypeSize i = AL_HeadIndex ;
TypeSize j=AL_LastIndex+1 ; TypeSize j = AL_TailIndex+1 ;
ZCLink* VP_PivotLinkPtr = APA_LinkPtrArr[i]; ZCLink* VP_PivotLinkPtr = APA_LinkPtrArr[i];
do ////// do //////
{ {
while(AL_LastIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_TailIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData()) );
while(AL_FirstIndex<j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_HeadIndex <j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData()) );
if(i<j) SwapLinkPtr( APA_LinkPtrArr[i], APA_LinkPtrArr[j] ); if(i<j) SwapLinkPtr( APA_LinkPtrArr[i], APA_LinkPtrArr[j] );
} }
while(i<j); while(i<j);
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]); /* SwapLinkPtr(APA_LinkPtrArr[AL_HeadIndex], APA_LinkPtrArr[j]);
위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지 위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지
않아서 좋다. 않아서 좋다.
*/ */
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j]; APA_LinkPtrArr[AL_HeadIndex] = APA_LinkPtrArr[j];
APA_LinkPtrArr[j ] = VP_PivotLinkPtr ; APA_LinkPtrArr[j ] = VP_PivotLinkPtr ;
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_FirstIndex, j-1 ); QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_HeadIndex, j-1 );
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_LastIndex); QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_TailIndex);
}/* }/*
if(AL_FirstIndex<AL_LastIndex)*/ if(AL_HeadIndex<AL_TailIndex)*/
}/* }/*
template template
<typename TTypFuncIsMore, typename TTypFuncIsLess> <typename TTypFuncIsMore, typename TTypFuncIsLess>
@ -110,91 +110,91 @@ namespace ZNsMain
TTypFuncIsMore APF_IsMore , TTypFuncIsMore APF_IsMore ,
TTypFuncIsLess APF_IsLess , TTypFuncIsLess APF_IsLess ,
ZCLink* APA_LinkPtrArr[], ZCLink* APA_LinkPtrArr[],
TypeSize AL_FirstIndex , TypeSize AL_HeadIndex ,
TypeSize AL_LastIndex TypeSize AL_TailIndex
) )
###########################################################*/ ####################################################*/
static void QuickSortAsc static void QuickSortAsc
( (
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex ZCLink* APA_LinkPtrArr[], TypeSize AL_HeadIndex, TypeSize AL_TailIndex
) )
/*####################*/ /*####################*/
{ {
if(AL_FirstIndex<AL_LastIndex) if(AL_HeadIndex<AL_TailIndex)
{ {
TypeSize i=AL_FirstIndex ; TypeSize i=AL_HeadIndex ;
TypeSize j=AL_LastIndex+1 ; TypeSize j=AL_TailIndex+1 ;
ZCLink* VP_PivotLinkPtr = APA_LinkPtrArr[i]; ZCLink* VP_PivotLinkPtr = APA_LinkPtrArr[i];
do //// do ////
{ {
while(AL_LastIndex >i && APA_LinkPtrArr[++i]->GetData() < VP_PivotLinkPtr->GetData()); while(AL_TailIndex >i && APA_LinkPtrArr[++i]->GetData() < VP_PivotLinkPtr->GetData());
while(AL_FirstIndex<j && APA_LinkPtrArr[--j]->GetData() > VP_PivotLinkPtr->GetData()); while(AL_HeadIndex <j && APA_LinkPtrArr[--j]->GetData() > VP_PivotLinkPtr->GetData());
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]); if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
} }
while(i<j); while(i<j);
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]); /* SwapLinkPtr(APA_LinkPtrArr[AL_HeadIndex], APA_LinkPtrArr[j]);
위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지 않아서 좋다.*/ 위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지 않아서 좋다.
*/
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j]; APA_LinkPtrArr[AL_HeadIndex] = APA_LinkPtrArr[j] ;
APA_LinkPtrArr[j ] = VP_PivotLinkPtr ; APA_LinkPtrArr[j ] = VP_PivotLinkPtr ;
QuickSortAsc(APA_LinkPtrArr, AL_FirstIndex, j-1 ); QuickSortAsc(APA_LinkPtrArr, AL_HeadIndex, j-1 );
QuickSortAsc(APA_LinkPtrArr, j+1, AL_LastIndex); QuickSortAsc(APA_LinkPtrArr, j+1, AL_TailIndex);
}/* }/*
if(AL_FirstIndex<AL_LastIndex)*/ if(AL_HeadIndex<AL_TailIndex)*/
}/* }/*
static void QuickSortAsc static void QuickSortAsc
( (
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex ZCLink* APA_LinkPtrArr[], TypeSize AL_HeadIndex, TypeSize AL_TailIndex
) )
/*####################*/ /*####################*/
static void QuickSortDesc static void QuickSortDesc
( (
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex ZCLink* APA_LinkPtrArr[], TypeSize AL_HeadIndex, TypeSize AL_TailIndex
) )
/*#####################*/ /*#####################*/
{ {
if(AL_FirstIndex<AL_LastIndex) if(AL_HeadIndex<AL_TailIndex)
{ {
TypeSize i=AL_FirstIndex ; TypeSize i= AL_HeadIndex ;
TypeSize j=AL_LastIndex+1; TypeSize j= AL_TailIndex+1;
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i]; ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
do ////// do //////
{ {
while(AL_LastIndex >i && APA_LinkPtrArr[++i]->GetData() > VP_PivotLinkPtr->GetData()); while(AL_TailIndex >i && APA_LinkPtrArr[++i]->GetData() > VP_PivotLinkPtr->GetData());
while(AL_FirstIndex<j && APA_LinkPtrArr[--j]->GetData() < VP_PivotLinkPtr->GetData()); while(AL_HeadIndex <j && APA_LinkPtrArr[--j]->GetData() < VP_PivotLinkPtr->GetData());
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]); if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
} }
while(i<j); while(i<j);
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex], APA_LinkPtrArr[j]); /* SwapLinkPtr(APA_LinkPtrArr[AL_HeadIndex], APA_LinkPtrArr[j]);
위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지 위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지
않아서 좋다. 않아서 좋다.
*/ */
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j]; APA_LinkPtrArr[AL_HeadIndex]=APA_LinkPtrArr[j];
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ; APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
QuickSortDesc(APA_LinkPtrArr, AL_FirstIndex, j-1); QuickSortDesc(APA_LinkPtrArr, AL_HeadIndex, j-1 );
QuickSortDesc(APA_LinkPtrArr, j+1, AL_LastIndex); QuickSortDesc(APA_LinkPtrArr, j+1, AL_TailIndex);
}/* }/*
if(AL_FirstIndex<AL_LastIndex)*/ if(AL_HeadIndex<AL_TailIndex)*/
}/* }/*
static void QuickSortDesc static void QuickSortDesc
( (
ZCLink* APA_LinkPtrArr[], TypeSize AL_FirstIndex, TypeSize AL_LastIndex ZCLink* APA_LinkPtrArr[], TypeSize AL_HeadIndex, TypeSize AL_TailIndex
) )
/*#####################*/ /*#####################*/
@ -290,7 +290,7 @@ namespace ZNsMain
{ {
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]); ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
}/* }/*
//////////////////////////*/ for(i=1; i<VL_SortSize; ++i)*/
ZCLink::MakeRing ZCLink::MakeRing
(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]); (VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]);
@ -457,9 +457,9 @@ namespace ZNsMain
ARR_AddList.JoinBefore //////////////////// ARR_AddList.JoinBefore ////////////////////
( (
ARR_CutList.CutLink(VP_TempLink,1), ARR_CutList.CutLink(VP_TempLink, 1)
VP_LhsTemp, , VP_LhsTemp
VL_LhsTempPos , VL_LhsTempPos
); );
/////////////////////////////////////////// ///////////////////////////////////////////
@ -729,39 +729,39 @@ namespace ZNsMain
TTypFuncIsMore APF_IsMore , TTypFuncIsMore APF_IsMore ,
TTypFuncIsLess APF_IsLess , TTypFuncIsLess APF_IsLess ,
ZCLink* APA_LinkPtrArr[], ZCLink* APA_LinkPtrArr[],
TypeSize AL_FirstIndex , TypeSize AL_HeadIndex ,
TypeSize AL_LastIndex TypeSize AL_TailIndex
) )
/*##################################################*/ /*##################################################*/
{ {
if(AL_FirstIndex<AL_LastIndex) if(AL_HeadIndex<AL_TailIndex)
{ {
TypeSize i=AL_FirstIndex ; TypeSize i=AL_HeadIndex ;
TypeSize j=AL_LastIndex+1 ; TypeSize j=AL_TailIndex+1 ;
ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i]; ZCLink* VP_PivotLinkPtr=APA_LinkPtrArr[i];
do ////// do //////
{ {
while(AL_LastIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_TailIndex >i && APF_IsLess(APA_LinkPtrArr[++i]->GetData(), VP_PivotLinkPtr->GetData()));
while(AL_FirstIndex<j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData())); while(AL_HeadIndex <j && APF_IsMore(APA_LinkPtrArr[--j]->GetData(), VP_PivotLinkPtr->GetData()));
if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]); if(i<j) SwapLinkPtr(APA_LinkPtrArr[i], APA_LinkPtrArr[j]);
} }
while(i<j); while(i<j);
/* SwapLinkPtr(APA_LinkPtrArr[AL_FirstIndex],APA_LinkPtrArr[j]); /* SwapLinkPtr(APA_LinkPtrArr[AL_HeadIndex],APA_LinkPtrArr[j]);
위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지 위 코드 보다 아래처럼 2 줄로 쓰는게 별도의 스택 변수를 사용하지
않아서 좋다. 않아서 좋다.
*/ */
APA_LinkPtrArr[AL_FirstIndex]=APA_LinkPtrArr[j]; APA_LinkPtrArr[AL_HeadIndex]=APA_LinkPtrArr[j];
APA_LinkPtrArr[j ]=VP_PivotLinkPtr ; APA_LinkPtrArr[j ]=VP_PivotLinkPtr ;
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_FirstIndex, j-1 ); QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, AL_HeadIndex, j-1 );
QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_LastIndex); QuickSort(APF_IsMore, APF_IsLess, APA_LinkPtrArr, j+1, AL_TailIndex);
}/* }/*
if(AL_FirstIndex<AL_LastIndex)*/ if(AL_HeadIndex<AL_TailIndex)*/
}/* }/*
template template
<typename TTypFuncIsMore, typename TTypFuncIsLess> <typename TTypFuncIsMore, typename TTypFuncIsLess>
@ -770,8 +770,8 @@ namespace ZNsMain
TTypFuncIsMore APF_IsMore , TTypFuncIsMore APF_IsMore ,
TTypFuncIsLess APF_IsLess , TTypFuncIsLess APF_IsLess ,
ZCLink* APA_LinkPtrArr[], ZCLink* APA_LinkPtrArr[],
TypeSize AL_FirstIndex , TypeSize AL_HeadIndex ,
TypeSize AL_LastIndex TypeSize AL_TailIndex
) )
/*##################################################*/ /*##################################################*/
@ -812,13 +812,14 @@ namespace ZNsMain
} }
///////////////////////// /////////////////////////
QuickSort(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1); QuickSort
(APF_IsMore, APF_IsLess, VPP_LinkPtrArr, 0, VL_SortSize-1);
for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 번 순환 for(i=1; i<VL_SortSize; ++i) // VL_SortSize-1 번 순환
{ {
ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]); ZCLink::JoinLink(VPP_LinkPtrArr[i-1], VPP_LinkPtrArr[i]);
} }
//////////////////////////// /*++++++++++++++++++++++++*/
#if(_CODE_OLD_) // 아래 코드만 빠진다. #if(_CODE_OLD_) // 아래 코드만 빠진다.
ZCLink::MakeRing(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]); ZCLink::MakeRing(VPP_LinkPtrArr[0], VPP_LinkPtrArr[VL_SortSize-1]);