//+------------------------------------------------------------------+
//| MyTreeNode.mq5 |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| CTreeNode에서 파생된 CMyTreeNode 클래스를 설명합니다. |
//+------------------------------------------------------------------+
//| Class CMyTreeNode. |
//| 목적: 이진 트리의 요소 클래스. |
//| 클래스 CTreeNode의 하위 항목. |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
{
protected:
//--- 이용자 데이터
long m_long; // long 유형의 필드
double m_double; // double 유형의 커스텀 변수
string m_string; // string 유형의 커스텀 변수
datetime m_datetime; // datetime 유형의 커스텀 변수
public:
CMyTreeNode();
//--- 사용자 데이터에 액세스하는 방법
long GetLong(void) { return(m_long); }
void SetLong(long value) { m_long=value; }
double GetDouble(void) { return(m_double); }
void SetDouble(double value) { m_double=value; }
string GetString(void) { return(m_string); }
void SetString(string value) { m_string=value; }
datetime GetDateTime(void) { return(m_datetime); }
void SetDateTime(datetime value) { m_datetime=value; }
//--- 파일 작업 방법
virtual bool Save(int file_handle);
virtual bool Load(int file_handle);
protected:
virtual int Compare(const CObject *node,int mode);
//--- 클래스 인스턴스 생성 방법
virtual CTreeNode* CreateSample();
};
//+------------------------------------------------------------------+
//| CMyTreeNode 클래스 구성자. |
//| INPUT: 없음. |
//| OUTPUT: none. |
//| 비고: 없음. |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
{
//--- 사용자 데이터 초기화
m_long =0;
m_double =0.0;
m_string ="";
m_datetime =0;
}
//+------------------------------------------------------------------+
//| 지정된 알고리즘으로 다른 트리 노드와 비교. |
//| INPUT: 노드 - 비교할 트리 요소, |
//| 모드 - 비교 알고리즘의 식별자. |
//| OUTPUT: 비교 결과 (>0,0,<0). |
//| 비고: 없음. |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
{
//--- 트리 생성 알고리즘이 유일하기 때문에 모드 매개 변수가 무시됩니다
int res=0;
//--- 명시적 유형 캐스팅
CMyTreeNode *n=node;
res=(int)(m_long-n.m_long);
//---
return(res);
}
//+------------------------------------------------------------------+
//| 새 클래스 인스턴스 만들기. |
//| INPUT: 없음. |
//| OUTPUT: CMyTreeNode 클래스의 새 인스턴스에 대한 포인터. |
//| 비고: 없음. |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
{
CMyTreeNode *result=new CMyTreeNode;
//---
return(result);
}
//+------------------------------------------------------------------+
//| 파일에 트리 노드 데이터를 씁니다. |
//| INPUT: file_handle -쓰기 위해 미리 열린 파일의 핸들. |
//| OUTPUT: 정상이면 true, 그렇지 않으면 false입니다. |
//| 비고: 없음. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
{
uint i=0,len;
//--- 점검
if(file_handle<0) return(false);
//--- 사용자 데이터 쓰기
//--- long 유형의 커스텀 변수 쓰기
if(FileWriteLong(file_handle,m_long)!=sizeof(long)) return(false);
//--- double 유형의 커스텀 변수 쓰기
if(FileWriteDouble(file_handle,m_double)!=sizeof(double)) return(false);
//--- 문자열 유형의 커스텀 변수 쓰기
len=StringLen(m_string);
//--- 문자열 길이 작성
if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) return(false);
//--- 문자열 작성
if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- datetime 유형의 커스텀 변수 작성
if(FileWriteLong(file_handle,m_datetime)!=sizeof(long)) return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| 파일에서 트리 노드 데이터를 읽습니다. |
//| INPUT: file_handle -읽기 위해 미리 열어 놓은 파일의 핸들. |
//| OUTPUT: 정상이면 true, 그렇지 않으면 false입니다. |
//| 비고: 없음. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
{
uint i=0,len;
//--- 점검
if(file_handle<0) return(false);
//--- 읽기
if(FileIsEnding(file_handle)) return(false);
//--- char 타입의 커스텀 변수 읽기
//--- long 타입의 커스텀 변수 읽기
m_long=FileReadLong(file_handle);
//--- double 타입의 커스텀 변수 읽기
m_double=FileReadDouble(file_handle);
//--- string 타입의 커스텀 변수 읽기
//--- string 길이 읽기
len=FileReadInteger(file_handle,INT_VALUE);
//--- string 읽기
if(len!=0) m_string=FileReadString(file_handle,len);
else m_string="";
//--- datetime 유형의 커스텀 변수 읽기
m_datetime=FileReadLong(file_handle);
//---
return(true);
}
|