Metalang99 1.13.3
Full-blown preprocessor metaprogramming
gen.h File Reference

Support for C language constructions. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ML99_semicoloned(...)   ML99_call(ML99_semicoloned, __VA_ARGS__)
 Puts a semicolon after provided arguments. More...
 
#define ML99_braced(...)   ML99_call(ML99_braced, __VA_ARGS__)
 Puts provided arguments into braces. More...
 
#define ML99_assign(lhs, ...)   ML99_call(ML99_assign, lhs, __VA_ARGS__)
 Generates an assignment of provided variadic arguments to lhs. More...
 
#define ML99_assignInitializerList(lhs, ...)   ML99_call(ML99_assignInitializerList, lhs, __VA_ARGS__)
 A shortcut for ML99_assign(lhs, ML99_braced(...)).
 
#define ML99_assignStmt(lhs, ...)   ML99_call(ML99_assignStmt, lhs, __VA_ARGS__)
 A shortcut for ML99_semicoloned(ML99_assign(lhs, ...)).
 
#define ML99_assignInitializerListStmt(lhs, ...)    ML99_call(ML99_assignInitializerListStmt, lhs, __VA_ARGS__)
 A shortcut for ML99_assignStmt(lhs, ML99_braced(...)).
 
#define ML99_invoke(f, ...)   ML99_call(ML99_invoke, f, __VA_ARGS__)
 Generates a function/macro invocation. More...
 
#define ML99_invokeStmt(f, ...)   ML99_call(ML99_invokeStmt, f, __VA_ARGS__)
 A shortcut for ML99_semicoloned(ML99_invoke(f, ...)).
 
#define ML99_prefixedBlock(prefix, ...)   ML99_call(ML99_prefixedBlock, prefix, __VA_ARGS__)
 Generates prefix { code }. More...
 
#define ML99_typedef(ident, ...)   ML99_call(ML99_typedef, ident, __VA_ARGS__)
 Generates a type definition. More...
 
#define ML99_struct(ident, ...)   ML99_call(ML99_struct, ident, __VA_ARGS__)
 Generates a C structure. More...
 
#define ML99_anonStruct(...)   ML99_call(ML99_anonStruct, __VA_ARGS__)
 Generates an anonymous C structure. More...
 
#define ML99_union(ident, ...)   ML99_call(ML99_union, ident, __VA_ARGS__)
 The same as ML99_struct but generates a union.
 
#define ML99_anonUnion(...)   ML99_call(ML99_anonUnion, __VA_ARGS__)
 The same as ML99_anonStruct but generates a union.
 
#define ML99_enum(ident, ...)   ML99_call(ML99_enum, ident, __VA_ARGS__)
 The same as ML99_struct but generates an enumeration.
 
#define ML99_anonEnum(...)   ML99_call(ML99_anonEnum, __VA_ARGS__)
 The same as ML99_anonStruct but generates an enumeration.
 
#define ML99_fnPtr(ret_ty, name, ...)   ML99_call(ML99_fnPtr, ret_ty, name, __VA_ARGS__)
 Generates a function pointer. More...
 
#define ML99_fnPtrStmt(ret_ty, name, ...)   ML99_call(ML99_fnPtrStmt, ret_ty, name, __VA_ARGS__)
 A shortcut for ML99_semicoloned(ML99_fnPtr(ret_ty, name, ...)).
 
#define ML99_times(n, ...)   ML99_call(ML99_times, n, __VA_ARGS__)
 Pastes provided arguments n times. More...
 
#define ML99_repeat(n, f)   ML99_call(ML99_repeat, n, f)
 Invokes f n times, providing an iteration index each time. More...
 
#define ML99_indexedParams(type_list)   ML99_call(ML99_indexedParams, type_list)
 Generates \((T_0 \ \_0, ..., T_n \ \_n)\). More...
 
#define ML99_indexedFields(type_list)   ML99_call(ML99_indexedFields, type_list)
 Generates \(T_0 \ \_0; ...; T_n \ \_n\). More...
 
#define ML99_indexedInitializerList(n)   ML99_call(ML99_indexedInitializerList, n)
 Generates \(\{ \_0, ..., \_{n - 1} \}\). More...
 
#define ML99_indexedArgs(n)   ML99_call(ML99_indexedArgs, n)
 Generates \(\_0, ..., \_{n - 1}\). More...
 

Detailed Description

Support for C language constructions.

Some decent usage examples can be found in datatype99/examples/derive.

Macro Definition Documentation

◆ ML99_anonStruct

#define ML99_anonStruct (   ...)    ML99_call(ML99_anonStruct, __VA_ARGS__)

Generates an anonymous C structure.

Examples

#include <metalang99/gen.h>
// struct { int x, y; }
ML99_struct(v(int x, y;))
Support for C language constructions.
#define ML99_struct(ident,...)
Generates a C structure.
Definition: gen.h:143
#define v(...)
A value that is pasted as-is; no evaluation occurs on provided arguments.
Definition: lang.h:145

◆ ML99_assign

#define ML99_assign (   lhs,
  ... 
)    ML99_call(ML99_assign, lhs, __VA_ARGS__)

Generates an assignment of provided variadic arguments to lhs.

Examples

#include <metalang99/gen.h>
// x = 5, 6, 7
ML99_assign(v(x), v(5, 6, 7))
#define ML99_assign(lhs,...)
Generates an assignment of provided variadic arguments to lhs.
Definition: gen.h:64

◆ ML99_braced

#define ML99_braced (   ...)    ML99_call(ML99_braced, __VA_ARGS__)

Puts provided arguments into braces.

Examples

#include <metalang99/gen.h>
// { int a, b, c; }
ML99_braced(v(int a, b, c;))
#define ML99_braced(...)
Puts provided arguments into braces.
Definition: gen.h:50

