//+------------------------------------------------------------------+ //| 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 MQLARTICLES_UTILS_FA_AUTODELETE_MQH #define MQLARTICLES_UTILS_FA_AUTODELETE_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) //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CAutoCleaner { private: static void* s_ptrs[]; static int s_ptrs_size; static FinalCleanFunction s_c_functions[]; static int s_c_functions_size; public: //--- Inicializar static void Init() { s_ptrs_size = ArrayResize(s_ptrs, 0); s_c_functions_size = ArrayResize(s_c_functions, 0); } //--- Punteros // Añadir static void AddPtr(void* ptr) { if(CheckPointer(ptr) == POINTER_DYNAMIC) { s_ptrs[ArrayResize(s_ptrs, ++s_ptrs_size) - 1] = 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]; ArrayResize(s_ptrs, s_ptrs_size); break; } } } //--- Funciones // Añadir static void AddFunction(FinalCleanFunction f) { s_c_functions[ArrayResize(s_c_functions, (++s_c_functions_size)) - 1] = 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) { if((flags & MQLARTICLES_AUTOCLEANER_FLAG_PTR) != 0) { for(int i = 0; i < s_ptrs_size; i++) { if(CheckPointer(s_ptrs[i]) == POINTER_DYNAMIC) delete s_ptrs[i]; } } if((flags & MQLARTICLES_AUTOCLEANER_FLAG_FUNCTION) != 0) { for(int i = 0; i < s_c_functions_size; i++) { s_c_functions[i](reason); } } s_c_functions_size = ArrayResize(s_c_functions, 0); s_ptrs_size = ArrayResize(s_ptrs, 0); } }; //+------------------------------------------------------------------+ //| Definición de miembros estáticos | //+------------------------------------------------------------------+ void* CAutoCleaner::s_ptrs[]; int CAutoCleaner::s_ptrs_size = 0; FinalCleanFunction CAutoCleaner::s_c_functions[]; int CAutoCleaner::s_c_functions_size = 0; //+------------------------------------------------------------------+ #endif // MQLARTICLES_UTILS_FA_AUTODELETE_MQH