SOFUS ..
Macros
cenv.h File Reference

Environment macros introduced for portability This file must be kept C compliant. More...

#include <stdarg.h>
Include dependency graph for cenv.h:
This graph shows which files directly or indirectly include this file:

Macros

#define SPS_LIKELY(x)   (x)
 
#define SPS_UNLIKELY(x)   (x)
 
#define SPS_ASS_ALIGNED(x, y)   (x)
 
#define __BEGIN__   {
 
#define __END__   goto exit; exit: ; }
 
#define STR_HELPER(x)   #x
 
#define STR(x)   STR_HELPER(x)
 
#define NUMARGS(...)    SELECT_5TH(__VA_ARGS__, 4, 3, 2, 1, 0, throwaway, throwaway)
 
#define SELECT_5TH(a1, a2, a3, a4, a5, ...)   a5
 
#define RETURN_FIRST(...)   RETURN_FIRST_HELPER(__VA_ARGS__, throwaway)
 
#define RETURN_FIRST_HELPER(first, ...)   return first;
 
#define FIRST(...)   FIRST_HELPER(__VA_ARGS__, throwaway)
 
#define FIRST_HELPER(first, ...)   first
 
#define REST(...)   REST_HELPER(NNUM(__VA_ARGS__), __VA_ARGS__)
 
#define REST_HELPER(qty, ...)   REST_HELPER2(qty, __VA_ARGS__)
 
#define REST_HELPER2(qty, ...)   REST_HELPER_##qty(__VA_ARGS__)
 
#define REST_HELPER_ONE(first)
 
#define REST_HELPER_TWOORMORE(first, ...)   , __VA_ARGS__
 
#define NNUM(...)
 
#define SELECT_10TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ...)   a10
 
#define CONCATENATE(arg1, arg2)   CONCATENATE1(arg1, arg2)
 
#define CONCATENATE1(arg1, arg2)   CONCATENATE2(arg1, arg2)
 
#define CONCATENATE2(arg1, arg2)   arg1##arg2
 
#define FOR_EACH_1(what, x)    what(x)
 
#define FOR_EACH_2(what, x, ...)
 
#define FOR_EACH_3(what, x, ...)
 
#define FOR_EACH_4(what, x, ...)
 
#define FOR_EACH_5(what, x, ...)
 
#define FOR_EACH_6(what, x, ...)
 
#define FOR_EACH_7(what, x, ...)
 
#define FOR_EACH_8(what, x, ...)
 
#define FOR_EACH_9(what, x, ...)
 
#define FOR_EACH_10(what, x, ...)
 
#define FOR_EACH_11(what, x, ...)
 
#define FOR_EACH_12(what, x, ...)
 
#define FOR_EACH_13(what, x, ...)
 
#define FOR_EACH_NARG(...)   FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())
 
#define FOR_EACH_NARG_(...)   FOR_EACH_ARG_N(__VA_ARGS__)
 
#define FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, N, ...)   N
 
#define FOR_EACH_RSEQ_N()   12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
 
#define FOR_EACH_(N, what, ...)   CONCATENATE(FOR_EACH_, N)(what, __VA_ARGS__)
 
#define FOR_EACH(what, ...)   FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, __VA_ARGS__)
 
#define SPS_UNREFERENCED_PARAMETER(x)   ((void)(x))
 
#define SPS_UNREFERENCED_PARAMETERS(...)   FOR_EACH( SPS_UNREFERENCED_PARAMETER, __VA_ARGS__)
 
#define SPS_ATTR_DESTRUCTOR   __attribute__((destructor(101)))
 

Detailed Description

Environment macros introduced for portability This file must be kept C compliant.

Author
Jens Munk Hansen jens..nosp@m.munk.nosp@m..hans.nosp@m.en@g.nosp@m.mail..nosp@m.com
Date
Sat Nov 29 17:48:45 2014

Macro Definition Documentation

◆ __BEGIN__

#define __BEGIN__   {

◆ __END__

#define __END__   goto exit; exit: ; }

◆ CONCATENATE

#define CONCATENATE (   arg1,
  arg2 
)    CONCATENATE1(arg1, arg2)

◆ CONCATENATE1

#define CONCATENATE1 (   arg1,
  arg2 
)    CONCATENATE2(arg1, arg2)

◆ CONCATENATE2

#define CONCATENATE2 (   arg1,
  arg2 
)    arg1##arg2

◆ FIRST

#define FIRST (   ...)    FIRST_HELPER(__VA_ARGS__, throwaway)

◆ FIRST_HELPER

#define FIRST_HELPER (   first,
  ... 
)    first

◆ FOR_EACH

#define FOR_EACH (   what,
  ... 
)    FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, __VA_ARGS__)

◆ FOR_EACH_

#define FOR_EACH_ (   N,
  what,
  ... 
)    CONCATENATE(FOR_EACH_, N)(what, __VA_ARGS__)

