339 righe
9,7 KiB
MQL5
339 righe
9,7 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| DomDef.mqh |
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
//| https://www.mql5.com/ |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
#property link "https://www.mql5.com/"
|
|
#property strict
|
|
|
|
#ifndef BASESPARSERSLAN_SRC_DOM_DEF_MQH
|
|
#define BASESPARSERSLAN_SRC_DOM_DEF_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "DomBaseHeader.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Code |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CDomNodeManager
|
|
{
|
|
public:
|
|
CDomNodeManager();
|
|
~CDomNodeManager() {}
|
|
|
|
//--- String
|
|
//- Stack
|
|
int m_string_stack_size;
|
|
int m_string_stack_r;
|
|
string m_string_stack[];
|
|
//- Free
|
|
int m_string_free[];
|
|
int m_string_free_r;
|
|
int m_string_free_s;
|
|
//- Methods
|
|
void FreeString(const int ix);
|
|
int ReserveString();
|
|
|
|
//--- Array
|
|
struct NodeValues
|
|
{
|
|
CDomNodeBase* values[];
|
|
int values_size;
|
|
int values_r;
|
|
};
|
|
//- node
|
|
NodeValues m_node[];
|
|
int m_node_size;
|
|
int m_node_r;
|
|
//- free
|
|
int m_node_free[];
|
|
int m_node_free_r;
|
|
int m_node_free_s;
|
|
|
|
//- Methods
|
|
template <typename T>
|
|
int ToArray(const int ix, T& array[]) const;
|
|
void ClearArray(const int ix);
|
|
bool DeleteElementArr(const int ix, const int el);
|
|
bool AddElementArr(const int ix, CDomNodeBase* ptr);
|
|
void FreeArr(const int ix);
|
|
int ReserveArr(const int initial_reserve);
|
|
|
|
//--- Obj
|
|
CHashMapFast(string, CDomNodeBase*)* m_objs[];
|
|
int m_objs_size;
|
|
int m_objs_r;
|
|
//- free
|
|
int m_objs_free[];
|
|
int m_objs_free_r;
|
|
int m_objs_free_s;
|
|
|
|
//- Methods
|
|
void FreeObj(const int ix);
|
|
int ReserveObj(const int initial_reserve);
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
CDomNodeManager::CDomNodeManager()
|
|
: m_string_free_s(0), m_string_stack_size(0), m_node_free_s(0), m_node_size(0), m_objs_size(0), m_objs_free_s(0),
|
|
m_string_free_r(8), m_string_stack_r(8), m_node_free_r(8), m_node_r(8), m_objs_free_r(8), m_objs_r(8)
|
|
{
|
|
ArrayResize(m_string_free, m_string_free_r, m_string_free_r);
|
|
ArrayResize(m_string_stack, m_string_stack_r, m_string_stack_r);
|
|
|
|
ArrayResize(m_node_free, m_node_free_r, m_node_free_r);
|
|
ArrayResize(m_node, m_node_r, m_node_r);
|
|
|
|
ArrayResize(m_objs_free, m_objs_free_r, m_objs_free_r);
|
|
ArrayResize(m_objs, m_objs_r, m_objs_r);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Obj |
|
|
//+------------------------------------------------------------------+
|
|
int CDomNodeManager::ReserveObj(const int initial_reserve)
|
|
{
|
|
//---
|
|
if(m_objs_free_s > 0)
|
|
{
|
|
const int idx = m_objs_free[--m_objs_free_s];
|
|
return idx;
|
|
}
|
|
|
|
//---
|
|
if(m_objs_size + 1 >= m_objs_r)
|
|
{
|
|
m_objs_r <<= 1;
|
|
ArrayResize(m_objs, m_objs_r, m_objs_r);
|
|
}
|
|
|
|
//---
|
|
m_objs[m_objs_size++] = new CHashMapFast(string, CDomNodeBase*)(initial_reserve);
|
|
return m_objs_size - 1;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CDomNodeManager::FreeObj(const int ix)
|
|
{
|
|
//---
|
|
//Print("INicio elimiacion: " , ix);
|
|
CHashMapFast(string, CDomNodeBase*)* ptr = m_objs[ix];
|
|
CHashMapFastIterator(string, CDomNodeBase*) it = ptr.BeginIteration();
|
|
|
|
//--- Iteramos por todas los value y eliminamos todos los valores
|
|
while(it.IsValid())
|
|
{
|
|
CDomNodeBase* f = it.Val();
|
|
// Print(it.Key());
|
|
// En caso el contexto del objeto... a eliminar es el mismo (proviene de la misma pila)
|
|
// ENtonces eliminamos..
|
|
if(f.m_ctx == &this && CheckPointer(f) == POINTER_DYNAMIC)
|
|
{
|
|
//Print("Eliminado: " , it.Key(), " Es nuestro");
|
|
|
|
delete f;
|
|
}
|
|
// else
|
|
// Print("No eliminado: " , it.Key(), " No es nuestro");
|
|
|
|
//---
|
|
it.Next();
|
|
}
|
|
|
|
//--- Eliminamos el hashmap
|
|
if(CheckPointer(ptr) == POINTER_DYNAMIC)
|
|
delete ptr;
|
|
|
|
//--- Delete
|
|
if(m_objs_free_s + 1 >= m_objs_free_r)
|
|
{
|
|
m_objs_free_r <<= 1;
|
|
ArrayResize(m_objs_free, m_objs_free_r, m_objs_free_r);
|
|
}
|
|
m_objs_free[m_objs_free_s++] = ix;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Stirng |
|
|
//+------------------------------------------------------------------+
|
|
int CDomNodeManager::ReserveString(void)
|
|
{
|
|
//---
|
|
if(m_string_free_s > 0)
|
|
{
|
|
const int idx = m_string_free[--m_string_free_s];
|
|
return idx;
|
|
}
|
|
|
|
//---
|
|
if(m_string_stack_size + 1 >= m_string_stack_r)
|
|
{
|
|
m_string_stack_r <<= 1;
|
|
ArrayResize(m_string_stack, m_string_stack_r, m_string_stack_r);
|
|
}
|
|
m_string_stack_size++;
|
|
return m_string_stack_size - 1;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CDomNodeManager::FreeString(const int ix)
|
|
{
|
|
if(m_string_free_s + 1 >= m_string_free_r)
|
|
{
|
|
m_string_free_r <<= 1;
|
|
ArrayResize(m_string_free, m_string_free_r, m_string_free_r);
|
|
}
|
|
m_string_free[m_string_free_s++] = ix;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Array |
|
|
//+------------------------------------------------------------------+
|
|
bool CDomNodeManager::AddElementArr(const int ix, CDomNodeBase *ptr)
|
|
{
|
|
//---
|
|
if(m_node[ix].values_size + 1 >= m_node[ix].values_r)
|
|
{
|
|
m_node[ix].values_r <<= 1;
|
|
ArrayResize(m_node[ix].values, m_node[ix].values_r, m_node[ix].values_r);
|
|
}
|
|
|
|
//---
|
|
m_node[ix].values[m_node[ix].values_size++] = ptr;
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
bool CDomNodeManager::DeleteElementArr(const int ix, const int el)
|
|
{
|
|
//---
|
|
if(el < 0 || el >= m_node[ix].values_size)
|
|
return false;
|
|
|
|
//---
|
|
const int t = --m_node[ix].values_size;
|
|
|
|
//---
|
|
CDomNodeBase* ptr = m_node[ix].values[el];
|
|
if(ptr.m_ctx == &this && CheckPointer(ptr) == POINTER_DYNAMIC)
|
|
delete ptr;
|
|
|
|
//---
|
|
for(int i = el; i < t; i++)
|
|
m_node[ix].values[i] = m_node[ix].values[i + 1];
|
|
|
|
//---
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
int CDomNodeManager::ReserveArr(const int initial_reserve)
|
|
{
|
|
//---
|
|
if(m_node_free_s > 0)
|
|
{
|
|
const int idx = m_node_free[--m_node_free_s];
|
|
return idx;
|
|
}
|
|
|
|
//---
|
|
if(m_node_size + 1 >= m_node_r)
|
|
{
|
|
m_node_r <<= 1;
|
|
ArrayResize(m_node, m_node_r, m_node_r);
|
|
}
|
|
|
|
//---
|
|
m_node[m_node_size].values_r = ArrayResize(m_node[m_node_size].values, initial_reserve, initial_reserve);
|
|
m_node[m_node_size++].values_size = 0; // 0 elementos
|
|
return m_node_size - 1;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CDomNodeManager::FreeArr(const int ix)
|
|
{
|
|
//---
|
|
//Print("--------------------");
|
|
ClearArray(ix);
|
|
|
|
//---
|
|
if(m_node_free_s + 1 >= m_node_free_r)
|
|
{
|
|
m_node_free_r <<= 1;
|
|
ArrayResize(m_node_free, m_node_free_r, m_node_free_r);
|
|
}
|
|
m_node_free[m_node_free_s++] = ix;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CDomNodeManager::ClearArray(const int ix)
|
|
{
|
|
//--- iteramos por todos los elementos y vamos eliminando los que son del own
|
|
//Print("DEL START: ", m_node[ix].values_size);
|
|
for(int i = 0; i < m_node[ix].values_size; i++)
|
|
{
|
|
//Print("Iteration: ", i);
|
|
CDomNodeBase* ptr = m_node[ix].values[i];
|
|
if(ptr.m_ctx == &this && CheckPointer(ptr) == POINTER_DYNAMIC)
|
|
{
|
|
// Print("Del: ", i);
|
|
delete ptr;
|
|
}
|
|
}
|
|
//Print("DEL END");
|
|
|
|
//--- resize
|
|
m_node[ix].values_size = 0; // 0 elementos
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
template <typename T>
|
|
int CDomNodeManager::ToArray(const int ix, T &array[]) const
|
|
{
|
|
const int t = m_node[ix].values_size;
|
|
ArrayResize(array, t);
|
|
for(int i = 0; i < t; i++)
|
|
{
|
|
switch(m_node[ix].values[i].m_type)
|
|
{
|
|
case TSN_SBL_BASE_TYPE_INT:
|
|
{
|
|
array[i] = (T)m_node[ix].values[i].m_v.iv;
|
|
break;
|
|
}
|
|
case TSN_SBL_BASE_TYPE_FLT:
|
|
{
|
|
array[i] = (T)m_node[ix].values[i].m_v.dv;
|
|
break;
|
|
}
|
|
case TSN_SBL_BASE_TYPE_BOL:
|
|
{
|
|
array[i] = (T)m_node[ix].values[i].m_v.bv;
|
|
break;
|
|
}
|
|
case TSN_SBL_BASE_TYPE_STR:
|
|
{
|
|
const int ri = m_node[ix].values[i].m_v.ix;
|
|
array[i] = (T)m_string_stack[ri];
|
|
break;
|
|
}
|
|
default:
|
|
array[i] = (T)NULL;
|
|
break;
|
|
}
|
|
}
|
|
return t;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif // BASESPARSERSLAN_SRC_DOM_DEF_MQH
|