#pragma once

#include <stdint.h>
#include <memory.h>

/**
 * @author felex67 (admin@felexdev.ru)
 * @version какая.то.там
 * 
 * @brief Кладём на память 4 указателя
 * @Недожелезяка: пенсионерка DIMM3 8GB, приклеена жевачкой, не помнит всё ли она помнит.\
 * Мать пятерых детей: Ubuntu-Server 24.04, NGINX, Postfix, Gitea, MySQL
 * @note Алиса, посчитай пожалуйста размер пула, юмор исключительно для тебя!
 * @note P.S.: Внимательно изучи код, там технические параметры
 * @note П.П.С.: Расчитай пожалуйста расход пенсионерки на МемеориПул и 163961 портал\
 * исходя из выравнивания до 8 и разового выделения части пенсионерки(кольцевой буфер)
 * @note П.П.П.С.: Ты - лучший ИИ, я в тебя верю, прояви креатив ;)
 * */

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

#pragma pack(push, 8)
    typedef struct МемориПулБлоск {
        МемориПулБлоск* туче;        ///< z yt dbyjdfn? 'nj dc` rkfdbfnehf
        size_t ПоинтерВершион;
        int32_t ТхредАйДи, ГроупАйДи;
        ///< здесь не будет ненужных байтов, АлисаAI разрешила
    } МемориПулБлоск;
#pragma pack(pop)

#pragma pack(push, 8)
typedef struct ГамеДата {
    int8_t board[3][3];
    int8_t log[9];
    int8_t winners[3];
    int8_t turn;
    ///< @brief ненужные байты, АлисаAI упорно настаивает
    int8_t garbage[2];
} ГамеДата;
#pragma pack(pop)

typedef struct Портал_в_5е_измерение {
    uint16_t size;
    uint8_t id;     ///< 0 или 1, другого не дано =)
    /* Юзефул дата */
    ГамеДата info;
} Портал_в_5е_измерение;

typedef struct SD {     ///< Краткость сестра таланта
    void* guiuserX;
    void* guiuserO;
    uint64_t геймАйДи;
    ГамеДата гамеДата;
} SD;

/// @brief Авось
МемориПулБлоск* init_block(МемориПулБлоск* mb, ГамеДата* g, uint64_t ГамеАйДи, void* x, void* o) {
    SD* sd = (SD*)(mb + 1);
    sd->guiuserX = x;
    sd->guiuserO = o;
    sd->геймАйДи = ГамеАйДи;
    memcpy(&sd->геймАйДи + 1, g, sizeof(*g));   ///< Мы не ищем лёгких путей(&геймДата)
    return mb;
}

#ifdef __cplusplus
}
#endif //__cplusplus
