//+------------------------------------------------------------------+
//| MyTreeNode.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| CTreeNode から派生した CMyTreeNode クラスを記述する |
//+------------------------------------------------------------------+
//| 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 クラスコンストラクタ |
//| 入力:なし |
//| 出力:なし |
//| メモ:なし |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
{
//--- ユーザデータの初期化
m_long =0;
m_double =0.0;
m_string ="";
m_datetime =0;
}
//+------------------------------------------------------------------+
//| 指定されたアルゴリズムでの他のツリーノードとの比較 |
//| 入力: node - 比較されるツリー要素 |
//| mode - 比較アルゴリズムの識別子 |
//| 出力:比較結果(>0、0、<0 ) |
//| メモ:なし |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
{
//--- ツリー構築アルゴリズムが 1 つだけであるため、パラメータモードが無視される
int res=0;
//--- 明示的な型キャスト
CMyTreeNode *n=node;
res=(int)(m_long-n.m_long);
//---
return(res);
}
//+------------------------------------------------------------------+
//| 新しいクラスインスタンスの作成 |
//| 入力:なし |
//| 出力:CMyTreeNodeクラスの新しいインスタンスへのポインタ |
//| メモ:なし |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
{
CMyTreeNode *result=new CMyTreeNode;
//---
return(result);
}
//+------------------------------------------------------------------+
//| ツリーノードデータをファイルに書き込みます。 |
//| 入力:file_handle - 既に書き込みのために開かれたファイルのハンドル |
//| 出力:成功の場合は 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);
//--- string 型のカスタム変数の書き込み
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);
}
//+------------------------------------------------------------------+
//| ファイルからツリーノードデータを読み込む |
//| 入力: file_handle - 既に読み込みのために開かれたファイルのハンドル |
//| 出力:成功の場合は 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 型のカスタム変数の読み込み
//--- 文字列の長さを読み込む
len=FileReadInteger(file_handle,INT_VALUE);
//--- 文字列を読み込む
if(len!=0) m_string=FileReadString(file_handle,len);
else m_string="";
//--- datetime 型のカスタム変数の読み込み
m_datetime=FileReadLong(file_handle);
//---
return(true);
}
|