
#ifndef ETHERCAT_SUGAR_TOKEN_PASTE_H
#define ETHERCAT_SUGAR_TOKEN_PASTE_H

#include "../ethercat_types.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#define EC_DECLARE_GETTER(name, type, fn)                                \
    static inline type ec_get_##name(uint16_t mi, uint16_t si) {         \
        return fn(mi, si);                                               \
    }

#define EC_DECLARE_GETTER1(name, type, fn)                               \
    static inline type ec_get_##name(uint16_t mi) {                      \
        return fn(mi);                                                   \
    }

#define EC_BEGIN_NAME_MAP(map_name, enum_type)                           \
    static inline const char* map_name##_name(enum_type _v) {            \
        switch (_v) {

#define EC_NAME_MAP_ENTRY(value, str)                                    \
            case (value): return (str);

#define EC_END_NAME_MAP(default_str)                                     \
            default: return (default_str);                               \
        }                                                                \
    }

#define EC_STRINGIFY_RAW(x) #x
#define EC_STRINGIFY(x)     EC_STRINGIFY_RAW(x)

#define EC_LOC               __FILE__ ":" EC_STRINGIFY(__LINE__)

#define EC_CONCAT_RAW(a, b)        a##b
#define EC_CONCAT(a, b)            EC_CONCAT_RAW(a, b)
#define EC_CONCAT3_RAW(a, b, c)    a##b##c
#define EC_CONCAT3(a, b, c)        EC_CONCAT3_RAW(a, b, c)

#define EC_ARRAY_LEN(arr)  ((int)(sizeof(arr) / sizeof((arr)[0])))

#define EC_UNUSED(x)       ((void)(x))

#ifdef __cplusplus
}
#endif

#endif
