forked from nique_372/TSNStd
165 lines
5.7 KiB
MQL5
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
|