#ifndef _L_MACRO_TYPES_H
#define _L_MACRO_TYPES_H

//******************************************** Включаемые файлы *********************************************

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

//************************************ Глобальные (публичные) константы *************************************



//***************************** Глобальные (публичные) макросы с параметрами ********************************

#define L_ASSERT(cond)       (true == (cond))?(ERR_OK):(ERR_ASSERT_ERROR)
#define L_CHECK_ERR(cond)    if (cond < ERR_OK) { goto exit; }
#define L_CHECK_RT_ERR(cond) if (cond < ERR_OK) { goto runtime_exit; }
#define L_CHECK_VAL(cond)    if (cond > 0) { goto exit; }

#define L_GOTO_EXIT          goto exit
#define L_GOTO_RT_EXIT       goto runtime_exit

#define L_EXIT               exit:
#define L_RT_EXIT            runtime_exit:


#ifndef NULL
#define NULL ((void*)(0))
#endif

// Чтобы убрать предупреждения о неиспользуемой переменной
#define L_UNUSED(x)         (void)(x)

#ifndef OFF
#define OFF       (0U)
#endif
#ifndef ON
#define ON        (1U)
#endif

#ifndef LOGIC_0
#define LOGIC_0   (0U)
#endif
#ifndef LOGIC_1
#define LOGIC_1   (1U)
#endif

//******************************************* Определения типов *********************************************

typedef int8_t       i8;
typedef uint8_t      u8;
typedef int16_t      i16;
typedef uint16_t     u16;
typedef int32_t      i32;
typedef uint32_t     u32;
typedef int64_t      i64;
typedef uint64_t     u64;
typedef float        f32;
typedef double       d64;

typedef void (*void_fun_t)(void);

// Может быть ошибка (< 0) или результат (>= 0)
typedef int32_t      err_or_res_t;

typedef enum
{
    ERR_OK               =  0,
    ERR_ASSERT_ERROR     = -1, 
    ERR_RUNTIME_ERROR    = -2, 
    ERR_INVALID_ARGUMENT = -3,
    ERR_NOT_IMPLEMENTED  = -4,
    ERR_TIMEOUT_EXPIRED  = -5,
    
    ERR_QTY = 6,
} fun_res_t;


#endif

//*********************************************** КОНЕЦ ФАЙЛА ***********************************************
