mql5/Experts/_Architecture/State/StateManager.mqh

107 lines
3 KiB
MQL5

2026-08-14 16:19:56 +02:00
//+------------------------------------------------------------------+
//| StateManager.mqh |
//| Copyright 2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#include "IState.mqh"
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
//| State manager – holds named states and can save/load all |
//+------------------------------------------------------------------+
class StateManager
{
private:
struct StateEntry
{
string name;
IState* state;
};
StateEntry m_entries[];
int m_count;
public:
StateManager() : m_count(0) {}
~StateManager()
{
// States are owned externally, do not delete here.
}
// Register a state object under a unique name
void AddState(string name, IState* state)
{
int size = ArraySize(m_entries);
ArrayResize(m_entries, size + 1);
m_entries[size].name = name;
m_entries[size].state = state;
m_count = size + 1;
}
// Save all states into a single JSON object
JSON::Object* SaveAll()
{
JSON::Object* root = new JSON::Object();
for(int i = 0; i < m_count; i++)
{
JSON::Object* stateObj = m_entries[i].state.Save();
if(stateObj != NULL)
root.setProperty(m_entries[i].name, stateObj);
}
return root;
}
// Load all states from a JSON object
bool LoadAll(const JSON::Object* root)
{
if(root == NULL) return false;
for(int i = 0; i < m_count; i++)
{
JSON::Object* stateObj = root.getObject(m_entries[i].name);
if(stateObj == NULL) continue; // skip missing
m_entries[i].state.Load(stateObj);
}
return true;
}
// Write the JSON representation to a file
bool SaveToFile(string filename)
{
JSON::Object* root = SaveAll();
if(root == NULL) return false;
string jsonStr = root.toString();
delete root;
int handle = FileOpen(filename, FILE_WRITE|FILE_TXT|FILE_ANSI);
if(handle == INVALID_HANDLE) return false;
FileWriteString(handle, jsonStr);
FileClose(handle);
return true;
}
// Read JSON from file and load states
bool LoadFromFile(string filename)
{
int handle = FileOpen(filename, FILE_READ|FILE_TXT|FILE_ANSI);
if(handle == INVALID_HANDLE) return false;
string jsonStr = "";
while(!FileIsEnding(handle))
jsonStr += FileReadString(handle, 0);
FileClose(handle);
JSON::Object* root = new JSON::Object(jsonStr);
bool result = LoadAll(root);
delete root;
return result;
}
};
//+------------------------------------------------------------------+