◆ FOR_EACH_1

#define FOR_EACH_1 (   what,
 
)     what(x)

◆ FOR_EACH_10

#define FOR_EACH_10 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_9(what, __VA_ARGS__);

◆ FOR_EACH_11

#define FOR_EACH_11 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_10(what, __VA_ARGS__);

◆ FOR_EACH_12

#define FOR_EACH_12 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_11(what, __VA_ARGS__);

◆ FOR_EACH_13

#define FOR_EACH_13 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_12(what, __VA_ARGS__);

◆ FOR_EACH_2

#define FOR_EACH_2 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_1(what, __VA_ARGS__);

◆ FOR_EACH_3

#define FOR_EACH_3 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_2(what, __VA_ARGS__);

◆ FOR_EACH_4

#define FOR_EACH_4 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_3(what, __VA_ARGS__);

◆ FOR_EACH_5

#define FOR_EACH_5 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_4(what, __VA_ARGS__);

◆ FOR_EACH_6

#define FOR_EACH_6 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_5(what, __VA_ARGS__);

◆ FOR_EACH_7

#define FOR_EACH_7 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_6(what, __VA_ARGS__);

◆ FOR_EACH_8

#define FOR_EACH_8 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_7(what, __VA_ARGS__);

◆ FOR_EACH_9

#define FOR_EACH_9 (   what,
  x,
  ... 
)
Value:
what(x); \
FOR_EACH_8(what, __VA_ARGS__);

◆ FOR_EACH_ARG_N

#define FOR_EACH_ARG_N (   _1,
  _2,
  _3,
  _4,
  _5,
  _6,
  _7,
  _8,
  _9,
  _10,
  _11,
  _12,
  N,
  ... 
)    N

◆ FOR_EACH_NARG

#define FOR_EACH_NARG (   ...)    FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())

◆ FOR_EACH_NARG_

#define FOR_EACH_NARG_ (   ...)    FOR_EACH_ARG_N(__VA_ARGS__)

◆ FOR_EACH_RSEQ_N

#define FOR_EACH_RSEQ_N ( )    12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

◆ NNUM

#define NNUM (   ...)
Value:
SELECT_10TH(__VA_ARGS__, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE,\
TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, ONE, throwaway)
#define SELECT_10TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,...)
Definition: cenv.h:231

◆ NUMARGS

#define NUMARGS (   ...)     SELECT_5TH(__VA_ARGS__, 4, 3, 2, 1, 0, throwaway, throwaway)

◆ REST

#define REST (   ...)    REST_HELPER(NNUM(__VA_ARGS__), __VA_ARGS__)

◆ REST_HELPER

#define REST_HELPER (   qty,
  ... 
)    REST_HELPER2(qty, __VA_ARGS__)

◆ REST_HELPER2

#define REST_HELPER2 (   qty,
  ... 
)    REST_HELPER_##qty(__VA_ARGS__)

◆ REST_HELPER_ONE

#define REST_HELPER_ONE (   first)

◆ REST_HELPER_TWOORMORE

#define REST_HELPER_TWOORMORE (   first,
  ... 
)    , __VA_ARGS__

◆ RETURN_FIRST

#define RETURN_FIRST (   ...)    RETURN_FIRST_HELPER(__VA_ARGS__, throwaway)

◆ RETURN_FIRST_HELPER

#define RETURN_FIRST_HELPER (   first,
  ... 
)    return first;

◆ SELECT_10TH

#define SELECT_10TH (   a1,
  a2,
  a3,
  a4,
  a5,
  a6,
  a7,
  a8,
  a9,
  a10,
  ... 
)    a10

◆ SELECT_5TH

#define SELECT_5TH (   a1,
  a2,
  a3,
  a4,
  a5,
  ... 
)    a5

◆ SPS_ASS_ALIGNED

#define SPS_ASS_ALIGNED (   x,
 
)    (x)

◆ SPS_ATTR_DESTRUCTOR

#define SPS_ATTR_DESTRUCTOR   __attribute__((destructor(101)))

◆ SPS_LIKELY

#define SPS_LIKELY (   x)    (x)
Todo:
: Add other OS'es
Todo:
: Use alignas if present

◆ SPS_UNLIKELY

#define SPS_UNLIKELY (   x)    (x)

◆ SPS_UNREFERENCED_PARAMETER

#define SPS_UNREFERENCED_PARAMETER (   x)    ((void)(x))

◆ SPS_UNREFERENCED_PARAMETERS

#define SPS_UNREFERENCED_PARAMETERS (   ...)    FOR_EACH( SPS_UNREFERENCED_PARAMETER, __VA_ARGS__)

◆ STR

#define STR (   x)    STR_HELPER(x)

◆ STR_HELPER

#define STR_HELPER (   x)    #x
Todo:
: Make file with helper macros