BasesParserSLan/Src/DomDef.mqh

339 lines
9.7 KiB
MQL5
Raw Permalink Normal View History

2026-07-19 12:14:17 -05:00
//+------------------------------------------------------------------+
//| 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();
2026-07-19 15:10:50 -05:00
~CDomNodeManager() {}
2026-07-19 12:14:17 -05:00
//--- String
2026-07-19 12:38:12 -05:00
//- Stack
2026-07-19 12:14:17 -05:00
int m_string_stack_size;
int m_string_stack_r;
string m_string_stack[];
2026-07-19 12:38:12 -05:00
//- Free
int m_string_free[];
int m_string_free_r;
int m_string_free_s;
//- Methods
2026-07-19 12:14:17 -05:00
void FreeString(const int ix);
int ReserveString();
//--- Array
struct NodeValues
{
CDomNodeBase* values[];
int values_size;
int values_r;
};
2026-07-19 12:38:12 -05:00
//- node
2026-07-19 12:14:17 -05:00
NodeValues m_node[];
int m_node_size;
int m_node_r;
2026-07-19 12:38:12 -05:00
//- free
int m_node_free[];
int m_node_free_r;
int m_node_free_s;
//- Methods
2026-07-19 21:43:38 -05:00
template <typename T>
int ToArray(const int ix, T& array[]) const;
2026-07-19 12:14:17 -05:00
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;
2026-07-19 12:38:12 -05:00
//- free
int m_objs_free[];
int m_objs_free_r;
int m_objs_free_s;
//- Methods
2026-07-19 12:14:17 -05:00
void FreeObj(const int ix);
int ReserveObj(const int initial_reserve);
};
2026-07-19 12:38:12 -05:00
2026-07-19 15:10:50 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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);
}
2026-07-19 12:38:12 -05:00
//+------------------------------------------------------------------+
//| 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)
{
2026-07-19 15:10:50 -05:00
//---
2026-07-21 10:57:52 -05:00
//Print("INicio elimiacion: " , ix);
2026-07-19 15:10:50 -05:00
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();
2026-07-21 10:57:52 -05:00
// Print(it.Key());
2026-07-19 15:10:50 -05:00
// 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)
2026-07-21 10:57:52 -05:00
{
//Print("Eliminado: " , it.Key(), " Es nuestro");
2026-07-20 09:31:55 -05:00
2026-07-19 15:10:50 -05:00
delete f;
}
2026-07-20 09:31:55 -05:00
// else
2026-07-21 10:57:52 -05:00
// Print("No eliminado: " , it.Key(), " No es nuestro");
2026-07-19 15:10:50 -05:00
//---
it.Next();
}
//--- Eliminamos el hashmap
if(CheckPointer(ptr) == POINTER_DYNAMIC)
delete ptr;
//--- Delete
2026-07-19 12:38:12 -05:00
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)
{
2026-07-21 10:57:52 -05:00
//---
if(el < 0 || el >= m_node[ix].values_size)
return false;
2026-07-19 12:38:12 -05:00
//---
const int t = --m_node[ix].values_size;
2026-07-21 10:57:52 -05:00
//---
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;
2026-07-19 12:38:12 -05:00
}
//+------------------------------------------------------------------+
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);
2026-07-19 15:10:50 -05:00
m_node[m_node_size++].values_size = 0; // 0 elementos
2026-07-19 12:38:12 -05:00
return m_node_size - 1;
}
//+------------------------------------------------------------------+
void CDomNodeManager::FreeArr(const int ix)
{
2026-07-19 15:10:50 -05:00
//---
2026-07-19 21:43:38 -05:00
//Print("--------------------");
2026-07-19 15:10:50 -05:00
ClearArray(ix);
//---
2026-07-19 12:38:12 -05:00
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)
{
2026-07-19 15:10:50 -05:00
//--- iteramos por todos los elementos y vamos eliminando los que son del own
2026-07-19 21:43:38 -05:00
//Print("DEL START: ", m_node[ix].values_size);
2026-07-19 15:10:50 -05:00
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)
{
2026-07-19 21:43:38 -05:00
// Print("Del: ", i);
2026-07-19 15:10:50 -05:00
delete ptr;
}
}
2026-07-19 21:43:38 -05:00
//Print("DEL END");
2026-07-19 15:10:50 -05:00
//--- resize
2026-07-19 12:38:12 -05:00
m_node[ix].values_size = 0; // 0 elementos
}
2026-07-19 21:43:38 -05:00
//+------------------------------------------------------------------+
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;
}
2026-07-19 12:14:17 -05:00
}
//+------------------------------------------------------------------+
#endif // BASESPARSERSLAN_SRC_DOM_DEF_MQH