95 lines
3.2 KiB
MQL5
95 lines
3.2 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Node |
|
|
//| Copyright 2006-2011, www.FXmaster.de |
|
|
//| www.FXmaster.de |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2006-2011, www.FXmaster.de"
|
|
#property link "www.FXmaster.de"
|
|
#property version "1.00"
|
|
|
|
#define NIL(p) (CheckPointer(p)==POINTER_INVALID)
|
|
|
|
//------------------------------------------------------------------ struct tagWatch
|
|
struct tagWatch
|
|
{
|
|
string m_name; // имя значения
|
|
string m_val; // значение
|
|
};
|
|
|
|
class CNode; // forward declaration
|
|
//------------------------------------------------------------------ class CNodeBase
|
|
class CNodeBase
|
|
{
|
|
public:
|
|
CNode *m_next[]; // список узлов, на которые он указывает
|
|
CNode *m_prev; // узел родитель
|
|
int m_id; // уникальный номер
|
|
string m_text; // текст
|
|
|
|
public:
|
|
CNodeBase() { m_id=0; m_text=""; } // конструктор
|
|
~CNodeBase(); // деструктор
|
|
};
|
|
//------------------------------------------------------------------ ~CNodeInfo
|
|
void CNodeBase::~CNodeBase()
|
|
{
|
|
for (int i=0; i<ArraySize(m_next); i++) // удаление массива
|
|
if (CheckPointer(m_next[i])==POINTER_DYNAMIC) delete m_next[i];
|
|
m_prev=NULL; ArrayResize(m_next, 0);
|
|
}
|
|
|
|
//------------------------------------------------------------------ class CNode
|
|
class CNode : public CNodeBase
|
|
{
|
|
public:
|
|
bool m_expand; // раcкрытость
|
|
bool m_check; // отмеченный точкой
|
|
bool m_select; // подсвеченный
|
|
bool m_edit; // редактируемый
|
|
|
|
//--- run-time информация
|
|
int m_uses; // число обращений к узлу
|
|
long m_tick; // время проведенное в узле
|
|
long m_tick0; // время входа в узел
|
|
datetime m_last; // время входа в узел
|
|
tagWatch m_watch[]; // список параметров имя/значение
|
|
bool m_break; // дебаг-пауза
|
|
int m_brkuse; // остановка на функции при достижении m_uses значения m_brkuse
|
|
|
|
//--- параметры вызова
|
|
string m_path; // имя файла
|
|
string m_file; // имя файла
|
|
int m_line; // номер линии в файле
|
|
string m_class; // имя класса
|
|
string m_func; // имя функции
|
|
string m_desc; // дополнительное описание узла
|
|
|
|
public:
|
|
CNode(); // конструктор
|
|
~CNode(); // деструктор
|
|
|
|
void AddWatch(string watch, string val);
|
|
};
|
|
//------------------------------------------------------------------ CNode
|
|
void CNode::CNode()
|
|
{
|
|
m_id=0; m_text="";
|
|
m_expand=true; m_check=false; m_select=false; m_edit=false;
|
|
m_desc=""; m_uses=0; m_tick=0; m_tick0=0; m_last=0; m_brkuse=-2;
|
|
m_path=""; m_file=""; m_line=0; m_class=""; m_func="";
|
|
}
|
|
//------------------------------------------------------------------ ~CNode
|
|
void CNode::~CNode()
|
|
{
|
|
for (int i=0; i<ArraySize(m_next); i++) // удаление массива
|
|
if (CheckPointer(m_next[i])==POINTER_DYNAMIC) delete m_next[i];
|
|
m_prev=NULL; ArrayResize(m_next, 0);
|
|
}
|
|
//------------------------------------------------------------------ Watch
|
|
void CNode::AddWatch(string name, string val)
|
|
{
|
|
int n=ArraySize(m_watch); bool b=false;
|
|
for (int i=0; i<n; i++) if (m_watch[i].m_name==name) { m_watch[i].m_val=val; b=true; break; }
|
|
if (b) return;
|
|
ArrayResize(m_watch, n+1); m_watch[n].m_name=name; m_watch[n].m_val=val;
|
|
}
|