/*! *********************************************************************************
 * Copyright (c) 2015, Freescale Semiconductor, Inc.
 * Copyright 2016-2017 NXP
 * All rights reserved.
 *
 * \file
 *
 * SPDX-License-Identifier: BSD-3-Clause
 ********************************************************************************** */

#ifndef EMBEDDEDTYPES_H
#define EMBEDDEDTYPES_H

/************************************************************************************
 *
 *       INCLUDES
 *
 ************************************************************************************/

#include <stdint.h>

#if defined(__IAR_SYSTEMS_ICC__)
#include "iccarm_builtin.h"
#endif /* (__IAR_SYSTEMS_ICC__) */

/************************************************************************************
 *
 *       TYPE DEFINITIONS
 *
 ************************************************************************************/
#if defined(__IAR_SYSTEMS_ICC__)
/* __get_LR() declaration included from "iccarm_builtin.h" to avoid compatibility issues with different versions of IAR
 * compiler */
#elif defined(__GNUC__)
#define __get_LR() __builtin_return_address(0)
#elif defined(__CC_ARM)
#define __get_LR() __return_address()
#endif

/* boolean types */
#ifndef HAVE_BOOL_T_DEFINED
typedef uint8_t bool_t; /* boolean data type */
/* Prevent from any further definition by setting and checking HAVE_BOOL_T_DEFINED
    Make sure bool_t is defined to uint8_t on other places      */
#define HAVE_BOOL_T_DEFINED
#endif
typedef uint8_t index_t;

/* TRUE/FALSE definition*/
#ifndef TRUE
#define TRUE (0 == 0)
#endif

#ifndef FALSE
#define FALSE (0 != 0)
#endif

/* null pointer definition*/
#ifndef NULL
#define NULL ((void *)(0x0UL))
#endif

#if defined(__GNUC__)
#define PACKED_STRUCT struct __attribute__((__packed__))
#define PACKED_UNION  union __attribute__((__packed__))
#elif defined(__IAR_SYSTEMS_ICC__)
#define PACKED_STRUCT __packed struct
#define PACKED_UNION  __packed union
#elif defined(__CC_ARM)
#define PACKED_STRUCT struct __attribute__((packed))
#define PACKED_UNION  union __attribute__((packed))
#else
#warning No definition for PACKED_STRUCT and PACKED_UNION!
#endif

#ifndef WEAK
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__)
#define WEAK __attribute__((__weak__))
#elif defined(__CC_ARM)
#define WEAK __weak
#endif
#endif

typedef unsigned char uintn8_t;
typedef unsigned long uintn32_t;

typedef unsigned char uchar_t;

#if !defined(MIN)
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
#endif

#if !defined(MAX)
#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
#endif

/* Compute the number of elements of an array */
#define NumberOfElements(x) (sizeof(x) / sizeof((x)[0]))

/* Compute the size of a string initialized with quotation marks */
#define SizeOfString(string) (sizeof(string) - 1)

#define GetRelAddr(strct, member)      ((uint32_t) & (((strct *)(void *)0)->member))
#define GetSizeOfMember(strct, member) sizeof(((strct *)(void *)0)->member)

/* Type definitions for link configuration of instantiable layers  */
#define gInvalidInstanceId_c (instanceId_t)(-1)
typedef uint32_t instanceId_t;

/* Bit shift definitions */
#define BIT0  0x01U
#define BIT1  0x02U
#define BIT2  0x04U
#define BIT3  0x08U
#define BIT4  0x10U
#define BIT5  0x20U
#define BIT6  0x40U
#define BIT7  0x80U
#define BIT8  0x100U
#define BIT9  0x200U
#define BIT10 0x400U
#define BIT11 0x800U
#define BIT12 0x1000U
#define BIT13 0x2000U
#define BIT14 0x4000U
#define BIT15 0x8000U
#define BIT16 0x10000U
#define BIT17 0x20000U
#define BIT18 0x40000U
#define BIT19 0x80000U
#define BIT20 0x100000U
#define BIT21 0x200000U
#define BIT22 0x400000U
#define BIT23 0x800000U
#define BIT24 0x1000000U
#define BIT25 0x2000000U
#define BIT26 0x4000000U
#define BIT27 0x8000000U
#define BIT28 0x10000000U
#define BIT29 0x20000000U
#define BIT30 0x40000000U
#define BIT31 0x80000000U

/* Shift definitions */
#define SHIFT0  (0U)
#define SHIFT1  (1U)
#define SHIFT2  (2U)
#define SHIFT3  (3U)
#define SHIFT4  (4U)
#define SHIFT5  (5U)
#define SHIFT6  (6U)
#define SHIFT7  (7U)
#define SHIFT8  (8U)
#define SHIFT9  (9U)
#define SHIFT10 (10U)
#define SHIFT11 (11U)
#define SHIFT12 (12U)
#define SHIFT13 (13U)
#define SHIFT14 (14U)
#define SHIFT15 (15U)
#define SHIFT16 (16U)
#define SHIFT17 (17U)
#define SHIFT18 (18U)
#define SHIFT19 (19U)
#define SHIFT20 (20U)
#define SHIFT21 (21U)
#define SHIFT22 (22U)
#define SHIFT23 (23U)
#define SHIFT24 (24U)
#define SHIFT25 (25U)
#define SHIFT26 (26U)
#define SHIFT27 (27U)
#define SHIFT28 (28U)
#define SHIFT29 (29U)
#define SHIFT30 (30U)
#define SHIFT31 (31U)

#define SHIFT32 (32U)
#define SHIFT33 (33U)
#define SHIFT34 (34U)
#define SHIFT35 (35U)
#define SHIFT36 (36U)
#define SHIFT37 (37U)
#define SHIFT38 (38U)
#define SHIFT39 (39U)
#define SHIFT40 (40U)
#define SHIFT41 (41U)
#define SHIFT42 (42U)
#define SHIFT43 (43U)
#define SHIFT44 (44U)
#define SHIFT45 (45U)
#define SHIFT46 (46U)
#define SHIFT47 (47U)
#define SHIFT48 (48U)
#define SHIFT49 (49U)
#define SHIFT50 (50U)
#define SHIFT51 (51U)
#define SHIFT52 (52U)
#define SHIFT53 (53U)
#define SHIFT54 (54U)
#define SHIFT55 (55U)
#define SHIFT56 (56U)
#define SHIFT57 (57U)
#define SHIFT58 (58U)
#define SHIFT59 (59U)
#define SHIFT60 (60U)
#define SHIFT61 (61U)
#define SHIFT62 (62U)
#define SHIFT63 (63U)

#define NOT_USED(__x) (void)(__x)

#endif /* EMBEDDEDTYPES_H */
