Wirepas SDK
util.h
Go to the documentation of this file.
1
/* Copyright 2017 Wirepas Ltd. All Rights Reserved.
2
*
3
* See file LICENSE.txt for full license details.
4
*
5
*/
6
7
#ifndef UTIL_H
8
#define UTIL_H
9
46
#include <stdint.h>
47
#include <stdbool.h>
48
49
#define Util_isLtUint8(a, b) ((int8_t)((a) - (b)) < 0)
50
#define Util_isGtOrEqUint8(a, b) ((int8_t)((a) - (b)) >= 0)
51
#define Util_isLtUint16(a, b) ((int16_t)((a) - (b)) < 0)
52
#define Util_isGtOrEqUint16(a, b) ((int16_t)((a) - (b)) >= 0)
53
#define Util_isGtOrEqUint32(a, b) !Util_isLtUint32(a, b)
54
55
bool
Util_isLtUint32
(uint32_t a, uint32_t b);
56
57
#define Util_isGtUint8(a, b) (!Util_isGtOrEqUint8(b, a))
58
#define Util_isGtUint16(a, b) (!Util_isGtOrEqUint16(b, a))
59
#define Util_isGtUint32(a, b) (!Util_isGtOrEqUint32(b, a))
60
66
bool
Util_isSmallest
(
const
uint32_t a,
const
uint32_t b,
const
uint32_t c);
67
75
bool
Util_inBetween
(
const
uint32_t a,
const
uint32_t b,
const
uint32_t c);
76
77
/* Aligning macros for structs.
78
*
79
* These can be used in structs to align the struct members correctly,
80
* especially when preceeding struct member size varies by some compilation
81
* flag
82
*
83
* Usage:
84
* STRUCT_ALIGN_4(prev_type);
85
* STRUCT_ALIGN_2(prev_type);
86
*
87
* These align the next member in struct to 4 or 2 byte boundary.
88
*
89
* For example:
90
* typedef struct
91
* {
92
* another_struct_t a;
93
*
94
* STRUCT_ALIGN_4(another_struct_t);
95
*
96
* uint32_t b;
97
* } example_struct_t;
98
*
99
* In this case, if length of another_struct_t varies, this ensures that b is
100
* aligned to 32-bit boundary (4 bytes)
101
*
102
* Another example:
103
* typedef struct
104
* {
105
* another_struct_t a;
106
*
107
* STRUCT_ALIGN_2(another_struct_t);
108
*
109
* uint16_t b;
110
* } example_struct_t;
111
*
112
* This case, align macro ensures that b is aligned to 16-bit boundary
113
*
114
* NOTE: Do NOT use in PACKED structs!
115
*/
116
117
// These are macro replacement redirection forumulas to do the correct operation
118
#define SA_MEMBERNAME(line) align ## line
119
#define SA_BASE(prev_type, size, line) \
120
uint8_t SA_MEMBERNAME(line) \
121
[sizeof(prev_type)%size ? size-(sizeof(prev_type)%size) : 0]
122
123
#define STRUCT_ALIGN_4(prev_type) SA_BASE(prev_type, 4, __LINE__)
124
//uint8_t align ## __LINE__ [sizeof(prev_type)%4 ? 4-(sizeof(prev_type)%4) : 0]
125
#define STRUCT_ALIGN_2(prev_type) SA_BASE(prev_type, 2, __LINE__)
126
// uint8_t align ## __LINE__ [sizeof(prev_type)%2 ? 1 : 0]
127
134
uint8_t
Util_bitCountU8
(uint8_t value);
135
136
#endif // #ifndef __UTIL_H__
Util_bitCountU8
uint8_t Util_bitCountU8(uint8_t value)
Calculate the '1' bits in 8-bit value.
Util_isSmallest
bool Util_isSmallest(const uint32_t a, const uint32_t b, const uint32_t c)
Util_isLtUint32
bool Util_isLtUint32(uint32_t a, uint32_t b)
Util_inBetween
bool Util_inBetween(const uint32_t a, const uint32_t b, const uint32_t c)