#ifndef _AE_bfield_h_
#define _AE_bfield_h_

#include <malloc.h>
#include <stdint.h>
#include <stdio.h>

#define _AE_bfield_debug_

  // Windows - 1251 (ANSI)
  // Модуль предназначен для организации и работы с двумерным битовым полем.

typedef struct {
    uint32_t size;      // Размер всей структуры в байтах.
    uint32_t width;     // Ширина массива в битах.
    uint32_t height;    // Высота массива в битах.
    uint8_t data[];     // Массив данных.
} bfield;

  // Конструктор:
  // ВОЗВРАТ: 0 - ошибка.
bfield* bfield_create(uint32_t width, uint32_t height);

  // Деструктор:
void bfield_destroy(bfield** ttbfield);

  // Функции:

  // Функция сбрасывает в ноль бит в указанном массиве по указанной координате.
void bfield_clear(bfield* tbfield, uint32_t x, uint32_t y);

  // Функция создаёт точную копию массива.
  // ВОЗВРАТ: 0 - ошибка.
bfield* bfield_clone(bfield* tbfield);

  // Функция возвращает состояние бита в указанном массиве по указанной координате.
uint32_t bfield_get(bfield* tbfield, uint32_t x, uint32_t y);

  // Функция сохраняет в файл массив в текстовом виде. 
void bfield_info(bfield* tbfield, char* name);

  // Функция загружает массив из файла.
  // ВОЗВРАТ: 0 - ошибка.
bfield* bfield_load(char* name);

  // Функция изменяет состояние бита на противоположное в указанном массиве
  // по указанной координате.
void bfield_not(bfield* tbfield, uint32_t x, uint32_t y);

  // Функция создаёт массив нового размера.
  // Копирует в него данные из старого массива.
  // Стирает старый массив.
  // ВОЗВРАТ: 0 - успешное завершение.
  //          UINT32_MAX - ошибка.
uint32_t bfield_resize(bfield** ttbfield, uint32_t new_width, uint32_t new_height);

  // Функция сохраняет массив в файле.
  // ВОЗВРАТ: 0 - успешное завершение.
  //          UINT32_MAX - ошибка.
uint32_t bfield_save(bfield* tbfield, char* name);

  // Функция устанавливает бит в единицу в указанном массиве по указанной координате.
void bfield_set(bfield* tbfield, uint32_t x, uint32_t y);

  // Функция заполняет обнуляет содержимое бит поля.
void bfield_zero(bfield* tbfield);

#endif