libcute 0.1
Loading...
Searching...
No Matches
Macros
optional.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include "macro.h"
#include <nostd.h>
Include dependency graph for optional.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define CU_OPTIONAL_NAME(NAME)   NAME##_Optional
 
#define CU_OPTIONAL_FN(NAME, SUFFIX)   CU_CONCAT(CU_OPTIONAL_NAME(NAME), SUFFIX)
 
#define CU_OPTIONAL_HEADER(NAME, T)
 
#define CU_OPTIONAL_DECL(NAME, T)
 
#define CU_OPTIONAL_IMPL(NAME, T)
 

Detailed Description

Generic optional helper macros.

Macro Definition Documentation

◆ CU_OPTIONAL_DECL

#define CU_OPTIONAL_DECL (   NAME,
 
)
Value:
typedef struct { \
T value; \
bool isSome; \
} CU_OPTIONAL_NAME(NAME); \
CU_OPTIONAL_HEADER(NAME, T)
#define CU_OPTIONAL_NAME(NAME)
Definition optional.h:12

Declare the optional struct and associated functions.

◆ CU_OPTIONAL_FN

#define CU_OPTIONAL_FN (   NAME,
  SUFFIX 
)    CU_CONCAT(CU_OPTIONAL_NAME(NAME), SUFFIX)

Construct an optional helper function name.

◆ CU_OPTIONAL_HEADER

#define CU_OPTIONAL_HEADER (   NAME,
 
)
Value:
CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _some)(T value); \
CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _none)(void); \
bool CU_OPTIONAL_FN(NAME, _is_some)(const CU_OPTIONAL_NAME(NAME) * opt); \
bool CU_OPTIONAL_FN(NAME, _is_none)(const CU_OPTIONAL_NAME(NAME) * opt); \
T CU_OPTIONAL_FN(NAME, _unwrap)(CU_OPTIONAL_NAME(NAME) * opt);
#define CU_OPTIONAL_FN(NAME, SUFFIX)
Definition optional.h:14

Declare optional helper functions for a given type.

◆ CU_OPTIONAL_IMPL

#define CU_OPTIONAL_IMPL (   NAME,
 
)
Value:
CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _some)(T value) { \
CU_OPTIONAL_NAME(NAME) opt; \
cu_Memory_memset(&opt, 0, sizeof(opt)); \
opt.value = value; \
opt.isSome = true; \
return opt; \
} \
\
CU_OPTIONAL_NAME(NAME) CU_OPTIONAL_FN(NAME, _none)(void) { \
CU_OPTIONAL_NAME(NAME) opt; \
cu_Memory_memset(&opt, 0, sizeof(opt)); \
opt.isSome = false; \
return opt; \
} \
\
bool CU_OPTIONAL_FN(NAME, _is_some)(const CU_OPTIONAL_NAME(NAME) * opt) { \
return opt->isSome; \
} \
\
bool CU_OPTIONAL_FN(NAME, _is_none)(const CU_OPTIONAL_NAME(NAME) * opt) { \
return !opt->isSome; \
} \
\
T CU_OPTIONAL_FN(NAME, _unwrap)(CU_OPTIONAL_NAME(NAME) * opt) { \
if (!opt->isSome) { \
CU_DIE("Attempted to unwrap a None optional"); \
} \
return opt->value; \
}

Define the implementation of the optional helpers.

◆ CU_OPTIONAL_NAME

#define CU_OPTIONAL_NAME (   NAME)    NAME##_Optional

Build the concrete optional type name for a category.