#pragma once


#include <string>
#include <mutex>

#include "../profinet/profinet_data_map.hpp"
#include <boost/interprocess/managed_shared_memory.hpp>

#include <iostream>

class ProfinetSharedData {
public:
    ~ProfinetSharedData() {
        ///Удаляем память
        boost::interprocess::shared_memory_object::remove(mem_name_.c_str());
        //std::cout << "Destruct: ProfinetSharedData: Shared data deleted" << std::endl;
    }
    /**
     * @brief Выделяыет раздеяемую память под структуру ProfinetData_Map
     * 
     * @param mem_name 
     * @return ProfinetData_Map* 
     */
    
    ProfinetData_Map * Create(std::string mem_name);
    
    template<class T>
    T * allocateData(uint32_t nbr) {
        return shmem_.construct<T>(boost::interprocess::anonymous_instance)[nbr]();
    }

    /**
     * @brief Проверяет, что размер свободной памяти не меньше чем значение required_mem_size
     * Если меньше, то увеличиват память.
     * 
     * @param required_mem_size 
     * @return uint32_t 
     */
    void checkMemorySize(uint32_t required_mem_size);

    ProfinetData_Map * p_profinet_data_;
    
private:
    boost::interprocess::managed_shared_memory shmem_;
    std::string mem_name_;
};