//+------------------------------------------------------------------+ //| 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