TSNStd/Src/PtrClean/AutoDelete.mqh
2026-10-24 12:39:37 -05:00

165 lines
5.7 KiB
MQL5

//+------------------------------------------------------------------+
//| AutoDelete.mqh |
//| Copyright 2025, Niquel Mendoza. |
//| https://www.mql5.com/es/users/nique_372 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Niquel Mendoza."
#property link "https://www.mql5.com/es/users/nique_372"
#property strict
#ifndef TSNSTD_SRC_PTRCLEAN_AUTODELETE_MQH
#define TSNSTD_SRC_PTRCLEAN_AUTODELETE_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\Logger\\SimpleLogger.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
typedef void(*FinalCleanFunction)(const int reason);
#define MQLARTICLES_AUTOCLEANER_FLAG_PTR (1)
#define MQLARTICLES_AUTOCLEANER_FLAG_FUNCTION (2)
#define MQLARTICLES_AUTOCLEANER_ALL (MQLARTICLES_AUTOCLEANER_FLAG_PTR|MQLARTICLES_AUTOCLEANER_FLAG_FUNCTION)
//---
#ifndef MQLARTICLES_AUTOCLEANR_DEF_ADD
#define MQLARTICLES_AUTOCLEANR_DEF_ADD (32)
#endif // MQLARTICLES_AUTOCLEANR_DEF_ADD
//---
//#define MQLARTICLES_AUTOCLENER_DEBUG
//---
#define MQLARTICLES_AUTOCLEANER_ADD(ARR, SIZE, RESERVE, PTR) \
if(SIZE >= RESERVE) \
{ \
RESERVE += MQLARTICLES_AUTOCLEANR_DEF_ADD; \
ArrayResize(ARR, RESERVE, RESERVE); \
} \
ARR[SIZE++] = PTR;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// 1. No garantiza orden de eliminacino. .asi que al ser un objeto global, cuando va agregnado elemntos ptr.. considere
// que no se destruirian al orden al que fueron insertados (NOTA)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CAutoCleaner
{
private:
//---
static void* s_ptrs[];
static int s_ptrs_size;
static int s_ptrs_r;
//---
static FinalCleanFunction s_c_functions[];
static int s_c_functions_size;
static int s_c_functions_r;
public:
CAutoCleaner() {}
~CAutoCleaner() {}
//---
static void Clear()
{
s_ptrs_size = 0;
s_c_functions_size = 0;
}
//--- Punteros
// Añadir
static void AddPtr(void* ptr)
{
if(CheckPointer(ptr) != POINTER_DYNAMIC)
return;
MQLARTICLES_AUTOCLEANER_ADD(s_ptrs, s_ptrs_size, s_ptrs_r, ptr)
}
// Remover
static void RemovePtr(void* ptr)
{
for(int i = 0; i < s_ptrs_size; i++)
{
if(s_ptrs[i] == ptr)
{
s_ptrs[i] = s_ptrs[--s_ptrs_size];
break;
}
}
}
//--- Funciones
// Añadir
static void AddFunction(FinalCleanFunction f)
{
MQLARTICLES_AUTOCLEANER_ADD(s_c_functions, s_c_functions_size, s_c_functions_r, f)
}
//--- Totales
static __forceinline int TotalPtr() { return s_ptrs_size; }
static __forceinline int TotalFunctions() { return s_c_functions_size; }
//--- Funciones principal clean
static void Deinit(const int reason, int flags = MQLARTICLES_AUTOCLEANER_ALL)
{
//--- Ptrs
if((flags & MQLARTICLES_AUTOCLEANER_FLAG_PTR) != 0)
{
for(int i = 0; i < s_ptrs_size; i++)
{
#ifdef MQLARTICLES_AUTOCLENER_DEBUG
FastLog(FUNCION_ACTUAL, INFO_TEXT, StringFormat("Iniciado eliminacion de puntero en posicion[%d], tipo = %s", i, EnumToString(CheckPointer(s_ptrs[i]))));
#endif
if(CheckPointer(s_ptrs[i]) == POINTER_DYNAMIC)
delete s_ptrs[i];
#ifdef MQLARTICLES_AUTOCLENER_DEBUG
FastLog(FUNCION_ACTUAL, INFO_TEXT, StringFormat("Finalizando eliminacion de puntero en posicion[%d]", i));
#endif
}
s_ptrs_size = 0;
}
//--- Eliminacion de funciones (DESPUES) debido aque qui eestan funciones de manager o clases de eventos
if((flags & MQLARTICLES_AUTOCLEANER_FLAG_FUNCTION) != 0)
{
for(int i = 0; i < s_c_functions_size; i++)
{
#ifdef MQLARTICLES_AUTOCLENER_DEBUG
FastLog(FUNCION_ACTUAL, INFO_TEXT, StringFormat("Iniciado ejecucion de funcion[%d]", i));
#endif
s_c_functions[i](reason);
#ifdef MQLARTICLES_AUTOCLENER_DEBUG
FastLog(FUNCION_ACTUAL, INFO_TEXT, StringFormat("Finalizando ejecucion de funcion[%d]", i));
#endif
}
s_c_functions_size = 0;
}
#ifdef MQLARTICLES_AUTOCLENER_DEBUG
FastLog(FUNCION_ACTUAL, INFO_TEXT, "Fin de la limpieza");
#endif
}
};
//+------------------------------------------------------------------+
//| Definición de miembros estáticos |
//+------------------------------------------------------------------+
void* CAutoCleaner::s_ptrs[];
int CAutoCleaner::s_ptrs_size = 0;
int CAutoCleaner::s_ptrs_r = 0;
FinalCleanFunction CAutoCleaner::s_c_functions[];
int CAutoCleaner::s_c_functions_size = 0;
int CAutoCleaner::s_c_functions_r = 0;
//+------------------------------------------------------------------+
#endif // TSNSTD_SRC_PTRCLEAN_AUTODELETE_MQH