aboutsummaryrefslogtreecommitdiff
path: root/include/nullable.h
blob: 6c4d3a74940c490da6f9cdfec930bd707b64b42b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef AMAL_NULLABLE_H
#define AMAL_NULLABLE_H

struct __nullable_type_dummy{ int _; };

int assert_not_null(void *val);

#ifdef DEBUG
#define DefineNullablePtrType(type)                 \
    typedef struct type##_nullable type##_nullable; \
    struct type##_nullable {                        \
        type *value;                                \
    }
#define NullablePtr(type) type##_nullable
#define nullable_unwrap(nullable_type) \
    (assert_not_null((nullable_type).value) ? ((nullable_type).value) : NULL)
#define nullable_assign(nullable_type, new_value) ((nullable_type).value = (new_value))
#define is_not_null(nullable_type) ((nullable_type).value != NULL)
#define nullable_raw(nullable_type) ((nullable_type).value)
#else
#define DefineNullablePtrType(type)
#define NullablePtr(type) type*
#define nullable_unwrap(value) value
#define nullable_assign(nullable_type, new_value) ((nullable_type) = (new_value))
#define is_not_null(nullable_type) ((nullable_type) != NULL)
#define nullable_raw(nullable_type) (nullable_type)
#endif

#endif