◆ ML99_fnPtr

#define ML99_fnPtr (   ret_ty,
  name,
  ... 
)    ML99_call(ML99_fnPtr, ret_ty, name, __VA_ARGS__)

Generates a function pointer.

Examples

#include <metalang99/gen.h>
// int (*add)(int x, int y)
ML99_fnPtr(v(int), v(add), v(int x), v(int y))
// const char *(*title)(void)
ML99_fnPtr(v(const char *), v(title), v(void))
#define ML99_fnPtr(ret_ty, name,...)
Generates a function pointer.
Definition: gen.h:194

◆ ML99_indexedArgs

#define ML99_indexedArgs (   n)    ML99_call(ML99_indexedArgs, n)

Generates \(\_0, ..., \_{n - 1}\).

If n is 0, this macro results in emptiness.

Examples

#include <metalang99/gen.h>
// _0, _1, _2
// ML99_empty()
#define ML99_indexedArgs(n)
Generates .
Definition: gen.h:304

◆ ML99_indexedFields

#define ML99_indexedFields (   type_list)    ML99_call(ML99_indexedFields, type_list)

Generates \(T_0 \ \_0; ...; T_n \ \_n\).

If type_list is empty, this macro results in emptiness.

Examples

#include <metalang99/gen.h>
// int _0; long long _1; const char * _2;
ML99_indexedFields(ML99_list(v(int, long long, const char *)))
// ML99_empty()
#define ML99_indexedFields(type_list)
Generates .
Definition: gen.h:266
#define ML99_list(...)
Constructs a list from its arguments.
Definition: list.h:147
#define ML99_nil(...)
The empty list.
Definition: list.h:35

◆ ML99_indexedInitializerList

#define ML99_indexedInitializerList (   n)    ML99_call(ML99_indexedInitializerList, n)

Generates \(\{ \_0, ..., \_{n - 1} \}\).

If n is 0, this macro results in { 0 }.

Examples

#include <metalang99/gen.h>
// { _0, _1, _2 }
// { 0 }
#define ML99_indexedInitializerList(n)
Generates .
Definition: gen.h:285

◆ ML99_indexedParams

#define ML99_indexedParams (   type_list)    ML99_call(ML99_indexedParams, type_list)

Generates \((T_0 \ \_0, ..., T_n \ \_n)\).

If type_list is empty, this macro results in (void).

Examples

#include <metalang99/gen.h>
// (int _0, long long _1, const char * _2)
ML99_indexedParams(ML99_list(v(int, long long, const char *)))
// (void)
#define ML99_indexedParams(type_list)
Generates .
Definition: gen.h:247

◆ ML99_invoke

#define ML99_invoke (   f,
  ... 
)    ML99_call(ML99_invoke, f, __VA_ARGS__)

Generates a function/macro invocation.

Examples

#include <metalang99/gen.h>
// If you are on C11.
ML99_invoke(v(_Static_assert), v(1 == 1, "Must be true"))
#define ML99_invoke(f,...)
Generates a function/macro invocation.
Definition: gen.h:94

◆ ML99_prefixedBlock

#define ML99_prefixedBlock (   prefix,
  ... 
)    ML99_call(ML99_prefixedBlock, prefix, __VA_ARGS__)

Generates prefix { code }.

Examples

#include <metalang99/gen.h>
// if (1 == 1) {
// printf("x = %d\n", x);
// }
ML99_prefixedBlock(v(if (1 == 1)), v(printf("x = %d\n", x);))
#define ML99_prefixedBlock(prefix,...)
Generates prefix { code }.
Definition: gen.h:115

◆ ML99_repeat

#define ML99_repeat (   n,
 
)    ML99_call(ML99_repeat, n, f)

Invokes f n times, providing an iteration index each time.

Examples

#include <metalang99/gen.h>
// _0 _1 _2
#define ML99_repeat(n, f)
Invokes f n times, providing an iteration index each time.
Definition: gen.h:228
#define ML99_appl(f,...)
Applies arguments to f.
Definition: lang.h:93
Utilitary stuff.
#define ML99_cat(a, b)
Concatenates a with b, leaving the result unevaluated.
Definition: util.h:53

◆ ML99_semicoloned

#define ML99_semicoloned (   ...)    ML99_call(ML99_semicoloned, __VA_ARGS__)

Puts a semicolon after provided arguments.

Examples

#include <metalang99/gen.h>
// int x = 5;
ML99_semicoloned(v(int x = 5))
#define ML99_semicoloned(...)
Puts a semicolon after provided arguments.
Definition: gen.h:36

◆ ML99_struct

#define ML99_struct (   ident,
  ... 
)    ML99_call(ML99_struct, ident, __VA_ARGS__)

Generates a C structure.

Examples

#include <metalang99/gen.h>
// struct Point { int x, y; }
ML99_struct(v(Point), v(int x, y;))

◆ ML99_times

#define ML99_times (   n,
  ... 
)    ML99_call(ML99_times, n, __VA_ARGS__)

Pastes provided arguments n times.

Examples

#include <metalang99/gen.h>
// ~ ~ ~ ~ ~
ML99_times(v(5), v(~))
#define ML99_times(n,...)
Pastes provided arguments n times.
Definition: gen.h:213

◆ ML99_typedef

#define ML99_typedef (   ident,
  ... 
)    ML99_call(ML99_typedef, ident, __VA_ARGS__)

Generates a type definition.

Examples

#include <metalang99/gen.h>
// typedef struct { int x, y; } Point;
ML99_typedef(v(Point), v(struct { int x, y; }))
#define ML99_typedef(ident,...)
Generates a type definition.
Definition: gen.h:129