107 lines
3 KiB
MQL5
107 lines
3 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| 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;
| |||
}
| |||
};
| |||
//+------------------------------------------------------------------+
|