Files
RepoMain/ZCppMain/ZMainHead.H

11615 lines
430 KiB
C++
Raw Normal View History


2021-02-25 16:23:13 +09:00
/*//////////////////////////////////////////////////////////////////////////////////////
unsigned . signed
'' , '' . 2008-09-14 03:24:00
2021-02-25 16:23:13 +09:00
namespace namespace namespace ZNsConst
.
namespace enum namespace enum namespace ZNsEnum
. enum ,
const char* GetMSG_enum_data_type(int AI_Enum);
const char* GetMSG_enum_data_type(enum_data_type AE_Enum);
.
--
ZNsEnum, ZNsConst namespace enum
.
-- 2010-06-13 22:37:00
namespace
namespace interface namespace ZNsIFace .
2021-02-25 16:23:13 +09:00
interface 'C' 'I' .
릿 class ZtCType
namespace ZNsType .
namespace ZNsExam . 릿
.
릿 Proxy class CProxy
namespace ZNsIProxy .(Interface Proxy) Proxy
CProxy namespace ZNsProxy .
ZNsIProxy ZNsProxy .
namespace ZNsHide
.
릿 ,
릿 , 릿 namespace
namespace ZNsTmpl .
cf) std::ZNsTmpl::FindPos();
(릿) , Decoration ,
, Decoration
namespace ZNsDeco
. Decoration Logic View , View , Logic
() .
릿 ,
,
CHelp~ . Business Logic View
CView~ .
cf) class CHelpIOCP
template main class class template
릿 instance template
public .
template ( main class
.) class friend . main class 릿
.
main class 릿 (
.) friend .
public 릿 public
No Public macro _NP_
, bool
enum std::ZNsEnum::ZERun
2021-02-25 16:23:13 +09:00
.
,
, bool
2021-02-25 16:23:13 +09:00
, enum std::ZNsEnum::EAct .
call back 'On' .
'Iter' .
cf) CDoubleList<int>::IterElement();
'Iter' 'OnEach' .
, Init, Fini
. , Init, Fini ,
.
0 InitVar
.
containter class template TypeData type .
CObjList<int>::TypeData
. int TypeData
containter 릿, 릿 ( int)
containter . (릿 )
.
type 릿
TypeData . type Type
.
cf) IN ZNsCPP::CStringSerial_T<>
typedef TTypeCh TypeData ;
typedef TStringType TypeCStringData ;
typedef TStringList TypeCStringList ;
container class template class template
TypeData . 2008-11-05 13:22:00
TString TypeCString TypeString
(?) .
typedef TString TypeCString;
typedef TString TypeString ;
2021-02-25 17:11:44 +09:00
2 . 2008-11-05 13:42:00
2021-02-25 16:23:13 +09:00
template functor . ,
InputIterator& first, InputIterator& last
. object .
for_each InputIterator .
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
while ( first!=last ) f(*first++);
return f;
}
WINDOW UNICODE 3 .
#define _MBCS
#define _UNICODE
#define UNICODE
RTTI typeinfo .
breakpoint assembly
_asm
{
int 3;
}
core file
ulimit -c unlimited
system("ulimit -c unlimited");
Visual C++ 2008 .
#define _WIN32_WINNT 0x0600
-- 2010-04-22 19:55:00
_REENTRANT_EX _REENTRANT thread-safe
, thread-safe .
-- 2011-03-13 01:04:00
//////////////////////////////////////////////////////////////////////////////////////*/
#ifndef __ZCPPMAIIN_ZMAINHEAD_H__
#define __ZCPPMAIIN_ZMAINHEAD_H__
2021-02-25 16:23:13 +09:00
#include <cstdio>
#include <cstdarg>
#include <cstdlib>
#include <cstring>
#include <string>
#include <climits>
#include <typeinfo>
#include <wchar.h>
#include <iostream>
2021-02-25 16:23:13 +09:00
#define _CODE_OLD_ 0
#define _CODE_BAD_ 0
#define _CODE_NEW_ 1
/*/////////////////////////////////////////////////////////////////
_CODE_OLD_ _CODE_NEW_ #if(0) #if(1)
.
-- 2013-07-28 16:21:00
/////////////////////////////////////////////////////////////////*/
#define _COMMENT_ 0 // 주석으로 사용하는 부분.
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN128) || \
defined( WIN32) || defined( WIN64) || defined( WIN128)
#ifndef _WIN
#define _WIN
#endif
#endif/*
defined(_WIN32) || defined(_WIN64) || defined(_WIN128) || \
defined( WIN32) || defined( WIN64) || defined( WIN128) */
#if defined(_WIN64) || defined( WIN64)
#ifndef __CPU_BIT_CNT__
#define __CPU_BIT_CNT__ 64
#endif
#endif /*defined(_WIN64) || defined( WIN64) */
#if defined(_WIN128) || defined( WIN128)
#ifndef __CPU_BIT_CNT__
#define __CPU_BIT_CNT__ 128
#endif
#endif /*defined(_WIN128) || defined(WIN128) */
#if defined(_WIN)
typedef signed char int8_t ;
typedef unsigned char uint8_t ;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
#ifndef __VISUAL_CPP_VER__
#define __VISUAL_CPP_VER__ 200800 // 끝 2 자리는 소수점 버전
#endif//__VISUAL_CPP_VER__
#elif defined(__mips__)
typedef signed char int8_t ;
typedef unsigned char uint8_t ;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#else
#include <stdint.h>
#endif
#if defined(_WIN)
#define _STRUCT_PACK_
#ifndef __STD_CALL__
#define __STD_CALL__ __stdcall
#endif
#elif defined(__unix__)
#define _STRUCT_PACK_ __attribute__((packed))
#ifndef __STD_CALL__
#define __STD_CALL__
#endif
#elif defined(__linux__)
#define _STRUCT_PACK_ __attribute__((packed))
#ifndef __STD_CALL__
#define __STD_CALL__
#endif
#else
#define _STRUCT_PACK_ __attribute__((packed))
#ifndef __STD_CALL__
#define __STD_CALL__
#endif
#endif
#ifdef _REENTRANT_EX
#ifndef _REENTRANT
#define _REENTRANT
#endif
#endif
#if defined(_REENTRANT)
#ifndef _REENTRANT_MUTEX
#define _REENTRANT_MUTEX
#endif //_REENTRANT_MUTEX
#define _REENTRANT_BOOL_ 1
#else
#define _REENTRANT_BOOL_ 0
#endif //_REENTRANT
#ifdef _WIN
#pragma warning(disable:4503)
#pragma warning(disable:4786)
#pragma warning(disable:4996)
#pragma warning(disable:4244)
#pragma warning(disable:4267)
#pragma warning(disable:4018)
#pragma warning(disable:4312)
#pragma warning(disable:4290)
#pragma warning(disable:4076)
/*/////////////////////////////////////////////////////////////////////////////
4290 : throw .
warning C4290: __declspec(nothrow) C++ .
warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
-- 2013-07-08 02:39:00
4076 : wchar_t unsigned . .
warning C4076: 'unsigned' : can not be used with type 'wchar_t'
-- 2013-07-08 02:45:00
/////////////////////////////////////////////////////////////////////////////*/
/*/////////////////////////////////////////////////////////////////////////////
WinSock2.h include , windows.h include .
WinSock2.h , MainHeader include .
TCHAR.H include _MBCS _UNICODE
TCHAR wchar_t , VC++ 6.0 char .
-- 2006-10-12 09:53:00
/////////////////////////////////////////////////////////////////////////////*/
#include <TCHAR.H>
#include <WinSock2.h>
#include <windows.h>
// 아래 pragma 코드가 이미 CNet_Win.H 에 있는데, 필요하면 아래 주석을 제거한다.
//
// #pragma comment(lib, "ws2_32")
#ifndef _T
#define _T(X) X
#endif
#if defined(__VISUAL_CPP_VER__) && __VISUAL_CPP_VER__<200000
// VC++ 6.0 에서는 아래 선언이 필요.
// VC++ 7.0 부터는 주석처리 할 것.
typedef unsigned long ULONG_PTR ;
typedef unsigned long* PULONG_PTR;
#endif //defined(__VISUAL_CPP_VER__) && __VISUAL_CPP_VER__<200000
#else // !defined(_WIN)
#include<errno.h>
#if defined(UNICODE) || defined(_UNICODE)
#define LPCTSTR const wchar_t*
#else
#define LPCTSTR const char*
#endif
#ifndef _T
#define _T(X) X
#endif
#define LONG long
#endif // !defined(_WIN)
#if defined(_REENTRANT)
#if defined(__linux__)
2021-02-25 17:11:44 +09:00
// 리눅스 Multi Thread Programming 에서 ZCObjList 라든가 여러
// 자료구조에서 쓰는 동기화 뮤텍스를 위해 pthread.h 를 포함한다.
2021-02-25 16:23:13 +09:00
#include <pthread.h>
#elif defined(__unix__)
#include <pthread.h>
#elif defined(__sun__) // In Solaris
#include <pthread.h>
#elif defined(_WIN)
//Don't inclucde
#else
#include <pthread.h>
#endif
#endif //defined(_REENTRANT)
#ifdef _DEBUG
#include<iostream>
#include<fstream>
#endif
using namespace std;
#define RR(RefReceive) RefReceive
// RR 메크로는 인수가 참조를 전달하고 다시 어떤 값으로 설정받는다는 것을 뜻함
#define _NP_
/* 템플릿의 멤버함수가 원래는 public 가 아니어야 하지만,
릿 public . No Public */
#define _VT_
// _VT_ 메크로는 주로 상속해서 사용하는 멤버함수를 의미
#define _SY_
/* 동기화(Sync) 영역에서 호출되는 함수를 의미. 따라서 이 함수안에서
object . */
#define _BETA_
/* beta 테스트 중이거나, 실제로 사용하기에는 기술적인 문제가
. (2011-04-03 21:37:00) */
#ifdef __CYGWIN__
#define atoll atol /*for Cygwin*/
#endif
#define __for0(IntType, i, LoopCount) for(IntType i=0; i< LoopCount; ++i)
#define __for1(IntType, i, LoopCount) for(IntType i=1; i<=LoopCount; ++i)
#define __forD0(i, LoopCount) for(i=0; i< LoopCount; ++i) // 정수형 선언이 미리 있는 경우. D 는 Declare.
#define __forD1(i, LoopCount) for(i=1; i<=LoopCount; ++i)
#define __for_it( MainType, MainObj, IterVar) \
for ( \
typename MainType:: iterator \
IterVar=MainObj.begin(); \
IterVar<=MainObj.size(); ++IterVar \
)
#define __for_itc(MainType, MainObj, IterVar) \
for ( \
typename MainType::const_iterator \
IterVar=MainObj.cbegin(); \
IterVar<=MainObj.size(); ++IterVar \
)
#define __for_it_r( MainType, MainObj, IterVar) \
for ( \
typename MainType:: iterator \
IterVar=MainObj.end(); \
IterVar>0; --IterVar \
)
#define __for_it_rc(MainType, MainObj, IterVar) \
for ( \
typename MainType::const_iterator \
IterVar=MainObj.cend(); \
IterVar>0; --IterVar \
)
#define _FOR_ITER_EASY_START0(MainObj, IterVar, SizeVar) \
{ \
typedef ZTypLength IterTypeSize ; \
ZNsMain::IterEasyID IterVar = MainObj.ItHID(); \
\
for(IterTypeSize SizeVar=0; SizeVar<MainObj.size(); ++SizeVar){
#define _FOR_ITER_EASY_CLOSE0(MainObj, IterVar, SizeVar) \
MainObj.ItNext(IterVar); } \
}
#define _FOR_ITER_EASY_START0_C(MainObj, IterVar, SizeVar) \
{ \
typedef ZTypLength IterTypeSize ; \
ZNsMain::IterEasyIDc IterVar = MainObj.ItHIDc(); \
\
for(IterTypeSize SizeVar=0; SizeVar<MainObj.size(); ++SizeVar){
#define _FOR_ITER_EASY_CLOSE0_C(MainObj, IterVar, SizeVar) \
MainObj.ItNext(IterVar); } \
}
#define _FOR_ITER_EASY_START0_R(MainObj, IterVar, SizeVar) \
{ \
typedef ZTypLength IterTypeSize ; \
ZNsMain::IterEasyID IterVar = MainObj.ItTID(); \
\
for(IterTypeSize SizeVar=0; SizeVar<MainObj.size(); ++SizeVar){
#define _FOR_ITER_EASY_CLOSE0_R(MainObj, IterVar, SizeVar) \
MainObj.ItPrev(IterVar); } \
}
#define _FOR_ITER_EASY_START0_RC(MainObj, IterVar, SizeVar) \
{ \
typedef ZTypLength IterTypeSize ; \
ZNsMain::IterEasyIDc IterVar = MainObj.ItTIDc(); \
\
for(IterTypeSize SizeVar=0; SizeVar<MainObj.size(); ++SizeVar){
#define _FOR_ITER_EASY_CLOSE0_RC(MainObj, IterVar, SizeVar) \
MainObj.ItPrev(IterVar); } \
}
/*######################################################################
_FOR_ITER_EASY_START0 _FOR_ITER_EASY_CLOSE0 .
typedef ZtCObjList<int> CObjList;
CObjList myList;
myList.AddTail(1);
myList.AddTail(2);
myList.AddTail(3);
_FOR_ITER_EASY_START0 (myList, VH_NowIter, i)
{
cout<<"# list : "<<myList.ItD(VH_NowIter)<<endl;
}
_FOR_ITER_EASY_CLOSE0 (myList, VH_NowIter, i)
_FOR_ITER_EASY_START0_RC(myList, VH_NowIter, i)
{
cout<<"# list rev const: "<<myList.ItD(VH_NowIter)<<endl;
}
_FOR_ITER_EASY_CLOSE0_RC(myList, VH_NowIter, i)
-- 2025-10-14 16:34
######################################################################*/
2021-02-25 16:23:13 +09:00
namespace ZNsMain
{
typedef int ZTypInt ;
typedef int ZTypIntE ; // int enum : 다른 enum 형끼리 비교할 일이 있을 때, 이 자료로 형변환한다.
2021-02-25 17:45:17 +09:00
typedef int ZTypIntEnum ;
2021-02-25 16:23:13 +09:00
typedef long ZTypIntLong ;
typedef short ZTypIntShort;
typedef int ZTypIntI ; // 정수를 가장 잘 대표할 수 있는 자료형. 필요에 따라 long 이나 short 으로 typedef 할 수도 있다.
typedef long ZTypIntL ;
typedef short ZTypIntS ;
2021-02-25 17:49:30 +09:00
typedef long ZTypLong ;
typedef short ZTypShort ;
2021-02-25 16:23:13 +09:00
typedef int8_t ZTypInt8 ;
typedef int16_t ZTypInt16 ;
typedef int32_t ZTypInt32 ;
typedef int64_t ZTypInt64 ;
typedef uint8_t ZTypUInt8 ;
typedef uint16_t ZTypUInt16 ;
typedef uint32_t ZTypUInt32 ;
typedef uint64_t ZTypUInt64 ;
typedef uint8_t ZTypIntU8 ;
typedef uint16_t ZTypIntU16 ;
typedef uint32_t ZTypIntU32 ;
typedef uint64_t ZTypIntU64 ;
#if defined(UNICODE) || defined(_UNICODE)
typedef wchar_t ZTypXCHAR ;
typedef wchar_t ZTypXChar ;
typedef wchar_t* ZTypXPChar ;
typedef const wchar_t* ZTypXCPChar ;
#else
typedef char ZTypXCHAR ;
typedef char ZTypXChar ;
typedef char* ZTypXPChar ;
typedef const char* ZTypXCPChar ;
#endif
typedef char ZTypChar ;
typedef wchar_t ZTypCharW ;
typedef const char ZTypCChar ;
typedef const wchar_t ZTypCCharW ;
typedef char* ZTypPChar ;
typedef const char* ZTypCPChar ;
typedef char* const ZTypPCChar ;
typedef const char* const ZTypCPCChar ;
typedef char* ZTypPCh ;
typedef const char* ZTypCPCh ;
typedef char* const ZTypPCCh ;
typedef const char* const ZTypCPCCh ;
typedef wchar_t* ZTypPWChar ;
typedef const wchar_t* ZTypCPWChar ;
typedef wchar_t* const ZTypPWCChar ;
typedef const wchar_t* const ZTypCPCWChar;
typedef wchar_t* ZTypPWCh ;
typedef const wchar_t* ZTypCPWCh ;
typedef wchar_t* const ZTypPWCCh ;
typedef const wchar_t* const ZTypCPCWCh ;
typedef unsigned char ZTypUChar ;
#if(0)
2021-02-25 17:11:44 +09:00
typedef unsigned wchar_t ZTypUWCha ;
2021-02-25 16:23:13 +09:00
/* VC++ 2012 에서는 여기서 4076 번 경고가 발생한다.
warning C4076: 'unsigned' : can not be used with type 'wchar_t'
Linux g++ 4.4.7 unsigned wchar_t .
*/
#endif
typedef unsigned int ZTypUInt ;
typedef unsigned short ZTypUShort ;
typedef unsigned long ZTypULong ;
2021-02-25 16:23:13 +09:00
typedef unsigned char ZTypIntUChar ;
typedef unsigned int ZTypIntUInt ;
typedef unsigned short ZTypIntUShort ;
typedef unsigned long ZTypIntULong ;
2021-02-25 16:23:13 +09:00
typedef unsigned char ZTypIntUC ;
typedef unsigned int ZTypIntUI ;
typedef unsigned short ZTypIntUS ;
typedef unsigned long ZTypIntUL ;
2021-02-25 16:23:13 +09:00
#if(defined(__CPU_BIT_CNT__) && __CPU_BIT_CNT__>=64)
#ifdef _WIN
typedef __int64 ZTypLength ; // 문자열의 길이를 나타내는 자료형.
2021-02-25 17:34:50 +09:00
// 송수신 버퍼의 크기 자료형으로도 쓰인다.
typedef unsigned __int64 ZTypULen ;
typedef unsigned __int64 ZTypULength ;
2021-02-25 16:23:13 +09:00
#else
typedef long ZTypLength ;
typedef unsigned long ZTypULen ;
typedef unsigned long ZTypULength ;
2021-02-25 16:23:13 +09:00
#endif
#else // !defined(__CPU_BIT_CNT__) || __CPU_BIT_CNT__<64
typedef long ZTypLength ;
typedef unsigned long ZTypULen ;
typedef unsigned long ZTypULength ;
2021-02-25 16:23:13 +09:00
#endif // !defined(__CPU_BIT_CNT__) || __CPU_BIT_CNT__<64
#ifdef _WIN
typedef __int64 ZTypLengthFile ; // 파일의 크기를 나타내는 자료형.
2021-02-25 16:23:13 +09:00
#else
typedef long ZTypLengthFile ; // 파일의 크기를 나타내는 자료형.
2021-02-25 16:23:13 +09:00
#endif
typedef ZTypLengthFile ZTypLengthF ;
2021-02-25 16:23:13 +09:00
2021-02-25 17:11:44 +09:00
#ifdef _WIN
typedef __int64 ZTypLongLong ;
typedef unsigned __int64 ZTypULongLong ;
2021-02-25 16:23:13 +09:00
typedef __int64 ZTypIntLLong ;
typedef unsigned __int64 ZTypIntULLong ;
2021-02-25 17:11:44 +09:00
#else
typedef long long ZTypLongLong ;
typedef unsigned long long ZTypULongLong ;
2021-02-25 16:23:13 +09:00
typedef long long ZTypIntLLong ;
typedef unsigned long long ZTypIntULLong ;
2021-02-25 17:11:44 +09:00
#endif
2021-02-25 16:23:13 +09:00
typedef ZTypLongLong ZTypLLong ;
typedef ZTypULongLong ZTypULLong ;
2021-02-25 16:23:13 +09:00
typedef ZTypLongLong ZTypIntLL ;
typedef ZTypULongLong ZTypIntULL ;
2021-02-25 16:23:13 +09:00
#ifdef _WIN64
typedef __int64 ZTypIntPtr ; // 포인터를 표현하는 정수 크기다.
typedef unsigned __int64 ZTypIntUPtr ; // 포인터를 표현하는 양의 정수 크기다.
2021-02-25 16:23:13 +09:00
#else
typedef long ZTypIntPtr ;
typedef unsigned long ZTypIntUPtr ;
2021-02-25 16:23:13 +09:00
#endif
typedef const int ZTycInt ;
typedef const int ZTycIntI ;
typedef const long ZTycLong ;
typedef const long ZTycIntL ;
typedef const short ZTycShort ;
typedef const short ZTycIntS ;
typedef const char ZTycChar ;
typedef const wchar_t ZTycCharW ;
typedef const ZTypLLong ZTycLLong ;
typedef const ZTypULLong ZTycULLong ;
typedef const ZTypIntLL ZTycIntLL ;
typedef const ZTypIntULL ZTycIntULL ;
typedef const ZTypIntPtr ZTycIntPtr ;
typedef const ZTypIntUPtr ZTycIntUPtr;
typedef const char ZTycChar ;
typedef const wchar_t ZTycWChar ;
typedef const char* ZTycPChar ;
typedef const wchar_t* ZTycPWChar ;
2021-02-25 16:23:13 +09:00
#ifdef _WIN32
typedef HANDLE ZTypeID;
#else
typedef int ZTypeID;
#endif
2021-03-04 18:02:17 +09:00
typedef class ZCIterEasy{} IterEasy, *IterEasyID ;
typedef const IterEasy* IterEasyIDc;
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////////////////
typedef const IterEasyID IterEasyIDc;
, IterEasy * const , IterEasy const * ! -- 2025-10-14 19:50
cf) _FOR_ITER_EASY_START0 , _FOR_ITER_EASY_CLOSE0 -- 2025-10-14 16:36
2021-02-25 16:23:13 +09:00
typedef class CIterEasy{} *IterEasyID
CObjList<> .
, typedef typename std::CObjList<>::IterEasy IterEasy
.
-- 2013-06-02 08:44:00
CObjList.H , CHttp.H CHttp2.H ZCLink
IterEasyID ,
, .
-- 2013-06-02 12:13:00
CStringEx.H . -- 2013-06-02 09:59:00
IterEasyIDc
typedef const IterEasyID IterEasyIDc;
, IterEasyIDc type
typeid(IterEasyIDc).name()
IterEasyID name() .
2021-02-25 16:23:13 +09:00
-- 2015-11-07 21:34:00
typedef class ZCIterEasy{} IterEasy, *IterEasyID ;
typedef const IterEasyID IterEasyIDc;
, IterEasyIDc
IterEasy const * IterEasy * const
.
2021-02-25 16:23:13 +09:00
///////////////////////////////////////////////////////////////////////////////*/
class ZCEndian
{
private:
static const unsigned int SUI_Int ;
static const unsigned char* const SPC_Char;
public :
static const bool SB_IsBig ;
static const bool SB_IsLittle ;
public :
};/*
class ZCEndian*/
const unsigned int ZCEndian::SUI_Int = 1 ;
const unsigned char* const ZCEndian::SPC_Char =
reinterpret_cast<const unsigned char*>(&ZCEndian::SUI_Int) ;
const bool ZCEndian::SB_IsBig = (int(ZCEndian::SPC_Char[0]) ==1 ) ;
const bool ZCEndian::SB_IsLittle = (int(ZCEndian::SPC_Char[0]) !=1 ) ;
2021-02-25 16:23:13 +09:00
class ZCEmpty
{
/*///////////////////////////////////////////////////////////////////////////
릿 .
릿 릿
, type ,
릿 ,
ZCEmpty .
-- 2010-05-04 02:29:00
, 릿 void . ,
, 0
. void , void 릿
.
-- 2012-09-01 17:26:00
///////////////////////////////////////////////////////////////////////////*/
};/*
class ZCEmpty*/
namespace ZNsIFace
{
// 이 이름 공간안에 interface 가 되는 class (템플릿) 가 온다.
2021-02-25 16:23:13 +09:00
}/*
namespace ZNsIFace*/
namespace ZNsIFaceEx
{
// ZNsIFace 에는 주로 interface 가 있다면,
// ZNsIFaceEx 에는 실제로 동작하는 코드가 온다.
// 따라서 여기에 오는 클래스는 주로 ZNsIFace 에 이미 있는 것이다.
// 다만, ZNsIFace 의 클래스는 주로 ZI 로 시작한다면
// ZNsIFaceEx 의 클래스는 주로 ZC 로 시작한다.
// -- 2025-09-13 01:06
}/*
namespace ZNsIFaceEx*/
2021-02-25 16:23:13 +09:00
namespace ZNsEnum
{
// ECompareResult 는 어떤 두 개의 값을 비교한 결과를 표시한다.
// ZftGetCompareCode() 나 class ZtCCompare<> 에서 사용할 것이다.
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
enum ZECompareResult
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
ZECompareResult_Equal= 0, // 서로 같다.
ZECompareResult_More = 1, // 왼쪽이 크다.
ZECompareResult_Less =-1 // 오른쪽이 크다.
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZECompareResult*/
2021-02-25 16:23:13 +09:00
}/*
namespace ZNsEnum*/
/*//////////////////////////////////////////////////////////////////////
ZtCCharInt TTypChar
cf) 'char int '
cf) ZtCCharInt<char>::TypeInt, ZtCCharInt<wchar_t>::TypeInt
-- 2025-10-08 09:37
//////////////////////////////////////////////////////////////////////*/
namespace ZNsIn
{
const int CI_Char1Byte = 1;
const int CI_Char2Byte = 2;
const int CI_Char4Byte = 4;
}/*
namespace ZNsIn*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
template<int TTyiByteSize> class ZtCCharIntBySize
{ public: typedef ZTypLong TypeInt; };
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
template<> class ZtCCharIntBySize<ZNsIn::CI_Char1Byte>
{ public: typedef ZTypInt TypeInt; };
template<> class ZtCCharIntBySize<ZNsIn::CI_Char2Byte>
{ public: typedef ZTypInt TypeInt; };
template<> class ZtCCharIntBySize<ZNsIn::CI_Char4Byte>
{ public: typedef ZTypLong TypeInt; };
template<typename TTypChar> class ZtCCharInt
{ public: typedef typename ZtCCharIntBySize<sizeof(TTypChar)>::TypeInt TypeInt; };
template<> class ZtCCharInt<char >
{ public: typedef typename ZtCCharIntBySize<sizeof(char) >::TypeInt TypeInt; };
template<> class ZtCCharInt<wchar_t>
{ public: typedef typename ZtCCharIntBySize<sizeof(wchar_t) >::TypeInt TypeInt; };
template<typename TTyChar, typename TTyiLength> ZTypIntE ZftGetCompareCode
(
const TTyChar* ZApcLeft , TTyiLength ZAiLenLeft ,
const TTyChar* ZApcRight, TTyiLength zAiLenRight
)
2021-03-24 10:37:45 +09:00
/*######################################################################*/
2021-02-25 16:23:13 +09:00
{
if(ZAiLenLeft<1 && zAiLenRight<1)
return ZNsEnum::ZECompareResult_Equal;
2021-02-25 16:23:13 +09:00
typedef typename ZtCCharInt<TTyChar>::TypeInt TypeInt;
TTyiLength ViLoopCnt =
(ZAiLenLeft<=zAiLenRight ? ZAiLenLeft : zAiLenRight);
2021-02-25 16:23:13 +09:00
__for0(TTyiLength, i, ViLoopCnt)
2021-02-25 16:23:13 +09:00
{
if(TypeInt(ZApcLeft[i]) > TypeInt(ZApcRight[i])) return ZNsEnum::ZECompareResult_More;
if(TypeInt(ZApcLeft[i]) < TypeInt(ZApcRight[i])) return ZNsEnum::ZECompareResult_Less;
2021-02-25 16:23:13 +09:00
}/*
__for0(TTyiLength, i, ViLoopCnt)*/
2021-02-25 16:23:13 +09:00
if(ZAiLenLeft==zAiLenRight) return ZNsEnum::ZECompareResult_Equal;
if(ZAiLenLeft> zAiLenRight) return ZNsEnum::ZECompareResult_More ;
if(ZAiLenLeft< zAiLenRight) return ZNsEnum::ZECompareResult_Less ;
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
return ZNsEnum::ZECompareResult_Equal;
2021-02-25 16:23:13 +09:00
}/*
template<typename TTyChar, typename TTyiLength> ZTypIntE ZftGetCompareCode
(
const TTyChar* ZApcLeft , TTyiLength ZAiLenLeft ,
const TTyChar* ZApcRight, TTyiLength zAiLenRight
)
########################################################################*/
2021-03-24 10:37:45 +09:00
/* 어떤 변수를 강제적으로 참조로 인식하게 하는 클래스. 인수를 참조로
. class ZtCCheckRef .
-- 2021-04-10 16:15
*/
template<typename TTypType> class ZtCRef
2021-03-24 10:37:45 +09:00
{
public :
typedef TTypType& TypeData ;
typedef TTypType& TypeRef ;
typedef TTypType TypeRaw ;
typedef TTypType TypeConst;
2021-03-24 10:37:45 +09:00
private:
TypeData mr_Data;
public :
ZtCRef(TypeData AR_TypeData) : mr_Data(AR_TypeData){}
2021-03-24 10:37:45 +09:00
public :
TypeData GetData(){return mr_Data;}
public :
2021-03-24 10:37:45 +09:00
};/*
template<typename TTypType> class ZtCRef*/
template<typename TTypType> class ZtCRef<TTypType&>
{
public :
typedef TTypType& TypeData ;
typedef TTypType& TypeRef ;
typedef TTypType TypeRaw ;
typedef const TTypType& TypeConst;
private:
TypeRaw& mr_Data;
public :
ZtCRef(TypeRef AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeRef GetData(){return mr_Data;}
public :
};/*
template<typename TTypType> class ZtCRef<TTypType&>*/
template<typename TTypType> class ZtCRef<const TTypType&>
{
public :
typedef const TTypType& TypeData ;
typedef const TTypType& TypeRef ;
typedef const TTypType TypeRaw ;
typedef const TTypType& TypeConst;
private:
TypeRaw& mr_Data;
public :
ZtCRef(TypeRef AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeRef GetData(){return mr_Data;}
public :
};/*
template<typename TTypType> class ZtCRef<const TTypType&>*/
template<typename TTypType> inline ZtCRef<TTypType>
ZftMakeCRef(TTypType& AR_TypeData){ return ZtCRef<TTypType> (AR_TypeData );}
template<typename TTypType> inline ZtCRef<TTypType>*
ZftMakeCPtr(TTypType& AR_TypeData){ return (ZtCRef<TTypType>*)(&AR_TypeData);}
/*////////////////////////////////////////////////////////////////////////////////
ZftMakeCPtr() AR_TypeData ZtCRef<TTypType>* .
template<typename TType> class ZtCCheckRef< ZtCRef<TType>* >
.
-- 2025-08-07 17:16
ZCppMain/ZtCArray.H IterElement() .
ZftMCR() ZftMCP() . -- 2025-08-07 17:41
////////////////////////////////////////////////////////////////////////////////*/
template<typename TTypType> inline ZtCRef<TTypType>
ZftMCR(TTypType& AR_TypeData){ return ZtCRef<TTypType> (AR_TypeData );}
template<typename TTypType> inline ZtCRef<TTypType>*
ZftMCP(TTypType& AR_TypeData){ return (ZtCRef<TTypType>*)(&AR_TypeData);}
2021-03-24 10:37:45 +09:00
/* template 인수에 ZtCRef 가 있으면, 해당 값을 참조로 인식하고
, .
ZtCArray.H .
-- 2021-04-10 16:15
*/
template<typename TType>
class ZtCCheckRef /*###############################################*/
2021-03-24 10:37:45 +09:00
{
public :
typedef TType TypeData;
typedef TType TypeRaw ;
private:
TypeData mr_Data;
public :
ZtCCheckRef(TypeData AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeData GetData(){return mr_Data;}
public :
static TypeData PassData(TypeData AO_Data){return AO_Data;}
};/*
template<typename TType>
class ZtCCheckRef #################################################*/
2021-03-24 10:37:45 +09:00
/* 참조 전문화 */
template<typename TType>
class ZtCCheckRef<TType&> /*#######################################*/
{
public :
typedef TType& TypeData;
typedef TType TypeRaw ;
private:
TypeData mr_Data;
public :
ZtCCheckRef(TypeData AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeData GetData(){return mr_Data;}
public :
static TypeData PassData(TypeData AO_Data){return AO_Data;}
};/*
template<typename TType>
class ZtCCheckRef<TType&> #########################################*/
2021-03-24 10:37:45 +09:00
/* ZtCRef 전문화 */
template<typename TType>
class ZtCCheckRef< ZtCRef<TType> > /*##############################*/
2021-03-24 10:37:45 +09:00
{
public :
typedef TType& TypeData;
typedef TType TypeRaw ;
typedef ZtCRef<TType> ZCRef ;
private:
TypeData mr_Data;
public :
ZtCCheckRef(TypeData AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeData GetData(){return mr_Data;}
public :
static TypeData PassData(TypeData AO_Data){return AO_Data;}
static TypeData PassData(ZCRef& AO_Data){return AO_Data.GetData();}
};/*
template<typename TType>
class ZtCCheckRef< ZtCRef<TType> > ################################*/
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////////
ZtCRef*
template<typename TTypType> inline
ZtCRef<TTypType>* ZftMakeCPtr(TTypType& AR_TypeData)
{ return (ZtCRef<TTypType>*)(&AR_TypeData); }
, , PassData()
TypeRaw* . ZtCRef<TTypType>
TypeRaw .
-- 2025-08-07 17:19
///////////////////////////////////////////////////////////////////////*/
template<typename TType>
class ZtCCheckRef< ZtCRef<TType>* > /*#############################*/
{
public :
typedef TType& TypeData;
typedef TType TypeRaw ;
typedef ZtCRef<TType> ZCRef ;
private:
TypeData mr_Data;
public :
ZtCCheckRef(TypeData AR_TypeData) : mr_Data(AR_TypeData){}
public :
TypeData GetData(){return mr_Data;}
public :
static TypeData PassData(TypeData AO_Data){return AO_Data;}
static TypeData PassData(ZCRef& AO_Data){return AO_Data.GetData();}
static TypeData PassData(ZCRef* AP_CRef)
{ return *reinterpret_cast<TypeRaw*>(AP_CRef); }
};/*
template<typename TType>
class ZtCCheckRef< ZtCRef<TType>* > ###############################*/
template<typename TType> class ZtCCheckConstRef
{
public: enum {ZEConstRef = 0};
};/*
template<typename TType> class ZtCCheckConstRef*/
template<typename TType> class ZtCCheckConstRef<const TType&>
{
public: enum {ZEConstRef = 1};
};/*
template<typename TType> class ZtCCheckConstRef<const TType&>*/
2021-02-25 16:23:13 +09:00
namespace ZNsType
{
/*/////////////////////////////////////////////////////////////////////////////////////////
( ) 릿 typename 10 릿
릿 typename 릿 typename
. typedef ZtCType .
2021-02-25 17:11:44 +09:00
ZtCTypeCRTP<> 릿 CRTP(CURIOUSLY RECURRING TEMPLATE PATTERN)
. ZtCTypeCRTP<> , ,
2021-02-25 16:23:13 +09:00
2 (CRTP , ) .
-- 2010-03-12 20:00:00
class ZtCTypeCRTP ,
class ZtCTypeCRTP2 .
2021-03-25 16:05:16 +09:00
2021-03-25 16:41:48 +09:00
, ZtCTypeCRTP
. CDerive0 , ,
CDerive0::ZtCTypeCRTP::TypeData
. .
2021-03-25 16:05:16 +09:00
-- 2021-03-25 16:01
2021-02-25 17:11:44 +09:00
TypeData .
2021-02-25 16:23:13 +09:00
-- 2011-10-18 21:51:00
/////////////////////////////////////////////////////////////////////////////////////////*/
/*#########################################################################################
2 template parameter bool TTypebUseCRTP , TTypeChild
, TTypebUseCRTP true , DEBUG TTypebUseCRTP
false .
-- 2025-09-28 08:41
#########################################################################################*/
2021-02-25 16:23:13 +09:00
template< typename TTypeChild=ZCEmpty, bool TTypebUseCRTP =false
>
2021-02-25 17:11:44 +09:00
class ZtCTypeCRTP ////////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
{
public:
typedef TTypeChild TypeData;
public:
2021-03-04 15:36:45 +09:00
enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
2021-02-25 16:23:13 +09:00
public:
};/*
template< typename TTypeChild=ZCEmpty, bool TTypebUseCRTP =false
>
2021-02-25 17:11:44 +09:00
class ZtCTypeCRTP //////////////////////////////////////////////*/
2021-02-25 16:23:13 +09:00
#if(_CODE_OLD_)
/*#########################################################################################
ZtCTypeCRTP2 ZtCTypeNowCRTP . -- 2025-09-28 09:25
ZtCBaseList ZtCTypeCRTP ZtCTypeNowCRTP .
#########################################################################################*/
template< typename TTypeChild = ZCEmpty , ////////////////////
typename TTypeBase = ZCEmpty ,
bool TTypebUseCRTP= false
2021-02-25 16:23:13 +09:00
>
class ZtCTypeCRTP2 ///////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
{
public:
typedef TTypeChild TypeData;
typedef TTypeBase TypeBase;
public:
2021-03-04 15:36:45 +09:00
enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
2021-02-25 16:23:13 +09:00
public:
}; /*
template< typename TTypeChild = ZCEmpty , ////////////////////
typename TTypeBase = ZCEmpty ,
bool TTypebUseCRTP= false
2021-02-25 16:23:13 +09:00
>
class ZtCTypeCRTP2 /////////////////////////////////////////////*/
#endif //_CODE_OLD_
2021-02-25 16:23:13 +09:00
/*//////////////////////////////////////////////////////////////////////////////////////////
2021-03-25 16:05:16 +09:00
class ZtCTypeCRTP2<> , CWorkPool.H
2021-02-25 16:23:13 +09:00
'-CCtrlAllocWork::CRTP2' .
-- 2012-09-20 09:46:00
. -- 2025-09-28 02:41
template< typename TWork ,
typename TWorkExec , // 작업(TWork)에 대하여 어떤 처리를 하는 클래스
typename TWorkArg =const TWork& ,
typename TBarrier =std::CBarrier_T<> , // 작업 쓰레드의 시작 및 종료 대기 barrier
typename TSyncWait =std::CThreadSemaphore,
typename TSyncExec =std::CDefLockEasy ,
typename TWorkList =NsCPP::CObjList<TWork,TWorkArg> , // 작업 큐 컨테이너
typename TTypeBase =NsIFace::CAllocWork_BASE_T<TWork>,
typename TFetchWork=TWorkList , // 작업 큐에서 작업을 가져오는 컨테이너.
typename TTypeCRTP =std::NsType::CTypeCRTP2_T< NsIFace::ICtrlAllocWork, NsIFace::ICtrlAllocWork >
>
class CTypeCtrlAllocWork_T //////////////////////////////////////////////////////////////////////////////////
{
public:
class CThread ;
class CBaseClass;
typedef TWork CWork ;
typedef TWorkArg CWorkArg ;
typedef TWorkExec CWorkExec ;
typedef TBarrier CBarrier ;
typedef TSyncWait CSyncWait ;
typedef TSyncExec CSyncExec ;
typedef TWorkList CWorkList ;
typedef TFetchWork CFetchWork;
typedef TTypeCRTP CTypeCRTP ;
typedef typename TWorkList::TypeAlloc CAlloc ;
typedef std::CAutoKey_T<CSyncExec> CAutoKey ;
typedef NsCPP::CObjList
<
CThread ,
const CThread&,
CAlloc
> CThreadList;
typedef typename CThreadList::CLink CThreadLink;
#define _CAllocWork_BASE_ std::CAllocWork_T< \
CWork , \
CWorkArg , \
CSyncWait , \
CSyncExec , \
CWorkList , \
CThread , \
CBaseClass , \
std::NsType::CTypeCRTP_T<CAllocWork, true> >
class CAllocWork : public _CAllocWork_BASE_
{
// some code
}
};
template<typename TTypeCtrlAllocWork>
class CCtrlAllocWork_T : protected TTypeCtrlAllocWork::CSyncKey ,
protected TTypeCtrlAllocWork::CAllocWork,
protected TTypeCtrlAllocWork::CTypeCRTP::TypeBase
{
public :
enum{EMaxThreadCnt=1}; typedef NsEnum::EThreadPoolStep EPoolStep;
public :
typedef typename TTypeCtrlAllocWork::CWork CWork ;
typedef typename TTypeCtrlAllocWork::CWorkArg CWorkArg ;
typedef typename TTypeCtrlAllocWork::CWorkExec CWorkExec ;
typedef typename TTypeCtrlAllocWork::CThread CThread ;
typedef typename TTypeCtrlAllocWork::CSyncKey CSyncKey ;
typedef typename TTypeCtrlAllocWork::CSyncExec CSyncExec ;
typedef typename TTypeCtrlAllocWork::CAutoKey CAutoKey ;
typedef typename TTypeCtrlAllocWork::CAllocWork CAllocWork ;
typedef typename TTypeCtrlAllocWork::CBaseClass CBaseClass ;
typedef typename TTypeCtrlAllocWork::CWorkList CWorkList ;
typedef typename TTypeCtrlAllocWork::CFetchWork CFetchWork ;
typedef typename TTypeCtrlAllocWork::CThreadList CThreadList;
typedef typename TTypeCtrlAllocWork::CThreadLink CThreadLink;
typedef typename TTypeCtrlAllocWork::CTypeCRTP CTypeCRTP ;
// some code
void SetCloseMark(CWork& ARR_CWork)
{
if(CTypeCRTP::EUseCRTP>0)
{
typedef typename CTypeCRTP::TypeData CCtrlAllocWorkEx;
#if(_CODE_NEW_)
static_cast<CCtrlAllocWorkEx&>(*this). // 코드-CCtrlAllocWork::CRTP2
SetCloseMarkInChild(RR(ARR_CWork)); return;
#else
((CCtrlAllocWorkEx&)(*this)). // 코드-CCtrlAllocWork::CRTP
SetCloseMarkInChild(RR(ARR_CWork)); return;
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////
-CCtrlAllocWork::CRTP2
SetCloseMarkInChild() '-CCtrlAllocWork::CRTP'
, std::NsType::CTypeCRTP2_T<> , NsT
ype::CTypeCtrlAllocWork_T<> 릿 typename TTypeCRTP , '-CCtrlAll
ocWork::CRTP2' . class CCtrlAllocWork_T<>
TTypeCtrlAllocWork::CTypeCRTP::TypeBase
. TypeBase SetCloseMarkInChild(CWork&) .
-- 2012-09-20 09:43:00
NsType::CTypeCRTP2_T<> NsType::CTypeCRTP_T<> TypeBase .
-- 2012-09-20 09:57:00
//////////////////////////////////////////////////////////////////////////////////////////////////
}
CWorkExec::SetCloseMark(RR(ARR_CWork));
}
//void SetCloseMark(CWork& ARR_CWork)
// some code
}
typedef typename CTypeCRTP::TypeData CCtrlAllocWorkEx;
CCtrlAllocWork_T , .
CTypeCRTP::TypeData NsIFace::ICtrlAllocWork .
.
-- 2025-09-28 07-27
2021-02-25 16:23:13 +09:00
//////////////////////////////////////////////////////////////////////////////////////////*/
/*#########################################################################################
2021-02-25 16:23:13 +09:00
2021-03-25 16:50:23 +09:00
class ZtCTypeCRTP<> class ,
2021-02-25 16:23:13 +09:00
class ZtCTypeNowCRTP<>
2021-03-25 16:05:16 +09:00
. CCtrlAsyncSock.H .
-- (2025-08-02 22:37) CCtrlAsyncSock.H .
2021-03-25 16:05:16 +09:00
TAsyncServ
, CMainServ TAsyncServ ,
, CMainServ0
2021-03-25 16:50:23 +09:00
.
2021-02-25 16:23:13 +09:00
typedef typename TAsyncServ::ZtCTypeCRTP ZtCTypeCRTP ;
typedef typename ZtCTypeCRTP ::TypeData CMainServ0 ;
2021-02-25 16:23:13 +09:00
typedef std::ZNsType::ZtCTypeNowCRTP<
TAsyncServ, CMainServ0>::TypeData CMainServ ;
CMainServ& VR_CMainServ=
static_cast<CMainServ&>(ArCAsyncServ);
ZtCTypeNowCRTP<> TAsyncServ , CMainServ0 ZCEmpty ,
.
.
. C++ . -- 2013-06-10 00:33:00
ZtCTypeNowCRTP template parameter bool TTypebUseCRTP . -- 2025-09-28 15:55
2021-02-25 16:23:13 +09:00
TTypeChild ZCEmpty TTypebUseCRTP false , .
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
TTypeChild ZCEmpty TTypebUseCRTP false .
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty, false>
3 template parameter bool TTypebUseCRTP , TTypeChild
, TTypebUseCRTP true , DEBUG TTypebUseCRTP
false .
ZtCTypeCRTP ,
. CRTP
, ZtCTypeNowCRTP .
ZtCBaseList .
-- 2025-09-28 16:13
#########################################################################################*/
template
<typename TTypeNow, typename TTypeChild, bool TTypebUseCRTP>
class ZtCTypeNowCRTP
{
public: enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public: typedef TTypeChild TypeData;
public: typedef TTypeNow TypeBase;
};
template
<typename TTypeNow, typename TTypeChild>
class ZtCTypeNowCRTP<TTypeNow, TTypeChild, false /*++*/ >
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
template
<typename TTypeNow, bool TTypebUseCRTP>
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty , TTypebUseCRTP>
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
template
<typename TTypeNow>
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty , false /*++*/ >
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
/////////////////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
2021-03-24 10:37:45 +09:00
2021-02-25 16:23:13 +09:00
namespace ZNsTmplParam
{
/*//////////////////////////////////////////////////////////////////////////
릿 ,
,
, ,
template .
CParam~ .
ZNsTmplParam ZNsType .
.
//////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsTmplParam*/
}/*
namespace ZNsType*/
/*//////////////////////////////////////////////////////////////
릿 릿 parameter
,
. ZtCTypeData<> .
cf)
cout<<typeid(std::ZtCTypeData<ZTypIntI >::TypeData).name()<<endl;
cout<<typeid(std::ZtCTypeData<ZTypIntI*>::TypeData).name()<<endl;
cout<<typeid(std::ZtCTypeData<ZTypIntI&>::TypeData).name()<<endl;
-- 2010-01-15 00:11:00
ZtCTypeData<>::GetObjRef(~)
, ,
.
, .
() 릿 . -- 2025-09-28 22:08
--
//////////////////////////////////////////////////////////////*/
typedef void (*ZfpNone)(void*); void ZfNone(void* AP_Void=0){};
template<typename TType> class ZtCTypeData
{ public: typedef TType TypeData;
static TType& GetObjRef(TType& AR_Type){return AR_Type ;}};
template<typename TType> class ZtCTypeData<TType*>
{ public: typedef TType TypeData;
static TType& GetObjRef(TType* AP_Type){return *AP_Type;}};
template<typename TType> class ZtCTypeData<TType&>
{ public: typedef TType TypeData;
static TType& GetObjRef(TType& AR_Type){return AR_Type ;}};
template< /*########*/ > class ZtCTypeData<void* >
{ public: typedef ZfpNone TypeData;
static ZfpNone GetObjRef(void* AP_Void){return ZfNone ;}};
template<typename TType> class ZtCTypeData< ZtCRef<TType> >
{ public: typedef TType TypeData; static TType&
GetObjRef(ZtCRef<TType>& AR_CRef)
{return AR_CRef.GetData() /*//////////////*/ ;}
};
template<typename TType> class ZtCTypeData< ZtCRef<TType>* >
{ public: typedef TType TypeData; static TType&
GetObjRef(ZtCRef<TType>* AP_CRef)
{return *reinterpret_cast<TypeData*>(AP_CRef);}
};
template<typename TType> class ZtCTD
{ public: typedef TType TypeData;
static TType& GetObjRef(TType& AR_Type){return AR_Type ;}
static TType& GOR (TType& AR_Type){return AR_Type ;}};
template<typename TType> class ZtCTD<TType*>
{ public: typedef TType TypeData;
static TType& GetObjRef(TType* AP_Type){return *AP_Type;}
static TType& GOR (TType* AP_Type){return *AP_Type;}};
template<typename TType> class ZtCTD<TType&>
{ public: typedef TType TypeData;
static TType& GetObjRef(TType& AR_Type){return AR_Type ;}
static TType& GOR (TType& AR_Type){return AR_Type ;}};
template< /*########*/ > class ZtCTD<void* >
{ public: typedef ZfpNone TypeData;
static ZfpNone GetObjRef(void* AP_Void){return ZfNone ;}
static ZfpNone GOR (void* AP_Void){return ZfNone ;}};
template<typename TType> class ZtCTD< ZtCRef<TType> >
{ public: typedef TType TypeData;
static TType& GetObjRef(ZtCRef<TType>& AR_CRef){return AR_CRef.GetData() ;}
static TType& GOR (ZtCRef<TType>& AR_CRef){return AR_CRef.GetData() ;}
};
template<typename TType> class ZtCTD< ZtCRef<TType>* >
{ public: typedef TType TypeData;
static TType& GetObjRef(ZtCRef<TType>* AP_CRef)
{return *reinterpret_cast<TypeData*>(AP_CRef);}
static TType& GOR (ZtCRef<TType>* AP_CRef)
{return *reinterpret_cast<TypeData*>(AP_CRef);}
};
/*/////////////////////////////////////////////////////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
template Type11 . Type10 .
-- 2015-02-16 21:20:00
2021-03-04 16:27:38 +09:00
, template 2 .
typedef ZtStTuple<int> CTupleInt1 .
typedef ZtStTuple<int, int> CTupleInt2 .
ZtStTuple<int> . -- 2021-03-04 16:27
template Type13 . Type12 . -- 2025-09-07 12:55
ZtStTuple<int> . ZftMakeTuple() . - -2025-09-05 21:01
RVO(Return Value Optimization) . -- 2025-09-06 21:23
int VariMy=0; ZtStTuple<int&> myt1 = ZftMakeTuple(ZftMCP(VariMy));
std::tuple<> -1 -- 2025-09-07 12:08
#include <tuple>
#include <iostream>
int main() {
int nownum=42;
// Creating a tuple
std::tuple<int&, std::string, double> myTuple(nownum, "Hello", 3.14);
// Accessing elements
std::cout << std::get<0>(myTuple) << "\n"; // Outputs: 42
std::cout << std::get<1>(myTuple) << "\n"; // Outputs: Hello
std::cout << std::get<2>(myTuple) << "\n"; // Outputs: 3.14
// Modifying elements
std::get<1>(myTuple) = "World";
std::cout << std::get<1>(myTuple) << "\n"; // Outputs: World
return 0;
}
std::tuple<> -2 -- 2025-09-07 12:09
#include <tuple>
#include <iostream>
std::tuple<int, double, std::string> getValues() {
return {42, 3.14, "Hello"};
}
int main() {
auto [x, y, z] = getValues(); // Structured binding (C++17)
std::cout << x << ", " << y << ", " << z << "\n"; // Outputs: 42, 3.14, Hello
return 0;
}
std::tuple<> -3 -- 2025-09-07 12:11
#include <iostream>
#include <tuple>
#include <string>
int main() {
// 기본 생성 및 값 할당
std::tuple<std::string, int, double> tpl;
std::get<0>(tpl) = "Example";
std::get<1>(tpl) = 42 ;
std::get<2>(tpl) = 3.14 ;
// make_tuple을 사용한 초기화
auto tpl2 = std::make_tuple("Hello", 100, 1.23);
// 구조적 바인딩 (C++17 이상)
auto [str, num, val] = tpl2;
std::cout << "Tuple 1: " << std::get<0>(tpl) << ", " << std::get<1>(tpl) << ", " << std::get<2>(tpl) << '\n';
std::cout << "Tuple 2: " << str << ", " << num << ", " << val << '\n';
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////*/
2021-02-25 16:23:13 +09:00
template< typename Type1 =void*, typename Type2 =void*,
typename Type3 =void*, typename Type4 =void*,
typename Type5 =void*, typename Type6 =void*,
typename Type7 =void*, typename Type8 =void*,
typename Type9 =void*, typename Type10=void*,
typename Type11=void*, typename Type12=void*,
typename Type13=void*
2021-02-25 16:23:13 +09:00
>
struct ZtStTuple //////////////////////////////////////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
{
ZtStTuple(){}
};
/*###########################################################################################*/
template<typename Type1> struct ZtStTuple<Type1>
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
2021-02-25 16:23:13 +09:00
TypeData1 _1;
ZtStTuple<Type1>(){}
ZtStTuple<Type1>(Type1 _T1) :
_1(CCheckRef1::PassData(_T1))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2 >
struct ZtStTuple<Type1, Type2>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
2021-03-24 10:37:45 +09:00
TypeData1 _1; TypeData2 _2;
2021-03-04 16:14:44 +09:00
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2>(){}
ZtStTuple<Type1, Type2>(Type1 _T1, Type2 _T2) :
_1(CCheckRef1::PassData(_T1)),
_2(CCheckRef2::PassData(_T2))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3 >
struct ZtStTuple<Type1, Type2, Type3>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
2021-03-24 10:37:45 +09:00
TypeData1 _1; TypeData2 _2; TypeData3 _3;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3>(){}
ZtStTuple<Type1, Type2, Type3>
(Type1 _T1, Type2 _T2, Type3 _T3) :
_1(CCheckRef1::PassData(_T1)),
_2(CCheckRef2::PassData(_T2)),
_3(CCheckRef3::PassData(_T3))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3, typename Type4 >
struct ZtStTuple<Type1, Type2, Type3, Type4>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
2021-03-24 10:37:45 +09:00
TypeData1 _1; TypeData2 _2; TypeData3 _3; TypeData4 _4;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4>(){}
ZtStTuple<Type1, Type2, Type3, Type4>
(Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5
>
struct ZtStTuple<Type1, Type2, Type3, Type4, Type5>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
2021-03-24 10:37:45 +09:00
TypeData1 _1; TypeData2 _2; TypeData3 _3; TypeData4 _4; TypeData5 _5;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5>
(Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4, Type5 _T5) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
, _5(CCheckRef5::PassData(_T5))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6
>
struct ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
2021-03-24 10:37:45 +09:00
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
TypeData1 _1; TypeData2 _2; TypeData3 _3;
TypeData4 _4; TypeData5 _5; TypeData6 _6;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6>
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4, Type5 _T5, Type6 _T6
) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
, _5(CCheckRef5::PassData(_T5))
, _6(CCheckRef6::PassData(_T6))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6, typename Type7
>
struct ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
TypeData1 _1; TypeData2 _2; TypeData3 _3; TypeData4 _4;
2021-03-24 10:37:45 +09:00
TypeData5 _5; TypeData6 _6; TypeData7 _7;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7>
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7
) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
, _5(CCheckRef5::PassData(_T5))
, _6(CCheckRef6::PassData(_T6))
, _7(CCheckRef7::PassData(_T7))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8
>
struct ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8> CCheckRef8 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
typedef typename CCheckRef8::TypeData TypeData8 ;
TypeData1 _1; TypeData2 _2; TypeData3 _3; TypeData4 _4;
TypeData5 _5; TypeData6 _6; TypeData7 _7; TypeData8 _8;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8>
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7, Type8 _T8
) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
, _5(CCheckRef5::PassData(_T5))
, _6(CCheckRef6::PassData(_T6))
, _7(CCheckRef7::PassData(_T7))
, _8(CCheckRef8::PassData(_T8))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8, typename Type9
>
struct ZtStTuple
<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8> CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9> CCheckRef9 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
typedef typename CCheckRef8::TypeData TypeData8 ;
typedef typename CCheckRef9::TypeData TypeData9 ;
TypeData1 _1; TypeData2 _2; TypeData3 _3; TypeData4 _4;
TypeData5 _5; TypeData6 _6; TypeData7 _7; TypeData8 _8; TypeData9 _9;
2021-02-25 16:23:13 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9>(){}
2021-03-24 10:37:45 +09:00
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9>
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7, Type8 _T8, Type9 _T9
) :
_1(CCheckRef1::PassData(_T1))
, _2(CCheckRef2::PassData(_T2))
, _3(CCheckRef3::PassData(_T3))
, _4(CCheckRef4::PassData(_T4))
, _5(CCheckRef5::PassData(_T5))
, _6(CCheckRef6::PassData(_T6))
, _7(CCheckRef7::PassData(_T7))
, _8(CCheckRef8::PassData(_T8))
, _9(CCheckRef9::PassData(_T9))
{}
};
/*###########################################################################################*/
template
< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8, typename Type9, typename Type10
>
struct ZtStTuple
<
Type1, Type2, Type3, Type4, Type5,
Type6, Type7, Type8, Type9, Type10
>
2021-02-25 16:23:13 +09:00
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
TypeData1 _1 ; TypeData2 _2 ; TypeData3 _3 ; TypeData4 _4 ;
TypeData5 _5 ; TypeData6 _6 ; TypeData7 _7 ; TypeData8 _8 ;
TypeData9 _9 ; TypeData10 _10;
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10>
(
Type1 _T1, Type2 _T2 , Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6 , Type7 _T7, Type8 _T8,
Type9 _T9, Type10 _T10
) :
_1 (CCheckRef1 ::PassData(_T1 ))
, _2 (CCheckRef2 ::PassData(_T2 ))
, _3 (CCheckRef3 ::PassData(_T3 ))
, _4 (CCheckRef4 ::PassData(_T4 ))
, _5 (CCheckRef5 ::PassData(_T5 ))
, _6 (CCheckRef6 ::PassData(_T6 ))
, _7 (CCheckRef7 ::PassData(_T7 ))
, _8 (CCheckRef8 ::PassData(_T8 ))
, _9 (CCheckRef9 ::PassData(_T9 ))
, _10(CCheckRef10::PassData(_T10))
{}
};
/*###########################################################################################*/
template
< typename Type1 , typename Type2 , typename Type3,
typename Type4 , typename Type5 , typename Type6,
typename Type7 , typename Type8 , typename Type9,
typename Type10, typename Type11
>
struct ZtStTuple
<
Type1, Type2, Type3, Type4 , Type5, Type6,
Type7, Type8, Type9, Type10, Type11
>
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef ZNsMain::ZtCCheckRef<Type11> CCheckRef11;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
typedef typename CCheckRef11::TypeData TypeData11 ;
TypeData1 _1 ; TypeData2 _2 ; TypeData3 _3 ; TypeData4 _4 ;
TypeData5 _5 ; TypeData6 _6 ; TypeData7 _7 ; TypeData8 _8 ;
TypeData9 _9 ; TypeData10 _10; TypeData11 _11;
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10, Type11>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10, Type11>
(
Type1 _T1, Type2 _T2 , Type3 _T3 , Type4 _T4,
Type5 _T5, Type6 _T6 , Type7 _T7 , Type8 _T8,
Type9 _T9, Type10 _T10, Type11 _T11
) :
_1 (CCheckRef1 ::PassData(_T1 ))
, _2 (CCheckRef2 ::PassData(_T2 ))
, _3 (CCheckRef3 ::PassData(_T3 ))
, _4 (CCheckRef4 ::PassData(_T4 ))
, _5 (CCheckRef5 ::PassData(_T5 ))
, _6 (CCheckRef6 ::PassData(_T6 ))
, _7 (CCheckRef7 ::PassData(_T7 ))
, _8 (CCheckRef8 ::PassData(_T8 ))
, _9 (CCheckRef9 ::PassData(_T9 ))
, _10(CCheckRef10::PassData(_T10))
, _11(CCheckRef11::PassData(_T11))
{}
};
/*###########################################################################################*/
template
< typename Type1 , typename Type2 , typename Type3 ,
typename Type4 , typename Type5 , typename Type6 ,
typename Type7 , typename Type8 , typename Type9 ,
typename Type10, typename Type11, typename Type12
>
struct ZtStTuple
<
Type1, Type2, Type3, Type4 , Type5 , Type6 ,
Type7, Type8, Type9, Type10, Type11, Type12
>
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef ZNsMain::ZtCCheckRef<Type11> CCheckRef11;
typedef ZNsMain::ZtCCheckRef<Type12> CCheckRef12;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
typedef typename CCheckRef11::TypeData TypeData11 ;
typedef typename CCheckRef12::TypeData TypeData12 ;
TypeData1 _1 ; TypeData2 _2 ; TypeData3 _3 ; TypeData4 _4 ;
TypeData5 _5 ; TypeData6 _6 ; TypeData7 _7 ; TypeData8 _8 ;
TypeData9 _9 ; TypeData10 _10; TypeData11 _11; TypeData12 _12;
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10, Type11, Type12>(){}
ZtStTuple<Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10, Type11, Type12>
(
Type1 _T1, Type2 _T2 , Type3 _T3 , Type4 _T4 ,
Type5 _T5, Type6 _T6 , Type7 _T7 , Type8 _T8 ,
Type9 _T9, Type10 _T10, Type11 _T11, Type12 _T12
) :
_1 (CCheckRef1 ::PassData(_T1 ))
, _2 (CCheckRef2 ::PassData(_T2 ))
, _3 (CCheckRef3 ::PassData(_T3 ))
, _4 (CCheckRef4 ::PassData(_T4 ))
, _5 (CCheckRef5 ::PassData(_T5 ))
, _6 (CCheckRef6 ::PassData(_T6 ))
, _7 (CCheckRef7 ::PassData(_T7 ))
, _8 (CCheckRef8 ::PassData(_T8 ))
, _9 (CCheckRef9 ::PassData(_T9 ))
, _10(CCheckRef10::PassData(_T10))
, _11(CCheckRef11::PassData(_T11))
, _12(CCheckRef12::PassData(_T12))
{}
};
/*###########################################################################################*/
2021-02-25 16:23:13 +09:00
/*/////////////////////////////////////////////////////////////////////////////////////////////
RVO(Return Value Optimization) . -- 2025-09-06 21:23
int VariMy=0; ZtStTuple<int&> myt1 = ZftMakeTuple(ZftMCP(VariMy));
/////////////////////////////////////////////////////////////////////////////////////////////*/
ZtStTuple<> ZftMakeTuple()
{
return ZtStTuple<>();
}
/*####################################################################*/
template
<typename Type1>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<typename ZNsMain::ZtCCheckRef<Type1>::TypeData>
ZftMakeTuple(Type1 _T1)
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
return ZtStTuple<TypeData1> /*::::::::::::::::::::::::::::::::::::*/
(
CCheckRef1::PassData(_T1)
);
}
/*####################################################################*/
template
<typename Type1, typename Type2>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
>
ZftMakeTuple(Type1 _T1, Type2 _T2)
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
return ZtStTuple<TypeData1, TypeData2> /*:::::::::::::::::::::::::*/
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
);
}
/*####################################################################*/
template
<typename Type1, typename Type2, typename Type3>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
>
ZftMakeTuple(Type1 _T1, Type2 _T2, Type3 _T3)
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
return ZtStTuple<TypeData1, TypeData2, TypeData3> /*::::::::::::::*/
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
);
}
/*####################################################################*/
template
< typename Type1, typename Type2, typename Type3, typename Type4 >
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
return ZtStTuple<TypeData1, TypeData2, TypeData3, TypeData4> /*:::*/
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
);
}
/*####################################################################*/
template< typename Type1, typename Type2,
typename Type3, typename Type4, typename Type5
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
, typename ZNsMain::ZtCCheckRef<Type5>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4, Type5 _T5
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2,
TypeData3, TypeData4, TypeData5
>
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
, CCheckRef5::PassData(_T5)
);
}
/*####################################################################*/
template< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
, typename ZNsMain::ZtCCheckRef<Type5>::TypeData
, typename ZNsMain::ZtCCheckRef<Type6>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4, Type5 _T5, Type6 _T6
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2, TypeData3,
TypeData4, TypeData5, TypeData6
>
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
, CCheckRef5::PassData(_T5)
, CCheckRef6::PassData(_T6)
);
}
/*####################################################################*/
template< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6, typename Type7
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
, typename ZNsMain::ZtCCheckRef<Type5>::TypeData
, typename ZNsMain::ZtCCheckRef<Type6>::TypeData
, typename ZNsMain::ZtCCheckRef<Type7>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2, TypeData3, TypeData4,
TypeData5, TypeData6, TypeData7
>
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
, CCheckRef5::PassData(_T5)
, CCheckRef6::PassData(_T6)
, CCheckRef7::PassData(_T7)
);
}
/*####################################################################*/
template< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
, typename ZNsMain::ZtCCheckRef<Type5>::TypeData
, typename ZNsMain::ZtCCheckRef<Type6>::TypeData
, typename ZNsMain::ZtCCheckRef<Type7>::TypeData
, typename ZNsMain::ZtCCheckRef<Type8>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7, Type8 _T8
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8> CCheckRef8 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
typedef typename CCheckRef8::TypeData TypeData8 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2, TypeData3, TypeData4,
TypeData5, TypeData6, TypeData7, TypeData8
>
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
, CCheckRef5::PassData(_T5)
, CCheckRef6::PassData(_T6)
, CCheckRef7::PassData(_T7)
, CCheckRef8::PassData(_T8)
);
}
/*####################################################################*/
template< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8, typename Type9
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1>::TypeData
, typename ZNsMain::ZtCCheckRef<Type2>::TypeData
, typename ZNsMain::ZtCCheckRef<Type3>::TypeData
, typename ZNsMain::ZtCCheckRef<Type4>::TypeData
, typename ZNsMain::ZtCCheckRef<Type5>::TypeData
, typename ZNsMain::ZtCCheckRef<Type6>::TypeData
, typename ZNsMain::ZtCCheckRef<Type7>::TypeData
, typename ZNsMain::ZtCCheckRef<Type8>::TypeData
, typename ZNsMain::ZtCCheckRef<Type9>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2, Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6, Type7 _T7, Type8 _T8, Type9 _T9
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1> CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2> CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3> CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4> CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5> CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6> CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7> CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8> CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9> CCheckRef9 ;
typedef typename CCheckRef1::TypeData TypeData1 ;
typedef typename CCheckRef2::TypeData TypeData2 ;
typedef typename CCheckRef3::TypeData TypeData3 ;
typedef typename CCheckRef4::TypeData TypeData4 ;
typedef typename CCheckRef5::TypeData TypeData5 ;
typedef typename CCheckRef6::TypeData TypeData6 ;
typedef typename CCheckRef7::TypeData TypeData7 ;
typedef typename CCheckRef8::TypeData TypeData8 ;
typedef typename CCheckRef9::TypeData TypeData9 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2, TypeData3, TypeData4,
TypeData5, TypeData6, TypeData7, TypeData8, TypeData9
>
(
CCheckRef1::PassData(_T1)
, CCheckRef2::PassData(_T2)
, CCheckRef3::PassData(_T3)
, CCheckRef4::PassData(_T4)
, CCheckRef5::PassData(_T5)
, CCheckRef6::PassData(_T6)
, CCheckRef7::PassData(_T7)
, CCheckRef8::PassData(_T8)
, CCheckRef9::PassData(_T9)
);
}
/*####################################################################*/
template< typename Type1, typename Type2, typename Type3,
typename Type4, typename Type5, typename Type6,
typename Type7, typename Type8, typename Type9, typename Type10
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type2 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type3 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type4 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type5 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type6 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type7 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type8 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type9 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type10>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2 , Type3 _T3, Type4 _T4,
Type5 _T5, Type6 _T6 , Type7 _T7, Type8 _T8,
Type9 _T9, Type10 _T10
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2, TypeData3, TypeData4,
TypeData5, TypeData6, TypeData7, TypeData8,
TypeData9, TypeData10
>
(
CCheckRef1 ::PassData(_T1 )
, CCheckRef2 ::PassData(_T2 )
, CCheckRef3 ::PassData(_T3 )
, CCheckRef4 ::PassData(_T4 )
, CCheckRef5 ::PassData(_T5 )
, CCheckRef6 ::PassData(_T6 )
, CCheckRef7 ::PassData(_T7 )
, CCheckRef8 ::PassData(_T8 )
, CCheckRef9 ::PassData(_T9 )
, CCheckRef10::PassData(_T10)
);
}
/*####################################################################*/
template< typename Type1 , typename Type2, typename Type3,
typename Type4 , typename Type5, typename Type6,
typename Type7 , typename Type8, typename Type9,
typename Type10, typename Type11
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type2 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type3 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type4 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type5 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type6 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type7 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type8 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type9 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type10>::TypeData
, typename ZNsMain::ZtCCheckRef<Type11>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2 , Type3 _T3 , Type4 _T4,
Type5 _T5, Type6 _T6 , Type7 _T7 , Type8 _T8,
Type9 _T9, Type10 _T10, Type11 _T11
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef ZNsMain::ZtCCheckRef<Type11> CCheckRef11;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
typedef typename CCheckRef11::TypeData TypeData11 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2 , TypeData3, TypeData4,
TypeData5, TypeData6 , TypeData7, TypeData8,
TypeData9, TypeData10, TypeData11
>
(
CCheckRef1 ::PassData(_T1 )
, CCheckRef2 ::PassData(_T2 )
, CCheckRef3 ::PassData(_T3 )
, CCheckRef4 ::PassData(_T4 )
, CCheckRef5 ::PassData(_T5 )
, CCheckRef6 ::PassData(_T6 )
, CCheckRef7 ::PassData(_T7 )
, CCheckRef8 ::PassData(_T8 )
, CCheckRef9 ::PassData(_T9 )
, CCheckRef10::PassData(_T10)
, CCheckRef11::PassData(_T11)
);
}
/*####################################################################*/
template< typename Type1 , typename Type2 , typename Type3,
typename Type4 , typename Type5 , typename Type6,
typename Type7 , typename Type8 , typename Type9,
typename Type10, typename Type11, typename Type12
>
ZtStTuple /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
<
typename ZNsMain::ZtCCheckRef<Type1 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type2 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type3 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type4 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type5 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type6 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type7 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type8 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type9 >::TypeData
, typename ZNsMain::ZtCCheckRef<Type10>::TypeData
, typename ZNsMain::ZtCCheckRef<Type11>::TypeData
, typename ZNsMain::ZtCCheckRef<Type12>::TypeData
>
ZftMakeTuple /*#######################################################*/
(
Type1 _T1, Type2 _T2 , Type3 _T3 , Type4 _T4 ,
Type5 _T5, Type6 _T6 , Type7 _T7 , Type8 _T8 ,
Type9 _T9, Type10 _T10, Type11 _T11, Type12 _T12
)
/*####################################################################*/
{
typedef ZNsMain::ZtCCheckRef<Type1 > CCheckRef1 ;
typedef ZNsMain::ZtCCheckRef<Type2 > CCheckRef2 ;
typedef ZNsMain::ZtCCheckRef<Type3 > CCheckRef3 ;
typedef ZNsMain::ZtCCheckRef<Type4 > CCheckRef4 ;
typedef ZNsMain::ZtCCheckRef<Type5 > CCheckRef5 ;
typedef ZNsMain::ZtCCheckRef<Type6 > CCheckRef6 ;
typedef ZNsMain::ZtCCheckRef<Type7 > CCheckRef7 ;
typedef ZNsMain::ZtCCheckRef<Type8 > CCheckRef8 ;
typedef ZNsMain::ZtCCheckRef<Type9 > CCheckRef9 ;
typedef ZNsMain::ZtCCheckRef<Type10> CCheckRef10;
typedef ZNsMain::ZtCCheckRef<Type11> CCheckRef11;
typedef ZNsMain::ZtCCheckRef<Type12> CCheckRef12;
typedef typename CCheckRef1 ::TypeData TypeData1 ;
typedef typename CCheckRef2 ::TypeData TypeData2 ;
typedef typename CCheckRef3 ::TypeData TypeData3 ;
typedef typename CCheckRef4 ::TypeData TypeData4 ;
typedef typename CCheckRef5 ::TypeData TypeData5 ;
typedef typename CCheckRef6 ::TypeData TypeData6 ;
typedef typename CCheckRef7 ::TypeData TypeData7 ;
typedef typename CCheckRef8 ::TypeData TypeData8 ;
typedef typename CCheckRef9 ::TypeData TypeData9 ;
typedef typename CCheckRef10::TypeData TypeData10 ;
typedef typename CCheckRef11::TypeData TypeData11 ;
typedef typename CCheckRef12::TypeData TypeData12 ;
return ZtStTuple /*:::::::::::::::::::::::::::::::::::::::::::::::*/
<
TypeData1, TypeData2 , TypeData3 , TypeData4,
TypeData5, TypeData6 , TypeData7 , TypeData8,
TypeData9, TypeData10, TypeData11, TypeData12
>
(
CCheckRef1 ::PassData(_T1 )
, CCheckRef2 ::PassData(_T2 )
, CCheckRef3 ::PassData(_T3 )
, CCheckRef4 ::PassData(_T4 )
, CCheckRef5 ::PassData(_T5 )
, CCheckRef6 ::PassData(_T6 )
, CCheckRef7 ::PassData(_T7 )
, CCheckRef8 ::PassData(_T8 )
, CCheckRef9 ::PassData(_T9 )
, CCheckRef10::PassData(_T10)
, CCheckRef11::PassData(_T11)
, CCheckRef12::PassData(_T12)
);
}
/*####################################################################*/
template< typename TTypeArg1,
typename TTypeArg2,
bool TTypebCompareObj=true
>
class ZtCCompare /////////////////////////
{
public:
enum {ZEUseCompareObj=(ZTypIntE)TTypebCompareObj};
public:
template<typename TTypeArg11, typename TTypeArg22>
static ZTypInt Exec(TTypeArg11 AR_TypeArg1, TTypeArg22 AR_TypeArg2)
{
#ifdef _DEBUG_CCOMPARE_EXEC
cout<<" ※※ ZtCCompare<TTypeArg1, TTypeArg2, true> is called."<<endl;
#endif //_DEBUG_CCOMPARE_EXEC
return AR_TypeArg1.Compare(AR_TypeArg2);
}/*
template<typename TTypeArg11, typename TTypeArg22>
static ZTypInt Exec(TTypeArg11 AR_TypeArg1, TTypeArg22 AR_TypeArg2) */
public:
};/*
template< typename TTypeArg1,
typename TTypeArg2,
bool TTypebCompareObj=true
>
class ZtCCompare ///////////////////////*/
template<typename TTypeArg1, typename TTypeArg2
>
class ZtCCompare<TTypeArg1, TTypeArg2, false>
{
public:
enum {ZEUseCompareObj=0};
public:
template<typename TTypeArg11, typename TTypeArg22>
static ZTypInt Exec(TTypeArg11 AR_TypeArg1, TTypeArg22 AR_TypeArg2)
{
return ZNsEnum::ZECompareResult_Equal;
}/*
template<typename TTypeArg11, typename TTypeArg22>
static ZTypInt Exec(TTypeArg1 AR_TypeArg1, TTypeArg2 AR_TypeArg2)*/
public:
};/*
template<typename TTypeArg1, typename TTypeArg2
>
class ZtCCompare<TTypeArg1, TTypeArg2, false> */
template<> class ZtCCompare<ZTypInt, ZTypInt, true>
{
public:
enum {ZEUseCompareObj=1};
public:
static ZTypInt Exec(ZTypInt AI_Int1, ZTypInt AI_Int2)
{
#ifdef _DEBUG_CCOMPARE_EXEC
cout<<" ※※ ZtCCompare<int, int, true> is called."<<endl;
#endif //_DEBUG_CCOMPARE_EXEC
return AI_Int1 - AI_Int2 ;
}/*
static ZTypInt Exec(ZTypInt AI_Int1, ZTypInt AI_Int2)*/
public:
};/*
template<> class ZtCCompare<ZTypInt, ZTypInt, true>*/
2021-02-25 16:23:13 +09:00
namespace ZNsHide
{
/* 특정 클래스 안에서만 사용되어, 사용자가 그 존재를 알 필요가 없는 클래스를 둔다. */
}/*
namespace ZNsHide*/
namespace ZNsIn
{
/*///////////////////////////////////////////////////////////////////////////////
, ,
ZNsIn~ namespace .
ZNsHide Hidden ,
. CIocp , CHelpIocp
, CHelpIocp
namespace ZNsInIOCP .
-- 2009-12-21 12:56:00
///////////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsIn*/
namespace ZNsTmplParam
{
}/*
namespace ZNsTmplParam*/
namespace ZNsBase
{
// 가상 클래스도 아니고 인터페이스 전용의 함수도 아니면서
2021-02-25 16:23:13 +09:00
// 주로 기반 클래스로 사용되는 클래스는 여기에 둔다.
}/*
namespace ZNsBase*/
namespace ZNsSngt
{
/*////////////////////////////////////////////////////////////////////////////////////////////
singleton object object .
singleton object , CSngt .
////////////////////////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsSngt*/
namespace ZNsSttc
{
/*/////////////////////////////////////////////////////////////////////////////
static object CSttc .
-- 2010-03-10 19:58:00
/////////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsSttc*/
namespace ZNsReent
{
/*////////////////////////////////////////////////////////////
ZNsReent : namespace Reentrant
thread safe ,
thread safe .
////////////////////////////////////////////////////////////*/
}/*
namespace ZNsReent*/
namespace ZNsArg
{
/*////////////////////////////////////////////////////////////////
Call Back
, object
, object class
object ,
.
Call Back
.
-- 2010-01-02 22:11:00
////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsArg*/
namespace ZNsDeco
{
/*////////////////////////////////////////////////////////////////
(릿) , Decoration
, ,
Decoration namespace ZNsDeco
. , Logic View , View
( ) 릿 .
-- 2010-03-10 22:04:00
////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsDeco*/
namespace ZNsView
{
/*//////////////////////////////////////////////////////////////////////////////////
'Logic-View '( Document-View ,
'Logic-View ' ) View
. CView .
CView , namespace ZNsView View
, CView ,
.
-- 2011-09-11 13:50:00
//////////////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsView*/
namespace ZNsViewIFace
{
/*//////////////////////////////////////////////////////////////////////////////////
'Logic-View ' View interface
.
-- 2011-09-11 13:54:00
//////////////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsViewIFace*/
namespace ZNsCRTP
{
/*//////////////////////////////////////////////////
CRTP : CURIOUSLY RECURRING TEMPLATE PATTERN
CRTP 릿 .
-- 2010-03-12 13:51:00
//////////////////////////////////////////////////*/
}/*
namespace ZNsCRTP*/
namespace ZNsHelp
{
/*//////////////////////////////////////////////////
.
-- 2025-09-13 00:59:00
//////////////////////////////////////////////////*/
}/*
namespace ZNsHelp*/
2021-02-25 16:23:13 +09:00
namespace ZNsFunc
{
/*///////////////////////////////////////////////////////////////////////////
릿 .
ZftMoveFast<>(Type1& AR_Type1, Type2& AR_Type2)
2021-02-25 16:23:13 +09:00
RValue Reference . Move
Move ,
AR_Type2 0 .
object Move object
ZftMoveFast() 릿 .
2021-02-25 16:23:13 +09:00
func() object /
, object class , /
/ , , func()
object __Init<>(), __Fini<>()
. , __Init, __Fini 릿
.
(2025-08-20) __init() __Fini() _CODE_OLD_ .
2021-02-25 16:23:13 +09:00
-- 2009-08-15 19:57:00
///////////////////////////////////////////////////////////////////////////*/
template<typename Type1, typename Type2>
void ZftMoveFast(Type1& AR_Type1, Type2& AR_Type2)
2021-02-25 16:23:13 +09:00
{
#ifdef _DEBUG_FAST_MOVE_OBJ_
cout<<" ※※ ZftMoveFast Start : Type1="<<typeid(Type1).name()<<", Type2="<<typeid(Type2).name()<<endl;
2021-02-25 16:23:13 +09:00
#endif //_DEBUG_FAST_MOVE_OBJ_
AR_Type1 = AR_Type2 ;
2021-02-25 16:23:13 +09:00
#ifdef _DEBUG_FAST_MOVE_OBJ_
cout<<" ※※ ZftMoveFast Close : Type2="<<typeid(Type1).name()<<", Type2="<<typeid(Type2).name()<<endl;
2021-02-25 16:23:13 +09:00
#endif //_DEBUG_FAST_MOVE_OBJ_
}/*
template<typename Type1, typename Type2>
void ZftMoveFast(Type& AR_Type1, Type& AR_Type2) */
2021-02-25 16:23:13 +09:00
#if(_CODE_OLD_)
2021-02-25 16:23:13 +09:00
template<typename Type> void __Init(Type& AR_Type)
{
#ifdef _DEBUG
cout<<"void ZNsFunc::__Init<Type>(Type&), Type="<<typeid(Type).name()<<endl;
#endif //_DEBUG
}/*
template<typename Type> void __Init(Type& AR_Type)*/
template<typename Type> void __Fini(Type& AR_Type)
{
#ifdef _DEBUG
cout<<"void ZNsFunc::__Fini<Type>(Type&), Type="<<typeid(Type).name()<<endl;
#endif //_DEBUG
}/*
template<typename Type> void __Fini(Type& AR_Type)*/
#endif //(_CODE_OLD_)
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////////////
CObjAVL<> object ,
1 2 ,
bool operator> (~)
bool operator==(~)
1 ( )
int ZtCCompare<>::Exec(TTypeArg1 AR_TypeArg1, TTypeArg2 AR_TypeArg2)
.
-- 2012-09-01 20:13:00
2021-03-04 15:36:45 +09:00
AR_Type1==AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1>=AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1> AR_Type2 ZNsEnum::ZECompareResult_More ,
AR_Type1<=AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1< AR_Type2 ZNsEnum::ZECompareResult_Less ,
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
AR_Type1>=AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1> AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1<=AR_Type2 ZNsEnum::ZECompareResult_Equal ,
AR_Type1< AR_Type2 ZNsEnum::ZECompareResult_Equal ,
2021-02-25 16:23:13 +09:00
.
-- 2012-09-01 20:20:00
template<typename Type1,typename Type2> __CompareObj(Type1, Type2)
, 릿 .
, ...
.
-- 2012-09-02 22:49:00
ZtCCompare<>::Exec(~) template , template
. template ZtCCompare<> template
TTypeArg1, TTypeArg2 .
.
-- 2012-10-09 09:14:00
///////////////////////////////////////////////////////////////////////////*/
}/*
namespace ZNsFunc*/
2021-02-25 16:23:13 +09:00
/*/////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
ZtCMoveObj<> CObjAVL.H .
2021-02-25 16:23:13 +09:00
-- 2013-08-26 19:18:00
/////////////////////////////////////////////*/
2021-02-25 16:23:13 +09:00
template< typename TTypeArg1 ,
typename TTypeArg2 ,
bool TTypebMoveObj=true
>
class ZtCMoveObj /*###############################################*/
{
public:
enum {ZEUseMoveObj = (ZTypIntE)TTypebMoveObj} ;
public:
typedef typename ZNsMain::ZtCRef<TTypeArg1>::TypeRef TypeRef1;
typedef typename ZNsMain::ZtCRef<TTypeArg2>::TypeRef TypeRef2;
public:
2021-02-25 16:23:13 +09:00
static void Exec(TypeRef1 AR_TypeArg1, TypeRef2 AR_TypeArg2)
2021-02-25 16:23:13 +09:00
{
#ifdef _DEBUG_MOVEOBJ_EXEC
cout<<" ※※ ZtCMoveObj<TTypeArg1, TTypeArg2, true> is called."<<endl;
#endif //_DEBUG_MOVEOBJ_EXEC
2021-02-25 16:23:13 +09:00
ZNsFunc::ZftMoveFast(AR_TypeArg1, AR_TypeArg2);
}/*
static void Exec(TTypeArg1& AR_TypeArg1, TTypeArg2& AR_TypeArg2)*/
2021-02-25 16:23:13 +09:00
public:
};/*
template< typename TTypeArg1 ,
typename TTypeArg2 ,
bool TTypebMoveObj=true
>
class ZtCMoveObj #################################################*/
2021-02-25 16:23:13 +09:00
template /*######################################################*/
<
typename TTypeArg1, typename TTypeArg2
>
class ZtCMoveObj<TTypeArg1, TTypeArg2, false> /*//////////////////*/
{
public:
enum {ZEUseMoveObj=0};
public:
typedef typename ZNsMain::ZtCRef<TTypeArg1>::TypeRef TypeRef1;
typedef typename ZNsMain::ZtCRef<TTypeArg2>::TypeRef TypeRef2;
public:
2021-02-25 16:23:13 +09:00
static void Exec(TypeRef1 AR_TypeArg1, TypeRef2 AR_TypeArg2)
2021-02-25 16:23:13 +09:00
{
AR_TypeArg1 = AR_TypeArg2 ;
}/*
static void Exec(TypeRef1 AR_TypeArg1, TypeRef2 AR_TypeArg2)*/
2021-02-25 16:23:13 +09:00
public:
};/*
template ###########################################################
<
typename TTypeArg1, typename TTypeArg2
>
class ZtCMoveObj<TTypeArg1, TTypeArg2, false> ////////////////////*/
2021-02-25 16:23:13 +09:00
template< typename TTypeNow, typename TTypeNextChain
>
class ZtCTypeChain ///////////////////////////////////
{
public :
typedef TTypeNow TypeData ;
typedef ZtCTypeChain TypeChainNow ;
typedef TTypeNextChain TypeChainNext ;
/************************************************************/
typedef typename TypeChainNext::TypeData TypeNext ;
/************************************************************/
enum{ZETypeNo = TypeChainNext::ZETypeNo+1};
enum{ZEBoolNext = 1 };
public:
static ZTypIntE Size(){return ZETypeNo;}
static ZTypIntE size(){return ZETypeNo;}
public:
/*//////////////////////////////////////////////
static template ,
class template .
-- 2025-10-17 22:09
//////////////////////////////////////////////*/
template<typename TViewChain> class ZtCIterChain
{
public:
static void IterHead(TViewChain AO_CView)
{
AO_CView.template OnMeetType<TypeChainNow>();
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template
ZtCIterChain<TViewChain>::IterHead(AO_CView);
}/*
if(TypeChainNow::ZEBoolNext>0)*/
}/*
static void IterHead(TViewChain AO_CView)*/
static void IterTail(TViewChain AO_CView)
{
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template
ZtCIterChain<TViewChain>::IterTail(AO_CView);
}/*
if(TypeChainNow::ZEBoolNext>0)*/
AO_CView.template OnMeetType<TypeChainNow>();
}/*
static void IterTail(TViewChain AO_CView)*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetType<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/*************************************************/
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template ZtCIterChain<TViewChain>::
template IterHead<TTypeHelp>(AO_CView, AO_TypeHelp) ;
}/*
if(TypeChainNow::ZEBoolNext>0)*/
}/*
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template ZtCIterChain<TViewChain>::
template IterTail<TTypeHelp>(AO_CView, AO_TypeHelp) ;
}
AO_CView.template OnMeetType<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/*************************************************/
}/*
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
public:
};/*
template<typename TViewChain> class ZtCIterChain*/
public:
};/*
template< typename TTypeNow, typename TTypeNextChain
>
class ZtCTypeChain /////////////////////////////////*/
template<typename TTypeNow> class ZtCTypeChain<TTypeNow, ZCEmpty>
{
public :
/************************************************************/
typedef ZtCTypeChain <TTypeNow, ZCEmpty> ZCTypeChain;
/************************************************************/
public :
typedef TTypeNow TypeData ;
public :
typedef ZCTypeChain TypeChainNow ;
typedef ZCTypeChain TypeChainNext;
typedef ZCEmpty TypeNext ;
public :
enum{ZETypeNo = 1};
enum{ZEBoolNext = 0};
public:
static ZTypIntE Size(){return ZETypeNo;}
static ZTypIntE size(){return ZETypeNo;}
public:
template<typename TViewChain> class ZtCIterChain
{
public:
static void IterHead(TViewChain AO_CView)
{ AO_CView.template OnMeetType<TypeChainNow>(); }
static void IterTail(TViewChain AO_CView)
{ AO_CView.template OnMeetType<TypeChainNow>(); }
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
// AO_CView 은 AO_TypeHelp 와 달리 ZtCCheckRef 를
// 적용하지 않는다. 외부에서 ZtCIterChain<SomeView>
// 처럼 접근하면서, SomeView 의 자료형을 지정하고 있다.
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetType<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) );
}/*
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
/*****************************************************************/
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetType<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
}/*
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
public:
};/*
template<typename TViewChain> class ZtCIterChain*/
};/*
template<typename TTypeNow> class ZtCTypeChain<TTypeNow, ZCEmpty>*/
template<typename TTmplChain, typename TTypeView>
void ZftIterTypeChainHead(TTypeView AO_CView)
{
AO_CView.template OnMeetType<TTmplChain>();
if(TTmplChain::ZEBoolNext>0)
{
typedef typename
TTmplChain::TypeChainNext TypeChainNext;
ZftIterTypeChainHead<TypeChainNext, TTypeView>(AO_CView);
}/*
if(TTmplChain::ZEBoolNext>0)*/
}/*
template<typename TTmplChain, typename TTypeView>
void ZftIterTypeChainHead(TTypeView AO_CView)
*/
template<typename TTmplChain, typename TTypeView>
void ZftIterTypeChainTail(TTypeView AO_CView)
{
if(TTmplChain::ZEBoolNext>0)
{
typedef typename
TTmplChain::TypeChainNext TypeChainNext;
ZftIterTypeChainTail<TypeChainNext, TTypeView>(AO_CView);
}/*
if(TTmplChain::ZEBoolNext>0)*/
AO_CView.template OnMeetType<TTmplChain>();
}/*
template<typename TTmplChain, typename TTypeView>
void ZftIterTypeChainTail(TTypeView AO_CView)
*/
template
<typename TTmplChain, typename TTypeView, typename TTypeHelp>
void ZftIterTypeChainHead
(TTypeView AO_CView, TTypeHelp AO_TypeHelp)
/*#############################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetType<TTmplChain, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) );
if(TTmplChain::ZEBoolNext>0)
{
typedef typename
TTmplChain::TypeChainNext TypeChainNext;
ZftIterTypeChainHead
<TypeChainNext, TTypeView, TTypeHelp>
(AO_CView, AO_TypeHelp);
}/*
if(TTmplChain::ZEBoolNext>0)*/
}/*
template
<typename TTmplChain, typename TTypeView, typename TTypeHelp>
void ZftIterTypeChainHead
(TTypeView AO_CView, TTypeHelp AO_TypeHelp)
###############################################################*/
template
<typename TTmplChain, typename TTypeView, typename TTypeHelp>
void ZftIterTypeChainTail
(TTypeView AO_CView, TTypeHelp AO_TypeHelp)
/*#############################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
if(TTmplChain::ZEBoolNext>0)
{
typedef typename
TTmplChain::TypeChainNext TypeChainNext;
ZftIterTypeChainTail
<TypeChainNext, TTypeView, TTypeHelp>
(AO_CView, AO_TypeHelp);
}/*
if(TTmplChain::ZEBoolNext>0)*/
AO_CView.template OnMeetType<TTmplChain, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) );
}/*
template
<typename TTmplChain, typename TTypeView, typename TTypeHelp>
void ZftIterTypeChainTail
(TTypeView AO_CView, TTypeHelp AO_TypeHelp)
###############################################################*/
/*////////////////////////////////////////////////////////////////
ZtCTypeChain .
using namespace ZNsMain;
class ZCTypeView
{
public:
template<typename TTypChain> void OnMeetType()
{
cout<<TTypChain::ZETypeNo<<" : "<<typeid(typename TTypChain::TypeData).name()<<endl;
}
template<typename TTypChain, typename TTypHelp> void OnMeetType(int& AR_CallNo)
{
cout<<"* Call No="<<++AR_CallNo<<" : "<<TTypChain::ZETypeNo<<" : "<<typeid(typename TTypChain::TypeData).name()<<endl;
}
// 위 함수에서 형식적으로 template parameter 를, TTypChain 와 TTypHelp
// 2 개를 받고 있음에 주의. 물론 TTypHelp 를 이용한 아래 선언도 가능하지만
// OnMeetType(TTypHelp& AR_CallNo)
// 아래가 더 명시적이다.
// OnMeetType(int& AR_CallNo)
};
int main()
{
typedef ZtCTypeChain
<
double , ZtCTypeChain<
int , ZtCTypeChain<
wchar_t, ZtCTypeChain<
char ,
ZCEmpty > > >
> ZCTypeChain; ZCTypeView VO_ZCTypeView;
int VI_CallNo = 0;
cout<<"tmpl chain size = "<<ZCTypeChain::Size()<<endl;
ZftIterTypeChainTail<ZCTypeChain, ZCTypeView&>(VO_ZCTypeView);
cout<<"************************************"<<endl;
//ZCTypeChain::ZtCIterChain<ZCTypeView >::IterHead(VO_ZCTypeView);
ZCTypeChain::ZtCIterChain<ZCTypeView&>::IterHead(VO_ZCTypeView);
cout<<"************************************"<<endl;
//ZCTypeChain::ZtCIterChain<ZCTypeView >::IterTail(VO_ZCTypeView);
ZCTypeChain::ZtCIterChain<ZCTypeView&>::IterTail(VO_ZCTypeView);
ZftIterTypeChainHead<ZCTypeChain, ZCTypeView&, int&>
( VO_ZCTypeView, (VI_CallNo = 0) );
cout<<"************************************"<<endl;
ZftIterTypeChainTail<ZCTypeChain, ZCTypeView&, int&>
( VO_ZCTypeView, (VI_CallNo = 0) );
cout<<"************************************"<<endl;
ZCTypeChain::ZtCIterChain<ZCTypeView>::
IterHead(VO_ZCTypeView, ZftMCP(VI_CallNo=0));
cout<<"************************************"<<endl;
ZCTypeChain::ZtCIterChain<ZCTypeView>::
IterTail(VO_ZCTypeView, ZftMCP(VI_CallNo=0));
return 0;
}
-- 2025-10-17 16:42
////////////////////////////////////////////////////////////////*/
/*///////////////////////////////////////////////////////////////////
class ZtCObjtChain<>
. -- 2025-10-18 01:41
///////////////////////////////////////////////////////////////////*/
template /*########################################################*/
<
typename TTypeNow, typename TTypeNextChain
>
class ZtCObjtChain : public TTypeNextChain //////////////////////////
{
public :
typedef TTypeNow TypeData ;
typedef ZtCObjtChain TypeChainNow ;
typedef TTypeNextChain TypeChainNext ;
/************************************************************/
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 :
ZtCObjtChain(){}
public :
TypeData & GetData() {return mo_TypeVar;}
TypeDataC& GetData() const{return mo_TypeVar;}
/************************************************************/
TypeChainNext & GetChainNext()
{ return static_cast<TypeChainNext&>(*this); }
TypeChainNextC& GetChainNext() const
{ return static_cast<TypeChainNext&>(*this); }
/************************************************************/
template<typename TViewChain> void IterHead(TViewChain AO_CView)
{
ZtCTypeData<TViewChain>::
GetObjRef(AO_CView).OnMeetData(*this);
if(TypeChainNow::ZEBoolNext>0)
{
static_cast<TypeChainNext&>(*this).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)
{
static_cast<TypeChainNext&>(*this).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)
{
static_cast<TypeChainNext&>(*this).
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)
{
static_cast<TypeChainNext&>(*this).
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)
*/
public:
};/*
template ############################################################
<
typename TTypeNow, typename TTypeNextChain
>
class ZtCObjtChain : public TTypeNextChain ////////////////////////*/
template /*########################################################*/
< typename TTypeNow >
class ZtCObjtChain<TTypeNow, ZCEmpty> ///////////////////////////////
{
public :
typedef ZtCObjtChain<TTypeNow, ZCEmpty> ZCObjtChain;
public :
typedef TTypeNow TypeData ;
typedef ZCObjtChain TypeChainNow ;
typedef ZCObjtChain TypeChainNext ;
/************************************************************/
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 :
ZtCObjtChain(){}
public :
TypeData & GetData() {return mo_TypeVar;}
TypeDataC& GetData() const{return mo_TypeVar;}
/************************************************************/
TypeChainNext & GetChainNext() { return (*this); }
TypeChainNextC& GetChainNext() const{ return (*this); }
/************************************************************/
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)
*/
public:
};/*
template ############################################################
< typename TTypeNow >
class ZtCObjtChain<TTypeNow, ZCEmpty> /////////////////////////////*/
/*///////////////////////////////////////////////////////////////////
class ZtCMiniValChain<>
TTypeNow , TTypeVar
, int, long, char
class . double
. -- 2025-10-18 00:17
ZtCObjtChainEx ZtCMiniValChain .
-- 2025-10-18 10:26
class ZtCMiniValChain<> .
typedef ZtCMiniValChain
<
char , 'a' , ZtCMiniValChain<
long , 1567 , ZtCMiniValChain<
char , 'a' , ZtCMiniValChain<
char , 'a' , ZtCMiniValChain<
char , 'c' , ZtCMiniValChain<
char , 'd' , ZtCMiniValChain<
char , 'f' , ZtCMiniValChain<
int , 19 ,
ZCEmpty > > > > > > >
> ZtCMiniValChain ;
char , .
-- 2025-10-18 02:10
ZtCMiniArrByChain ,
. .
-- 2025-10-18 16:23
///////////////////////////////////////////////////////////////////*/
template /*########################################################*/
<
typename TTypeNow, TTypeNow TTypeVar, typename TTypeNextChain
>
class ZtCMiniValChain ///////////////////////////////////////////////
{
public :
typedef TTypeNow TypeData ;
typedef ZtCMiniValChain TypeChainNow ;
typedef TTypeNextChain TypeChainNext ;
/************************************************************/
typedef typename TypeChainNext::TypeData TypeNext ;
/************************************************************/
typedef const TypeData TypeDataC ;
/************************************************************/
enum{ZETypeNo = TypeChainNext::ZETypeNo+1};
enum{ZEBoolNext = 1 };
public :
static ZTypIntE Size (){return ZETypeNo;}
static ZTypIntE size (){return ZETypeNo;}
static ZTypIntE GetNo (){return ZETypeNo;}
static TypeData GetData(){return TTypeVar;}
public :
template<typename TViewChain> class ZtCIterChain
{
public:
static void IterHead(TViewChain AO_CView)
{
AO_CView.template OnMeetTypeVal<TypeChainNow>();
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template
ZtCIterChain<TViewChain>::IterHead(AO_CView);
}/*
if(TypeChainNow::ZEBoolNext>0)*/
}/*
static void IterHead(TViewChain AO_CView)*/
static void IterTail(TViewChain AO_CView)
{
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template
ZtCIterChain<TViewChain>::IterTail(AO_CView);
}/*
if(TypeChainNow::ZEBoolNext>0)*/
AO_CView.template OnMeetTypeVal<TypeChainNow>();
}/*
static void IterTail(TViewChain AO_CView)*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetTypeVal<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/****************************************************/
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template ZtCIterChain<TViewChain>::
template IterHead<TTypeHelp>(AO_CView, AO_TypeHelp) ;
}/*
if(TypeChainNow::ZEBoolNext>0)*/
}/*
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
if(TypeChainNow::ZEBoolNext>0)
{
TypeChainNext::template ZtCIterChain<TViewChain>::
template IterTail<TTypeHelp>(AO_CView, AO_TypeHelp) ;
}
AO_CView.template OnMeetTypeVal<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/****************************************************/
}/*
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
public:
};/*
template<typename TViewChain> class ZtCIterChain*/
public:
};/*
template ############################################################
<
typename TTypeNow, TTypeNow TTypeVar, typename TTypeNextChain
>
class ZtCMiniValChain : public TTypeNextChain /////////////////////*/
template /*########################################################*/
<
typename TTypeNow, TTypeNow TTypeVar
>
class ZtCMiniValChain<TTypeNow, TTypeVar, ZCEmpty> //////////////////
{
public :
typedef ZtCMiniValChain<TTypeNow, TTypeVar, ZCEmpty> ZCObjtChain;
public :
typedef TTypeNow TypeData ;
typedef ZCObjtChain TypeChainNow ;
typedef ZCObjtChain TypeChainNext ;
/************************************************************/
typedef ZCEmpty TypeNext ;
/************************************************************/
typedef const TypeData TypeDataC ;
/************************************************************/
enum{ZETypeNo = 1 };
enum{ZEBoolNext = 0 };
public :
static ZTypIntE Size (){return ZETypeNo;}
static ZTypIntE size (){return ZETypeNo;}
static ZTypIntE GetNo (){return ZETypeNo;}
static TypeData GetData(){return TTypeVar;}
public :
template<typename TViewChain> class ZtCIterChain
{
public:
static void IterHead(TViewChain AO_CView)
{
AO_CView.template OnMeetTypeVal<TypeChainNow>();
}/*
static void IterHead(TViewChain AO_CView)*/
static void IterTail(TViewChain AO_CView)
{
AO_CView.template OnMeetTypeVal<TypeChainNow>();
}/*
static void IterTail(TViewChain AO_CView)*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetTypeVal<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/****************************************************/
}/*
template<typename TTypeHelp> static void
IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp> ZCCheckRef;
typedef typename ZCCheckRef::TypeRaw TypeRaw ;
AO_CView.template OnMeetTypeVal<TypeChainNow, TypeRaw>
( ZCCheckRef::PassData(AO_TypeHelp) ) ;
/****************************************************/
}/*
template<typename TTypeHelp> static void
IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/
public:
};/*
template<typename TViewChain> class ZtCIterChain*/
public:
};/*
template ############################################################
<
typename TTypeNow, TTypeNow TTypeVar
>
class ZtCMiniValChain<TTypeNow, TTypeVar, ZCEmpty> ////////////////*/
/*///////////////////////////////////////////////////////////////////
class ZtCMiniValChain<>
ZtCMiniValChain
. , .
-- 2025-10-18 16:25
class ZtCMiniValChain<> .
typedef ZtCMiniValChain
<
char , 'a' , ZtCMiniValChain<
char , 'b' , ZtCMiniValChain<
char , 'c' , ZtCMiniValChain<
char , 'd' , ZtCMiniValChain<
char , 'e' , ZtCMiniValChain<
char , 'f' , ZtCMiniValChain<
char , 'g' , ZtCMiniValChain<
char , 'h' ,
ZCEmpty > > > > > > >
> ZCCharValChain ;
typedef ZtCMiniArrByChain
<char, ZCCharValChain> ZCMiniArrByChain;
ZCMiniArrByChain VO_CMiniArrByChain;
cout<<"# VO_CMiniArrByChain.size()="<<VO_CMiniArrByChain.size()<<endl;
cout<<"# VO_CMiniArrByChain.data()="<<VO_CMiniArrByChain.data()<<endl;
-- 2025-10-18 16:26
///////////////////////////////////////////////////////////////////*/
template /*########################################################*/
<
typename TTypData, typename TCMiniValChain
>
class ZtCMiniArrByChain /////////////////////////////////////////////
{
public :
typedef TTypData TypeData ;
typedef TCMiniValChain TypeChain ;
public :
typedef const TTypData TypeDataC ;
public :
enum{ZESize = TCMiniValChain::ZETypeNo};
public :
typedef TTypData TypeArrr[ZESize+1];
/*******************************************************************/
TypeArrr mo_TypeArr;
public :
static ZTypIntE Size (){return ZESize;}
static ZTypIntE size (){return ZESize;}
public :
TypeData * GetArray() {return mo_TypeArr;}
TypeDataC* GetArray() const{return mo_TypeArr;}
TypeData * data () {return mo_TypeArr;}
TypeDataC* data () const{return mo_TypeArr;}
private:
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
class ZCTypeView
{
private:
ZTypIntE mi_CallNo;
public :
ZCTypeView(){mi_CallNo=0;}
public :
template
<typename TTypChain, typename THelpArray>
void OnMeetTypeVal(TypeData* mp_Array)
{
mp_Array[mi_CallNo++] = TTypChain::GetData() ;
}
public :
};/*
class ZCTypeView*/
private:
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
public :
ZtCMiniArrByChain()
{
ZCTypeView VO_ZCTypeView; mo_TypeArr[ZESize]=0;
TypeChain::template ZtCIterChain<ZCTypeView&>::
IterHead( VO_ZCTypeView, mo_TypeArr );
/*********************************************/
}/*
ZtCMiniArrByChain()*/
public:
};/*
template /*##########################################################
<
typename TTypData, typename TCMiniValChain
>
class ZtCMiniArrByChain ///////////////////////////////////////////*/
namespace ZNsType
{
template
< typename TTypData, typename TTypSize=ZTypLength >
class ZtCTypeSelfLink
{
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;
TypeLink* mp_PrevLink;
protected:
/* alwayse mp_NextLink!=0 && mp_PrevLink!=0 */
protected:
static void JoinLink(TypeLink* AP_PrevLink, TypeLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(TypeLink* AP_PrevLink, TypeLink* AP_NextLink)*/
static void MakeRing(TypeLink* AP_HeadLink, TypeLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(TypeLink* AP_HeadLink, TypeLink* AP_TailLink)*/
public :
TypeData & operator * () {return static_cast<TypeData &>(*this);}
TypeData & operator() () {return static_cast<TypeData &>(*this);}
operator TypeData & () {return static_cast<TypeData &>(*this);}
TypeDataC& operator * () const{return static_cast<TypeDataC&>(*this);}
TypeDataC& operator() () const{return static_cast<TypeDataC&>(*this);}
operator TypeDataC& () const{return static_cast<TypeDataC&>(*this);}
TypeData & GetData () {return static_cast<TypeData &>(*this);}
TypeDataC& GetData () const{return static_cast<TypeDataC&>(*this);}
TypeLink & GetNext () {return *mp_NextLink;}
TypeLink & GetPrev () {return *mp_PrevLink;}
TypeLinkC& GetNext () const{return *mp_NextLink;}
TypeLinkC& GetPrev () const{return *mp_PrevLink;}
public :
ZCDataLink()
{
mp_NextLink = mp_PrevLink = 0 ;
}/*
ZCDataLink()*/
ZCDataLink(TypeLinkC& rhs)
{
mp_NextLink = mp_PrevLink = 0 ; GetData() = rhs.GetData() ;
}/*
ZCDataLink(TypeLinkC& rhs)*/
ZCDataLink(TypeDataC& AR_Data)
{
mp_NextLink = mp_PrevLink = 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 ZtCTypeSelfLink */
}/*
namespace ZNsType*/
template ////////////////////////////////////////////////////////////////
<
typename TDataNow, typename TTypeSelfLink =
ZNsType::ZtCTypeSelfLink<TDataNow>
>
class ZCtDataRing : /*#################################################*/
public TTypeSelfLink::TypeLink
{
public :
typedef ZCtDataRing TypeThis ;
typedef TDataNow TypeData ;
public :
typedef typename TTypeSelfLink::TypeLink TypeLink;
typedef typename TTypeSelfLink::TypeSize TypeSize;
public :
typedef const TypeData TypeDataC;
typedef const TypeLink TypeLinkC;
typedef const TypeThis TypeThisC;
private:
using TypeLink::JoinLink; using TypeLink::MakeRing;
private:
TypeLink* mp_HeadLink;
TypeLink* mp_TailLink;
TypeSize ml_LinkSize;
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mp_HeadLink mp_TailLink this
ml_LinkSize+1 . this
mp_HeadLink->mp_NextLink .
-- 2025-10-19 12:55
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public :
ZCtDataRing()
{
mp_HeadLink=this;
mp_TailLink=this;
ml_LinkSize=0 ;
/* alwayse mp_NextLink!=0 && mp_PrevLink!=0 */
MakeRing(mp_HeadLink, mp_TailLink);
}/*
ZCtDataRing()*/
/*#######################################################################
ZCtDataRing(const ZCtDataRing& rhs) : ZCtDataRing()
{ this->GetData() = rhs.GetData() ; }
ZCtDataRing(const TypeLink & rhs) : ZCtDataRing()
{ this->GetData() = rhs.GetData() ; }
ZCtDataRing(const TypeData & rhs) : ZCtDataRing()
{ this->GetData() = rhs ; }
../ZCppMain/ZMainHead.H: In copy constructor ZNsMain::ZCtDataRing<TDataNow, TTypeSelfLink>::ZCtDataRing(const ZNsMain::ZCtDataRing<TDataNow, TTypeSelfLink>&):
../ZCppMain/ZMainHead.H:4242:59: warning: delegating constructors only available with -std=c++11 or -std=gnu++11
4242 | ZCtDataRing(const ZCtDataRing& rhs) : ZCtDataRing()
sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- 2025-10-19 11:41
#######################################################################*/
ZCtDataRing(const ZCtDataRing& rhs)
{
mp_HeadLink=this;
mp_TailLink=this;
ml_LinkSize=0 ;
MakeRing(mp_HeadLink, mp_TailLink);
this->GetData() = rhs.GetData() ;
}/*
ZCtDataRing(const ZCtDataRing& rhs)*/
ZCtDataRing(const TypeLink & rhs)
{
mp_HeadLink=this;
mp_TailLink=this;
ml_LinkSize=0 ;
MakeRing(mp_HeadLink, mp_TailLink);
this->GetData() = rhs.GetData() ;
}/*
ZCtDataRing(const TypeLink & rhs)*/
ZCtDataRing(const TypeData & rhs)
{
mp_HeadLink=this;
mp_TailLink=this;
ml_LinkSize=0 ;
MakeRing(mp_HeadLink, mp_TailLink);
this->GetData() = rhs ; /*********/
}/*
ZCtDataRing(const TypeData & rhs)*/
~ZCtDataRing(){DeleteAll();}
TypeSize size () const{return ml_LinkSize;}
TypeSize Size () const{return ml_LinkSize;}
TypeSize GetSize() const{return ml_LinkSize;}
TypeLink & operator * () {return static_cast<TypeLink &>(*this);}
TypeLink & operator() () {return static_cast<TypeLink &>(*this);}
operator TypeData & () {return static_cast<TypeLink &>(*this);}
TypeLinkC& operator * () const{return static_cast<TypeLinkC&>(*this);}
TypeLinkC& operator() () const{return static_cast<TypeLinkC&>(*this);}
operator TypeLinkC& () const{return static_cast<TypeLinkC&>(*this);}
TypeData & GetData () {return this->TypeLink::GetData();}
TypeDataC& GetData () const{return this->TypeLink::GetData();}
TypeLink & GetHead () {return *mp_HeadLink;}
TypeLink & GetTail () {return *mp_TailLink;}
TypeLinkC& GetHead () const{return *mp_HeadLink;}
TypeLinkC& GetTail () const{return *mp_TailLink;}
TypeThis& operator=(TypeThisC& rhs)
{ this->GetData() = rhs.GetData(); return *this; }
TypeThis& operator=(TypeLinkC& rhs)
{ this->GetData() = rhs.GetData(); return *this; }
TypeThis& operator=(TypeDataC& rhs)
{ this->GetData() = rhs ; return *this; }
TypeThis& operator=(TypeData & rhs)
{ this->GetData() = rhs ; return *this; }
TypeLink& AddTail()
{
TypeLink* VP_NewLink = new TypeLink;
JoinLink(mp_TailLink, VP_NewLink);
MakeRing(mp_HeadLink, VP_NewLink);
mp_TailLink = VP_NewLink ;
++ml_LinkSize; return *VP_NewLink;
}/*
TypeLink& AddTail()*/
TypeLink& AddTail(TypeLinkC& AR_TypeLink)
{
TypeLink* VP_NewLink =
new TypeLink( AR_TypeLink ) ;
JoinLink(mp_TailLink, VP_NewLink);
MakeRing(mp_HeadLink, VP_NewLink);
mp_TailLink = VP_NewLink ;
++ml_LinkSize; return *VP_NewLink;
}/*
TypeLink& AddTail(TypeLinkC& AR_TypeLink)*/
TypeLink& AddTail(TypeDataC& AR_TypeData)
{
TypeLink* VP_NewLink =
new TypeLink( AR_TypeData ) ;
JoinLink(mp_TailLink, VP_NewLink);
MakeRing(mp_HeadLink, VP_NewLink);
mp_TailLink = VP_NewLink ;
++ml_LinkSize; return *VP_NewLink;
}/*
TypeLink& AddTail(TypeDataC& AR_TypeData)*/
void DeleteAll()
{
TypeLink* VP_CutLink = &mp_HeadLink->GetNext();
TypeLink* VP_CutNext = &VP_CutLink ->GetNext();
__for0(TypeSize, i, ml_LinkSize)
{
delete VP_CutLink;
VP_CutLink = VP_CutNext ;
VP_CutNext = &VP_CutLink ->GetNext();
}/*
__for0(TypeSize, i, ml_LinkSize)*/
mp_HeadLink=this;
mp_TailLink=this;
ml_LinkSize=0 ;
}/*
void DeleteAll()*/
public :
};/*
template ////////////////////////////////////////////////////////////////
<
typename TDataNow, typename TTypeSelfLink =
ZNsType::ZtCTypeSelfLink<TDataNow>
>
class ZCtDataRing : ###################################################*/
template<typename TDataNow, typename TTypeSelfLink> std::ostream& operator <<
(
std::ostream& AR_COStream, const ZCtDataRing<TDataNow, TTypeSelfLink>& AR_CDataRing
)
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
{
/*/////////////////////////////////////////////////////////////////////////////////////
ZCtDataRing~ const , const ZCtDataRing object ,
. const .
/////////////////////////////////////////////////////////////////////////////////////*/
AR_COStream<<AR_CDataRing.GetData();
typedef ZCtDataRing
<TDataNow, TTypeSelfLink> TypeRing ;
typedef typename TypeRing::TypeSize TypeSize ;
typedef typename TypeRing::TypeLinkC TypeLinkC;
TypeLinkC* VP_NowLink = &AR_CDataRing.GetNext();
__for0(TypeSize, i, AR_CDataRing.size())
{
AR_COStream<<", "<<*VP_NowLink;
VP_NowLink = &VP_NowLink->GetNext();
}
return AR_COStream; /******************/
}/*
template<typename TDataNow, typename TTypeSelfLink> std::ostream& operator <<
(
std::ostream& AR_COStream, const ZCtDataRing<TDataNow, TTypeSelfLink>& AR_CDataRing
)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
2021-02-25 16:23:13 +09:00
namespace ZNsTmplChain
{
/*////////////////////////////////////////////////////////////
ZtCTmplChain<> , chain
.
-- 2011-08-05 21:16:00
CMainChars.H
TTypeLength CSearchCursor_T<>::GetLengthByTmplChain(~)
.
-- 2011-08-06 23:51:00
////////////////////////////////////////////////////////////*/
}/*
namespace ZNsTmplChain*/
/*///////////////////////////////////////////////////////////////////
,
2021-03-04 15:36:45 +09:00
bool enum ZERun .
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
enum ZERun ,
enum ZERunEx .
2021-02-25 16:23:13 +09:00
-- 2011-09-27 05:37:00
ZEActRun
,
, ZEActRun .
-- 2025-10-03 19:01
2021-02-25 16:23:13 +09:00
///////////////////////////////////////////////////////////////////*/
namespace ZNsEnum
{
2021-03-04 15:36:45 +09:00
enum ZERun
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
ZERun_NO, // 실행 중지
ZERun_OK // 실행 계속
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZERun*/
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
enum ZERunEx
2021-02-25 16:23:13 +09:00
{
ZERunEx_NO, // 실행 중지
ZERunEx_OK, // 실행 계속
ZERunEx_Err // 실행 에러
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZERun*/
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
enum ZEAct
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
ZEAct_NO, // (함수 등이) 어떤 조건에 맞지 않아서 아무 짓도 하지 않았다.
ZEAct_OK // (함수 등이) 어떤 조건에 맞아서 지정된 처리를 하였다.
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZEAct*/
2021-02-25 16:23:13 +09:00
2021-03-04 15:36:45 +09:00
enum ZEActEx
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
ZEActEx_NO, // (함수 등이) 어떤 조건에 맞지 않아서 아무 짓도 하지 않았다.
ZEActEx_OK, // (함수 등이) 어떤 조건에 맞아서 지정된 처리를 하였다.
ZEActEx_Err // (함수 등이) 수행 중에 에러가 발생하였다.
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZEAct*/
2021-02-25 16:23:13 +09:00
enum ZEActRun
{
ZEActRun_RunNO =0x01, // 실행 중지
ZEActRun_RunOK =0x02, // 실행 계속
ZEActRun_RunErr=0x04, // 실행 오류
ZEActRun_ActNO =0x08, // 처리 중지
ZEActRun_ActOK =0xA0, // 처리 계속
ZEActRun_ActErr=0xB0 // 처리 오류
};/*
enum ZEAct*/
2021-03-04 15:36:45 +09:00
enum ZEThrowFinally
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
ZEThrowFinally_NO,
ZEThrowFinally_OK
2021-02-25 16:23:13 +09:00
};/*
2021-03-04 15:36:45 +09:00
enum ZEThrowFinally*/
2021-02-25 16:23:13 +09:00
/*////////////////////////////////////////////////
throw ~ catch ~ finally
EThrowFinally .
////////////////////////////////////////////////*/
}/*
namespace ZNsEnum*/
using ZNsEnum::ZERun ;
using ZNsEnum::ZERun_NO ;
using ZNsEnum::ZERun_OK ;
using ZNsEnum::ZERunEx ;
using ZNsEnum::ZERunEx_NO ;
using ZNsEnum::ZERunEx_OK ;
using ZNsEnum::ZERunEx_Err;
namespace ZNsIFace
2021-02-25 16:23:13 +09:00
{
/*////////////////////////////////////////////////////////////////////////////////////
class ZIDelgtMSG C# delegate .
object object ,
object , object ZIDelgtMSG
, ZIDelgtMSG::SendMSG() ZIDelgtMSG::RecvMSG() .
COM . COM .
-- 2009-03-08 02:26:00
class ZIDelgtMSG
namespace ZNsIFace namespace ZNsIDelgt .
2021-02-25 16:23:13 +09:00
-- 2009-03-08 19:17:00
A, B, C .
ZIDelgtMSG , .
. ZIDelgtMSG , interface
.
-- 2010-03-13 22:28:00
////////////////////////////////////////////////////////////////////////////////////*/
class ZIDelgtMSG
{
public:
2021-03-04 15:36:45 +09:00
enum ZEIMsg{ZEIMsg_NO=0, ZEIMsg_OK=1};
2021-02-25 16:23:13 +09:00
public:
virtual ~ZIDelgtMSG(){}
2021-02-25 17:34:50 +09:00
virtual ZTypLLong GetTypeID() const
2021-02-25 16:23:13 +09:00
{
return 0;
}/*
2021-02-25 17:34:50 +09:00
virtual ZTypLLong GetTypeID() const*/
2021-02-25 16:23:13 +09:00
virtual const char* GetTypeName() const
{
return 0;
}/*
virtual const char* GetTypeID() const*/
2021-02-25 17:34:50 +09:00
virtual ZTypLLong GetIMSGPtrOfID(ZTypLLong AI_TypeID, ZIDelgtMSG*& APR_ZIDelgtMSG)
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
APR_ZIDelgtMSG=0; return ZEIMsg_OK;
2021-02-25 16:23:13 +09:00
}/*
2021-02-25 17:34:50 +09:00
virtual ZTypLLong GetIMSGPtrOfID(ZTypLLong AI_TypeID, ZIDelgtMSG*R APR_ZIDelgtMSG)*/
2021-02-25 16:23:13 +09:00
2021-02-25 17:27:36 +09:00
virtual ZTypIntPtr SendMSG(ZIDelgtMSG& ArZIDelgtMSG, ZTypIntI AI_MsgNo, const char* ApcMsgData, ZTypIntI AI_MsgLen, void* AP_Void=0, ...)
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
return ZEIMsg_OK;
2021-02-25 16:23:13 +09:00
}/*
2021-02-25 17:34:50 +09:00
virtual ZTypIntPtr SendMSG(ZIDelgtMSG& ArZIDelgtMSG, ZTypIntI AI_MsgNo, const char* ApcMsgData, ZTypIntI AI_MsgLen,void* AP_Void=0, ...)*/
2021-02-25 16:23:13 +09:00
2021-02-25 17:34:50 +09:00
virtual ZTypIntPtr RecvMSG(ZTypIntI AI_MsgNo, const char* ApcMsgData, ZTypLength AI_MsgLen, void* AP_Void=0, ...)
2021-02-25 16:23:13 +09:00
{
2021-03-04 15:36:45 +09:00
return ZEIMsg_OK;
2021-02-25 16:23:13 +09:00
}/*
2021-02-25 17:34:50 +09:00
virtual ZTypIntPtr RecvMSG(ZTypIntI AI_MsgNo, const char* ApcMsgData, ZTypLength AI_MsgLen, void* AP_Void=0, ...)*/
2021-02-25 16:23:13 +09:00
public:
};/*
class ZIDelgtMSG*/
}/*
namespace ZNsIFace*/
2021-02-25 16:23:13 +09:00
namespace ZNsIDelgt
{
// class ZIDelgtMSG 를 상속하여 추가 멤버함수를 가진
// 인터페이스를 구현하는 클래스일 경우에는 여기에 둔다.
}/*
namespace ZNsIDelgt*/
class ZCAllocator
{
public:
static void* operator new (size_t AL_AllocSize ){return ::malloc(AL_AllocSize);}
static void* operator new[](size_t AL_AllocSize ){return ::malloc(AL_AllocSize);}
static void* operator new (size_t AL_AllocSize, void* AP_AllocBegin){return AP_AllocBegin ;}
static void* operator new[](size_t AL_AllocSize, void* AP_AllocBegin){return AP_AllocBegin ;}
static void operator delete (void* AP_Void){if(AP_Void!=0) ::free(AP_Void);}
static void operator delete[](void* AP_Void){if(AP_Void!=0) ::free(AP_Void);}
public:
};/*
class ZCAllocator*/
/*/////////////////////////////////////////////////////////////////
class ZCAllocator
class ZtCAllocClass<> .
ZtCAllocClass<>
ZtCAllocClass<> 릿
Type .
/////////////////////////////////////////////////////////////////*/
template<typename TType> class ZtCAllocClass : public ZCAllocator
2021-02-25 16:23:13 +09:00
{
public:
TType* InitMem (size_t AL_AllocSize){return (TType*)::malloc(AL_AllocSize) ;}
TType* InitMemArr(size_t AL_AllocSize){return (TType*)::malloc(AL_AllocSize*sizeof(TType));}
public:
void FiniMem (void* AP_Void){if(AP_Void!=0) ::free(AP_Void);}
void FiniMemArr(void* AP_Void){if(AP_Void!=0) ::free(AP_Void);}
2021-02-25 16:23:13 +09:00
public:
};/*
template<typename TType> class ZtCAllocClass : public ZCAllocator*/
2021-02-25 16:23:13 +09:00
class ZCAllocClass : public ZCAllocator
{
public:
void* InitMem (size_t AL_AllocSize){return ::malloc(AL_AllocSize) ;}
void FiniMem (void* AP_Void ){if(AP_Void!=0) ::free(AP_Void);}
2021-02-25 16:23:13 +09:00
public:
};/*
class ZCAllocClass : public ZCAllocator*/
/*////////////////////////////////////////////////////////////////////////////////
,
,
.
////////////////////////////////////////////////////////////////////////////////*/
template<typename TTypeCh> class ZtCAllocMemSize
{
public:
template<typename TTypeSize> static TTypeSize
GetNewAllocSize(TTypeSize AL_NowAllocSize, TTypeSize AL_AllAllocSize )
2021-02-25 16:23:13 +09:00
{
/* AL_AllAllocSize : 해당 문자열 object 가 할당받은 문자 총갯수.
AL_NowAllocSize : AL_AllAllocSize . */
return AL_NowAllocSize<=AL_AllAllocSize ? AL_NowAllocSize : AL_NowAllocSize*2 ;
}/*
template<typenanme TTypeSize> static TTypeSize
GetNewAllocSize(TTypeSize AL_NowAllocSize, TTypeSize AL_AllAllocSize ) */
2021-02-25 16:23:13 +09:00
public:
};/*
template<typename TTypeCh> class ZtCAllocMemSize */
/*//////////////////////////////////////////////////////////////
릿 n ,
,
.
//////////////////////////////////////////////////////////////*/
template<typename TTypSize> class ZtCShortCut
{
private:
static inline TTypSize GetAbs(TTypSize AI_Param) // 인수의 절대값을 얻는다.
{
return (AI_Param<0 ? -AI_Param : AI_Param);
}/*
static inline TTypSize GetAbs(TTypSize AI_Param)*/
/*
private:*/
2021-02-25 16:23:13 +09:00
public :
2021-02-25 17:27:36 +09:00
static ZTypIntI GetAbsMinOrder(TTypSize AI_One, TTypSize AI_Two, TTypSize AI_Three)
2021-02-25 16:23:13 +09:00
{
// 세 개의 인수 중에서 절대값이 최소가 되는 수는
// 몇 번째 인지 그 순서를 반환한다.
// 맨 앞의 인수가 절대값이 최소면 1 을 반환한다.
// 두 번째 인수의 절대값이 최소면 2 를 반환한다.
// 세 번째 인수의 절대값이 최소면 3 을 반환한다.
// 이 함수는 양방향 원형 연결리스트에서 n 번째 링크를 찾는데 쓰인다.
return ( GetAbs(AI_One)<=GetAbs(AI_Two ) /******/ ?
(GetAbs(AI_One)<=GetAbs(AI_Three) ? 1 : 3) :
(GetAbs(AI_Two)<=GetAbs(AI_Three) ? 2 : 3)
/****/ );
};/*
2021-02-25 17:27:36 +09:00
static ZTypIntI GetAbsMinOrder(TTypSize AI_One,TTypSize AI_Two, TTypSize AI_Three)*/
2021-02-25 16:23:13 +09:00
public:
};/*
template<typename TTypSize> class ZtCShortCut*/
#ifdef _WIN
using ::GetLastError;
2021-02-25 16:23:13 +09:00
inline ZTypIntI ZfGetLastError(){ return ::GetLastError(); }
2021-02-25 16:23:13 +09:00
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0)
2021-02-25 16:23:13 +09:00
{
LPVOID VP_MsgBuff=0; DWORD ViErrNo =
(AI_ErrNo==0 ? ::GetLastError() : AI_ErrNo);
2021-02-25 16:23:13 +09:00
const DWORD CI_RetCode = ::FormatMessage( ///////////////
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS ,
NULL ,
ViErrNo ,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&VP_MsgBuff,0,NULL
/*//////////*/ ); ///////////////////////////////////////
if(CI_RetCode==0) return false;
(ARR_BuffCStr =
2021-02-25 16:23:13 +09:00
((LPCTSTR)VP_MsgBuff))(", ErrNo=")(ViErrNo);
::LocalFree(VP_MsgBuff); return true;
}/*
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0) */
2021-02-25 16:23:13 +09:00
// defined(_WIN)
#elif defined(__unix__)
inline ZTypIntI GetLastError(){return errno ;} // for compatibility with windows
inline ZTypIntI ZfGetLastError()
2021-02-25 16:23:13 +09:00
{
return errno ; // ::error 로 하면 안된다.
}/*
inline ZTypIntI ZfGetLastError()*/
2021-02-25 16:23:13 +09:00
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0)
2021-02-25 16:23:13 +09:00
{
if(AI_ErrNo==0)
ARR_BuffCStr = ::strerror(errno );
else ARR_BuffCStr = ::strerror(AI_ErrNo);
return true; // for compatibility with window
}/*
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0) */
2021-02-25 16:23:13 +09:00
//#elif defined(__unix__)
#else
inline ZTypIntI ZfGetLastError(){return errno ;}
2021-02-25 16:23:13 +09:00
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0)
2021-02-25 16:23:13 +09:00
{
if(AI_ErrNo==0)
ARR_BuffCStr = ::strerror(errno );
else ARR_BuffCStr = ::strerror(AI_ErrNo);
2021-02-25 16:23:13 +09:00
return true; // for compatibility with window
}/*
template<typename TString> static bool
ZftGetLastErrMSG(TString& ARR_BuffCStr, ZTypIntI AI_ErrNo=0) */
2021-02-25 16:23:13 +09:00
#endif
template
<typename TTypChar, typename TTypLength>
static TTypChar* ZftTrimDecimalZero
(TTypChar* APC_Data, TTypLength& ARRI_Length)
{
/* 문자열 APC_Data 이 어떤 소수를 표현할 경우
0 .
*/
typedef TTypChar TypeChar ;
typedef TTypLength TypeLength ;
TypeChar* VPC_StartChar= APC_Data;
if(ARRI_Length<=0)
{ ARRI_Length=0; return 0; }
TypeLength VL_PeriodPos =0;
TypeLength VL_CurrentPos=0;
for(; VL_PeriodPos<ARRI_Length; ++VL_PeriodPos)
{ if( *VPC_StartChar++ =='.' ) break; }
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
// 마침표가 없거나, 맨 앞에 오거나 맨 끝에 오는 경우도 유효하지 않다.
if(VL_PeriodPos<1 || VL_PeriodPos>=ARRI_Length-1)
{ return APC_Data; }
/*+++++++++++++++++++++++++++++++++++++++++++++*/
VPC_StartChar = APC_Data +
( VL_CurrentPos = ARRI_Length-1 ) ;
while(VL_PeriodPos<VL_CurrentPos)
{
if(*VPC_StartChar!=TypeChar('0'))
{ break; }
/*+++++++++++++++++++++++++++++*/
*VPC_StartChar=0;
--VL_CurrentPos;
--VPC_StartChar;
--ARRI_Length ;
}/*
while(VL_PeriodPos<VL_CurrentPos)*/
/* 소수부 맨 끝에 0 을 삭제한 결과,
.
*/
if(VL_PeriodPos==VL_CurrentPos)
{ * VPC_StartChar =TypeChar(0); --ARRI_Length; }
else{ *(VPC_StartChar+1)=TypeChar(0); }
return APC_Data; /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
}/*
template
<typename TTypChar, typename TTypLength>
static TTypChar* ZftTrimDecimalZero
(TTypChar* APC_Data, TTypLength& ARRI_Length)*/
2021-02-25 16:23:13 +09:00
// 절대값을 가져온다.
template<typename TLong> TLong ZfABS(TLong AL_Value)
2021-02-25 16:23:13 +09:00
{
if(AL_Value<0){return -AL_Value;} return AL_Value;
2021-02-25 16:23:13 +09:00
}/*
template<typename TLong> TLong ZfABS(TLong AL_Value) */
2021-02-25 16:23:13 +09:00
template<typename TypeInt>
TypeInt ZfAToInt(const char* ApcChar, ZTypIntI AI_Length)
2021-02-25 16:23:13 +09:00
{
if(AI_Length<1) return 0;
while(AI_Length>0 && ApcChar[AI_Length-1]==' ')
--AI_Length; // 뒤에 있는 공백을 제외.
/*+++++++++++++++++++++++++++++++++++++++++++*/
2021-02-25 16:23:13 +09:00
if(AI_Length<1) return 0;
ZTycChar* VPC_Char = ApcChar+AI_Length-1;
TypeInt VL_Temp = 0 ;
TypeInt VL_Result = (*VPC_Char--)-'0' ;
TypeInt VL_Multiple= 1 ;
2021-02-25 16:23:13 +09:00
while(--AI_Length>0)
{
if((VL_Temp=*VPC_Char--)<'0' || VL_Temp>'9' ) return 0;
VL_Result += (VL_Multiple*=10)*(VL_Temp-'0') ; ////////
}/*
while(--AI_Length>0)*/
return VL_Result;
}/*
template<typename TypeInt>
TypeInt ZfAToInt(const char* ApcChar, ZTypIntI AI_Length) */
2021-02-25 16:23:13 +09:00
#ifdef _WIN
inline ZTypLLong ZfAtoLL(const char* ApcChar)
2021-02-25 16:23:13 +09:00
{
if(ApcChar==0) return 0; return ::_atoi64(ApcChar);
}/*
inline ZTypLLong ZfAtoLL(const char* ApcChar)*/
2021-02-25 16:23:13 +09:00
#else // !defined(_WIN)
inline ZTypLLong ZfAtoLL(const char* ApcChar)
2021-02-25 16:23:13 +09:00
{
if(ApcChar==0){ return 0;} return ::atoll(ApcChar);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypLLong ZfAtoLL(const char* ApcChar)*/
2021-02-25 16:23:13 +09:00
#endif // !defined(_WIN)
inline ZTypLLong ZfAtoLL(const char* ApcChar, ZTypIntI AI_Length)
2021-02-25 16:23:13 +09:00
{
return ZfAToInt<ZTypLLong>(ApcChar, AI_Length);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypLLong ZfAtoL(const char* ApcChar, ZTypIntI AI_Length)*/
2021-02-25 16:23:13 +09:00
inline ZTypLong ZfAtoL(const char* ApcChar)
2021-02-25 16:23:13 +09:00
{
if(ApcChar==0){return 0;} return ::atol(ApcChar);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypLong ZfAtoL(const char* ApcChar)*/
2021-02-25 16:23:13 +09:00
inline ZTypLong ZfAtoL(const char* ApcChar, ZTypIntI AI_Length)
2021-02-25 16:23:13 +09:00
{
return ZfAToInt<ZTypLong>(ApcChar, AI_Length);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypLong ZfAtoL(const char* ApcChar, ZTypIntI AI_Length)*/
2021-02-25 16:23:13 +09:00
inline ZTypIntI ZfAtoI(const char* ApcChar)
2021-02-25 16:23:13 +09:00
{
if(ApcChar==0){return 0;} return ::atoi(ApcChar);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypIntI ZfAtoI(const char* ApcChar)*/
2021-02-25 16:23:13 +09:00
inline ZTypIntI ZfAtoI(const char* ApcChar, ZTypIntI AI_Length)
2021-02-25 16:23:13 +09:00
{
return ZfAToInt<ZTypIntI>(ApcChar, AI_Length);
2021-02-25 16:23:13 +09:00
}/*
inline ZTypIntI ZfAtoI(const char* ApcChar, ZTypIntI AI_Length)*/
2021-02-25 16:23:13 +09:00
inline double ZfAtoD(const char* ApcChar)
2021-02-25 16:23:13 +09:00
{
return ApcChar==0 ? 0 : ::atof(ApcChar) ;
}/*
inline double ZfAtoD(const char* ApcChar)*/
/*#############################################################################
#include <wchar.h>
long int wcstol(const wchar_t *nptr, wchar_t **endptr, int base);
#include <wchar.h>
long long int wcstoll(const wchar_t *nptr, wchar_t **endptr, int base);
*******************************************************************************
# https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strtoll-strtoll-l-wcstoll-wcstoll-l?view=msvc-170
base가 0 strSource
. '0' 'x' 'X'
8 . '0'
'x' 'X' 16 .
'1'~'9' 10 .
'a'~'z' 'A'~'Z' 10~35 . base
.
. base 0 '0'
8 '8' '9' .
*******************************************************************************
float wcstof ( const wchar_t* str, wchar_t** str_end ); (since C++11)
double wcstod ( const wchar_t* str, wchar_t** str_end );
long double wcstold( const wchar_t* str, wchar_t** str_end ); (since C++11)
-- 2025-10-08 09:23
#############################################################################*/
template<typename TTypChar> inline
ZTypInt ZftAtoI (const TTypChar* ApcChar){ return 0; }
template<> inline
ZTypInt ZftAtoI (const char* ApcChar){ return ZfAtoI(ApcChar); }
template<> inline
ZTypInt ZftAtoI (const wchar_t* ApcChar){ return (ZTypInt)::wcstol(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
ZTypLong ZftAtoL (const TTypChar* ApcChar){ return 0; }
template<> inline
ZTypLong ZftAtoL (const char* ApcChar){ return ZfAtoI(ApcChar); }
template<> inline
ZTypLong ZftAtoL (const wchar_t* ApcChar){ return ::wcstol(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
ZTypLLong ZftAtoLL(const TTypChar* ApcChar){ return 0; }
template<> inline
ZTypLLong ZftAtoLL(const char* ApcChar){ return ZfAtoLL(ApcChar); }
template<> inline
ZTypLLong ZftAtoLL(const wchar_t* ApcChar){ return ::wcstoll(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
double ZftAtoD (const TTypChar* ApcChar){ return 0; }
template<> inline
double ZftAtoD (const char* ApcChar){ return ZfAtoD(ApcChar); }
template<> inline
double ZftAtoD (const wchar_t* ApcChar){ return ::wcstod(ApcChar, 0) ; }
template<typename TTypChar> inline
ZTypInt ZftAtoI (const TTypChar* ApcChar, ZTypInt AI_Length){ return 0; }
template<> inline
ZTypInt ZftAtoI (const char* ApcChar, ZTypInt AI_Length){ return ZfAtoI(ApcChar); }
template<> inline
ZTypInt ZftAtoI (const wchar_t* ApcChar, ZTypInt AI_Length){ return (ZTypInt)::wcstol(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
ZTypLong ZftAtoL (const TTypChar* ApcChar, ZTypInt AI_Length){ return 0; }
template<> inline
ZTypLong ZftAtoL (const char* ApcChar, ZTypInt AI_Length){ return ZfAtoI(ApcChar); }
template<> inline
ZTypLong ZftAtoL (const wchar_t* ApcChar, ZTypInt AI_Length){ return ::wcstol(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
ZTypLLong ZftAtoLL(const TTypChar* ApcChar, ZTypInt AI_Length){ return 0; }
template<> inline
ZTypLLong ZftAtoLL(const char* ApcChar, ZTypInt AI_Length){ return ZfAtoLL(ApcChar); }
template<> inline
ZTypLLong ZftAtoLL(const wchar_t* ApcChar, ZTypInt AI_Length){ return ::wcstoll(ApcChar, 0, 0) ; }
template<typename TTypChar> inline
double ZftAtoD (const TTypChar* ApcChar, ZTypInt AI_Length){ return 0; }
template<> inline
double ZftAtoD (const char* ApcChar, ZTypInt AI_Length){ return ZfAtoD(ApcChar); }
template<> inline
double ZftAtoD (const wchar_t* ApcChar, ZTypInt AI_Length){ return ::wcstod(ApcChar, 0) ; }
inline ZTypLLong AtoLL(const char* ApcChar){return ZfAtoLL(ApcChar);}
inline ZTypLong AtoL (const char* ApcChar){return ZfAtoL (ApcChar);}
inline ZTypIntI AtoI (const char* ApcChar){return ZfAtoI (ApcChar);}
inline double AtoD (const char* ApcChar){return ZfAtoD (ApcChar);}
inline ZTypLLong AtoLL(const char* ApcChar, ZTypIntI AI_Length)
{ return ZfAToInt<ZTypLLong>(ApcChar, AI_Length); }
inline ZTypLong AtoL (const char* ApcChar, ZTypIntI AI_Length)
{ return ZfAToInt<ZTypLong >(ApcChar, AI_Length); }
inline ZTypIntI AtoI (const char* ApcChar, ZTypIntI AI_Length)
{ return ZfAToInt<ZTypIntI >(ApcChar, AI_Length); }
2021-02-25 16:23:13 +09:00
template<typename TTypeCh> inline
ZTypLength ZftGetLength(const TTypeCh* ApcChar)
2021-02-25 16:23:13 +09:00
{
2021-02-25 17:47:58 +09:00
if(ApcChar==0) return 0;
ZTypLength VL_Length=0;
2021-02-25 17:47:58 +09:00
while(*(ApcChar+VL_Length)!=TTypeCh('\0'))
2021-02-25 17:47:58 +09:00
++VL_Length;
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
2021-02-25 17:47:58 +09:00
return VL_Length;
2021-02-25 16:23:13 +09:00
}/*
template<typename TTypeCh> inline
ZTypLength ZftGetLength(const TTypeCh* ApcChar) */
2021-02-25 16:23:13 +09:00
template<typename TTypeSize, typename TTypeCh>
inline TTypeSize ZftGetLengthType(const TTypeCh* ApcChar)
2021-02-25 16:23:13 +09:00
{
if(ApcChar==0) return 0;
2021-02-25 17:45:17 +09:00
TTypeSize VL_Length=0 ;
2021-02-25 16:23:13 +09:00
while(*(ApcChar+VL_Length)!=_T('\0'))
++VL_Length;
2021-02-25 17:45:17 +09:00
/////////////////////////////////////
return VL_Length;
2021-02-25 16:23:13 +09:00
}/*
template<typename TTypeSize, typename TTypeCh>
inline TTypeSize ZftGetLengthType(const TTypeCh* ApcChar) */
template<typename TTypeCh>
inline ZTypLength ZftLength(const TTypeCh* ApcChar)
{
return ZftGetLength(ApcChar);
}/*
template<typename TTypeCh>
inline ZTypLength ZftLength(const TTypeCh* ApcChar) */
template<typename TTypeSize, typename TTypeCh>
inline TTypeSize ZftLengthType(const TTypeCh* ApcChar)
{
return ZftGetLengthType<TTypeSize, TTypeCh>(ApcChar);
}/*
template<typename TTypeSize, typename TTypeCh>
inline TTypeSize ZftLengthType(const TTypeCh* ApcChar) */
2021-02-25 16:23:13 +09:00
/*//////////////////////////////////////////////////////////////////////////////////////
ZftCopyChars() AL_DestSize , ZNsWin.H CRegistry
Windows Strsafe.h StringCchCopy() . mingw
Strsafe.h . StringCchCopy() .
2021-02-25 16:23:13 +09:00
HRESULT StringCchCopy(
__out LPTSTR pszDest,
__in size_t cchDest,
__in LPCTSTR pszSrc
);
This function can return one of the following values. It is strongly recommended
that you use the SUCCEEDED and FAILED macros to test the return value of this function.
Return code
S_OK : Source data was present, fully copied without truncation, and the resultant
destination buffer is null-terminated.
STRSAFE_E_INVALID_PARAMETER : The value in cchDest is either 0 or larger than STRSAFE_MAX_CCH.
STRSAFE_E_INSUFFICIENT_BUFFER : The copy operation failed due to insufficient buffer
space. The destination buffer contains a truncated, null-terminated version of the
intended result. In situations where truncation is acceptable, this may not necessarily
be seen as a failure condition.
-- 2012-08-15 07:40:00
//////////////////////////////////////////////////////////////////////////////////////*/
template<typename TTypeCh, typename TTypeSize> TTypeSize
ZftCopyChars(TTypeCh* ApcDest, TTypeSize AL_DestSize, const TTypeCh* ApcSource)
2021-02-25 16:23:13 +09:00
{
/* ApcSource must be null-terminated. AL_DestSize
must be equal to or more than strlen(ApcSource)+1.
Null ApcDest .
*/
typedef const TTypeCh TTypcCh;
2021-02-25 16:23:13 +09:00
if(ApcSource==0) return 0 ;
2021-02-25 16:23:13 +09:00
TTypeSize VL_SourceSize=0 ;
TTypeCh* VPC_Dest =ApcDest ;
TTypcCh* VPC_Source =ApcSource;
2021-02-25 16:23:13 +09:00
for(; VL_SourceSize<AL_DestSize; ++VL_SourceSize)
{
if(*ApcSource==0)
{
if(VL_SourceSize<AL_DestSize+1)
{ *VPC_Dest=0; return VL_SourceSize+1; }
2021-02-25 16:23:13 +09:00
return VL_SourceSize;
}/*
if(*ApcSource==0)*/
*VPC_Dest = *VPC_Source;
}/*
for(; VL_SourceSize<AL_DestSize; ++VL_SourceSize)*/
}/*
template<typename TTypeCh, typename TTypeSize> TTypeSize
ZftCopyChars(TTypeCh* ApcDest, TTypeSize AL_DestSize, const TTypeCh* ApcSource) */
2021-02-25 16:23:13 +09:00
/*######################################################################################
ZtCInit<>, ZCInit .
1) data OnInit() .
2) data OnFini() .
2) .
, Onfini()
.
-- 2025-09-11 11:00
container typename TType2 , container .
-- 2025-09-11 11:03
######################################################################################*/
2021-02-25 16:23:13 +09:00
template<typename TType> class ZtCInit
{
public:
enum{ZEUseInit=0};
enum{ZEUseFini=0};
2021-02-25 16:23:13 +09:00
public:
template<typename TType2>
static void OnInit(TType& AR_TypeArg, TType2& AR_TypeArg2){}
template<typename TType2>
static void OnFini(TType& AR_TypeArg, TType2& AR_TypeArg2){}
2021-02-25 16:23:13 +09:00
public:
};/*
template<typename TType> class ZtCInit*/
class ZCInit
{
public:
enum{ZEUseInit=0};
enum{ZEUseFini=0};
public:
template<typename TType, typename TType2>
static void OnInit(TType& AR_TypeArg, TType2& AR_TypeArg2){}
template<typename TType, typename TType2>
static void OnFini(TType& AR_TypeArg, TType2& AR_TypeArg2){}
2021-02-25 16:23:13 +09:00
public:
};/*
class ZCInit*/
class ZCExceptBase
2021-02-25 16:23:13 +09:00
{
public: void* operator()(){return 0;}
};/*
class ZCExceptBase*/
2021-02-25 16:23:13 +09:00
// 예외 기반 클래스를 template 로 하면 여러 기법을 사용할 수 있다.
template< typename TType, typename TypeArg=const TType&
>
class ZtCExceptBase /*/////////////////////////////////*/
2021-02-25 16:23:13 +09:00
{
protected:
TType mo_Type;
public :
ZtCExceptBase(){}
2021-02-25 16:23:13 +09:00
ZtCExceptBase(TypeArg TypeArgObj):mo_Type(TypeArgObj){}
2021-02-25 16:23:13 +09:00
TType& operator()(){return mo_Type;}
public :
};/*
template< typename TType, typename TypeArg=const TType&
>
class ZtCExceptBase ///////////////////////////////////*/
2021-02-25 16:23:13 +09:00
/*/////////////////////////////////////////////////////////////////////////////////
private .
template class class member template , class object
, ,
class class .
, CAsyncServ_H CAsyncServ_T<> ,
.
-- 2010-12-20 23:51:00
/////////////////////////////////////////////////////////////////////////////////*/
class ZCNonCopyable
2021-02-25 16:23:13 +09:00
{
private:
ZCNonCopyable(const ZCNonCopyable& rhs){}
ZCNonCopyable& operator=(const ZCNonCopyable& rhs){return *this;}
2021-02-25 16:23:13 +09:00
public :
ZCNonCopyable(){}
2021-02-25 16:23:13 +09:00
public :
};/*
class ZCNonCopyable*/
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////////////
- - class
class ZCFreeAllocBase . object
.
///////////////////////////////////////////////////////////////////////////*/
class ZCFreeAllocBase
{
public:
virtual ~ZCFreeAllocBase(){}
virtual long GetHeapSize() const{return 0;}
virtual long GetMemSize () const{return 0;}
const char* GetTypeName() const
{
return typeid(*this).name();
}/*
const char* GetTypeName() const*/
virtual void DeleteAllInHeap(){}
public:
};/*
class ZCFreeAllocBase*/
namespace ZNsIFace
{
// 자료 구조에서 자유 기억 공간을 구현하는 interface
class ZIFreeHeap
{
public:
template<typename TLinkList> class ZtCBody
{
public:
typedef typename TLinkList::ZCLink ZCLink ;
typedef typename TLinkList::TypeSize TypeSize;
public:
_NP_ void RecvFreeIn(ZCLink* AP_CutLink){}
_NP_ void RecvFreeIn /////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
{ } //////////////////////////////////////
_NP_ ZCLink* SendFreeOut(){}
_NP_ void SendFreeOut /////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_NewHead,
ZCLink*& APR_NewTail
)
{ } //////////////////////////////////////
_NP_ void SendFreeOutCopy /*//////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
{ } /*//////////////////////////////////////////////////*/
_NP_ void DeleteHeap(){}
_NP_ void MakeEuqal(ZtCBody& rhs)
{
}/*
_NP_ void MakeEuqal(ZtCBody& rhs)*/
_NP_ TypeSize GetUseHeapSize() const
{
return 0;
}/*
_NP_ TypeSize GetUseHeapSize() const*/
_NP_ TypeSize GetAllHeapSize() const
{
return 0;
}/*
_NP_ TypeSize GetAllHeapSize() const*/
_NP_ TypeSize size() const
{
return GetUseHeapSize();
}/*
_NP_ TypeSize size() const*/
public:
};/*
template<typename TLinkList> class ZtCBody*/
public:
};/*
class ZIFreeHeap*/
}/*
namespace ZNsIFace*/
namespace ZNsIFaceEx
{
/*################################################################
interface
class ,
ZtCFreeHeapSngl<> ,
ZtCFreeHeapCDL <> .
,
ZtCFreeHeapSngl<>::ZCLink ZtCFreeHeapCDL<>::ZCLink
friend .
template<int>
friend class ZNsIFaceEx::ZtCFreeHeapSngl ;
################################################################*/
template<int TTypIListKind=0> class ZtCFreeHeapSngl // Single List
{
public:
template<typename TSnglList> class ZtCBody
{
public:
typedef typename TSnglList::ZCLink ZCLink ;
typedef typename TSnglList::TypeSize TypeSize;
/*:::::::::::::::::::::::::::::::::::::::::::::::::::
ZCLink non-public ,
ZCLink ZtCBody friend
, friend , ZCLink
class class
.
-- 2025-09-14 12:34
:::::::::::::::::::::::::::::::::::::::::::::::::::*/
public:
_NP_ void RecvFreeIn(ZCLink* AP_CutLink){delete AP_CutLink;}
_NP_ void RecvFreeIn ///////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
////////////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr();
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
////////////////////////////////////////////////////////////
_NP_ ZCLink* SendFreeOut(){return new ZCLink;}
_NP_ void SendFreeOut ///////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
////////////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}
////////////////////////////////////////////////////////////
_NP_ void SendFreeOutCopy /*////////////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
//////////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊.
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink( **AP_LinkOrgin );
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
_NP_ void SendFreeOutCopy ////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
////////////////////////////////////////////////////////*/
_NP_ void DeleteHeap(){}
_NP_ void MakeEuqal(ZtCBody& rhs)
{
}/*
_NP_ void MakeEuqal(ZtCBody& rhs)*/
_NP_ TypeSize GetUseHeapSize() const
{
return 0;
}/*
_NP_ TypeSize GetUseHeapSize() const*/
_NP_ TypeSize size() const
{
return GetUseHeapSize();
}/*
_NP_ TypeSize size() const*/
public:
};/*
template<typename TSnglList> class ZtCBody*/
public:
};/*
template<int TTypIListKind=0> class ZtCFreeHeapSngl*/
template<int TTypIListKind=0> class ZtCFreeHeapCDL // Circular Double List
{
public:
template<typename TLinkList> class ZtCBody
{
public:
typedef typename TLinkList::ZCLink ZCLink ;
typedef typename TLinkList::TypeSize TypeSize;
public:
_NP_ void RecvFreeIn(ZCLink* AP_CutLink){delete AP_CutLink;}
_NP_ void RecvFreeIn ///////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
////////////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr() ;
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
////////////////////////////////////////////////////////////
_NP_ ZCLink* SendFreeOut(){return new ZCLink;}
_NP_ void SendFreeOut ///////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
////////////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}
////////////////////////////////////////////////////////////
_NP_ void SendFreeOutCopy /*////////////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
//////////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
_NP_ void SendFreeOutCopy ////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
////////////////////////////////////////////////////////*/
_NP_ void DeleteHeap(){}
_NP_ void MakeEuqal(ZtCBody& rhs)
{
}/*
_NP_ void MakeEuqal(ZtCBody& rhs)*/
_NP_ TypeSize GetUseHeapSize() const
{
return 0;
}/*
_NP_ TypeSize GetUseHeapSize() const*/
_NP_ TypeSize size() const
{
return GetUseHeapSize();
}/*
_NP_ TypeSize size() const*/
public:
};/*
template<typename TLinkList> class ZtCBody*/
public:
};/*
template<int TTypIListKind=0> class ZtCFreeHeapCDL*/
}/*
namespace ZNsIFaceEx*/
namespace ZNsConst
{
// cf) ZtCSimList, ZtObjList
const int CI_ListKind_Single = 10 ;
const int CI_ListKind_Double = 20 ;
}/*
namespace ZNsConst*/
2021-02-25 16:23:13 +09:00
/*//////////////////////////////////////////////////////////////////
릿 object
, object
object enum typedef
. object 릿
ZtCObjPtr<> .
2021-02-25 16:23:13 +09:00
typedef ZtCStringBase<char > CStringBase;
typedef ZtCObjPtr <CStringBase> CObjectPtr ;
2021-02-25 16:23:13 +09:00
CStringBase::TypeChar
2021-02-25 16:23:13 +09:00
CObjectPtr::TypeData::TypeChar .
2021-02-25 16:23:13 +09:00
ZtCObjPtr<>
2021-02-25 16:23:13 +09:00
ZtCTypeData<> . .
-- 2010-01-24 22:25:00
//////////////////////////////////////////////////////////////////*/
template
<typename TType, typename TTypArgu=const TType&>
class ZtCObjPtr
2021-02-25 16:23:13 +09:00
{
public :
typedef TType TypeData ;
typedef TTypArgu TypeArg ;
2021-02-25 16:23:13 +09:00
protected:
TypeData& mr_TypeData;
2021-02-25 16:23:13 +09:00
public :
ZtCObjPtr(TType& AR_CData) : mr_TypeData(AR_CData ){}
ZtCObjPtr(ZtCObjPtr& AR_Rhs ) : mr_TypeData(AR_Rhs.mr_TypeData){}
2021-02-25 16:23:13 +09:00
TypeData* operator->(){return &mr_TypeData;}
TypeData& operator* (){return mr_TypeData;}
operator TypeData& (){return mr_TypeData;}
2021-02-25 16:23:13 +09:00
ZtCObjPtr& operator=(const ZtCObjPtr& rhs)
{
if(this==&rhs) return *this;
mr_TypeData = rhs.mr_TypeData; return *this;
}/*
ZtCObjPtr& operator=(const ZtCObjPtr& rhs)*/
ZtCObjPtr& operator=(TTypArgu AO_ArguData)
{
mr_TypeData = AO_ArguData; return *this;
}/*
ZtCObjPtr& operator=(TTypArgu AO_ArguData)*/
2021-02-25 16:23:13 +09:00
public :
};/*
template
<typename TType, typename TTypArgu=const TType&>
class ZtCObjPtr
*/
template<typename TType> class ZtCObjOpt // C++ 17 에 추가된 optional 구현
{
public :
typedef TType TypeData;
protected:
TypeData* mp_TypeData ;
public :
ZtCObjOpt(TypeData& AR_CData) : mp_TypeData(&AR_CData ){}
ZtCObjOpt(TypeData* AP_CData) : mp_TypeData( AP_CData ){}
ZtCObjOpt(ZtCObjOpt& AR_Rhs ) : mp_TypeData(AR_Rhs.mp_TypeData){}
TypeData* operator->(){return mp_TypeData;}
TypeData& operator* (){return *mp_TypeData;}
TypeData& operator()(){return *mp_TypeData;}
operator TypeData& (){return *mp_TypeData;}
const TypeData* operator->() const{return mp_TypeData;}
const TypeData& operator* () const{return *mp_TypeData;}
const TypeData& operator()() const{return *mp_TypeData;}
operator const TypeData& () const{return *mp_TypeData;}
ZtCObjOpt& operator=(const ZtCObjOpt& rhs)
{ mp_TypeData=rhs.mp_TypeData; return *this; }
operator bool () const{return mp_TypeData!=0;}
bool has_value () const{return mp_TypeData!=0;}
/***/ TypeData& value() {return *mp_TypeData;}
const TypeData& value() const{return *mp_TypeData;}
TypeData* Raw() const{return mp_TypeData;}
public :
};/*
template<typename TType> class ZtCObjOpt */
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////
2021-02-25 16:23:13 +09:00
object heap , .
-- 2014-07-20 04:49:00
///////////////////////////////////////////////////////////*/
2021-02-25 16:23:13 +09:00
template< typename TType, typename TAllocClass=ZCAllocClass
>
class ZtCObjNew : public TAllocClass ////////////////////////
2021-02-25 16:23:13 +09:00
{
public :
typedef TType TypeData ;
2021-02-25 16:23:13 +09:00
typedef TAllocClass ZCAllocator;
typedef TAllocClass ZCAlloClass;
2021-02-25 16:23:13 +09:00
private:
struct StTypeRefCnt
{
TType MO_TypeData;
ZTypInt MI_RefCount;
StTypeRefCnt(){MI_RefCount=0;}
};/*
struct StTypeRefCnt*/
private:
StTypeRefCnt* mp_StTypeRefCnt;
public :
ZtCObjNew()
2021-02-25 16:23:13 +09:00
{
mp_StTypeRefCnt = (StTypeRefCnt*)
this->ZCAllocator::InitMem(sizeof(StTypeRefCnt));
2021-02-25 16:23:13 +09:00
mp_StTypeRefCnt->MI_RefCount = 1 ;
new(&mp_StTypeRefCnt->MO_TypeData) TypeData;
}/*
ZtCObjNew()*/
2021-02-25 16:23:13 +09:00
ZtCObjNew(const TypeData& AR_TypeData)
2021-02-25 16:23:13 +09:00
{
mp_StTypeRefCnt = (StTypeRefCnt*)
this->ZCAllocator::InitMem(sizeof(StTypeRefCnt));
2021-02-25 16:23:13 +09:00
mp_StTypeRefCnt->MI_RefCount = 1 ;
new(&mp_StTypeRefCnt->MO_TypeData) TypeData(AR_TypeData);
}/*
ZtCObjNew(const TypeData& AR_TypeData)*/
2021-02-25 16:23:13 +09:00
template<typename TTypeArg1, typename TTypeArg2>
ZtCObjNew(TTypeArg1& ArTTypeArg1, TTypeArg2& ArTTypeArg2)
2021-02-25 16:23:13 +09:00
{
mp_StTypeRefCnt = (StTypeRefCnt*)
this->ZCAllocator::InitMem(sizeof(StTypeRefCnt));
2021-02-25 16:23:13 +09:00
mp_StTypeRefCnt->MI_RefCount = 1 ;
new(&mp_StTypeRefCnt->MO_TypeData)
TypeData(ArTTypeArg1, ArTTypeArg2);
}/*
template<typename TTypeArg1, typename TTypeArg2>
ZtCObjNew(TTypeArg1& ArTTypeArg1, TTypeArg2& ArTTypeArg2))*/
2021-02-25 16:23:13 +09:00
ZtCObjNew(const ZtCObjNew& rhs)
2021-02-25 16:23:13 +09:00
{
mp_StTypeRefCnt = rhs.mp_StTypeRefCnt ;
++mp_StTypeRefCnt->MI_RefCount ;
2021-02-25 16:23:13 +09:00
}/*
ZtCObjNew(const ZtCObjNew& rhs)*/
2021-02-25 16:23:13 +09:00
~ZtCObjNew()
2021-02-25 16:23:13 +09:00
{
if(--mp_StTypeRefCnt->MI_RefCount <= 0)
this->ZCAllocator::FiniMem(mp_StTypeRefCnt);
2021-02-25 16:23:13 +09:00
}/*
~ZtCObjNew()*/
2021-02-25 16:23:13 +09:00
ZtCObjNew& operator=(const ZtCObjNew& rhs)
2021-02-25 16:23:13 +09:00
{
if(this==&rhs || mp_StTypeRefCnt==rhs.mp_StTypeRefCnt)
{ return *this; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++*/
2021-02-25 16:23:13 +09:00
#if(_CODE_OLD_)
mp_StTypeRefCnt->MO_TypeData =
rhs.mp_StTypeRefCnt->MO_TypeData ;
#else
/*//////////////////////////////////////////////
ZtCObjNew ,
.
**this = *rhs
. -- 2025-10-05 21:42
//////////////////////////////////////////////*/
if(--mp_StTypeRefCnt->MI_RefCount <= 0)
this->ZCAllocator::FiniMem(mp_StTypeRefCnt);
mp_StTypeRefCnt = rhs.mp_StTypeRefCnt ;
++mp_StTypeRefCnt->MI_RefCount ;
#endif
return *this; /*::::::::::::::::::::::::::::::*/
2021-02-25 16:23:13 +09:00
}/*
ZtCObjNew& operator=(const ZtCObjNew& rhs)*/
2021-02-25 16:23:13 +09:00
ZtCObjNew& operator=(const TypeData& AR_TypeData)
2021-02-25 16:23:13 +09:00
{
if(&mp_StTypeRefCnt->MO_TypeData==&AR_TypeData) return *this;
mp_StTypeRefCnt->MO_TypeData = AR_TypeData; return *this;
2021-02-25 16:23:13 +09:00
}/*
ZtCObjNew& operator=(const TypeData& AR_TypeData)*/
2021-02-25 16:23:13 +09:00
TypeData& operator* (){return mp_StTypeRefCnt->MO_TypeData;}
TypeData* operator->(){return &mp_StTypeRefCnt->MO_TypeData;}
operator TypeData& (){return mp_StTypeRefCnt->MO_TypeData;}
ZTypInt GetRefCnt () const{return mp_StTypeRefCnt->MI_RefCount;}
TypeData& GetObjRef () const{return &mp_StTypeRefCnt->MO_TypeData;}
2021-02-25 16:23:13 +09:00
public :
};/*
template< typename TType, typename TAllocClass=ZCAllocClass
>
class ZtCObjNew : public TAllocClass //////////////////////*/
2021-02-25 16:23:13 +09:00
#ifdef _DEBUG
/*/////////////////////////////////////////////////////////////////////
_REENTRANT .
_REENTRANT .
-- 2009-12-23 10:38:00
/////////////////////////////////////////////////////////////////////*/
inline void _DEBUG_REENTRANT_Check()
{
if(_REENTRANT_BOOL_<1)
{
std::fstream fileout("DEBUG.txt", std::ios::out | std::ios::app);
fileout<<"◆◆ Error! : _REENTRANT is Not Defined In Multi-Thread"<<std::endl;
fileout.close();
::exit(1);
}/*
if(_REENTRANT_BOOL_<1)*/
}/*
inline void _DEBUG_REENTRANT_Check()*/
#define _DEBUG_REENTRANT_CHECK_ _DEBUG_REENTRANT_Check();
#else // !defined(_DEBUG)
#define _DEBUG_REENTRANT_CHECK_
#endif // !defined(_DEBUG)
#if defined(_REENTRANT)
class ZCExceptSmallLock : public ZCExceptBase
2021-02-25 16:23:13 +09:00
{
private:
long ml_ErrCode;
string mo_ErrMSG ;
public :
ZCExceptSmallLock(long AL_ErrCode, const char* AP_ErrMSG)
{
ml_ErrCode=AL_ErrCode; //////////////
if(AP_ErrMSG!=0) mo_ErrMSG=AP_ErrMSG;
}/*
ZCExceptSmallLock(long AL_ErrCode, const char* AP_ErrMSG)*/
long GetErrCode() const{return ml_ErrCode;}
const string& GetErrMSG () const{return mo_ErrMSG ;}
2021-02-25 16:23:13 +09:00
public:
};/*
class ZCExceptSmallLock : public ZCExceptBase*/
2021-02-25 16:23:13 +09:00
#endif //defined(_REENTRANT)
#if defined(_REENTRANT) && defined(_WIN)
/*//////////////////////////////////////////////////////
object .
BOOL TryEnterCriticalSection(LPCRITICAL_SECTION)
.
//////////////////////////////////////////////////////*/
class ZCMutexSmallLock;
class ZCMutexSmallInit
{
private:
HANDLE mh_Mutex;
public :
/*/////////////////////////////////////////////////////////
Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest
# g++.exe -o ZtCArray_000_mw.exe ZtCArray_000.cpp -I../
In file included from ../ZCppMain/ZtCArray.H:7,
from ZtCArray_000.cpp:4:
../ZCppMain/ZMainHead.H:3115:21: error: ISO C++17 does not allow dynamic exception specifications
3115 | void Lock() throw(ZCExceptSmallLock&)
/////////////////////////////////////////////////////////*/
void Lock() /*throw(ZCExceptSmallLock&)*/
2021-02-25 16:23:13 +09:00
{
long VL_ErrCode=0;
if((VL_ErrCode = ::WaitForSingleObject(mh_Mutex, INFINITE))==WAIT_ABANDONED)
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::Lock()");
}/*
if((VL_ErrCode = ::WaitForSingleObject(mh_Mutex, INFINITE))==WAIT_ABANDONED)*/
}/*
void Lock() //throw(ZCExceptSmallLock&)*/
2021-02-25 16:23:13 +09:00
void UnLock()
{
::ReleaseMutex(mh_Mutex);
}/*
void UnLock()*/
ZCMutexSmallInit()
{
/* MUTEX 를 신호 상태로 만들고 이 함수를 호출한 쓰레드가 MUTEX 를 소유하지 않게
. . */
mh_Mutex = ::CreateMutex(NULL, FALSE, NULL);
}/*
ZCMutexSmallInit()*/
~ZCMutexSmallInit()
{
::CloseHandle(mh_Mutex);
}/*
~ZCMutexSmallInit()*/
public:
};/*
class ZCMutexSmallInit*/
class ZCMutexSmallLock
{
private:
ZCMutexSmallInit& mr_ZCMutexInit;
public :
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit):mr_ZCMutexInit(ArZCMutexInit)
{
mr_ZCMutexInit.Lock();
}/*
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit)*/
~ZCMutexSmallLock()
{
mr_ZCMutexInit.UnLock();
}/*
~ZCMutexSmallLock()*/
public:
};/*
class ZCMutexSmallLock*/
#elif defined(_REENTRANT) && defined(__unix__)
// 유닉스(특히 리눅스) 상에서 _REENTRANT 이 정의되어 있으면
// -lpthread 옵션을 잊지 말 것.
class ZCMutexSmallLock;
class ZCMutexSmallInit
{
private:
::pthread_mutex_t mo_Mutex;
public :
void Lock() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode = ::pthread_mutex_lock(&mo_Mutex))!=0)
2021-02-25 16:23:13 +09:00
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::Lock()");
}/*
if((VL_ErrCode = ::pthread_mutex_lock(&mo_Mutex))!=0)*/
2021-02-25 16:23:13 +09:00
}/*
void Lock() throw(ZCExceptSmallLock&)*/
void UnLock() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode=::pthread_mutex_unlock(&mo_Mutex))!=0)
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::UnLock()");
}/*
if((VL_ErrCode=::pthread_mutex_unlock(&mo_Mutex))!=0)*/
}/*
void UnLock() throw(ZCExceptSmallLock&)*/
ZCMutexSmallInit() throw(ZCExceptSmallLock&)
{
::pthread_mutexattr_t VO_MutexAttr;
::pthread_mutexattr_init(&VO_MutexAttr);
::pthread_mutexattr_settype(&VO_MutexAttr, PTHREAD_MUTEX_RECURSIVE);
long VL_ErrCode=0;
if((VL_ErrCode = ::pthread_mutex_init(&mo_Mutex, &VO_MutexAttr))!=0)
2021-02-25 16:23:13 +09:00
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::ZCMutexSmallInit()");
}/*
if((VL_ErrCode = ::pthread_mutex_init(&mo_Mutex, &VO_MutexAttr))!=0)*/
2021-02-25 16:23:13 +09:00
}/*
ZCMutexSmallInit() throw(ZCExceptSmallLock&)*/
~ZCMutexSmallInit() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode = ::pthread_mutex_destroy(&mo_Mutex))!=0)
2021-02-25 16:23:13 +09:00
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::~ZCMutexSmallInit()");
}/*
if((VL_ErrCode = ::pthread_mutex_destroy(&mo_Mutex))!=0)*/
2021-02-25 16:23:13 +09:00
}/*
~ZCMutexSmallInit() throw(ZCExceptSmallLock&)*/
public:
};/*
class ZCMutexSmallInit*/
class ZCMutexSmallLock
{
private:
ZCMutexSmallInit& mr_ZCMutexInit;
public :
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit):mr_ZCMutexInit(ArZCMutexInit)
{
mr_ZCMutexInit.Lock();
}/*
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit)*/
~ZCMutexSmallLock()
{
mr_ZCMutexInit.UnLock();
}/*
~ZCMutexSmallLock()*/
public:
};/*
class ZCMutexSmallLock*/
// defined(_REENTRANT) && defined(__unix__)
#elif defined(_REENTRANT)
// _REENTRANT 이 정의되어 있으면 -lpthread 옵션을 잊지 말 것.
class ZCMutexSmallLock;
class ZCMutexSmallInit
{
private:
::pthread_mutex_t mo_Mutex;
public :
void Lock() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode=::pthread_mutex_lock(&mo_Mutex))!=0)
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::Lock()");
}/*
if((VL_ErrCode=::pthread_mutex_lock(&mo_Mutex))!=0)*/
}/*
void Lock() throw(ZCExceptSmallLock&)*/
void UnLock() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode=::pthread_mutex_unlock(&mo_Mutex))!=0)
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::UnLock()");
}/*
if((VL_ErrCode=::pthread_mutex_unlock(&mo_Mutex))!=0)*/
}/*
void UnLock() throw(ZCExceptSmallLock&)*/
ZCMutexSmallInit() throw(ZCExceptSmallLock&)
{
::pthread_mutexattr_t VO_MutexAttr;
::pthread_mutexattr_init(&VO_MutexAttr);
::pthread_mutexattr_settype(&VO_MutexAttr, PTHREAD_MUTEX_RECURSIVE);
long VL_ErrCode=0;
if((VL_ErrCode= ::pthread_mutex_init(&mo_Mutex, &VO_MutexAttr))!=0)
2021-02-25 16:23:13 +09:00
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::ZCMutexSmallInit()");
}/*
if((VL_ErrCode= ::pthread_mutex_init(&mo_Mutex, &VO_MutexAttr))!=0)*/
2021-02-25 16:23:13 +09:00
}/*
ZCMutexSmallInit() throw(ZCExceptSmallLock&)*/
~ZCMutexSmallInit() throw(ZCExceptSmallLock&)
{
long VL_ErrCode=0;
if((VL_ErrCode= ::pthread_mutex_destroy(&mo_Mutex))!=0)
2021-02-25 16:23:13 +09:00
{
throw ZCExceptSmallLock(VL_ErrCode, "ZCMutexSmallInit::~ZCMutexSmallInit()");
}/*
if((VL_ErrCode= ::pthread_mutex_destroy(&mo_Mutex))!=0)*/
2021-02-25 16:23:13 +09:00
}/*
~ZCMutexSmallInit() throw(ZCExceptSmallLock&)*/
public:
};/*
class ZCMutexSmallInit*/
class ZCMutexSmallLock
{
private:
ZCMutexSmallInit& mr_ZCMutexInit;
public :
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit):mr_ZCMutexInit(ArZCMutexInit)
{
mr_ZCMutexInit.Lock();
}/*
ZCMutexSmallLock(ZCMutexSmallInit& ArZCMutexInit)*/
~ZCMutexSmallLock()
{
mr_ZCMutexInit.UnLock();
}/*
~ZCMutexSmallLock()*/
public :
};/*
class ZCMutexSmallLock*/
#endif //defined(_REENTRANT)
#if defined(_DEBUG) && defined(_REENTRANT)
class ZCSyncLog
{
private :
typedef ZCMutexSmallInit ZCSync;
2021-02-25 16:23:13 +09:00
protected:
static ZCSync& GetCSync()
2021-02-25 16:23:13 +09:00
{
static ZCSync SO_CSyncLog; return SO_CSyncLog;
2021-02-25 16:23:13 +09:00
}/*
static ZCSync& GetCSync()*/
2021-02-25 16:23:13 +09:00
public :
ZCSyncLog (){GetCSync().Lock ();}
~ZCSyncLog(){GetCSync().UnLock();}
public :
};/*
class ZCSyncLog*/
#endif // defined(_DEBUG) && defined(_REENTRANT)
#ifdef _DEBUG
static inline void ZfWriteError(const char* ApcErrorStr)
2021-02-25 16:23:13 +09:00
{
std::fstream fileout(
"DEBUG.txt", std::ios::out | std::ios::app);
fileout<<ApcErrorStr<<std::endl;
fileout.close();
::exit(1);
}/*
static inline void ZfWriteError(const char* ApcErrorStr)*/
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////
object object container .
container (DEBUG )
Stack container new
. container container new,
delete .
///////////////////////////////////////////////////////////////////*/
class ZCCheckAlloc
{
public :
class ZCAllowAlloc; friend class ZCAllowAlloc;
private:
static bool& GetAllowAllocBool()
{
static bool SB_AllowAlloc=false; return SB_AllowAlloc;
}/*
static bool& GetAllowAllocBool()*/
/*private:*/
public :
ZCCheckAlloc()
{
if(GetAllowAllocBool()==false)
{
cout<<endl<<"Warning! Unallowed Object Memory Allocation!"<<endl<<endl;
}/*
if(GetAllowAllocBool()==false)*/
}/*
ZCCheckAlloc()*/
static bool IsAllowAlloc()
{
return GetAllowAllocBool();
}/*
static bool IsAllowAlloc()*/
/*public:*/
public:
class ZCAllowAlloc
{
private:
bool mb_AllowAlready ;
/*///////////////////////////////////////////////////////
ZCAllowAlloc object
,
ZCCheckAlloc::GetAllowAllocBool()=false;
.
ZCCheckAlloc::GetAllowAllocBool() true .
--
///////////////////////////////////////////////////////*/
/*private:*/
public :
ZCAllowAlloc()
{
mb_AllowAlready=ZCCheckAlloc::GetAllowAllocBool();
ZCCheckAlloc::GetAllowAllocBool()=true; //////////
}/*
ZCAllowAlloc()*/
~ZCAllowAlloc()
{
if(mb_AllowAlready==false)
ZCCheckAlloc::GetAllowAllocBool()=false;
2021-02-25 16:23:13 +09:00
}/*
ZCAllowAlloc()*/
public:
};/*
class ZCAllowAlloc()*/
public:
};/*
class ZCCheckAlloc*/
#endif //_DEBUG
2021-02-25 16:23:13 +09:00
/*###################################################################
template<typename TClass, typename TTypInt> class ZtCCount
DEBUG
. -- 2025-10-10 21:43
###################################################################*/
template<typename TClass, typename TTypInt=ZTypLong> class ZtCCount
{
public :
typedef TTypInt TypeInt ;
typedef TClass TypeData;
private:
static TypeInt msi_Count;
public :
/*******************************************************************/
static TypeInt Curr (){return ZtCCount::msi_Count;}
/*******************************************************************/
static TypeInt Plus (ZTypLong AL_Plus=1)
{ return ZtCCount::msi_Count += AL_Plus; }
static TypeInt Minus(ZTypLong AL_Plus=1)
{ return ZtCCount::msi_Count -= AL_Plus; }
/*******************************************************************/
public :
};/*
template<typename TClass, typename TTypInt=ZTypLong> class ZtCCount*/
/*******************************************************************/
template<typename TClass, typename TTypInt>
TTypInt ZtCCount<TClass, TTypInt>::msi_Count= 0 ;
/*******************************************************************/
2021-02-25 16:23:13 +09:00
namespace ZNsConst
{
#if defined(_WIN)
#define __DIR_DELIMITERS__ "\\"
#define __DIR_DELIMITER__ '\\'
ZTypCPCCh CPC_DirDelimiter="\\";
ZTypCChar CC_DirDelimiter ='\\';
ZTypCPCCh CPC_Delm ="\\";
ZTypCChar CC_Delm ='\\';
2021-02-25 16:23:13 +09:00
#else //!(defined(_WIN)
#define __DIR_DELIMITERS__ "/"
#define __DIR_DELIMITER__ '/'
ZTypCPCCh CPC_DirDelimiter="/" ;
ZTypCChar CC_DirDelimiter ='/' ;
ZTypCPCCh CPC_Delm ="/" ;
ZTypCChar CC_Delm ='/' ;
2021-02-25 16:23:13 +09:00
#endif //!(defined(_WIN)
}/*
namespace ZNsConst*/
template<typename TStringData> TStringData& ZftConvertXhtml(TStringData& ARRoCString)
{
/* 데이타를 그대로 클라이언트에 전송하면, HTML 태그와
, .
*/
return ARRoCString.
Replace("&" ,"&amp;" ). Replace("<" ,"&lt;" ).
Replace(">" ,"&gt;" ). Replace(" " ,"&nbsp;").
Replace("\n","<br />" );
}/*
template<typename TStringData> TStringData& ConvertXhtml(TStringData& ARRoCString) */
template<typename TStringData> TStringData& ZftMakeXmlAttEnc(TStringData& ARRoCStringData)
{
return ARRoCStringData.
Replace("&" , "&amp;" ).Replace("\r", "&#xA;" ).
Replace("\n", "&#xD;" ).Replace("\t", "&#x9;" ).
Replace("\"", "&quot;").Replace(">" , "&gt;" ).Replace("<", "&lt;");
}/*
template<typename TStringData> TStringData& ZftMakeXmlAttEnc(TStringData& ARRoCStringData)*/
template<typename TStringData> TStringData& ZftMakeXmlAttDec(TStringData& ARRoCStringData)
{
return ARRoCStringData.
Replace("&#xA;" ,"\r" ). Replace("&#xD;" ,"\n").
Replace("&#x9;" ,"\t" ). Replace("&quot;","\"").
Replace("&gt;" ,">" ). Replace("&lt;" ,"<" ). Replace("&amp;" ,"&" );
}/*
template<typename TStringData> TStringData& ZftMakeXmlAttDec(TStringData& ARRoCStringData)*/
template<typename TString, typename TObject>
TString& ZftMakeStr(TString& ARR_SaveCStr, TObject AO_Object)
{ return ARR_SaveCStr; }
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, const string& AR_DataCStr)
{ ARR_SaveCStr.append(AR_DataCStr); return ARR_SaveCStr; }
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, const wstring& AR_DataCStr)
{ ARR_SaveCStr.append(AR_DataCStr); return ARR_SaveCStr; }
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, int AI_Int)
{
ZTycInt CI_BuffSize = 31 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
::sprintf(VCA_BuffParam, "%d", AI_Int);
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, int AI_Int)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, int AI_Int)
{
ZTycInt CI_BuffSize = 31 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%d", AI_Int);
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize) ;
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, int AI_Int)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, long AL_Long)
{
ZTycInt CI_BuffSize = 31 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
::sprintf(VCA_BuffParam, "%ld", AL_Long);
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, long AL_Long)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, long AL_Long)
{
ZTycInt CI_BuffSize = 31 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%ld", AL_Long);
ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize) ;
return ARR_SaveCStr;
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, long AL_Long)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypLLong ALL_Long)
{
ZTycInt CI_BuffSize = 41 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
( ::sprintf(VCA_BuffParam, "%lld" , ALL_Long) );
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypLLong ALL_Long)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypLLong ALL_Long)
{
ZTycInt CI_BuffSize = 41 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%lld" , ALL_Long) ;
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypLLong ALL_Long)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntUI AUI_Int)
{
ZTycInt CI_BuffSize = 31 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
( ::sprintf(VCA_BuffParam, "%u" , AUI_Int) );
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntUI AUI_Int)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntUI AUI_Int)
{
ZTycInt CI_BuffSize = 31 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%u" , AUI_Int) ;
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntUI AUI_Int)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntUL AUL_Int)
{
ZTycInt CI_BuffSize = 41 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
( ::sprintf(VCA_BuffParam, "%lu" , AUL_Int) );
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntUL AUL_Int)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntUL AUL_Int)
{
ZTycInt CI_BuffSize = 41 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%lu" , AUL_Int) ;
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntUL AUL_Int)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntULL AULL_Int)
{
ZTycInt CI_BuffSize = 41 ;
ZTypChar VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize =
( ::sprintf(VCA_BuffParam, "%llu" , AULL_Int) );
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, ZTypIntULL AULL_Int)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntULL AULL_Int)
{
ZTycInt CI_BuffSize = 41 ;
ZTypCharW VCA_BuffParam[CI_BuffSize] ;
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%llu" , AULL_Int) ;
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, ZTypIntULL AULL_Int)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, double AD_Double)
{
ZTycInt CI_BuffSize=51 ;
ZTypChar VCA_BuffParam[CI_BuffSize];
ZTypInt VI_ResultSize = ::sprintf
( VCA_BuffParam, "%f", AD_Double );
/********************************/
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> string& ZftMakeStr(string& ARR_SaveCStr, double AD_Double)*/
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, double AD_Double)
{
ZTycInt CI_BuffSize=51 ;
ZTypCharW VCA_BuffParam[CI_BuffSize];
ZTypInt VI_ResultSize = ::swprintf
(VCA_BuffParam, CI_BuffSize, L"%f", AD_Double);
/*********************************/
return ARR_SaveCStr.append
(VCA_BuffParam, VI_ResultSize);
}/*
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, double AD_Double)*/
/*============================================================================*/
template<> string& ZftMakeStr(string& ARR_SaveCStr, bool AB_Bool)
{ return ARR_SaveCStr.append( AB_Bool ? "true" : "false" ); }
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, bool AB_Bool)
{ return ARR_SaveCStr.append( AB_Bool ? L"true" : L"false" ); }
/*============================================================================*/
template<typename TTypeChar, typename TTypeLength>
class ZtCChars ;
/*++++++++++++++++++++++++++++++++++++++++++++++*/
template<> string & ZftMakeStr
(string& ARR_SaveCStr, const ZtCChars<char , ZTypLength>& AO_View);
template<> wstring& ZftMakeStr
(wstring& ARR_SaveCStr, const ZtCChars<wchar_t, ZTypLength>& AO_View);
// class ZtCBaseList : circular double linked list
template //////////////////////////////////////////////////////////////////
<
typename TType ,
typename TTypArgu = const TType& ,
typename TTypeAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TMoveObj = ZNsMain::
ZtCMoveObj<TType, TTypArgu, true> ,
typename TTypeCRTP = ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCBaseList /*#####################################################*/
{
public:
class ZCLink; class ZCNodePoint; class ZCNodePointN;
/*************************************************************************/
typedef ZtCObjOpt<ZCLink> ZCLinkOpt ;
typedef ZtCObjOpt<TType > ZCDataOpt ;
/*************************************************************************/
typedef ZtCBaseList TypeThis ;
typedef ZtCBaseList TypeList ;
typedef TType TypeData ;
typedef TTypArgu TypeArg ;
typedef TTypeAlloc TypeAlloc ;
typedef TTypSize TypeSize ;
typedef TMoveObj TypeMoveObj ;
typedef ZCLink TypeLink ;
typedef ZCLink TypeNode ; // ZCNodePoint::GetNode() 의 반환형.
typedef ZCNodePoint TypeNodePoint ;
typedef ZCNodePoint TypeIter ;
typedef ZCLink* IterEasy ; // 가장 쉽게 쓸 수 있는 반복자.
typedef ZCNodePointN iteratorN ;
typedef ZCNodePoint iterator ; // 다양한 기능을 가진 반복자.
typedef ZCNodePointN const_iterator;
typedef const TypeThis TypeThisC ;
typedef const TypeList TypeListC ;
typedef const TypeData TypeDataC ;
typedef const TypeNode TypeNodeC ; // ZCNodePoint::GetNode() const 의 반환형.
typedef const TypeLink TypeLinkC ;
typedef const TypeIter TypeIterC ;
typedef const ZCLink ZCLinkC ;
typedef const ZCLink* IterEasyC ;
typedef const ZCLinkOpt ZCLinkOptC ;
typedef const ZCDataOpt ZCDataOptC ;
typedef ZCNodePointN TypeIterN ;
/*************************************************************************/
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
<
ZtCBaseList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
>
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
/*************************************************************************/
public :
class ZCLink : public TypeAlloc
{
public :
friend class ZtCBaseList;
private:
ZCLink* mp_NextLink ;
ZCLink* mp_PrevLink ;
TypeData mo_DataObjt ;
private:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
ZCLink* GetNextPtr() {return mp_NextLink;}
ZCLink* GetPrevPtr() {return mp_PrevLink;}
const ZCLink* GetNextPtr()const{return mp_NextLink;}
const ZCLink* GetPrevPtr()const{return mp_PrevLink;}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
private:
static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)
{
AP_PrevLink->mp_NextLink=AP_NextLink;
AP_NextLink->mp_PrevLink=AP_PrevLink;
}/*
static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)*/
static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)
{
AP_HeadLink->mp_PrevLink=AP_TailLink;
AP_TailLink->mp_NextLink=AP_HeadLink;
}/*
static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/
public:
ZCLink()
{
mp_NextLink = mp_PrevLink = 0;
}/*
ZCLink()*/
ZCLink(const ZCLink& rhs)
{
mo_DataObjt = rhs.mo_DataObjt ;
mp_NextLink = 0 ;
mp_PrevLink = 0 ;
}/*
ZCLink(const ZCLink& rhs)*/
ZCLink(TypeArg AR_Data)
{
mo_DataObjt = AR_Data ;
mp_NextLink = 0 ;
mp_PrevLink = 0 ;
}/*
ZCLink(const ZCLink& rhs)*/
ZCLink& operator=(const ZCLink& rhs)
{
mo_DataObjt = rhs.mo_DataObjt; return *this;
}/*
ZCLink& operator=(const ZCLink& rhs)*/
ZCLink * GetNextPrevPtr(TypeSize AL_FarNum)
{
ZCLink* VP_TmpLink=this;
if(AL_FarNum>=0)
{ while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_FarNum<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZCLink * GetNextPrevPtr(TypeSize AL_FarNum)*/
ZCLinkC* GetNextPrevPtr(TypeSize AL_FarNum) const
{
ZCLinkC* VP_TmpLink = this;
if(AL_FarNum>=0)
{ while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; }
else{ while(++AL_FarNum<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }
return VP_TmpLink;
}/*
ZCLinkC* GetNextPrevPtr(TypeSize AL_FarNum) const*/
operator TypeData& () {return mo_DataObjt;}
operator TypeData () {return mo_DataObjt;}
TypeData & GetData () {return mo_DataObjt;}
TypeData & operator* () {return mo_DataObjt;}
TypeData & operator()() {return mo_DataObjt;}
operator TypeDataC&() const{return mo_DataObjt;}
TypeDataC& GetData () const{return mo_DataObjt;}
TypeDataC& operator* () const{return mo_DataObjt;}
TypeDataC& operator()() const{return mo_DataObjt;}
ZCLink & operator+(TypeSize AL_Distance)
{ return *GetNextPrevPtr( AL_Distance); }
ZCLink & operator-(TypeSize AL_Distance)
{ return *GetNextPrevPtr(-AL_Distance); }
ZCLinkC& operator+(TypeSize AL_Distance) const
{ return *GetNextPrevPtr( AL_Distance); }
ZCLinkC& operator-(TypeSize AL_Distance) const
{ return *GetNextPrevPtr(-AL_Distance); }
public:
};/*
class ZCLink*/
class ZCNodePoint
{
private:
/*****/ TypeList& mr_CurrList;
mutable TypeLink* mp_CurrLink; // 사실상 mp_CurrLink!=0
mutable TypeSize ml_CurrPos ;
public:
ZCNodePoint(TypeList& AR_TypeList) :
mr_CurrList(AR_TypeList)
{
mp_CurrLink = AR_TypeList.HeadPtr();
ml_CurrPos = 1 ;
}
ZCNodePoint(const ZCNodePoint& rhs) :
mr_CurrList(rhs.mr_CurrList),
mp_CurrLink(rhs.mp_CurrLink),
ml_CurrPos (rhs.ml_CurrPos )
{}
public :
static ZCNodePoint MakeTailPoint(TypeList & AR_TypeList)
{
ZCNodePoint VO_ZCLinkPoint(AR_TypeList);
VO_ZCLinkPoint.mp_CurrLink = AR_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = AR_TypeList.ml_LinkSize;
return VO_ZCLinkPoint; /****************************/
}/*
static ZCNodePoint MakeTailPoint(TypeList & AR_TypeList)*/
static ZCNodePoint MakeTailPoint(TypeIterC& AR_TypeIter)
{
ZCNodePoint VO_ZCLinkPoint(AR_TypeIter);
VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize;
return VO_ZCLinkPoint; /****************************/
}/*
static ZCNodePoint MakeTailPoint(TypeIterC& AR_TypeIter)*/
public :
TypeThis & GetMain() {return mr_CurrList;}
TypeNode & GetNode() {return *mp_CurrLink;}
TypeThisC& GetMain() const{return mr_CurrList;}
TypeNodeC& GetNode() const{return *mp_CurrLink;}
/***************************************************/
TypeSize GetPos () const{return ml_CurrPos ;}
/***************************************************/
bool IsValid() const{return mr_CurrList.size()>0;}
bool IsEmpty() const{return mr_CurrList.size()<1;}
ZCNodePoint& operator= (const ZCNodePoint& rhs){ return *this; }
TypeData & operator*() {return **mp_CurrLink;}
TypeDataC& operator*() const{return **mp_CurrLink;}
operator TypeLink * () {return mp_CurrLink;}
operator TypeLinkC* () const{return mp_CurrLink;}
operator TypeLink & () {return *mp_CurrLink;}
operator TypeLinkC& () const{return *mp_CurrLink;}
bool operator == (const ZCNodePoint& rhs) const
{ return ml_CurrPos == rhs.ml_CurrPos; }
bool operator != (const ZCNodePoint& rhs) const
{ return ml_CurrPos != rhs.ml_CurrPos; }
bool operator > (const ZCNodePoint& rhs) const
{ return ml_CurrPos > rhs.ml_CurrPos; }
bool operator >= (const ZCNodePoint& rhs) const
{ return ml_CurrPos >= rhs.ml_CurrPos; }
bool operator < (const ZCNodePoint& rhs) const
{ return ml_CurrPos < rhs.ml_CurrPos; }
bool operator <= (const ZCNodePoint& rhs) const
{ return ml_CurrPos <= rhs.ml_CurrPos; }
bool operator == (TypeSize AL_Size) const
{ return ml_CurrPos == AL_Size; }
bool operator != (TypeSize AL_Size) const
{ return ml_CurrPos != AL_Size; }
bool operator > (TypeSize AL_Size) const
{ return ml_CurrPos > AL_Size; }
bool operator >= (TypeSize AL_Size) const
{ return ml_CurrPos >= AL_Size; }
bool operator < (TypeSize AL_Size) const
{ return ml_CurrPos < AL_Size; }
bool operator <= (TypeSize AL_Size) const
{ return ml_CurrPos <= AL_Size; }
const ZCNodePoint& operator++() const
{
mp_CurrLink = mp_CurrLink->mp_NextLink;
++ml_CurrPos; return *this ;
}/*
const ZCNodePoint& operator++() const*/
const ZCNodePoint& operator--() const
{
mp_CurrLink = mp_CurrLink->mp_PrevLink;
--ml_CurrPos; return *this ;
}/*
const ZCNodePoint& operator--() const*/
ZCNodePoint operator++(int) const
{
ZCNodePoint VO_NowPoint(*this);
mp_CurrLink = mp_CurrLink->mp_NextLink;
++ml_CurrPos ; return VO_NowPoint ;
}/*
ZCNodePoint operator++(int) const*/
ZCNodePoint operator--(int) const
{
ZCNodePoint VO_NowPoint(*this);
mp_CurrLink = mp_CurrLink->mp_PrevLink;
--ml_CurrPos; return VO_NowPoint ;
}/*
ZCNodePoint operator--(int) const*/
const ZCNodePoint& operator+=(TypeSize AL_Distance) const
{
if(IsEmpty()){return *this;}
mp_CurrLink = &((*mp_CurrLink)+AL_Distance) ;
ml_CurrPos += AL_Distance ;
return *this; /*:::::::::::::::::::::::::::*/
}/*
const ZCNodePoint& operator+=(TypeSize AL_Distance) const*/
const ZCNodePoint& operator-=(TypeSize AL_Distance) const
{
mp_CurrLink = &((*mp_CurrLink)-AL_Distance);
ml_CurrPos -= AL_Distance ;
return *this; /*::::::::::::::::::::::::::*/
}/*
const ZCNodePoint& operator-=(TypeSize AL_Distance) const*/
public:
};/*
class ZCNodePoint*/
/*///////////////////////////////////////////////////////////////
const N .
C
typdef const some_class some_classC;
. -- 2025-10-14 09:08
const ZCNodePointN ZCNodePointNC
? ZCNodePointN const ,
const ZCNodePointN .
.
-- 2025-10-14 10:38
///////////////////////////////////////////////////////////////*/
class ZCNodePointN
{
protected:
const TypeList& mr_CurrList;
mutable TypeLinkC* mp_CurrLink; // 사실상 mp_CurrLink!=0
mutable TypeSize ml_CurrPos ;
public :
ZCNodePointN(const TypeList& AR_TypeList) :
mr_CurrList(AR_TypeList)
{
mp_CurrLink = AR_TypeList.HeadPtr();
ml_CurrPos = 1 ;
}
ZCNodePointN(const ZCNodePoint & rhs) :
mr_CurrList( rhs.GetMain()),
mp_CurrLink(&rhs.GetNode()),
ml_CurrPos ( rhs.GetPos ())
{}
ZCNodePointN(const ZCNodePointN& rhs) :
mr_CurrList(rhs.mr_CurrList),
mp_CurrLink(rhs.mp_CurrLink),
ml_CurrPos (rhs.ml_CurrPos )
{}
public :
static ZCNodePointN MakeTailPoint(const TypeList & AR_TypeList)
{
ZCNodePointN VO_ZCLinkPoint(AR_TypeList);
VO_ZCLinkPoint.mp_CurrLink = AR_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = AR_TypeList.ml_LinkSize;
return VO_ZCLinkPoint; /****************/
}/*
static ZCNodePointN MakeTailPoint(const TypeList & AR_TypeList)*/
static ZCNodePointN MakeTailPoint(const ZCNodePoint & AR_TypeIter)
{
ZCNodePointN VO_ZCLinkPoint(AR_TypeIter);
VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize;
return VO_ZCLinkPoint; /****************/
}/*
static ZCNodePointN MakeTailPoint(const ZCNodePoint & AR_TypeIter)*/
static ZCNodePointN MakeTailPoint(const ZCNodePointN& AR_TypeIter)
{
ZCNodePointN VO_ZCLinkPoint(AR_TypeIter);
VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize;
return VO_ZCLinkPoint; /****************/
}/*
static ZCNodePointN MakeTailPoint(const ZCNodePointN& AR_TypeIter)*/
public :
TypeThisC& GetMain() const{return mr_CurrList;}
TypeNodeC& GetNode() const{return *mp_CurrLink;}
/***************************************************/
TypeSize GetPos () const{return ml_CurrPos ;}
/***************************************************/
bool IsValid() const{return mr_CurrList.size()>0;}
bool IsEmpty() const{return mr_CurrList.size()<1;}
ZCNodePointN& operator= (const ZCNodePointN& rhs){ return *this; }
TypeDataC& operator*() const{return **mp_CurrLink;}
operator TypeNodeC* () const{return mp_CurrLink;}
operator TypeNodeC& () const{return *mp_CurrLink;}
operator TypeNode * () const{return 0 ;}
bool operator == (const ZCNodePointN& rhs) const
{ return ml_CurrPos == rhs.ml_CurrPos; }
bool operator != (const ZCNodePointN& rhs) const
{ return ml_CurrPos != rhs.ml_CurrPos; }
bool operator > (const ZCNodePointN& rhs) const
{ return ml_CurrPos > rhs.ml_CurrPos; }
bool operator >= (const ZCNodePointN& rhs) const
{ return ml_CurrPos >= rhs.ml_CurrPos; }
bool operator < (const ZCNodePointN& rhs) const
{ return ml_CurrPos < rhs.ml_CurrPos; }
bool operator <= (const ZCNodePointN& rhs) const
{ return ml_CurrPos <= rhs.ml_CurrPos; }
bool operator == (TypeSize AL_Size) const
{ return ml_CurrPos == AL_Size; }
bool operator != (TypeSize AL_Size) const
{ return ml_CurrPos != AL_Size; }
bool operator > (TypeSize AL_Size) const
{ return ml_CurrPos > AL_Size; }
bool operator >= (TypeSize AL_Size) const
{ return ml_CurrPos >= AL_Size; }
bool operator < (TypeSize AL_Size) const
{ return ml_CurrPos < AL_Size; }
bool operator <= (TypeSize AL_Size) const
{ return ml_CurrPos <= AL_Size; }
const ZCNodePointN& operator++() const
{
mp_CurrLink = mp_CurrLink->mp_NextLink;
++ml_CurrPos; return *this ;
}/*
const ZCNodePointN& operator++() const*/
const ZCNodePointN& operator--() const
{
mp_CurrLink = mp_CurrLink->mp_PrevLink;
--ml_CurrPos; return *this ;
}/*
const ZCNodePointN& operator--() const*/
ZCNodePointN operator++(int) const
{
ZCNodePointN VO_NowPoint(*this);
mp_CurrLink = mp_CurrLink->mp_NextLink;
++ml_CurrPos ; return VO_NowPoint ;
}/*
ZCNodePointN operator++(int) const*/
ZCNodePointN operator--(int) const
{
ZCNodePointN VO_NowPoint(*this);
mp_CurrLink = mp_CurrLink->mp_PrevLink;
--ml_CurrPos; return VO_NowPoint ;
}/*
ZCNodePointN operator--(int) const*/
const ZCNodePointN& operator+=(TypeSize AL_Distance) const
{
if(IsEmpty()){return *this;}
mp_CurrLink = &((*mp_CurrLink)+AL_Distance) ;
ml_CurrPos += AL_Distance ;
return *this; /*:::::::::::::::::::::::::::*/
}/*
const ZCNodePointN& operator+=(TypeSize AL_Distance) const*/
const ZCNodePointN& operator-=(TypeSize AL_Distance) const
{
mp_CurrLink = &((*mp_CurrLink)-AL_Distance);
ml_CurrPos -= AL_Distance ;
return *this; /*::::::::::::::::::::::::::*/
}/*
const ZCNodePointN& operator-=(TypeSize AL_Distance) const*/
public:
};/*
class ZCNodePointN*/
class ZCLinkPointEx : public ZCNodePoint
{
public:
ZCLinkPointEx(TypeList& AR_TypeList): ZCNodePoint(AR_TypeList){}
ZCLinkPointEx(const ZCNodePoint & rhs): ZCNodePoint(rhs ){}
ZCLinkPointEx(const ZCLinkPointEx& rhs): ZCNodePoint(rhs ){}
public:
static ZCLinkPointEx MakeTailPoint(const ZCLinkPointEx& AR_TypeIter)
{
ZCLinkPointEx VO_ZCLinkPoint(AR_TypeIter);
if(!AR_TypeIter.IsEmpty()) /****************************/
{
VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink;
VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize;
}
return VO_ZCLinkPoint; /********************************/
}/*
static ZCLinkPointEx MakeTailPoint(const ZCLinkPointEx& AR_TypeIter)*/
public:
ZCLinkPointEx& operator= (const ZCLinkPointEx& rhs){ return *this; }
const ZCLinkPointEx& operator++() const
{
if(this->IsEmpty()){return *this;}
this->mp_CurrLink = this->mp_CurrLink->mp_NextLink ;
if(++this->ml_CurrPos>this->mr_CurrList.size())
{ this->ml_CurrPos -= this->mr_CurrList.size(); }
return *this; /*******************************/
}/*
const ZCLinkPointEx& operator++() const*/
const ZCLinkPointEx& operator--() const
{
if(this->IsEmpty()){return *this;}
this->mp_CurrLink = this->mp_CurrLink->mp_PrevLink ;
if(--this->ml_CurrPos<1)
{ this->ml_CurrPos += this->mr_CurrList.size(); }
return *this; /********/
}/*
const ZCLinkPointEx& operator--() const*/
ZCLinkPointEx operator++(int) const
{
ZCLinkPointEx VO_NowPoint(*this);
if(this->IsEmpty()){return VO_NowPoint;}
this->mp_CurrLink = this->mp_CurrLink->mp_NextLink ;
if(++this->ml_CurrPos>this->mr_CurrList.size())
{ this->ml_CurrPos -= this->mr_CurrList.size(); }
return VO_NowPoint; /*************************/
}/*
ZCLinkPointEx operator++(int) const*/
ZCLinkPointEx operator--(int) const
{
ZCLinkPointEx VO_NowPoint(*this);
if(this->IsEmpty()){return VO_NowPoint;}
this->mp_CurrLink = this->mp_CurrLink->mp_PrevLink ;
if(--this->ml_CurrPos<1)
{ this->ml_CurrPos += this->mr_CurrList.size(); }
return VO_NowPoint;
}/*
ZCLinkPointEx operator--(int) const*/
const ZCLinkPointEx& operator+=(TypeSize AL_Distance) const
{
if(this->IsEmpty()){return *this;}
this->mp_CurrLink = &((*this->mp_CurrLink)+AL_Distance) ;
if(this->ml_CurrPos+=AL_Distance > this->mr_CurrList.size())
{ this->ml_CurrPos %= this->mr_CurrList.size(); }
else if(this->ml_CurrPos<1) // AL_Distance<0
{ while(this->ml_CurrPos+= this->mr_CurrList.size()<1){} }
return *this; /****************************/
}/*
const ZCLinkPointEx& operator+=(TypeSize AL_Distance) const*/
const ZCLinkPointEx& operator-=(TypeSize AL_Distance) const
{
if(this->IsEmpty()){return *this;}
this->mp_CurrLink = &((*this->mp_CurrLink)-AL_Distance);
if(this->ml_CurrPos-=AL_Distance > this->mr_CurrList.size())
{ this->ml_CurrPos %= this->mr_CurrList.size(); }
else if(this->ml_CurrPos<1) // AL_Distance>=0
{ while(this->ml_CurrPos+= this->mr_CurrList.size()<1){} }
return *this; /*****************************/
}/*
const ZCLinkPointEx& operator-=(TypeSize AL_Distance) const*/
public:
};/*
class ZCLinkPointEx*/
/*///////////////////////////////////////////////////////////////
class ZCLinkFake ,
,
,
,
, ZCLinkFake 2
,
. , ZCLink
. ZCLink TypeAlloc
.
MoveLinkIn() MoveRangeIn() . -- 2025-10-15 23:44
class ZCLinkFake , MoveRangeIn()
...
-- 2025-10-16 13:56
///////////////////////////////////////////////////////////////*/
class ZCLinkFake : public TypeAlloc
{
public:
friend class ZtCBaseList;
private:
ZCLink* mp_NextLink;
ZCLink* mp_PrevLink;
public :
ZCLinkFake()
{
mp_NextLink = 0;
mp_PrevLink = 0;
}
public :
};/*
class ZCLinkFake : public TypeAlloc*/
public :
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
private :
ZCLink* mp_HeadLink ;
ZCLink* mp_TailLink ;
TypeSize ml_LinkSize ;
private :
TypeChild& GetChildObj()
{
return *static_cast<TypeChild*>(this);
}/*
TypeChild& GetChildObj()*/
const TypeChild& GetChildObj() const
{
return *static_cast<const TypeChild*>(this);
}/*
const TypeChild& GetChildObj() const*/
protected:
ZCLink* NewLink() const
{
return new ZCLink;
}/*
ZCLink* NewLink() const*/
ZCLink* NewLink(TypeArg AO_ArgData) const
{
return new ZCLink(AO_ArgData);
}/*
ZCLink* NewLink(TypeArg AO_ArgData) const*/
void NewLink ////////////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
) const
/////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}/*
void NewLink ////////////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
) const
///////////////////////////////////////////////////*/
void NewLinkCopy //////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
void NewLinkCopy //////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
///////////////////////////////////////////////////*/
void DelLink(ZCLink* AP_DelLink)
{
delete AP_DelLink;
}/*
void DelLink(ZCLink* AP_DelLink)*/
void DelLink //////////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr() ;
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
///////////////////////////////////////////////////////
/*protected:*/
private :
_VT_ ZCLink* SendFreeOut() const
{
if(TTypeCRTP::ZEUseCRTP<1) return NewLink();
return GetChildObj().SendFreeOut();
}/*
_VT_ ZCLink* SendFreeOut() const*/
_VT_ void SendFreeOut
(TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) const
{
if(TTypeCRTP::ZEUseCRTP<1)
{
NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); return;
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
return GetChildObj().SendFreeOut
(AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink));
}/*
_VT_ void SendFreeOut
(TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) const
*/
_VT_ void SendFreeOutCopy /*///////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
if(TTypeCRTP::ZEUseCRTP<1)
{
NewLinkCopy /*::::::::::::::::::*/
(
AP_LinkOrgin, AL_FarNum ,
APR_HeadCopy, APR_TailCopy
);
return; /*::::::::::::::::::*/
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
return GetChildObj().SendFreeOutCopy
(AP_LinkOrgin, AL_FarNum, RR(APR_HeadCopy), RR(APR_TailCopy));
}/*
_VT_ void SendFreeOutCopy ///////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
) const
///////////////////////////////////////////////////*/
_VT_ void RecvFreeIn(ZCLink* AP_DelLink)
{
if(TTypeCRTP::ZEUseCRTP<1)
{ DelLink(AP_DelLink); return; }
GetChildObj().RecvFreeIn(AP_DelLink);
}/*
_VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/
_VT_ void RecvFreeIn //////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
if(TTypeCRTP::ZEUseCRTP<1)
{
DelLink
(AL_CutCnt, AP_CutHead, AP_CutTail);
return;
}/*
if(TTypeCRTP::ZEUseCRTP<1)*/
GetChildObj().RecvFreeIn(AL_CutCnt, AP_CutHead, AP_CutTail);
}/*
_VT_ void RecvFreeIn //////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
/////////////////////////////////////////////////////*/
/*private :*/
private :
ZCLink* AddTailLink(ZCLink* AP_NewLink)
{
if(ml_LinkSize<1)
{
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
ZCLink::MakeRing
( mp_HeadLink, mp_TailLink ) ;
ml_LinkSize= 1; return AP_NewLink;
}/*
if(ml_LinkSize<1)*/
ZCLink::JoinLink(mp_TailLink, AP_NewLink) ;
ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ;
mp_TailLink = AP_NewLink; ++ml_LinkSize ;
return AP_NewLink; /*::::::::::::::::::::*/
}/*
ZCLink* AddTailLink(ZCLink* AP_NewLink)*/
ZCLink* AddHeadLink(ZCLink* AP_NewLink)
{
if(ml_LinkSize<1)
{
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
ZCLink::MakeRing
( mp_HeadLink, mp_TailLink ) ;
ml_LinkSize= 1; return AP_NewLink;
}/*
if(ml_LinkSize<1)*/
ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ;
ZCLink::MakeRing(AP_NewLink, mp_TailLink) ;
mp_HeadLink = AP_NewLink; ++ml_LinkSize ;
return AP_NewLink; /*::::::::::::::::::::*/
}/*
ZCLink* AddHeadLink(ZCLink* AP_NewLink)*/
ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink)
{
// *this 에 속한 AP_StdLink 의 뒤에, AP_NewLink 를 삽입한다.
// AP_StdLink 이 0 이면, 맨 앞에 삽입한다.
if(AP_StdLink==0) // 맨 앞에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else
{
ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ;
ZCLink::MakeRing(AP_NewLink, mp_TailLink) ;
mp_HeadLink = AP_NewLink;
}
}
else if(AP_StdLink==mp_TailLink)
{
ZCLink::JoinLink(mp_TailLink, AP_NewLink) ;
ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ;
mp_TailLink = AP_NewLink;
}
else
{
ZCLink* VP_StdNext = AP_StdLink->mp_NextLink ;
ZCLink::JoinLink(AP_StdLink, AP_NewLink) ;
ZCLink::JoinLink(AP_NewLink, VP_StdNext) ;
}
++ml_LinkSize; return AP_NewLink;
}/*
ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/
ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink)
{
// *this 에 속한 AP_StdLink 의 앞에, AP_NewLink 를 삽입한다.
// AP_StdLink 이 0 이면, 맨 뒤에 삽입한다.
if(AP_StdLink==0) // 맨 뒤에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = AP_NewLink;
mp_TailLink = AP_NewLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else
{
ZCLink::JoinLink(mp_TailLink, AP_NewLink) ;
ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ;
mp_TailLink = AP_NewLink;
}
}
else if(AP_StdLink==mp_HeadLink)
{
ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ;
ZCLink::MakeRing(AP_NewLink, mp_TailLink) ;
mp_HeadLink = AP_NewLink;
}
else
{
ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink ;
ZCLink::JoinLink(VP_StdPrev, AP_NewLink) ;
ZCLink::JoinLink(AP_NewLink, AP_StdLink) ;
}
++ml_LinkSize; return AP_NewLink;
}/*
ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/
ZCLink* CutLink(ZCLink* AP_StdLink)
{
if(mp_HeadLink==AP_StdLink)
{
if(ml_LinkSize==1)
{
mp_HeadLink = 0;
mp_TailLink = 0;
}
else // ml_LinkSize>1
{
mp_HeadLink = mp_HeadLink->mp_NextLink ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
else*/
}
else if(mp_TailLink==AP_StdLink)
{
mp_TailLink = mp_TailLink->mp_PrevLink ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else
{
ZCLink::JoinLink
(
AP_StdLink->mp_PrevLink, AP_StdLink->mp_NextLink
) ;
////////////////
}/*
else*/
--ml_LinkSize ; return AP_StdLink;
}/*
ZCLink* CutLink(ZCLink* AP_StdLink)*/
ZtCBaseList& CutLinkRangeOut /*///////////////////////////////////////*/
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCBaseList& rhs ,
ZCLink* AP_RhsStd ,
bool AB_After=true
)
/*#####################################################################*/
{
/*///////////////////////////////////////////////////////////
AR_CutHead .
AR_CutTail .
AR_CutHead AR_CutTail ,
rhs AP_RhsStd .
AP_RhsStd==0 . -- 2025-10-06 09:16
bool AB_After=true .
AB_After==true , rhs AP_RhsStd .
AB_After==false , rhs AP_RhsStd .
AB_After==true && AP_RhsStd==0 .
AB_After==false && AP_RhsStd==0 .
-- 2025-10-07 08:36
///////////////////////////////////////////////////////////*/
if(this==&rhs ) return rhs;
if(ml_LinkSize<1) return rhs;
if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때.
{
mp_HeadLink=0;
}
else if(&AR_CutHead==mp_HeadLink)
{
ZCLink::MakeRing
( mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink );
}
else if(&AR_CutTail==mp_TailLink)
{
ZCLink::MakeRing
( mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink );
}
else
{
ZCLink::JoinLink
( AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink );
}/*
else*/
ml_LinkSize -= AL_CutSize;
if(rhs.size()<1)
{
// AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다.
ZCLink::MakeRing(&AR_CutHead, &AR_CutTail);
rhs.mp_HeadLink = &AR_CutHead ;
rhs.mp_TailLink = &AR_CutTail ;
}
else if(AB_After)
{
if(AP_RhsStd==0) // 맨 앞에 삽입.
{
ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink);
ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink);
rhs.mp_HeadLink = &AR_CutHead;
}
else // AP_RhsStd 의 뒤에 삽입.
{
ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ;
ZCLink::JoinLink(AP_RhsStd , &AR_CutHead );
ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext);
if(AP_RhsStd==rhs.mp_TailLink)
{ rhs.mp_TailLink = &AR_CutTail; }
}
}
else // !AB_After
{
if(AP_RhsStd==0) // 맨 뒤에 삽입.
{
ZCLink::JoinLink(rhs.mp_TailLink, &AR_CutHead);
ZCLink::MakeRing(rhs.mp_HeadLink, &AR_CutTail);
rhs.mp_TailLink = &AR_CutTail;
}
else // AP_RhsStd 의 앞에 삽입.
{
ZCLink* VP_RhsStdPrev = AP_RhsStd->mp_PrevLink ;
ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead);
ZCLink::JoinLink(&AR_CutTail , AP_RhsStd );
if(AP_RhsStd==rhs.mp_HeadLink)
{ rhs.mp_HeadLink = &AR_CutHead; }
}
}/*
else // !AB_After*/
rhs.ml_LinkSize += AL_CutSize; return rhs;
}/*
ZtCBaseList& CutLinkRangeOut ///////////////////////////////////////////
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZtCBaseList& rhs ,
ZCLink* AP_RhsStd ,
bool AB_After=true
)
#######################################################################*/
TypeThis& CutLinkRangeIn ///////////////////////////////////////////////
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZCLink* AP_NowStd ,
bool AB_After=true
)
/*#####################################################################*/
{
/*///////////////////////////////////////////////////////////
AR_CutHead .
AR_CutTail .
AR_CutHead AR_CutTail ,
AB_After==true , rhs AP_NowStd
AB_After==false , rhs AP_NowStd
.
AB_After==true && AP_NowStd==0
AB_After==false && AP_NowStd==0
. -- 2025-10-12 08:19
///////////////////////////////////////////////////////////*/
if(ml_LinkSize<1){return *this;}
if(AL_CutSize>=ml_LinkSize){return *this;}
if(&AR_CutHead==mp_HeadLink && &AR_CutTail==mp_TailLink)
{ return *this; }
if(&AR_CutHead==AP_NowStd || &AR_CutTail==AP_NowStd )
{ return *this; }
/******************************************************/
if (AB_After && AP_NowStd==0) // 맨 앞에 삽입.
{
if(&AR_CutHead==mp_HeadLink)
{ /* nothing to do.*/ }
else if(mp_HeadLink->mp_NextLink==&AR_CutHead)
{
// mp_HeadLink - &AR_CutHead ~ &AR_CutTail
if(&AR_CutTail==mp_TailLink)
{
// 현재 : mp_HeadLink - &AR_CutHead ~ &AR_CutTail(=mp_TailLink)
// 이후 : &AR_CutHead ~ &AR_CutTail - mp_HeadLink
ZCLink::JoinLink(&AR_CutTail, mp_HeadLink);
ZCLink::MakeRing(&AR_CutHead, mp_HeadLink);
mp_TailLink = mp_HeadLink ;
mp_HeadLink = &AR_CutHead ;
}
else
{
// 현재 : mp_HeadLink - &AR_CutHead ~ &AR_CutTail - VP_CutNext
// 이후 : &AR_CutHead ~ &AR_CutTail - mp_HeadLink - VP_CutNext
ZCLink* VP_CutNext = AR_CutTail.mp_NextLink ;
ZCLink::JoinLink(&AR_CutTail, mp_HeadLink);
ZCLink::JoinLink(mp_HeadLink, VP_CutNext );
ZCLink::MakeRing(&AR_CutHead, mp_TailLink);
mp_HeadLink = &AR_CutHead ;
}
}/*
else if(mp_HeadLink->mp_NextLink==&AR_CutHead)*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
mp_HeadLink ~ &AR_CutHead ~ &AR_CutTail
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
else
{
if(&AR_CutTail==mp_TailLink)
{
/*////////////////////////////////////////////
:
mp_HeadLink ~ VP_CutPrev -
&AR_CutHead - &AR_CutTail(mp_TailLink)
:
&AR_CutHead - &AR_CutTail -
mp_HeadLink ~ VP_CutPrev
////////////////////////////////////////////*/
ZCLink* VP_CutPrev = AR_CutHead.mp_PrevLink ;
ZCLink::JoinLink(&AR_CutTail, mp_HeadLink);
ZCLink::MakeRing(&AR_CutHead, VP_CutPrev );
mp_HeadLink = &AR_CutHead ;
mp_TailLink = VP_CutPrev ;
}/*
if(&AR_CutTail==mp_TailLink)*/
else /*************************************************/
{
/*////////////////////////////////////////////
:
mp_HeadLink ~ VP_CutPrev -
&AR_CutHead - &AR_CutTail - VP_CutNext
:
&AR_CutHead - &AR_CutTail -
mp_HeadLink ~ VP_CutPrev - VP_CutNext
////////////////////////////////////////////*/
ZCLink* VP_CutNext = AR_CutTail.mp_NextLink ;
ZCLink* VP_CutPrev = AR_CutHead.mp_PrevLink ;
ZCLink::JoinLink(&AR_CutTail, mp_HeadLink);
ZCLink::JoinLink(&VP_CutPrev, VP_CutNext );
ZCLink::MakeRing(&AR_CutHead, mp_TailLink);
mp_HeadLink = &AR_CutHead ;
}/*
else **************************************************/
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
mp_HeadLink ~ &AR_CutHead ~ &AR_CutTail
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
}/*
if (AB_After && AP_NowStd==0) // 맨 앞에 삽입.*/
else if(!AB_After && AP_NowStd==0) // 맨 뒤에 삽입.
{
if(&AR_CutTail==mp_TailLink)
{ /* nothing to do.*/ }
else if(mp_TailLink->mp_PrevLink==&AR_CutTail)
{
// &AR_CutHead ~ &AR_CutTail - mp_TailLink
if(&AR_CutHead==mp_HeadLink)
{
// 현재 : &AR_CutHead(=mp_HeadLink) ~ &AR_CutTail - mp_TailLink
// 이후 : mp_TailLink - &AR_CutHead ~ &AR_CutTail
ZCLink::JoinLink(mp_TailLink, &AR_CutHead);
ZCLink::MakeRing(mp_TailLink, &AR_CutTail);
mp_HeadLink = mp_TailLink ;
mp_TailLink = &AR_CutTail ;
}
else
{
// 현재 : VP_CutPrev - &AR_CutHead ~ &AR_CutTail - mp_TailLink
// 이후 : VP_CutPrev - mp_TailLink - &AR_CutHead ~ &AR_CutTail
ZCLink* VP_CutPrev = AR_CutHead.mp_PrevLink ;
ZCLink::JoinLink(VP_CutPrev, mp_TailLink);
ZCLink::JoinLink(mp_TailLink, &AR_CutHead);
ZCLink::MakeRing(mp_HeadLink, &AR_CutTail);
mp_TailLink = &AR_CutTail ;
}
}/*
else if(mp_TailLink->mp_PrevLink==&AR_CutTail)*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
&AR_CutHead ~ &AR_CutTail ~ mp_TailLink
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
else
{
if(&AR_CutHead==mp_HeadLink)
{
/*////////////////////////////////////////////
:
(mp_HeadLink=)
&AR_CutHead ~ &AR_CutTail - VP_CutNext ~ mp_TailLink
:
VP_CutNext ~ mp_TailLink - &AR_CutHead ~ &AR_CutTail
////////////////////////////////////////////*/
ZCLink* VP_CutNext = AR_CutTail.mp_NextLink ;
ZCLink::JoinLink(mp_TailLink, &AR_CutHead);
ZCLink::MakeRing(VP_CutNext , &AR_CutTail);
mp_HeadLink = VP_CutNext ;
mp_TailLink = &AR_CutTail ;
}/*
if(&AR_CutHead==mp_HeadlLink)*/
else /*************************************************/
{
/*////////////////////////////////////////////
:
VP_CutPrev - &AR_CutHead ~
&AR_CutTail - VP_CutNext ~ mp_TailLink
:
&VP_CutPrev - VP_CutNext ~
mp_TailLink - &AR_CutHead ~ &AR_CutTail
////////////////////////////////////////////*/
ZCLink* VP_CutNext = AR_CutTail.mp_NextLink ;
ZCLink* VP_CutPrev = AR_CutHead.mp_PrevLink ;
ZCLink::JoinLink(&VP_CutPrev, VP_CutNext );
ZCLink::JoinLink(mp_TailLink, &AR_CutHead);
ZCLink::MakeRing(&AR_CutHead, &AR_CutTail);
mp_TailLink = &AR_CutTail ;
}/*
else **************************************************/
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
&AR_CutHead ~ &AR_CutTail ~ mp_TailLink
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
}/*
else if(!AB_After && AP_NowStd==0) // 맨 뒤에 삽입.*/
/*=================================================================
AP_NowStd!=0 : AP_NowStd .
=================================================================*/
else if(AR_CutTail.mp_NextLink==AP_NowStd)
{
// &AR_CutHead ~ &AR_CutTail - AP_NowStd
if(!AB_After)
{ /* nothing to do*/ }
else if(&AR_CutHead==mp_HeadLink)
{
/*************************************************************
mp_HeadLink==&AR_CutHead && mp_TailLink!=mp_TailLink
: &AR_CutHead ~ &AR_CutTail - AP_NowStd - VP_StdNext ~ mp_TailLink
: AP_NowStd - &AR_CutHead ~ &AR_CutTail- VP_StdNext ~ mp_TailLink
*************************************************************/
ZCLink* VP_StdNext = AP_NowStd->mp_NextLink;
ZCLink::JoinLink(AP_NowStd , &AR_CutHead );
ZCLink::JoinLink(&AR_CutTail, VP_StdNext );
ZCLink::MakeRing(AP_NowStd , mp_TailLink);
mp_HeadLink = AP_NowStd ;
}/*
else if(&AR_CutHead==mp_HeadLink)*/
else if(&AR_CutTail==mp_TailLink)
{ /* nothing to do */ }
/*******************************/
else
{
/*************************************************************
mp_HeadLink!=&AR_CutHead && mp_TailLink!=&AR_CutTail
: VP_CutPrev - &AR_CutHead ~ &AR_CutTail - AP_NowStd - VP_StdNext
: VP_CutPrev - AP_NowStd - &AR_CutHead ~ &AR_CutTail- VP_StdNext
*************************************************************/
ZCLink* VP_CutPrev = AR_CutHead.mp_PrevLink;
ZCLink* VP_StdNext = AP_NowStd->mp_NextLink;
ZCLink::JoinLink(VP_CutPrev , AP_NowStd );
ZCLink::JoinLink(AP_NowStd , &AR_CutHead);
ZCLink::JoinLink(&AR_CutTail, VP_StdNext );
}
}/*
else if(AR_CutTail.mp_NextLink==AP_NowStd)*/
else if(AR_CutHead.mp_PrevLink==AP_NowStd)
{
// AP_NowStd - &AR_CutHead ~ &AR_CutTail
if(AB_After)
{ /* nothing to do*/ }
else if(&AR_CutTail==mp_TailLink)
{
if(AP_NowStd==mp_HeadLink)
{
/*************************************************************
AP_NowStd==mp_HeadLink && &AR_CutTail==mp_TailLink
: AP_NowStd - &AR_CutHead ~ &AR_CutTail
: &AR_CutHead ~ &AR_CutTail - AP_NowStd
*************************************************************/
ZCLink::JoinLink(&AR_CutTail, AP_NowStd);
ZCLink::MakeRing(&AR_CutHead, AP_NowStd);
mp_HeadLink = &AR_CutHead;
mp_TailLink = AP_NowStd ;
}
else
{
/*************************************************************
&AR_CutTail==mp_TailLink
: VP_StdPrev - AP_NowStd - &AR_CutHead ~ &AR_CutTail
: VP_StdPrev - &AR_CutHead ~ &AR_CutTail - AP_NowStd
*************************************************************/
ZCLink* VP_StdPrev = AP_NowStd->mp_PrevLink ;
ZCLink::JoinLink(VP_StdPrev , &AR_CutHead);
ZCLink::JoinLink(&AR_CutTail, AP_NowStd );
ZCLink::MakeRing(mp_HeadLink, AP_NowStd );
mp_TailLink = AP_NowStd ;
}
}/*
else if(&AR_CutHead==mp_HeadLink)*/
// add codes
}/*
else if(AR_CutTail.mp_NextLink==AP_NowStd)*/
/*=================================================================
AP_RhsStd!=0 : AP_RhsStd .
=================================================================*/
// add codes
return *this;
}/*
TypeThis& CutLinkRangeIn ///////////////////////////////////////////////
(
ZCLink& AR_CutHead ,
ZCLink& AR_CutTail ,
TypeSize AL_CutSize ,
ZCLink* AP_RhsStd ,
bool AB_After=true
)
#######################################################################*/
private :
/***************************************************************************/
public :
ZtCBaseList()
{
mp_HeadLink = 0 ;
mp_TailLink = 0 ;
ml_LinkSize = 0 ;
}/*
ZtCBaseList()*/
ZtCBaseList(const ZtCBaseList& rhs)
{
mp_HeadLink = 0 ;
mp_TailLink = 0 ;
ml_LinkSize = 0 ;
*this = (rhs);
}/*
ZtCBaseList(const ZtCBaseList& rhs)*/
~ZtCBaseList()
{
DeleteAll();
}/*
~ZtCBaseList()*/
ZtCBaseList& operator=(const ZtCBaseList& rhs)
{
if(this==&rhs) return *this;
if(rhs.size()<1)
{ this->DeleteAll(); return *this; }
TypeSize VL_MinusSize = this->size() - rhs.size() ;
if (VL_MinusSize>0)
{
ZCLink* VP_CutTail =
mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1);
ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ;
RecvFreeIn ////////////////////////////////////////
(
VL_MinusSize, mp_HeadLink, VP_CutTail
);
///////////////////////////////////////////////////
mp_HeadLink = VP_CutTailNext;
ml_LinkSize -= VL_MinusSize ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}
else if(VL_MinusSize<0)
{
ZCLink* VP_HeadLink=0;
ZCLink* VP_TailLink=0;
SendFreeOut ///////////////////////////////////////
(
-VL_MinusSize ,
RR(VP_HeadLink) ,
RR(VP_TailLink)
);
///////////////////////////////////////////////////
if(ml_LinkSize>0)
{
ZCLink::JoinLink(mp_TailLink, VP_HeadLink);
ZCLink::MakeRing(mp_HeadLink, VP_TailLink);
mp_TailLink = VP_TailLink ;
}
else
{
mp_HeadLink = VP_HeadLink ;
mp_TailLink = VP_TailLink ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
else*/
ml_LinkSize += (-VL_MinusSize);
}/*
else if(VL_MinusSize<0)*/
ZCLink* VP_RhsLink = rhs.mp_HeadLink ;
ZCLink* VP_LhsLink = mp_HeadLink ;
__for0(TypeSize, i, rhs.size())
{
**VP_LhsLink = **VP_RhsLink ;
VP_RhsLink = VP_RhsLink->mp_NextLink;
VP_LhsLink = VP_LhsLink->mp_NextLink;
}/*
__for0(TypeSize, i, rhs.size())*/
return *this;
}/*
ZtCBaseList& operator=(const ZtCBaseList& rhs)*/
void DeleteAll()
{
if(ml_LinkSize<1) return;
RecvFreeIn
(ml_LinkSize, mp_HeadLink, mp_TailLink);
mp_HeadLink =0 ;
mp_TailLink =0 ;
ml_LinkSize =0 ;
}/*
void DeleteAll()*/
TypeData& AddHead()
{ return **AddHeadLink(SendFreeOut()); }
TypeData& AddTail()
{ return **AddTailLink(SendFreeOut()); }
ZCLink& AddHeadDef()
{ return *AddHeadLink(SendFreeOut()); }
ZCLink& AddTailDef()
{ return *AddTailLink(SendFreeOut()); }
TypeData& AddHead(TypeArg AO_ArgData) /*########################*/
{
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
{
ZCLink* VP_NewNode = SendFreeOut();
TypeMoveObj::Exec(**VP_NewNode, AO_ArgData);
return AddHeadLink(VP_NewNode)->mo_DataObjt;
}
////////////////////////////////////////////////////
#endif
return AddHeadLink(new ZCLink(AO_ArgData))->mo_DataObjt;
}/*
TypeData& AddHead(TypeArg AO_ArgData) ##########################*/
TypeData& AddTail(TypeArg AO_ArgData) /*########################*/
{
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
{
ZCLink* VP_NewNode = SendFreeOut();
TypeMoveObj::Exec(*VP_NewNode, AO_ArgData);
return AddTailLink(VP_NewNode)->mo_DataObjt;
}
////////////////////////////////////////////////////
#endif
return AddTailLink(new ZCLink(AO_ArgData))->mo_DataObjt;
}/*
TypeData& AddTail(TypeArg AO_ArgData) ##########################*/
ZtCBaseList& AddHead(ZtCBaseList& rhs)
{
if(this == &rhs ) return *this;
if(rhs.size()<1 ) return *this;
ZtCBaseList VO_TempList(rhs);
return JoinHead(VO_TempList);
}/*
ZtCBaseList& AddHead(ZtCBaseList& rhs)*/
ZtCBaseList& AddTail(ZtCBaseList& rhs)
{
if(this == &rhs ) return *this;
if(rhs.size()<1 ) return *this;
ZtCBaseList VO_TempList(rhs);
return JoinTail(VO_TempList);
}/*
ZtCBaseList& AddTail(ZtCBaseList& rhs)*/
void DeleteHead()
{
if(ml_LinkSize<1) return;
ZCLink* VP_TempLink = mp_HeadLink ;
mp_HeadLink = mp_HeadLink->mp_NextLink ;
RecvFreeIn(VP_TempLink);
if(--ml_LinkSize<1)
{
mp_HeadLink = mp_TailLink =0; return;
}/*
if(--ml_LinkSize<1)*/
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteHead()*/
void DeleteTail()
{
if(ml_LinkSize<1) return;
ZCLink* VP_TempLink = mp_TailLink ;
mp_TailLink = mp_TailLink->mp_PrevLink ;
RecvFreeIn(VP_TempLink);
if(--ml_LinkSize<1)
{
mp_HeadLink = mp_TailLink =0; return;
}/*
if(--ml_LinkSize<1)*/
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteTail()*/
void DeleteHead(TTypSize AL_DelSize)
{
// AL_DelSize 개의 링크를 앞 부분에서 삭제
if(ml_LinkSize<1 || AL_DelSize<1){ return; }
if(AL_DelSize > ml_LinkSize)
{ AL_DelSize = ml_LinkSize; }
if(AL_DelSize== ml_LinkSize)
{
RecvFreeIn
(ml_LinkSize, mp_HeadLink, mp_TailLink);
mp_HeadLink=0 ;
mp_TailLink=0 ;
ml_LinkSize=0 ;
return;
}/*
if(AL_DelSize==ml_LinkSize)*/
ZCLink* VP_NewHead =
mp_HeadLink->GetNextPrevPtr( AL_DelSize ) ;
RecvFreeIn
(AL_DelSize, mp_HeadLink, VP_NewHead->mp_PrevLink);
mp_HeadLink = VP_NewHead ;
ml_LinkSize -= AL_DelSize ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteHead(TTypSize AL_DelSize)*/
void DeleteTail(TTypSize AL_DelSize)
{
if(ml_LinkSize==0 || AL_DelSize<1){ return; }
if(AL_DelSize> ml_LinkSize){ AL_DelSize=ml_LinkSize; }
if(AL_DelSize==ml_LinkSize)
{
RecvFreeIn
(ml_LinkSize, mp_HeadLink, mp_TailLink);
mp_HeadLink=0 ;
mp_TailLink=0 ;
ml_LinkSize=0 ;
return;
}/*
if(AL_DelSize==ml_LinkSize)*/
ZCLink* VP_NewTail =
mp_TailLink->GetNextPrevPtr( -AL_DelSize ) ;
RecvFreeIn
(AL_DelSize, VP_NewTail->mp_NextLink, mp_TailLink);
mp_TailLink = VP_NewTail ;
ml_LinkSize -= AL_DelSize ;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
}/*
void DeleteTail(TTypSize AL_DelSize)*/
ZtCBaseList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_StdLink 의 뒤에 rhs 를 삽입.
if(rhs.ml_LinkSize<1) return *this;
ZCLink* VP_StdLink = AO_StdOpt.Raw();
if(VP_StdLink==0) // 맨 앞에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = rhs.mp_HeadLink ;
mp_TailLink = rhs.mp_TailLink ;
}
else // ml_LinkSize>=1
{
ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink );
ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink );
mp_HeadLink = rhs.mp_HeadLink ;
}/*
else // ml_LinkSize>=1*/
ml_LinkSize += rhs.ml_LinkSize;
rhs.mp_HeadLink = 0 ;
rhs.mp_TailLink = 0 ;
rhs.ml_LinkSize = 0 ;
return *this; /////////////////
}/*
if(VP_StdLink==0)*/
ZCLink* VP_StdNext=VP_StdLink->mp_NextLink;
ZCLink::JoinLink(VP_StdLink , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext );
if(VP_StdLink==mp_TailLink)
{ mp_TailLink=rhs.mp_TailLink; }
ml_LinkSize += rhs.ml_LinkSize;
rhs.mp_HeadLink =0 ;
rhs.mp_TailLink =0 ;
rhs.ml_LinkSize =0 ;
return *this; /*:::::::::::::*/
}/*
ZtCBaseList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
ZtCBaseList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt)
{
// AO_StdOpt 의 앞에 rhs 를 삽입.
if(rhs.size()<1) return *this;
ZCLink* VP_StdLink = AO_StdOpt.Raw();
if(VP_StdLink==0) // 맨 뒤에 삽입
{
if(ml_LinkSize<1)
{
mp_HeadLink = rhs.mp_HeadLink ;
mp_TailLink = rhs.mp_TailLink ;
}
else // ml_LinkSize>=1
{
ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink );
ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink );
mp_TailLink = rhs.mp_TailLink ;
}/*
else // ml_LinkSize>=1*/
ml_LinkSize += rhs.ml_LinkSize;
rhs.mp_HeadLink = 0 ;
rhs.mp_TailLink = 0 ;
rhs.ml_LinkSize = 0 ;
return *this; /////////////////
}/*
if(VP_StdLink==0)*/
ZCLink* VP_StdPrev = VP_StdLink->mp_PrevLink;
ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink );
ZCLink::JoinLink(rhs.mp_TailLink, VP_StdLink );
if(VP_StdLink==mp_HeadLink)
{ mp_HeadLink = rhs.mp_HeadLink; }
ml_LinkSize += rhs.ml_LinkSize;
rhs.mp_HeadLink =0 ;
rhs.mp_TailLink =0 ;
rhs.ml_LinkSize =0 ;
return *this; /*:::::::::::::*/
}/*
ZtCBaseList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
ZtCBaseList& JoinHead(TypeThis& rhs)
{ if(this==&rhs) return *this; return JoinAfter (rhs, ZCLinkOpt(0)); }
ZtCBaseList& JoinTail(TypeThis& rhs)
{ if(this==&rhs) return *this; return JoinBefore(rhs, ZCLinkOpt(0)); }
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다.
CutLink(&AR_CutLink); rhs.AddLinkAfter(AO_StdOpt.Raw(), &AR_CutLink);
}/*
void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)
{
// AP_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다.
CutLink(&AR_CutLink); rhs.AddLinkBefore(AO_StdOpt.Raw(), &AR_CutLink);
}/*
void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/
ZtCBaseList& SwapLinkNext(ZCLink& AR_LinkPrev)
{
// 다음 링크와 위치를 맞바꾼다.
if(size()<=1){return *this;}
ZCLink* VP_LinkNext = AR_LinkPrev.mp_NextLink;
if(&AR_LinkPrev == VP_LinkNext){ return *this; }
if(size()==2)
{
if(&AR_LinkPrev==mp_HeadLink) /*************************/
{
// VP_LinkNext==mp_TailLink
mp_HeadLink = VP_LinkNext ;
mp_TailLink = &AR_LinkPrev;
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/
else // VP_LinkNext==mp_HeadLink
{
mp_HeadLink = &AR_LinkPrev ;
mp_TailLink = VP_LinkNext ;
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/
}
else if(&AR_LinkPrev==mp_HeadLink)
{
// VP_LinkNext == mp_HeadLink.mp_NextLink;
ZCLink* VP_HeadNext2 =
VP_LinkNext->mp_NextLink ;
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev);
ZCLink::JoinLink(&AR_LinkPrev, VP_HeadNext2);
ZCLink::MakeRing(VP_LinkNext , mp_TailLink );
mp_HeadLink = VP_LinkNext ;
}
else if(&AR_LinkPrev==mp_TailLink)
{
// VP_LinkNext==mp_HeadLink
ZCLink* VP_HeadNext =
mp_HeadLink->mp_NextLink ;
ZCLink* VP_TailPrev =
mp_TailLink->mp_PrevLink ;
ZCLink::JoinLink(mp_TailLink, VP_HeadNext);
ZCLink::JoinLink(VP_TailPrev, mp_HeadLink);
ZCLink::MakeRing(mp_TailLink, mp_HeadLink);
mp_HeadLink = &AR_LinkPrev ;
mp_TailLink = VP_LinkNext ;
}
else if(VP_LinkNext==mp_TailLink)
{
ZCLink* VP_TailPrev2 =
AR_LinkPrev.mp_PrevLink ;
ZCLink::JoinLink(VP_TailPrev2, VP_LinkNext );
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev );
ZCLink::MakeRing(mp_HeadLink , &AR_LinkPrev );
mp_TailLink = &AR_LinkPrev ;
}
else
{
ZCLink* VP_SwapPrev = AR_LinkPrev. mp_PrevLink;
ZCLink* VP_SwapNext = VP_LinkNext->mp_NextLink;
ZCLink::JoinLink(VP_SwapPrev , VP_LinkNext ) ;
ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ) ;
ZCLink::JoinLink(&AR_LinkPrev, VP_SwapNext ) ;
}
return *this; /***********************************/
}/*
ZtCBaseList& SwapLinkNext(ZCLink& AR_LinkPrev)*/
ZtCBaseList& SwapLinkPrev(ZCLink& AR_LinkNext)
{
// 이전 링크와 위치를 맞바꾼다.
return SwapLinkNext(*AR_LinkNext.mp_PrevLink);
}/*
ZtCBaseList& SwapLinkPrev(ZCLink& AR_LinkNext)*/
ZtCBaseList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)
{
// AR_LinkOne 와 AR_LinkTwo 의 위치를 바꾼다.
if(size()<=1){return *this;}
if(&AR_LinkOne==&AR_LinkTwo){return *this;}
if(&AR_LinkOne==mp_HeadLink && &AR_LinkTwo==mp_TailLink)
{ return SwapLinkNext(AR_LinkTwo); }
if(&AR_LinkOne==mp_TailLink && &AR_LinkTwo==mp_HeadLink)
{ return SwapLinkNext(AR_LinkOne); }
/******************************************************/
if(&AR_LinkTwo==AR_LinkOne.mp_NextLink)
{ return SwapLinkNext(AR_LinkOne); }
if(&AR_LinkOne==AR_LinkTwo.mp_NextLink)
{ return SwapLinkNext(AR_LinkTwo); }
/******************************************************/
if(&AR_LinkOne==mp_HeadLink)
{
ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink;
ZCLink* VP_TwoNext =AR_LinkTwo. mp_NextLink;
ZCLink* VP_TwoPrev =AR_LinkTwo. mp_PrevLink;
ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ;
ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne ) ;
ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext ) ;
ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ;
mp_HeadLink = &AR_LinkTwo ; return *this;
}
if(&AR_LinkOne==mp_TailLink)
{
ZCLink* VP_TailPrev= mp_TailLink->mp_PrevLink;
ZCLink* VP_TwoNext = AR_LinkTwo. mp_NextLink;
ZCLink* VP_TwoPrev = AR_LinkTwo. mp_PrevLink;
ZCLink::JoinLink( VP_TwoPrev , &AR_LinkOne ) ;
ZCLink::JoinLink(&AR_LinkOne , VP_TwoNext ) ;
ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ;
ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ;
mp_TailLink = &AR_LinkTwo ; return *this;
}
/******************************************************/
if(&AR_LinkTwo==mp_HeadLink)
{
ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink;
ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink;
ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink;
ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ;
ZCLink::JoinLink( VP_OnePrev, &AR_LinkOne ) ;
ZCLink::JoinLink(&AR_LinkOne, VP_OneNext ) ;
ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ;
mp_HeadLink = &AR_LinkTwo ; return *this;
}
if(&AR_LinkTwo==mp_TailLink)
{
ZCLink* VP_TailPrev=mp_TailLink->mp_PrevLink;
ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink;
ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink;
ZCLink::JoinLink( VP_OnePrev , &AR_LinkTwo ) ;
ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext ) ;
ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ;
ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ;
mp_TailLink = &AR_LinkTwo ; return *this;
}
/********************************************************/
ZCLink* VP_OnePrev= AR_LinkOne.mp_PrevLink ;
ZCLink* VP_OneNext= AR_LinkOne.mp_NextLink ;
ZCLink* VP_TwoPrev= AR_LinkTwo.mp_PrevLink ;
ZCLink* VP_TwoNext= AR_LinkTwo.mp_NextLink ;
ZCLink::JoinLink( VP_OnePrev, &AR_LinkTwo) ;
ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext) ;
ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne) ;
ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext) ; return *this;
}/*
ZtCBaseList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/
ZtCBaseList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)
{
if(size()<=1 || &AR_MoveLink==&AR_StdLink){return *this;}
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) /////////////////////////////////////////////
{
if ( &AR_MoveLink == mp_HeadLink &&
mp_HeadLink->mp_NextLink== &AR_StdLink && !AB_After
)
{ return *this; } /*****************************************/
if ( &AR_MoveLink == mp_TailLink &&
mp_TailLink->mp_PrevLink== &AR_StdLink && AB_After
)
{ return *this; } /*****************************************/
if ( &AR_StdLink == mp_HeadLink &&
mp_HeadLink->mp_NextLink== &AR_MoveLink && AB_After
)
{ return *this; } /*****************************************/
if ( &AR_StdLink == mp_TailLink &&
mp_TailLink->mp_PrevLink== &AR_MoveLink && !AB_After
)
{ return *this; } /*****************************************/
// AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결.
ZCLinkFake VO_FakeHead ;
ZCLinkFake VO_FakeTail ;
ZCLink* VP_FakeHead =
reinterpret_cast<ZCLink*>(&VO_FakeHead ) ;
ZCLink* VP_FakeTail =
reinterpret_cast<ZCLink*>(&VO_FakeTail ) ;
ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ;
ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ;
ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink;
ZCLink::JoinLink(VP_MovePrev, VP_MoveNext);
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AR_MoveLink .
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink );
}
mp_HeadLink = VP_FakeHead->mp_NextLink;
mp_TailLink = VP_FakeTail->mp_PrevLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
return *this; /***************************/
}/*
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) ///////////////////////////////////////////*/
if( AB_After && AR_MoveLink.mp_PrevLink==&AR_StdLink)
{ return *this; }
if(!AB_After && AR_MoveLink.mp_NextLink==&AR_StdLink)
{ return *this; }
/*:::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink;
ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ;
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink);
ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink );
}
return *this; /*::::::::::::::::::::::::::::::::*/
}/*
ZtCBaseList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)*/
ZtCBaseList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)
{
ZCLink* VP_LinkStd = AO_StdOpt.Raw();
if(VP_LinkStd==0)
{
if(AB_After)
{ VP_LinkStd = mp_HeadLink; AB_After=false; }
else{ VP_LinkStd = mp_TailLink; AB_After=true ; }
}/*
if(VP_LinkStd==0)*/
return MoveLinkIn(AR_MoveLink, *VP_LinkStd, AB_After);
}/*
ZtCBaseList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)*/
ZtCBaseList& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)
{ return MoveLinkIn(AR_MoveLink, AO_StdOpt, true ); }
ZtCBaseList& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)
{ return MoveLinkIn(AR_MoveLink, AO_StdOpt, false); }
ZtCBaseList& MoveLinkHead(ZCLink& AR_MoveLink)
{ return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), true ); }
ZtCBaseList& MoveLinkTail(ZCLink& AR_MoveLink)
{ return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); }
ZtCBaseList& MoveRangeIn /*////////////////////////////////////////////*/
(
ZCLink& AR_MoveHead , ZCLink& AR_MoveTail ,
ZCLink& AR_StdLink , bool AB_After
)
/*#####################################################################*/
{
// AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다.
// AR_MoveHead 이 AR_MoveTail 뒤에 와서는 안 된다.
if(size() <= 1 ){return *this;}
if(&AR_MoveHead == &AR_StdLink){return *this;}
if(&AR_MoveTail == &AR_StdLink){return *this;}
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink ||
&AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) /////////////////////////////////////////////
{
if ( &AR_MoveHead == mp_HeadLink &&
AR_MoveTail.mp_NextLink== &AR_StdLink && !AB_After
)
{ return *this; } /*****************************************/
if ( &AR_MoveTail == mp_TailLink &&
AR_MoveHead.mp_PrevLink== &AR_StdLink && AB_After
)
{ return *this; } /*****************************************/
if ( &AR_StdLink == mp_HeadLink &&
AR_StdLink.mp_NextLink == &AR_MoveHead && AB_After
)
{ return *this; } /*****************************************/
if ( &AR_StdLink == mp_TailLink &&
AR_StdLink.mp_PrevLink == &AR_MoveTail && !AB_After
)
{ return *this; } /*****************************************/
// AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결.
ZCLinkFake VO_FakeHead ;
ZCLinkFake VO_FakeTail ;
ZCLink* VP_FakeHead =
reinterpret_cast<ZCLink*>(&VO_FakeHead ) ;
ZCLink* VP_FakeTail =
reinterpret_cast<ZCLink*>(&VO_FakeTail ) ;
ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ;
ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ;
ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink;
ZCLink::JoinLink(VP_MovePrev, VP_MoveNext);
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AR_MoveHead~AR_MoveTail .
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink );
}
mp_HeadLink = VP_FakeHead->mp_NextLink;
mp_TailLink = VP_FakeTail->mp_PrevLink;
ZCLink::MakeRing(mp_HeadLink, mp_TailLink);
return *this; /***************************/
}/*
const bool CB_NeedFakeLink = ////////////////////////////////////
(
&AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink ||
&AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink ||
&AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink
) ;
if(CB_NeedFakeLink) ///////////////////////////////////////////*/
if( AB_After && AR_MoveHead.mp_PrevLink==&AR_StdLink)
{ return *this; }
if(!AB_After && AR_MoveTail.mp_NextLink==&AR_StdLink)
{ return *this; }
/*:::::::::::::::::::::::::::::::::::::::::::::::::*/
ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink;
ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink;
ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ;
ZCLink* VP_StdNext = AR_StdLink .mp_NextLink;
ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink;
if(AB_After)
{
ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, VP_StdNext );
}
else
{
ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead);
ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink );
}
return *this; /*::::::::::::::::::::::::::::::::*/
}/*
ZtCBaseList& MoveRangeIn ////////////////////////////////////////////////
(
ZCLink& AR_MoveHead, ZCLink& AR_MoveTail,
ZCLink& AR_StdLink , bool AB_After
)
#######################################################################*/
ZtCBaseList& MoveRangeIn ////////////////////////////////////////////////
(
ZCLink& AR_MoveHead, ZCLink& AR_MoveTail,
ZCLinkOpt AO_StdOpt , bool AB_After
)
/*#####################################################################*/
{
ZCLink* VP_LinkStd = AO_StdOpt.Raw();
if(VP_LinkStd==0)
{
if(AB_After)
{ VP_LinkStd = mp_HeadLink; AB_After=false; }
else{ VP_LinkStd = mp_TailLink; AB_After=true ; }
}/*
if(VP_LinkStd==0)*/
return MoveRangeIn(AR_MoveHead, AR_MoveTail, *VP_LinkStd, AB_After);
}
/*#####################################################################*/
ZtCBaseList& MoveRangeInAfter
( ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, ZCLinkOpt AO_StdOpt)
{ return MoveRangeIn(AR_MoveHead, AR_MoveTail, AO_StdOpt, true ); }
ZtCBaseList& MoveRangeInBefore
( ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, ZCLinkOpt AO_StdOpt)
{ return MoveRangeIn(AR_MoveHead, AR_MoveTail, AO_StdOpt, false); }
/***********************************************************************/
ZtCBaseList& MoveRangeInHead(ZCLink& AR_MoveHead, ZCLink& AR_MoveTail)
{ return MoveRangeIn(AR_MoveHead, AR_MoveTail, ZCLinkOpt(0), true ); }
ZtCBaseList& MoveRangeInTail(ZCLink& AR_MoveHead, ZCLink& AR_MoveTail)
{ return MoveRangeIn(AR_MoveHead, AR_MoveTail, ZCLinkOpt(0), false); }
void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 앞에 연결한다.
{ SendOutAfter (AR_CutLink, rhs, ZCLinkOpt(0)); }
void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 뒤에 연결한다.
{ SendOutBefore(AR_CutLink, rhs, ZCLinkOpt(0)); }
ZtCBaseList& SendRangeOut ///////////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs ,
ZCLinkOpt AO_LinkOpt, bool AB_After
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
return CutLinkRangeOut /************************/
(
AR_CutHead, AR_CutTail , AI_CutSize,
rhs , AO_LinkOpt.Raw(), AB_After
);
/***********************************************/
}
/*#####################################################################*/
ZtCBaseList& SendRangeOutAfter //////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
return CutLinkRangeOut /////////////
(
AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true
);
////////////////////////////////////
}
ZtCBaseList& SendRangeOutBefore /////////////////////////////////////////
(
ZCLink& AR_CutHead, ZCLink& AR_CutTail,
TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt
)
/*#####################################################################*/
{
// AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다.
return CutLinkRangeOut
(
AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), false
);
//////////////////////
}
/*#####################################################################*/
TypeThis& CopyThis(TypeThis& ARR_Rhs) const
{
// *this 를 복사해서, ARR_Rhs 의 끝에 연결한다.
if(size()<1) return ARR_Rhs;
ZCLink* VP_HeadCopy=0;
ZCLink* VP_TailCopy=0;
SendFreeOutCopy ////////////////////////
(
mp_HeadLink , size()-1,
RR(VP_HeadCopy), RR(VP_TailCopy)
);
////////////////////////////////////////
TypeThis VO_TempList;
VO_TempList.mp_HeadLink=VP_HeadCopy ;
VO_TempList.mp_TailLink=VP_TailCopy ;
VO_TempList.ml_LinkSize=size() ;
return ARR_Rhs.JoinTail(VO_TempList);
}/*
TypeThis& CopyThis(TypeThis& ARR_Rhs) const*/
TypeData& GetHeadData(){return mp_HeadLink->mo_DataObjt;}
TypeData& GetTailData(){return mp_TailLink->mo_DataObjt;}
const TypeData& GetHeadData() const{return mp_HeadLink->mo_DataObjt;}
const TypeData& GetTailData() const{return mp_TailLink->mo_DataObjt;}
operator TypeData&() { return AddTail() ; }
ZCDataOpt GetHeadDataOpt()
{
if(mp_HeadLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_HeadLink->mo_DataObjt);
}
ZCDataOpt GetTailDataOpt()
{
if(mp_TailLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_TailLink->mo_DataObjt);
}/*
ZCDataOpt GetTailDataOpt()*/
const ZCDataOpt GetHeadDataOpt() const
{
if(mp_HeadLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_HeadLink->mo_DataObjt);
}
const ZCDataOpt GetTailDataOpt() const
{
if(mp_TailLink==0) return ZCDataOpt(0);
return ZCDataOpt(mp_TailLink->mo_DataObjt);
}/*
const ZCDataOpt GetTailDataOpt()*/
TypeSize size() const{ return ml_LinkSize; }
TypeSize GetSize() const{ return ml_LinkSize; }
_VT_ TypeSize capacity ()
{ if(TTypeCRTP::ZEUseCRTP<1) return 0;
return GetChildObj().capacity ();
}
_VT_ TypeSize size_free()
{ if(TTypeCRTP::ZEUseCRTP<1) return 0;
return GetChildObj().size_free();
}
bool IsEmpty() const{return ml_LinkSize<1;}
bool empty () const{return ml_LinkSize<1;}
void clear(){DeleteAll();}
void push_front(TypeArg AO_ArgData){AddHead(AO_ArgData);}
void push_back (TypeArg AO_ArgData){AddTail(AO_ArgData);}
void pop_front(){DeleteHead();}
void pop_back (){DeleteTail();}
TypeData & front() {return GetHeadData();}
TypeData & back () {return GetTailData();}
TypeDataC& front() const{return GetHeadData();}
TypeDataC& back () const{return GetTailData();}
template<typename TFunctor> void IterElement(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)(VP_LoopLink->mo_DataObjt);
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라,
operator() object
.
ZftMCP() 릿 . -- 2025-09-27 00:38
*/
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template<typename TFunctor> void IterElement(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
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::
ZtCCheckRef<TTypeHelp> ZCCheckRef;
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
**VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
);
////////////////////////////////////////////
/* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라, operator()
object . */
/* ZtCRef 클래스를 사용하는 ZCCheckRef::PassData() 으로 인해, 인수를
. -- 2021-03-10 16:56 */
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template<typename TFunctor, typename TTypeHelp>
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<TTypeHelp1> ZCCheckRef1;
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
VP_LoopLink->mo_DataObjt
, ZCCheckRef1::PassData(AO_TypeHelp1)
, ZCCheckRef2::PassData(AO_TypeHelp2)
);
////////////////////////////////////////////
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElement
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
template<typename TFunctor> void IterElemRev(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink=mp_TailLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)(**VP_LoopLink);
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template<typename TFunctor> void IterElemRev(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef;
ZCLink* VP_LoopLink = mp_TailLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
**VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
);
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template<typename TFunctor, typename TTypeHelp>
void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemRev
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
/*#############################################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp1> ZCCheckRef1;
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
ZCLink* VP_LoopLink = mp_TailLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
VP_LoopLink->mo_DataObjt
, ZCCheckRef1::PassData(AO_TypeHelp1)
, ZCCheckRef2::PassData(AO_TypeHelp2)
);
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_Size)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemRev
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
template<typename TFunctor> void IterElemLink(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)( *VP_LoopLink );
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template<typename TFunctor> void IterElemLink(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
void IterElemLink(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef;
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
*VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
);
////////////////////////////////////////////
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template<typename TFunctor, typename TTypeHelp>
void IterElemLink(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemLink
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
/*#############################################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp1> ZCCheckRef1;
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
ZCLink* VP_LoopLink=mp_HeadLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
*VP_LoopLink
, ZCCheckRef1::PassData(AO_TypeHelp1)
, ZCCheckRef2::PassData(AO_TypeHelp2)
);
////////////////////////////////////////////
VP_LoopLink = VP_LoopLink->mp_NextLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemLink
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
template<typename TFunctor> void IterElemLinkRev(TFunctor AO_Functor)
{
ZCLink* VP_LoopLink = mp_TailLink ;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::
GetObjRef(AO_Functor)( *VP_LoopLink );
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template<typename TFunctor> void IterElemLinkRev(TFunctor AO_Functor) */
template<typename TFunctor, typename TTypeHelp>
void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp)
{
typedef ZNsMain::
ZtCCheckRef<TTypeHelp> ZCCheckRef;
ZCLink* VP_LoopLink=mp_TailLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
*VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp)
);
////////////////////////////////////////////
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template<typename TFunctor, typename TTypeHelp>
void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemLinkRev
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
/*#############################################################################*/
{
typedef ZNsMain::ZtCCheckRef<TTypeHelp1> ZCCheckRef1;
typedef ZNsMain::ZtCCheckRef<TTypeHelp2> ZCCheckRef2;
ZCLink* VP_LoopLink=mp_TailLink;
__for0(TypeSize, i, ml_LinkSize)
{
ZtCTypeData<TFunctor>::GetObjRef(AO_Functor)
(
*VP_LoopLink
, ZCCheckRef1::PassData(AO_TypeHelp1)
, ZCCheckRef2::PassData(AO_TypeHelp2)
);
////////////////////////////////////////////
VP_LoopLink = VP_LoopLink->mp_PrevLink ;
}/*
__for0(TypeSize, i, ml_LinkSize)*/
}/*
template
< typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 >
void IterElemLinkRev
( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 )
###############################################################################*/
ZCLink * GetHeadLinkPtr() {return mp_HeadLink;}
ZCLink * GetTailLinkPtr() {return mp_TailLink;}
ZCLinkC* GetHeadLinkPtr() const{return mp_HeadLink;}
ZCLinkC* GetTailLinkPtr() const{return mp_TailLink;}
ZCLink * GetLinkPtr(TypeSize AI_Index) {return mp_HeadLink->GetNextPrevPtr(AI_Index-1);}
ZCLinkC* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);}
ZCLink & GetHeadLink(TypeSize AI_Distance) {return (*mp_HeadLink)+AI_Distance;}
ZCLink & GetTailLink(TypeSize AI_Distance) {return (*mp_TailLink)-AI_Distance;}
ZCLinkC& GetHeadLink(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;}
ZCLinkC& GetTailLink(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;}
ZCLink & GetNode(TypeSize AI_Index) {return (*mp_HeadLink)+(AI_Index-1);}
ZCLinkC& GetNode(TypeSize AI_Index) const{return (*mp_HeadLink)+(AI_Index-1);}
ZCLink * HeadPtr() {return mp_HeadLink;}
ZCLink * TailPtr() {return mp_TailLink;}
ZCLinkC* HeadPtr() const{return mp_HeadLink;}
ZCLinkC* TailPtr() const{return mp_TailLink;}
ZCLink * HeadPtr(TypeSize AI_Distance) {return &((*mp_HeadLink)+AI_Distance);}
ZCLink * TailPtr(TypeSize AI_Distance) {return &((*mp_TailLink)-AI_Distance);}
ZCLinkC* HeadPtr(TypeSize AI_Distance) const{return &((*mp_HeadLink)+AI_Distance);}
ZCLinkC* TailPtr(TypeSize AI_Distance) const{return &((*mp_TailLink)-AI_Distance);}
ZCLink & HeadRef() {return *mp_HeadLink;}
ZCLink & TailRef() {return *mp_TailLink;}
ZCLinkC& HeadRef() const{return *mp_HeadLink;}
ZCLinkC& TailRef() const{return *mp_TailLink;}
ZCLink & HeadRef(TypeSize AI_Distance) {return (*mp_HeadLink)+AI_Distance;}
ZCLink & TailRef(TypeSize AI_Distance) {return (*mp_TailLink)-AI_Distance;}
ZCLinkC& HeadRef(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;}
ZCLinkC& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;}
ZCLinkOpt HeadOpt() {return ZCLinkOpt(mp_HeadLink);}
ZCLinkOpt TailOpt() {return ZCLinkOpt(mp_TailLink);}
ZCLinkOptC HeadOpt() const{return ZCLinkOpt(mp_HeadLink);}
ZCLinkOptC TailOpt() const{return ZCLinkOpt(mp_TailLink);}
ZCLinkOpt HeadOpt(TypeSize AI_Distance)
{if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);}
ZCLinkOpt TailOpt(TypeSize AI_Distance)
{if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);}
ZCLinkOptC HeadOpt(TypeSize AI_Distance) const
{if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);}
ZCLinkOptC TailOpt(TypeSize AI_Distance) const
{if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);}
ZCLink & _1() {return HeadRef();}
ZCLink & _0() {return TailRef();}
ZCLinkC& _1() const{return HeadRef();}
ZCLinkC& _0() const{return TailRef();}
ZCLink & _1(TypeSize AI_Distance) {return HeadRef(AI_Distance);}
ZCLink & _0(TypeSize AI_Distance) {return TailRef(AI_Distance);}
ZCLinkC& _1(TypeSize AI_Distance) const{return HeadRef(AI_Distance);}
ZCLinkC& _0(TypeSize AI_Distance) const{return TailRef(AI_Distance);}
ZCDataOpt GetDataOpt(TypeSize AI_Index) // 1부터 시작.
{ return DataOpt(AI_Index-1); }
ZCDataOptC GetDataOpt(TypeSize AI_Index) const
{ return DataOpt(AI_Index-1); }
ZCDataOpt DataOpt(TypeSize AI_Index) // 1부터
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**HeadPtr(AI_Index-1));
}
ZCDataOptC DataOpt(TypeSize AI_Index) const
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**HeadPtr(AI_Index-1));
}/*
ZCDataOptC DataOpt(TypeSize AI_Index) const*/
ZCDataOpt DataOptHead(TypeSize AI_Distance=0)
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**HeadPtr(AI_Distance));
}
ZCDataOpt DataOptTail(TypeSize AI_Distance=0)
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**TailPtr(AI_Distance));
}/*
ZCDataOpt DataOptTail(TypeSize AI_Distance=0)*/
ZCDataOptC DataOptHead(TypeSize AI_Distance=0) const
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**HeadPtr(AI_Distance));
}
ZCDataOptC DataOptTail(TypeSize AI_Distance=0) const
{ if(mp_HeadLink==0){return ZCDataOpt(0);}
return ZCDataOpt(**TailPtr(AI_Distance));
}/*
ZCDataOptC DataOptTail(TypeSize AI_Distance=0) const*/
ZCLinkOpt GetLinkOpt(TypeSize AI_Index)
{ if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); }
ZCLinkOptC GetLinkOpt(TypeSize AI_Index) const
{ if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); }
IterEasy GetHeadIterEasy () {return GetHeadLinkPtr();}
IterEasy GetTailIterEasy () {return GetTailLinkPtr();}
IterEasyID GetHeadIterEasyID () {return (IterEasyID )GetHeadLinkPtr();}
IterEasyID GetTailIterEasyID () {return (IterEasyID )GetTailLinkPtr();}
IterEasy GetHeadIterEasy () const{return GetHeadLinkPtr();}
IterEasy GetTailIterEasy () const{return GetTailLinkPtr();}
IterEasyIDc GetHeadIterEasyID () const{return (IterEasyIDc)GetHeadLinkPtr();}
IterEasyIDc GetTailIterEasyID () const{return (IterEasyIDc)GetTailLinkPtr();}
IterEasyIDc GetHeadIterEasyIDc() const{return (IterEasyIDc)GetHeadLinkPtr();}
IterEasyIDc GetTailIterEasyIDc() const{return (IterEasyIDc)GetTailLinkPtr();}
void MoveNextIter(ZCLink* & APR_CLink ) const
{ APR_CLink=APR_CLink->GetNextPtr(); }
void MoveNextIter(IterEasyID & ARRI_IterEasyID ) const
{ MoveNextIter((ZCLink*&)(ARRI_IterEasyID)); }
void MoveNextIter(TypeLinkC* & APR_CLink ) const
{ APR_CLink=APR_CLink->GetNextPtr(); }
void MoveNextIter(IterEasyIDc& ARRI_IterEasyID ) const
{ MoveNextIter((TypeLinkC*&)(ARRI_IterEasyID)); }
void MoveNextIter(iterator & ARR_Iterator ) const{++ARR_Iterator;}
void MoveNextIter(iteratorN & ARR_Iterator ) const{++ARR_Iterator;}
void MovePrevIter(ZCLink* & APR_CLink ) const
{ APR_CLink=APR_CLink->GetPrevPtr(); }
void MovePrevIter(IterEasyID & ARRI_IterEasyID ) const
{ MovePrevIter((ZCLink*&)(ARRI_IterEasyID)); }
void MovePrevIter(TypeLinkC* & APR_CLink ) const
{ APR_CLink=APR_CLink->GetPrevPtr(); }
void MovePrevIter(IterEasyIDc& ARRI_IterEasyID ) const
{ MovePrevIter((TypeLinkC*&)(ARRI_IterEasyID)); }
void MovePrevIter(iterator & ARR_Iterator ) const{--ARR_Iterator;}
void MovePrevIter(iteratorN & ARR_Iterator ) const{--ARR_Iterator;}
iterator begin () { return ZCNodePoint (*this); }
iteratorN 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); }
IterEasy ItHEasy() {return GetHeadIterEasy ();}
IterEasy ItTEasy() {return GetTailIterEasy ();}
IterEasyID ItHID () {return GetHeadIterEasyID ();}
IterEasyID ItTID () {return GetTailIterEasyID ();}
IterEasyC ItHEasy() const{return GetHeadIterEasy ();}
IterEasyC ItTEasy() const{return GetTailIterEasy ();}
IterEasyIDc ItHID () const{return GetHeadIterEasyIDc();}
IterEasyIDc ItTID () const{return GetTailIterEasyIDc();}
IterEasyIDc ItHIDc () const{return GetHeadIterEasyIDc();}
IterEasyIDc ItTIDc () const{return GetTailIterEasyIDc();}
void ItNext(ZCLink * & APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;}
void ItNext(IterEasyID & ARRI_IterEasyID) const{ItNext((ZCLink*&)(ARRI_IterEasyID));}
void ItNext(TypeLinkC* & APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;}
void ItNext(iterator & ARR_Iterator ) const{++ARR_Iterator;}
void ItNext(iteratorN & ARR_Iterator ) const{++ARR_Iterator;}
void ItNext(IterEasyIDc & ARRI_IterEasyID) const
{ ItNext((TypeLinkC*&) (ARRI_IterEasyID)); }
void ItPrev(ZCLink * & APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;}
void ItPrev(IterEasyID & ARRI_IterEasyID) const{ItPrev((ZCLink*&)(ARRI_IterEasyID));}
void ItPrev(TypeLinkC* & APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;}
void ItPrev(iterator & ARR_Iterator ) const{--ARR_Iterator;}
void ItPrev(iteratorN & ARR_Iterator ) const{--ARR_Iterator;}
void ItPrev(IterEasyIDc & ARRI_IterEasyID) const
{ ItPrev((TypeLinkC*&) (ARRI_IterEasyID)); }
/*//////////////////////////////////////////////////////////////////
ItPrev(IterEasyIDc&) ItNext(IterEasyIDc&)
(TypeLinkC*&)
,
(TypeLinkC*&) (TypeLinkC*)
. ItNext(IterEasyID&) ItPrev(IterEasyID&)
(TypeLink *&) (TypeLink *)
. -- 2025-10-15 16:19
//////////////////////////////////////////////////////////////////*/
TypeData & ItD(ZCLink * AP_CLink ){return **AP_CLink ;}
TypeData & ItD(iterator & ARR_Iterator ){return *ARR_Iterator;}
TypeData & ItD(IterEasyID AH_IterEasyID )
{ return ItD((TypeLink* )AH_IterEasyID);}
TypeDataC& ItD(TypeLinkC * AP_CLink ) const{ return **AP_CLink ;}
TypeDataC& ItD(iteratorN & ARR_Iterator ) const{ return *ARR_Iterator ;}
TypeDataC& ItD(IterEasyIDc AH_IterEasyID ) const
{ return ItD((TypeLinkC*)AH_IterEasyID);}
TypeData & ItD( TypeLink * AP_CLink , TypeSize AI_FarNum)
{return **(AP_CLink->GetNextPrevPtr(AI_FarNum)) ; }
TypeData & ItD( IterEasyID AH_IterEasyID, TypeSize AI_FarNum)
{ return ItD((ZCLink *)AH_IterEasyID , AI_FarNum); }
TypeData & ItD( iterator & ARR_Iterator , TypeSize AI_FarNum)
{ return ItD((ZCLink *)ARR_Iterator , AI_FarNum); }
TypeDataC& ItD( TypeLinkC * AP_CLink , TypeSize AI_FarNum) const
{return **(AP_CLink->GetNextPrePtr(AI_FarNum)) ; }
TypeDataC& ItD( IterEasyIDc AH_IterEasyID, TypeSize AI_FarNum) const
{ return ItD((ZCLinkC*)AH_IterEasyID , AI_FarNum); }
TypeDataC& ItD( iteratorN & ARR_Iterator , TypeSize AI_FarNum) const
{ return ItD((ZCLinkC*)ARR_Iterator , AI_FarNum); }
public :
};/*
template //////////////////////////////////////////////////////////////////
<
typename TType ,
typename TTypArgu = const TType& ,
typename TTypeAlloc = ZCAllocator ,
typename TTypSize = ZTypLong ,
typename TMoveObj = ZNsMain::
ZtCMoveObj<TType, TTypArgu, true> ,
typename TTypeCRTP = ZNsType::ZtCTypeCRTP<ZCEmpty, false>
>
class ZtCBaseList #######################################################*/
namespace ZNsChars
{
template<typename TTypeChars> class ZtCMainChars;
}/*
namespace ZNsChars*/
template< typename TTypeChar, typename TTypeLength=ZTypLength
>
class ZtCChars /**#########################################*/
{
public :
template<typename TTypeChars>
friend class ZNsChars::ZtCMainChars ;
public :
typedef TTypeChar TypeChar ;
typedef TTypeLength TypeLength ;
typedef TTypeLength TypeSize ;
public:
typedef const TTypeChar TypeCharC ;
typedef const TTypeChar* TypeCharCP ;
private:
TypeChar* mp_TypeChar ;
TypeSize ml_TypeSize ;
public :
ZtCChars()
{
mp_TypeChar = 0;
ml_TypeSize = 0;
}/*
ZtCChars()*/
explicit ZtCChars(TypeCharC* APC_TypeChar)
{
mp_TypeChar =
const_cast<TypeChar*> (APC_TypeChar);
ml_TypeSize = ZftLengthType
<TypeSize, TypeChar > (mp_TypeChar );
}/*
explicit ZtCChars(TypeCharC* APC_TypeChar)*/
ZtCChars(TypeCharC* APC_TypeChar, TypeSize AL_Length)
{
mp_TypeChar = const_cast
<TypeChar*>(APC_TypeChar);
ml_TypeSize = AL_Length ;
}/*
ZtCChars(TypeCharC* APC_TypeChar, TypeSize AL_Length)*/
ZtCChars(const ZtCChars& rhs)
{
mp_TypeChar = const_cast
<TypeChar*>( rhs.mp_TypeChar ) ;
ml_TypeSize = rhs.ml_TypeSize ;
}/*
ZtCChars(const ZtCChars& rhs)*/
ZtCChars(ZtCChars& rhs)
{
mp_TypeChar = rhs.mp_TypeChar ;
ml_TypeSize = rhs.ml_TypeSize ;
}/*
ZtCChars(ZtCChars& rhs)*/
ZtCChars& operator=(const ZtCChars& rhs)
{
mp_TypeChar = const_cast<ZtCChars&>(rhs).mp_TypeChar ;
ml_TypeSize = const_cast<ZtCChars&>(rhs).ml_TypeSize ;
return *this;
}/*
ZtCChars& operator=(const ZtCChars& rhs)*/
ZtCChars& operator=(ZtCChars& rhs)
{
mp_TypeChar = rhs.mp_TypeChar ;
ml_TypeSize = rhs.ml_TypeSize ;
return *this;
}/*
ZtCChars& operator=(ZtCChars& rhs)*/
void Init()
{
mp_TypeChar = 0;
ml_TypeSize = 0;
}/*
void Init()*/
void Init(TypeCharC* APC_TypeChar)
{
mp_TypeChar =
const_cast<TypeChar*>(APC_TypeChar);
ml_TypeSize = ZftGetLength(mp_TypeChar);
}/*
void Init(TypeCharC* APC_TypeChar)*/
void Init(TypeCharC* APC_TypeChar, TypeLength AL_Length)
{
mp_TypeChar = const_cast
<TypeChar*>(APC_TypeChar) ;
ml_TypeSize = AL_Length ;
}/*
void Init(TypeCharC* APC_TypeChar, TypeLength AL_Length)*/
void InitData(TypeCharC* APC_TypeChar)
{
mp_TypeChar=const_cast<TypeChar*>(APC_TypeChar);
}/*
void InitData(TypeCharC* APC_TypeChar)*/
void InitLength(TypeLength AL_Length)
{
ml_TypeSize=AL_Length;
}/*
void InitLength(TypeLength AL_Length)*/
TypeChar* data() {return mp_TypeChar ;}
TypeCharC* data() const{return mp_TypeChar ;}
TypeLength size() const{return ml_TypeSize ;}
ZtCChars& operator+=(TypeLength AI_MovePos)
{
return MoveChar(AI_MovePos);
}/*
ZtCChars& operator+=(TypeLength AI_MovePos)*/
int operator-(const ZtCChars& rhs) const
{
// 두 문자열이 같으면 0
// 왼쪽 문자열이 크면 0 보다 큰 어떤 수
// 오른쪽 문자열이 크면 0 보다 작은 어떤 수를 반환
TypeCharC* VP_Left = mp_TypeChar;
TypeCharC* VP_Right=rhs.mp_TypeChar;
typedef typename ZtCCharInt
<TypeChar>::TypeInt TypeCharInt;
#if(_CODE_OLD_)
TypeChar VC_Minus = 0;
#else
TypeCharInt VI_Minus = 0; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고.
#endif
TypeLength VL_Index = 0;
TypeLength VL_Loop = /*:::::::::::::::::::::::::*/
(
ml_TypeSize <= rhs.ml_TypeSize
? this->ml_TypeSize
: rhs. ml_TypeSize
) ;
/*::::::::::::::::::::::::::::::::::::::::::::::::*/
while(VL_Index<VL_Loop)
{
#if(_CODE_OLD_)
if((VC_Minus=*VP_Left++ - *VP_Right++)!=0)
{
return VC_Minus;
}/*
if((VC_Minus=*VP_Left++ - *VP_Right++)!=0)*/
#else
if((VI_Minus=TypeCharInt(*VP_Left++) - TypeCharInt(*VP_Right++))!=0)
{
return VI_Minus; // 페이지 하단의 'char 의 int 확장에 따른 문제의 코드' 참고.
}/*
if((VI_Minus=TypeCharInt(*VP_Left++) - TypeCharInt(*VP_Right++))!=0)*/
#endif
++VL_Index;
}/*
while(VL_Index<VL_Loop)*/
return ml_TypeSize-rhs.ml_TypeSize;
}/*
int operator-(const ZtCChars& rhs) const*/
bool operator==(const ZtCChars& rhs) const{return (*this)-rhs == 0 ;}
bool operator> (const ZtCChars& rhs) const{return (*this)-rhs > 0 ;}
bool operator< (const ZtCChars& rhs) const{return (*this)-rhs < 0 ;}
bool operator>=(const ZtCChars& rhs) const{return (*this)-rhs >= 0 ;}
bool operator<=(const ZtCChars& rhs) const{return (*this)-rhs <= 0 ;}
ZtCChars& MoveChar(TypeLength AI_MovePos)
{
mp_TypeChar += AI_MovePos ;
ml_TypeSize -= AI_MovePos ;
return *this;
}/*
ZtCChars& MoveChar(TypeLength AI_MovePos)*/
ZTypIntI GetInt(bool AB_IsBigEndian=true) const
{
ZTycIntI CI_IntByte = sizeof(ZTypIntI);
ZTycIntI CI_SearchSize =
(ml_TypeSize<CI_IntByte ? ml_TypeSize : CI_IntByte) ;
ZTypIntI VI_Result = 0 ;
ZTypIntI VI_TempInt = 1 ;
if(AB_IsBigEndian)
{
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt *= 256 ;
}/*
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)*/
return VI_Result;
}/*
if(AB_IsBigEndian)*/
for(ZTypIntI i=0; i<CI_SearchSize; ++i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt*= 256 ;
}/*
for(ZTypIntI i=0; i<CI_SearchSize; ++i)*/
return VI_Result;
}/*
ZTypIntI GetInt(bool AB_IsBigEndian=true) const*/
ZTypIntL GetLong(bool AB_IsBigEndian=true) const
{
ZTycIntI CI_IntByte = sizeof(ZTypIntL);
ZTycIntI CI_SearchSize =
(ml_TypeSize<CI_IntByte ? ml_TypeSize : CI_IntByte) ;
ZTypIntL VI_Result = 0 ;
ZTypIntL VI_TempInt = 1 ;
if(AB_IsBigEndian)
{
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt *= 256 ;
}/*
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)*/
return VI_Result;
}/*
if(AB_IsBigEndian)*/
for(ZTypIntI i=0; i<CI_SearchSize; ++i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt *= 256 ;
}/*
for(ZTypIntI i=0; i<CI_SearchSize; ++i)*/
return VI_Result;
}/*
ZTypIntL GetLong(bool AB_IsBigEndian=true) const*/
ZTypIntLL GetLLong(bool AB_IsBigEndian=true) const
{
ZTycIntI CI_IntByte = sizeof(ZTypIntLL);
ZTycIntI CI_SearchSize =
(ml_TypeSize<CI_IntByte ? ml_TypeSize : CI_IntByte) ;
ZTypIntLL VI_Result = 0 ;
ZTypIntLL VI_TempInt = 1 ;
if(AB_IsBigEndian)
{
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt *= 256 ;
}/*
for(ZTypIntI i=CI_SearchSize-1; i>=0; --i)*/
return VI_Result;
}/*
if(AB_IsBigEndian)*/
for(ZTypIntI i=0; i<CI_SearchSize; ++i)
{
VI_Result += (ZTypIntI)(ZTypUChar)(mp_TypeChar[i]) * VI_TempInt ;
VI_TempInt *= 256 ;
}/*
for(ZTypIntI i=0; i<CI_SearchSize; ++i)*/
return VI_Result;
}/*
ZTypIntLL GetLLong(bool AB_IsBigEndian=true) const*/
public:
};/*
template< typename TTypeChar, typename TTypeLength=ZTypLength
>
class ZtCChars ############################################*/
typedef ZtCChars<char > ZCChars ;
typedef ZtCChars<wchar_t> ZCCharsW ;
typedef ZtCChars<char > ZCCharView ; // for string_view in C++17
typedef ZtCChars<wchar_t> ZCCharViewW ;
template<> string& ZftMakeStr(string& ARR_SaveCStr, const ZCCharView& AO_View)
{ ARR_SaveCStr.append(AO_View.data(), AO_View.size()); return ARR_SaveCStr; }
template<> wstring& ZftMakeStr(wstring& ARR_SaveCStr, const ZCCharViewW& AO_View)
{ ARR_SaveCStr.append(AO_View.data(), AO_View.size()); return ARR_SaveCStr; }
/*//////////////////////////////////////////////////////////////////////////////////////
template<typename TTypString> class ZtCCharType
stl string wstring 릿 ,
char wchar_t ,
, ZtCStringBase
template<> class ZtCCharType
cf) typedef ZtCCharType::TypeChar TypeChar;
.
string::traits_type::char_type
string::traits_type::int_type
, string
.
-- 2025-10-08 21:24
//////////////////////////////////////////////////////////////////////////////////////*/
template<typename TTypString> class ZtCCharType
{
public:
typedef typename TTypString::
traits_type::char_type /*++*/ TypeChar;
typedef TTypString /*++*/ TypeCStr;
typedef typename
ZtCCharInt<TypeChar>::TypeInt TypeInt ;
typedef typename TypeCStr::
size_type /*++*/ TypeSize;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const int CI_ByteSize = sizeof(TypeChar);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef TypeChar char_type ; // for stl string/wstring
typedef TypeInt int_type ; // for stl string/wstring
typedef TypeSize size_type ; // for stl string/wstring
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};/*
template<typename TTypString> class ZtCCharType*/
template<> class ZtCCharType<std::string>
{
public:
typedef std::string /*+++++++*/ TypeCStr;
typedef char /*+++++++*/ TypeChar;
typedef typename TypeCStr::
size_type /*+++++++*/ TypeSize;
typedef typename
ZtCCharInt<char>::TypeInt TypeInt ;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const int CI_ByteSize = sizeof(TypeChar);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef TypeChar char_type ;
typedef TypeInt int_type ;
typedef TypeSize size_type ;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};/*
template<> class ZtCCharType<std::string>*/
template<> class ZtCCharType<std::wstring>
{
public:
typedef std::wstring /*+++++++*/ TypeCStr;
typedef wchar_t /*+++++++*/ TypeChar;
typedef typename
ZtCCharInt<wchar_t>::TypeInt TypeInt ;
typedef typename TypeCStr::
size_type /*+++++++*/ TypeSize;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const int CI_ByteSize = sizeof(TypeChar);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef TypeChar char_type ;
typedef TypeInt int_type ;
typedef TypeSize size_type ;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};/*
template<> class ZtCCharType<std::wstring>*/
template<typename TTypChar, typename TTypLength> class ZtCBoolStr
{
public:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef ZtCChars<TTypChar, TTypLength> ZCChars;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMarkTrue ()
{ static const ZCChars SO_ZCChars; return SO_ZCChars; }
static const ZCChars& GetMarkFalse()
{ static const ZCChars SO_ZCChars; return SO_ZCChars; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMark(bool AB_Bool)
{
return AB_Bool ? GetMarkTrue() : GetMarkFalse();
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};
/*##############################################################################*/
template<typename TTypLength>
class ZtCBoolStr<char, TTypLength> /*+++++++++++++++++++++++++++++++*/
{
public:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef ZtCChars<char, TTypLength> ZCChars;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMarkTrue ()
{ static const ZCChars SO_ZCChars("true" ); return SO_ZCChars; }
static const ZCChars& GetMarkFalse()
{ static const ZCChars SO_ZCChars("false"); return SO_ZCChars; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMark(bool AB_Bool)
{
return AB_Bool ? GetMarkTrue() : GetMarkFalse();
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};
//////////////////////////////////////////////////////////////////////////
template<typename TTypLength>
class ZtCBoolStr<wchar_t, TTypLength> /*++++++++++++++++++++++++++++*/
{
public:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
typedef ZtCChars<wchar_t, TTypLength> ZCChars;
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMarkTrue ()
{ static const ZCChars SO_ZCChars(L"true" ); return SO_ZCChars; }
static const ZCChars& GetMarkFalse()
{ static const ZCChars SO_ZCChars(L"false"); return SO_ZCChars; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const ZCChars& GetMark(bool AB_Bool)
{
return AB_Bool ? GetMarkTrue() : GetMarkFalse();
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public:
};
//////////////////////////////////////////////////////////////////////////
namespace ZNsView
{
class ZCViewLogData
{
public:
virtual void Log(const char* APC_LogData, ZTypLength AI_Length)
{
__for0(ZTypLength, i, AI_Length){std::cout<<APC_LogData[i];}
}/*
virtual void Log(const char* APC_LogData, ZTypLength AI_Length)*/
virtual void Log(const char* APC_LogData)
{ std::cout<<APC_LogData; }
virtual void Log(int AI_LogData){ std::cout<<AI_LogData; }
virtual void Log(long AL_LogData){ std::cout<<AL_LogData; }
virtual void Log(double AD_LogData){ std::cout<<AD_LogData; }
virtual void Log(char AC_LogData){ std::cout<<AC_LogData; }
virtual void Log(bool AB_LogData)
{
cout<<(AB_LogData ? "true" : "false");
}/*
virtual void Log(bool AB_LogData)*/
virtual void LogXmlAtt(const char* APC_LogData, ZTypLength AI_Length)
{
__for0(ZTypLength, i, AI_Length)
{
if(APC_LogData[i]=='&' ){cout<<"&amp;" ; continue;}
if(APC_LogData[i]=='\r'){cout<<"&#xA;" ; continue;}
if(APC_LogData[i]=='\n'){cout<<"&#xD;" ; continue;}
if(APC_LogData[i]=='\t'){cout<<"&#x9;" ; continue;}
if(APC_LogData[i]=='\"'){cout<<"&quot;"; continue;}
if(APC_LogData[i]=='>' ){cout<<"&gt;" ; continue;}
if(APC_LogData[i]=='<' ){cout<<"&lt;" ; continue;}
cout<<APC_LogData[i] ;
}/*
__for0(ZTypLength, i, AI_Length)*/
}/*
virtual void LogXmlAtt(const char* APC_LogData, ZTypLength AI_Length)*/
virtual void LogXmlAtt(const char* APC_LogData)
{
LogXmlAtt(APC_LogData, ZftLength(APC_LogData));
}/*
virtual void LogXmlAtt(const char* APC_LogData)*/
public:
};/*
class ZCViewLogData*/
}/*
namespace ZNsView*/
class ZCSngtLogData
{
public :
typedef ZNsView::ZCViewLogData ZCViewLogData;
private:
ZCViewLogData mo_ZCViewLogData;
ZCViewLogData* mp_ZCViewLogData;
private:
ZCSngtLogData() : mp_ZCViewLogData(&mo_ZCViewLogData){}
public :
static ZCSngtLogData& GetSngtObj()
{
static ZCSngtLogData SO_ZCSngtLogData; return SO_ZCSngtLogData;
}/*
static ZCSngtLogData& GetSngtObj()*/
static ZCViewLogData& GetSngtView()
{
return *GetSngtObj().mp_ZCViewLogData;
}/*
static ZCViewLogData& GetSngtView()*/
static void SetSngtView(ZCViewLogData& AR_ViewObj)
{
GetSngtObj().mp_ZCViewLogData = &AR_ViewObj ;
}/*
static void SetSngtView(ZCViewLogData& AR_ViewObj)*/
public :
static void Log(const char* APC_Log, ZTypLength AI_Length)
{
GetSngtView().Log(APC_Log, AI_Length);
}/*
static void Log(const char* APC_Log, ZTypLength AI_Length)*/
static void Log(const char* APC_LogData)
{
GetSngtView().Log( APC_LogData );
}/*
static void Log(const char* APC_LogData)*/
static void Log(int AI_LogData){ GetSngtView().Log(AI_LogData); }
static void Log(long AL_LogData){ GetSngtView().Log(AL_LogData); }
static void Log(double AD_LogData){ GetSngtView().Log(AD_LogData); }
static void Log(char AC_LogData){ GetSngtView().Log(AC_LogData); }
static void Log(bool AB_LogData){ GetSngtView().Log(AB_LogData); }
static void LogXmlAtt(const char* APC_LogData, ZTypLength AI_Length)
{
GetSngtView().LogXmlAtt(APC_LogData, AI_Length);
}/*
static void LogXmlAtt(const char* APC_LogData, ZTypLength AI_Length)*/
static void LogXmlAtt(const char* APC_LogData)
{
GetSngtView().LogXmlAtt(APC_LogData);
}/*
static void LogXmlAtt(const char* APC_LogData)*/
public :
ZCSngtLogData& operator()(const char* APC_Log, ZTypLength AI_Length)
{
ZCSngtLogData::Log(APC_Log, AI_Length); return *this;
}/*
ZCSngtLogData& operator()(const char* APC_Log, ZTypLength AI_Length)*/
ZCSngtLogData& operator()(const char* APC_LogData)
{
GetSngtView().Log( APC_LogData ); return *this;
}/*
ZCSngtLogData& operator()(const char* APC_LogData)*/
ZCSngtLogData& operator()(const ZCCharView& AO_View)
{
ZCSngtLogData::Log(AO_View.data(), AO_View.size()); return *this;
}/*
ZCSngtLogData& operator()(const ZCCharView& AO_View)*/
ZCSngtLogData& operator()(int AI_LogData){ GetSngtView().Log(AI_LogData); return *this; }
ZCSngtLogData& operator()(long AL_LogData){ GetSngtView().Log(AL_LogData); return *this; }
ZCSngtLogData& operator()(double AD_LogData){ GetSngtView().Log(AD_LogData); return *this; }
ZCSngtLogData& operator()(char AC_LogData){ GetSngtView().Log(AC_LogData); return *this; }
ZCSngtLogData& operator()(bool AB_LogData){ GetSngtView().Log(AB_LogData); return *this; }
ZCSngtLogData& Xa(const char* APC_LogData, ZTypLength AI_Length)
{
GetSngtView().LogXmlAtt(APC_LogData, AI_Length); return *this;
}/*
ZCSngtLogData& Xa(const char* APC_LogData, ZTypLength AI_Length)*/
ZCSngtLogData& Xa(const char* APC_LogData)
{
GetSngtView().LogXmlAtt(APC_LogData); return *this;
}/*
ZCSngtLogData& Xa(const char* APC_LogData)*/
public :
};/*
class ZCSngtLogData*/
2021-02-25 16:23:13 +09:00
}/*
namespace ZNsMain*/
2021-02-25 16:23:13 +09:00
namespace ZNsCPP
{
2021-03-04 18:02:17 +09:00
using ZNsMain::IterEasyID;
2021-02-25 16:23:13 +09:00
/* 이 이름공간에는 ZNsMain 에 있는 라이브러리 보다 좀더 thread-safe
, gerneric .
*/
namespace ZNsIFace
{
}/*
namespace ZNsIFace*/
namespace ZNsType
{
}/*
namespace ZNsType*/
namespace ZNsEnum
{
}/*
namespace ZNsEnum*/
namespace ZNsConst
{
}/*
namespace ZNsConst*/
}/*
namespace ZNsCPP */
/* 함수 안에서 함수를 정의할 필요가 있을 때, struct 를 이용하여 함수를 정의하는 매크로. -- 2015-09-06 05:20:00 */
#define _FUNC_IN_FUNC_START_(ZstClassName) struct ZstClassName{static void Exec
#define _FUNC_IN_FUNC_CLOSE_(ZstClassName) };
#define _FUNC_IN_FUNC_RETURN_START_(ZstClassName, ZTypeReturn) struct ZstClassName{static ZTypeReturn Exec
#define _FUNC_IN_FUNC_RETURN_CLOSE_(ZstClassName, ZTypeReturn) };
#define _FFS_(ZstClassName) _FUNC_IN_FUNC_START_(ZstClassName)
#define _FFC_(ZstClassName) _FUNC_IN_FUNC_CLOSE_(ZstClassName)
#define _FFE_(ZstClassName) }; // E 문자는 END 의 뜻.
#define _FFRS_(ZstClassName, ZTypeReturn) _FUNC_IN_FUNC_RETURN_START_(ZstClassName, ZTypeReturn)
#define _FFRC_(ZstClassName, ZTypeReturn) _FUNC_IN_FUNC_RETURN_CLOSE_(ZstClassName, ZTypeReturn)
#define _FFRE_(ZstClassName) };
#define _FFF_(ZstClassName) ZstClassName::Exec
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_FUNC_IN_FUNC_START_ .
#include<iostream>
using namespace ZNsMain;
int main()
{
_FUNC_IN_FUNC_START_(My)
(IntI ArgiShowCnt)
{
for(int i=0; i<ArgiShowCnt; ++i) cout<<"# Show My() In Func."<<endl;
}
_FUNC_IN_FUNC_CLOSE_(My)
_FUNC_IN_FUNC_RETURN_START_(My2, Int)
(IntI ArgiShowCnt)
{
for(int i=0; i<ArgiShowCnt; ++i) cout<<"# Show My() In Func."<<endl; return ArgiShowCnt;
}
_FUNC_IN_FUNC_RETURN_CLOSE_(My2, int)
_FFS_(My3)
(IntI ArgiShowCnt)
{
for(int i=0; i<ArgiShowCnt; ++i) cout<<"# Show My() In Func."<<endl; return ArgiShowCnt;
}
_FFC_(My3)
My ::Exec(3);
My2::Exec(3);
My3::Exec(3);
return 0;
}
-- 2015-09-06 17:21:00
CNetEx.H HandleEvent . -- 2015-09-06 17:43:00
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
2021-02-25 16:23:13 +09:00
/*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4.1
gcc -v
.
.
$ echo 'main(){printf("hello world\n");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
/usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -
--
,
echo . | gcc -dM -E -
gcc -dM -E - < /dev/null
.
ex) gcc -dM -E - < /dev/null | grep 'linux'
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
ex) echo . | gcc -dM -E - | grep 'unix'
#define __unix 1
#define __unix__ 1
#define unix 1
ymir . http://kldp.org/node/121720
-- 2011-03-03 13:21:00
OS
: #define __linux__ 1
HP : #define __hpux__ 1
sun : #define __sun__ 1
IRIX : #define __mips__ 1
TRUE64 : #define __alpha__ 1
FreeBSD: #define __FreeBSD_cc_version 800001
#define __VERSION__ "4.2.1 20070719 [FreeBSD]"
#define __FreeBSD__ 8
AIX : #define _AIX 1
#define _AIX32 1
#define _AIX41 1
#define _AIX43 1
#define _AIX51 1
#define _AIX52 1
#define _AIX53 1
-- 2011-03-12 16:17:00
, .
#ifdef __linux__
// ... funky stuff ...
#endif // __linux__
__linux__라는 . linux .
2021-02-25 16:23:13 +09:00
POSIX .
OS Shared Library PATH (2012-04-08 19:25:00)
http://cafe335.daum.net/_c21_/bbs_search_read?grpid=TzUN&fldid=DUnV&contentval=0000szzzzzzzzzzzzzzzzzzzzzzzzz&nenc=&fenc=&q=gulim.ttf&nil_profile=cafetop&nil_menu=sch_updw
AIX LIBPATH, LD_LIBRARY_PATH
OS/2 LIBPATH
Windows NT/95 PATH
Solaris/Linux LD_LIBRARY_PATH
HP/UX SHLIB_PATH, LD_LIBRARY_PATH (64 bit only)
ex) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/userJNI/lib
HP-UX Shared Library sl .
SUN일 LD_LIBRARY_PATH HP-UX SHLIB_PATH , AIX LIBPATH .
: HP에서 LD_LIBRARY_PATH 64 . sl
chatr SHLIB_PATH가 "사용 불가능" .
/opt/mqm/samp/bin/amqsput chatr .
chatr /opt/mqm/samp/bin/amqsput
SHLIB_PATH를 .
chatr +s enable /opt/mqm/samp/bin/amqsput
SHLIB_PATH /usr/lib (echo $SHLIB_PATH).
.
export SHLIB_PATH=$SHLIB_PATH:/usr/lib
SHLIB_PATH chatr +s .
IBM WebSphere MQ runmqsc
runmqsc D11LHP.QM
5724-B41 (C) Copyright IBM Corp. 1994, 2002. ALL RIGHTS RESERVED.
Starting MQSC for queue manager D11LHP.QM.
/usr/lib/dld.sl: Can't find path for shared library: libstream.2
/usr/lib/dld.sl: No such file or directory
AMQ9508: Program cannot connect to the queue manager.
No MQSC commands read.
No commands have a syntax error.
All valid MQSC commands were processed.
IBM WebSphere MQ ( 2217)
amqsput QL_D11LHP_B02KLNX.U1.I D11LHP.QM
Sample AMQSPUT0 start
target queue is QL_D11LHP_B02KLNX.U1.I
MQOPEN ended with reason code 2217
unable to open queue for output
Sample AMQSPUT0 end
--
--
'new operator' 'operator new' Programming
2025-10-18 21:29 .
new operator = operator new + placement new
2021-02-25 16:23:13 +09:00
(2007/04/03 16:20)
http://blog.naver.com/cppis/60036113050
bugmail More Effective C++ new delete
.
2021-02-25 16:23:13 +09:00
new operator operator new
2021-02-25 16:23:13 +09:00
.
2021-02-25 16:23:13 +09:00
new operator C++ .
2021-02-25 16:23:13 +09:00
-- , , ,
-- .
2021-02-25 16:23:13 +09:00
C++ new operator . operator new
Operator .
, new operator
operator new , object .
.
operator new Overload 'operator new'
. , void* , size_t . new operator
.
2021-02-25 16:23:13 +09:00
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
- placement
new overload . , C++
default new exception throw . Overload new
NULL , Overload new .
2021-02-25 16:23:13 +09:00
struct nothrow_t {};
extern const nothrow_t nothrow;
void *operator new throw() (size_t, const nothrow_t& );
foo *fp = new (nothrow) foo;
if( !fp ) {
// Out of memory를 처리합니다.
}
- type-name
. type-name built-in user-defined .
2021-02-25 16:23:13 +09:00
- initializer
object . initializer object
. new operator default object
.
2021-02-25 16:23:13 +09:00
new Placement-new , object
. Placement-new .
2021-02-25 16:23:13 +09:00
inline void *operator new( size_t, void* p )
{
return p;
}
Automatic Variable Placement-new object
. new (Pair) delete도 .
2021-02-25 16:23:13 +09:00
'delete operator' object ,
'operator delete' .
reference
- More Effective C++
- MSDN
Placement-New Requires Heap-Allocated Buffers
The placement-new operator constructs an object on a pre-allocated buffer. The pre-allocated buffer has to be allocated
on the heap.
char *pbuff = new char[1024]; // heap allocation using plain new
Person *p = new (pbuff) Person; // placement new uses a pre-allocated buffer
You may be tempted to use a buffer allocated on the stack to avoid the need of explicitly freeing it:
char pbuff [1024]; //bad idea: stack allocation instead of heap
Person *p = new ( pbuff ) Person; //undefined behavior
However, the pre-allocated buffer must comply with certain alignment constraints required by C++. Memory allocated
on the heap is guaranteed to comply with these requirements. Stack memory, on the other hand, may not be properly aligned,
and hence using it for that purpose yields undefined behavior
-- heap
-- stack .
-- ( pbuff[1024] pbuff heap ,
-- .) 2008-10-26
http://kldp.org/node/76375
http://www.devx.com/tips/Tip/12756
.
.
2021-02-25 16:23:13 +09:00
,
. ,
,
, .
.
.
2021-02-25 16:23:13 +09:00
.
virtual CIOCP ::SendPacket(HANDLE SocketID,const char* ApcData=0,int AI_Length=0,CSendBuffList* AP_CSendBuffList=0) // 1) 번코드
virtual CIOCPEx::SendPacket(HANDLE SocketID,const char* ApcData=0,int AI_Length=0) // 2) 번코드
1)
2) .
CIOCPEx VO_CIOCPEx;
CIOCP* VP_CIOCP=&VO_CIOCPEx;
VO_CIOCPEx->SendPacket((HANDLE)100,"my",2); // 어느 함수가 호출될까.
CIOCP::SendPacket() .
-- 2009-01-03 13:09:00
const char* CPC_MySQL_Host="localhost"
const char* const CPC_MySQL_Host="localhost" .
릿 , 릿 parameter .
.
template<typename TTypeBase>
class CMy : public TTypeBase
{
public:
void Init();
void Fini();
};
릿 CMy2
clear() .
class CMy2 : public CMy<CBaseClass>
{
public:
void clear();
};
, clear() CMy<CBaseClass>
2021-02-25 16:23:13 +09:00
. CMy<CBaseClass> CBaseClass
. clear() CBaseClass
. 릿
.
릿 parameter 릿 .
CHttp.H std::ZNsCGI::ZNsThpe::ZtCTypeLoadDataQuery_T<> template clear() Override ,
. clear()
ZtCTypeLoadDataQuery_T<> ::clear()
2021-02-25 16:23:13 +09:00
std::CLoadDataBlockOne_T<>::clear()
TTypeBase . TTypeBase
clear() ZtCTypeLoadDataQuery_T<>::clear() ,
std::CLoadDataBlockOne_T<>::clear()
this->TTypeBase ::clear()
. . . clear()
TTypeBase
std::ZNsIFace::CDeriveLoadDataQuery_T<TString>
me_ESearch ESearch_Name .
me_ESearch==ESearch_Name 2
me_ESearch!=ESearch_Name ,
me_ESearch==ESearch_Name , 3
me_ESearch==ESearch_Name ...
breakpoint ... . -- 2009-01-05 10:02:00
CHttp.H 릿 .
, .
2021-02-25 16:23:13 +09:00
"가상 상속의 템플릿 구현(TIVI : Template Implementation Of Virtual Inheritance)" .
CHttp.H . ,
, object .
, object (, )
. . A/B/C/D/E
2021-02-25 16:23:13 +09:00
2021-02-25 16:23:13 +09:00
B A object
C B object
D C object
E D object .
A A object
B B object
C C object
D D object .
object . "가상 상속의 템플릿 구현" .
-- 2009-01-18 17:48:00
, "가상 상속의 템플릿 구현" , ' '
. .
. .
2021-02-25 16:23:13 +09:00
-- 2009-01-19 01:21:00
object A,B,C,D,E .
A
A ( ) B
B ( ) C
C ( ) D .
,
2021-02-25 16:23:13 +09:00
A
A ( ) B
B ( ) C
C ( ) D .
2021-02-25 16:23:13 +09:00
-- 2009-01-19 01:26:00
.
(WTM Working Thread Model)
A IOCP A-WTM
B IOCP B-WTM
C IOCP C-WTM ...
A,B C,D ,
A,B IOCP AB-WTM
C,D IOCP CD-WTM ...
--
COM(Component Object Model) .
cf) std::ZNsIFace::ZIDelgtMSG
-- 2009-03-09 20:18:00
"가상 상속의 템플릿 구현" A, B, C, D
. A, B, C, D 릿 ,
A, B, C, D E , E A, B, C, D .
.
cf) MainHead_VirtualDeriveTmpl.cpp
"가상 상속의 템플릿 구현" CURIOUSLY RECURRING TEMPLATE PATTERN .
class template A class B1, B2, B3 , class B1, B2, B3 A
. class B1, B2, B3 .
2021-02-25 16:23:13 +09:00
class B1, B2, B3 , A A2 , A2 B1, B2, B3 interface
, B1 B2 B3 interface .
ex)
1) 릿 class template A .
2) A B1, B2, B3
B1, B2, B3 A .
3) A , B1, B2, B3 object ,
.
template<typename TParent>
class A
{
public:
void UseB1(){static_cast<TParent*>(this)->GetObjB1().CallFunc();}
void UseB2(){static_cast<TParent*>(this)->GetObjB2().CallFunc();}
void UseB3(){static_cast<TParent*>(this)->GetObjB3().CallFunc();}
void UseExB1(TParent& ArCParent){static_cast<TParent*>(this)->GetObjB1().CallFunc(ArCParent);}
void UseExB2(TParent& ArCParent){static_cast<TParent*>(this)->GetObjB2().CallFunc(ArCParent);}
void UseExB3(TParent& ArCParent){static_cast<TParent*>(this)->GetObjB3().CallFunc(ArCParent);}
};
class A2 : public A<A2>
{
public:
class B1{public:void CallFunc() {cout<<"Call B1::CallFunc()"<<endl;}
2021-02-25 16:23:13 +09:00
void CallFunc(A2& ArA2){cout<<"Call B1::CallFunc(A2)"<<endl;}};
class B2{public:void CallFunc() {cout<<"Call B2::CallFunc()"<<endl;}
2021-02-25 16:23:13 +09:00
void CallFunc(A2& ArA2){cout<<"Call B2::CallFunc(A2)"<<endl;}};
class B3{public:void CallFunc() {cout<<"Call B3::CallFunc()"<<endl;}
2021-02-25 16:23:13 +09:00
void CallFunc(A2& ArA2){cout<<"Call B3::CallFunc(A2)"<<endl;}};
private:
B1 b1;
B2 b2;
B3 b3;
public:
B1 GetObjB1(){return b1;}
B2 GetObjB2(){return b2;}
B3 GetObjB3(){return b3;}
void UseExB1(){A<A2>::UseExB1(*this);}
void UseExB2(){A<A2>::UseExB2(*this);}
void UseExB3(){A<A2>::UseExB3(*this);}
};
A2 myA2;
myA2.UseB1();
myA2.UseB2();
myA2.UseB3();
myA2.UseExB1();
myA2.UseExB2();
myA2.UseExB3();
-- 2010-03-12 11:56:00
. A,B,C
IA, IB, IC , A, B, C IA, IB, IC . IA, IB, IC
2021-02-25 16:23:13 +09:00
singleton object SngtA, SngtB, SngtC , A, B, C , (
), SngtA, SngtB, SngtC .
A, B, C singleton object SngtA, SngtB, SngtC interface .
2021-02-25 16:23:13 +09:00
.
-- 2010-03-13 22:43:00
pool P1 class A, B , A,B P1 , B P1
2021-02-25 16:23:13 +09:00
P1 . / A => P1 => B . P1 B
, P1 릿 , P1 Instance
B 릿 B .
릿 CThreadEx_T<> CProxySockHttpXml.H .
-- 2009-08-09 20:23:00
( ) ,
,
. , ,
.
-- 2009-02-10 23:02:00
VC++ 2008 "도구 => 옵션 => '프로젝트 밑 솔루션' => VC++ 디렉토리"
"포함파일" "라이브러리 파일" .
"프로젝트 => 속성" .
-- 2009-02-27 10:02:00
릿 . -- 2009-02-28 04:21:00
2021-02-25 16:23:13 +09:00
C# delegate std:ZNsIFace::ZIDelgtMSG . object
, interface .
.
ZIDelgtMSG interface , COM(Component Object Model)
. C++ COM .
-- 2009-03-01 12:04:00
,
object .
(, ,
.)
1) object polling ,
object , object
.
( polling) / lock .
2) , object ,
,
, . ,
.
object
key/value map .
CKeyValueMap_T<> CKeyValMapPrgs(Sync)_T<>
.
-- 2009-03-03 07:36:00
object ,
.
-- 2009-03-05 06:20:00
, .
, #include ,
#include
.
class CKeyValueMap_T< int,std::ZNsIFace::ZIDelgtMSG*,
int,std::ZNsIFace::ZIDelgtMSG*,
/////////////////// >
. object , /
2021-02-25 16:23:13 +09:00
#include . std::ZNsIFace::ZIDelgtMSG .
-- 2009-03-06 08:59:00
Modeless Modeless , Modeless
. Modeless
2021-02-25 16:23:13 +09:00
.
-- 2009-03-08 21:28:00
릿 릿 릿 , ZtCStringEx.H ZNsMain::ZftMoveFast() ZtCStringBase<>
2021-02-25 16:23:13 +09:00
릿 .
-- 2009-09-06 07:26:00
OS
MainHead.H
MainHeadEx.H
CFileEx.H
CProcess.H
CNet.H
. .
.
. .
.
-
,
. .
, .
http://phpschool.com/gnuboard4/bbs/board.php?bo_table=talkbox&wr_id=1473843&page=1
-- 2009-04-28 09:16:00
릿 .
template<typename T> struct CShow
{
static void Show(){cout<<"## show : T="<<typeid(T).name()<<endl;}
template<typename T2> static void Show2(T2);
};
template<typename T> template<typename T2>
void CShow<T>::Show2(T2){cout<<"## show : T2="<<typeid(T2).name()<<endl;}
-- 2013-05-06
main .
echo %ERRORLEVEL%
,
echo $?
,
http://bcode.tistory.com/5
-- 2011-03-03 22:43:00
my1 my2 .
char my1[]="C++ World1";
const char* my2 ="C++ World2";
cout<<typeid(my1).name()<<endl;
cout<<typeid(my2).name()<<endl;
my1 => char [11]
my2 => char const * __ptr64
-- 2025-08-21 12:42
2021-02-25 16:23:13 +09:00
. (/ ' ' 167 page)
?
?
?
?
, ?
, Assertion ?
, ?
Exception ?
?
thread-safe ?
object thread-safe ?
Lock ?
?
, ?
?
?
API ?
, .
thread-safe ?
object thread-safe ?
Lock ?
?
class , object ?
, . .
Flow '' ?
-- 2011-04-16 15:39:00
DB ERD , ?
-- 2011-04-17 12:08:00
, typedef ,
?
-- 2011-05-09 21:10:00
.
overflow underflow .
-- 2011-05-19 09:14:00
vector , object ,
. object ( )
, .
-- 2013-06-08 15:25:00
, , .
-- 2013-06-09 18:34:00
. ''
, .
ABA , .
-- 2013-06-21 19:41:00
object , object
. , ' ' .
-- 2013-06-23 19:30:00
new[] delete[] . MainHead.H 2013-07-09 23:32:00 .
valgrind . .
-- 2013-07-09 23:44:00
new new[] . ZtCObjNew<> CArray_T<> .
2021-02-25 16:23:13 +09:00
-- 2013-07-11 01:26:00
, , ,
.
MainSSL.H 2015-03-06 22:17:00 . https://www.openssl.org 의 데이타를 가져올 때, 응
BIO object , .
.
-- 2015-03-08 21:32:00
object , object , .
CCtrlAsyncSock.H "'코드C2'에 대한 주석" . -- 2015-03-22 17:01:00
object -1 , object , flow . object
, object object
. .
-- 2013-06-23 19:25:00
' ' , / object
, object .
-- 2013-06-23 19:34:00
'char int '
int ZtCMainChars<>::Minus(TypeCharC*, TypeCharC*, TypeLength, TypeLength)
return
return VC_Minus; // VC_Minus 는 *(VP_Left-1)-*(VP_Right-1)
return int(*(VP_Left-1))-int(*(VP_Right-1));
. , char int (+) .
, LG CNS . ELDK 4.0 tool chain
, NsUtility::CLoadSimUrlConfig_T<> ,
. CLoadSimUrlConfig_T<> ns1.cppschool.com
ns2.cppschool.com . .
Hemose ,
. CObjAVL.H AddKey() cout
, '>' . ZtCMainChars<>::Minus()
! , .
. , , char int
.
-- 2011-12-29 17:35:00
g++ .
#include<iostream>
using namespace std;
int Main(int AI_ArgCnt=0, const char* APP_ArgVal[]=0)
{
cout<<"Call Main()"<<endl; return 0;
}
/////////////////////////////////////////////////////
int main(int AI_ArgCnt, char* APP_ArgVal[])
{
return Main(AI_ArgCnt, APP_ArgVal);
}
///////////////////////////////////////////
mingw
g++.exe -o g++_test_000.exe g++_test_000.cpp -I../
Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest
# g++.exe -o g++_test_000.exe g++_test_000.cpp -I../
g++_test_000.cpp: In function 'int main(int, char**)':
g++_test_000.cpp:18:28: error: invalid conversion from 'char**' to 'const cha
r**' [-fpermissive]
18 | return Main(AI_ArgCnt, APP_ArgVal);
| ^~~~~~~~~~
| |
| char**
g++_test_000.cpp:9:39: note: initializing argument 2 of 'int Main(int, cons
t char**)'
9 | int Main(int AI_ArgCnt=0, const char* APP_ArgVal[]=0)
| ~~~~~~~~~~~~^~~~~~~~~~~~~~
Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest
# g++ --version
g++.exe (Rev2, Built by MSYS2 project) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-1
#include<iostream>
using namespace std;
int Main(int AI_ArgCnt=0, const char* const APP_ArgVal[]=0)
{
cout<<"Call Main()"<<endl; return 0;
}
///////////////////////////////////////////////////////////
int main(int AI_ArgCnt, char* APP_ArgVal[])
{
return Main(AI_ArgCnt, APP_ArgVal);
}
///////////////////////////////////////////
-2
#include<iostream>
using namespace std;
int Main(int AI_ArgCnt=0, char* const APP_ArgVal[]=0)
{
cout<<"Call Main()"<<endl; return 0;
}
/////////////////////////////////////////////////////
int main(int AI_ArgCnt, char* APP_ArgVal[])
{
return Main(AI_ArgCnt, (const char**)APP_ArgVal);
}
///////////////////////////////////////////
-- 2025-08-25 00:56
'char int '
int ZtCMainChars<>::Minus(TypeCharC*, TypeCharC*, TypeLength, TypeLength)
return
return VC_Minus; // VC_Minus 는 *(VP_Left-1)-*(VP_Right-1)
return int(*(VP_Left-1))-int(*(VP_Right-1));
. , char int (+) .
, LG CNS . ELDK 4.0 tool chain
, NsUtility::CLoadSimUrlConfig_T<> ,
. CLoadSimUrlConfig_T<> ns1.cppschool.com
ns2.cppschool.com . .
Hemose ,
. CObjAVL.H AddKey() cout
, '>' . ZtCMainChars<>::Minus()
! , .
. , , char int
.
-- 2011-12-29 17:35:00
2021-02-25 16:23:13 +09:00
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
#endif //__ZCPPMAIIN_ZMAINHEAD_H__