blob: ef0f02d548d329f09f8d928e4cbd92b5d47e8784 [file] [log] [blame]
Allan MacKinnon4359d522018-06-19 13:57:04 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can
5 * be found in the LICENSE file.
6 *
7 */
8
9#pragma once
10
11//
12//
13//
14
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -070015#include <stdint.h>
Allan MacKinnon4359d522018-06-19 13:57:04 -070016
17//
18//
19//
20
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -070021#define ARRAY_LENGTH_MACRO(x) (sizeof(x)/sizeof(x[0]))
22#define OFFSET_OF_MACRO(t,m) ((size_t)&(((t*)0)->m))
23#define MEMBER_SIZE_MACRO(t,m) sizeof(((t*)0)->m)
24
25
26//
27//
28//
29
30#define MAX_MACRO(a,b) (((a) > (b)) ? (a) : (b))
31#define MIN_MACRO(a,b) (((a) < (b)) ? (a) : (b))
32#define GTE_MACRO(a,b) ((a) >= (b))
33#define LT_MACRO(a,b) ((a) < (b))
34
35//
36//
37//
38
Allan MacKinnoned5e73c2018-08-16 10:09:48 -070039#if defined( _MSC_VER )
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -070040#define ALLOCA_MACRO(n) _alloca(n)
41#else
Allan MacKinnone65dd582018-08-17 09:30:44 -070042#include <alloca.h>
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -070043#define ALLOCA_MACRO(n) alloca(n)
44#endif
Allan MacKinnon4359d522018-06-19 13:57:04 -070045
46//
47//
48//
49
50#define BITS_TO_MASK(n) (((uint32_t)1<<(n))-1)
51#define BITS_TO_MASK_64(n) (((uint64_t)1<<(n))-1)
52
53#define BITS_TO_MASK_AT(n,b) (BITS_TO_MASK(n)<<(b))
54#define BITS_TO_MASK_AT_64(n,b) (BITS_TO_MASK_64(n)<<(b))
55
56//
Allan MacKinnoned5e73c2018-08-16 10:09:48 -070057//
58//
59
Allan MacKinnon638ab5a2018-09-10 13:02:04 -070060#define STRINGIFY_MACRO_2(a) #a
61#define STRINGIFY_MACRO(a) STRINGIFY_MACRO_2(a)
Allan MacKinnoned5e73c2018-08-16 10:09:48 -070062
63//
64//
65//
66
Allan MacKinnon1dd2b872018-08-23 13:14:41 -070067#define CONCAT_MACRO_2(a,b) a ## b
68#define CONCAT_MACRO(a,b) CONCAT_MACRO_2(a,b)
Allan MacKinnoned5e73c2018-08-16 10:09:48 -070069
70//
71// Convert byte pointer to a network order 32-bit integer to host
72// order.
Allan MacKinnon4359d522018-06-19 13:57:04 -070073//
74
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -070075#define NPBTOHL_MACRO(pb4) ((((pb4)[0])<<24) | (((pb4)[1])<<16) | \
76 (((pb4)[2])<< 8) | (pb4)[3])
77
Allan MacKinnoned5e73c2018-08-16 10:09:48 -070078//
79//
80//
81
82#if defined( _MSC_VER )
83
84#if REG_DWORD == REG_DWORD_LITTLE_ENDIAN
85#define NTOHL_MACRO(x) _byteswap_ulong(x)
86#else
87#define NTOHL_MACRO(x) x
88#endif
89
90#elif defined( __GNUC__ )
91
92#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
93#define NTOHL_MACRO(x) __builtin_bswap32(x)
94#else
95#define NTOHL_MACRO(x) x
96#endif
97
98#else
99//
100// FIXME -- CLANG, etc.
101//
102#endif
103
104//
105//
106//
107
108#if defined( _MSC_VER )
109
110#define STATIC_ASSERT_MACRO(...) static_assert(__VA_ARGS__)
111
112#elif defined( __GNUC__ )
113
114#define STATIC_ASSERT_MACRO(...) _Static_assert(__VA_ARGS__)
115
116#else
117//
118// FIXME -- CLANG, etc.
119//
120#endif
Allan MacKinnon9e0d7e42018-07-16 15:57:05 -0700121
Allan MacKinnon4359d522018-06-19 13:57:04 -0700122//
123//
124//
Allan MacKinnone65dd582018-08-17 09:30:44 -0700125
126#if defined( _MSC_VER )
127
128#define POPCOUNT_MACRO(...) __popcnt(__VA_ARGS__)
129
130#elif defined( __GNUC__ )
131
132#define POPCOUNT_MACRO(...) __builtin_popcount(__VA_ARGS__)
133
134#else
135//
136// FIXME -- CLANG, etc.
137//
138#endif
139
140//
141//
142//