#include <iostream>
#include <vector>
using namespace std;

/// singleton class
class ConfigurationManager {
private:
    string configuration_path;
    vector<string> servers_ips;
    string aws_service_url;
    bool is_loaded = false;
    static ConfigurationManager* obj;

    ConfigurationManager() {} 

    void load() {
        if (is_loaded) return;
        cout << "Lazy Loading\n";
        servers_ips.push_back("10.20.30.40");
        servers_ips.push_back("10.20.30.41");
        servers_ips.push_back("10.20.30.42");
        aws_service_url = "https://d...content-available-to-author-only...s.com";
        is_loaded = true;
    }

public:
    ConfigurationManager(const ConfigurationManager& other) = delete;
    ConfigurationManager& operator=(const ConfigurationManager& other) = delete;

    static ConfigurationManager* GetInstance() {
        if (!obj) {
            obj = new ConfigurationManager();
        }
        return obj;
    }

    string GetAwsServiceUrl() {
        load();
        return aws_service_url;
    }
};

// Initialize static member
ConfigurationManager* ConfigurationManager::obj = nullptr;

void f1() {
    ConfigurationManager* mgr = ConfigurationManager::GetInstance();
    cout << "Instance address in f1: " << mgr << '\n';
    cout << mgr->GetAwsServiceUrl() << '\n';
    cout <<"-------------------------------------------\n";
}

void f2() {
    ConfigurationManager* mgr = ConfigurationManager::GetInstance();
    cout << "Instance address in f1: " << mgr << '\n';
    cout << mgr->GetAwsServiceUrl() << '\n';
    cout <<"-------------------------------------------\n";
}

int main() {
    f1();
    f2();
    return 0;
}
