xref: /petsc/include/petsc/private/petscadvancedmacros.h (revision 6cdbbeb72054dee200e22f5b025f82ba65e618f9)
1 #pragma once
2 
3 #include <petscmacros.h>
4 
5 /* ------------------------------ Like petscmacros.h but advanced ------------------------------ */
6 
7 #define PETSC_IF_INTERNAL_0(result_if_true, ...) __VA_ARGS__
8 #define PETSC_IF_INTERNAL_1(result_if_true, ...) result_if_true
9 
10 /*
11   PetscIf - Conditionally expand to the second or remaining args
12 
13   No Fortran Support
14 
15   Input Parameters:
16 + cond           - Preprocessor conditional
17 . result_if_true - Result of macro expansion if cond expands to 1
18 - __VA_ARGS__    - Result of macro expansion if cond expands to 0
19 
20   Level: intermediate
21 
22   Note:
23   cond must be defined and expand (not evaluate!) to either integer literal 0 or 1. Must have
24   at least 1 argument for __VA_ARGS__, but it may expand empty.
25 
26   Example usage:
27 .vb
28   void myFunction(int,char*);
29   #define MY_VAR 1
30   PetscIf(MY_VAR,"hello","goodbye") -> "hello"
31   PetscIf(MY_VAR,myFunction,PetscExpandToNothing)(1,"hello") -> myFunction(1,"hello")
32 
33   #define MY_VAR 0
34   PetscIf(MY_VAR,"hello",func<type1,type2>()) -> func<type1,type2>()
35   PetscIf(MY_VAR,myFunction,PetscExpandToNothing)(1,"hello") -> *nothing*
36 .ve
37 
38 .seealso: `PetscIfPetscDefined()`, `PetscConcat()`, `PetscExpandToNothing()`, `PetscCompl()`
39 */
40 #define PetscIf(cond, result_if_true, ...) PetscConcat_(PETSC_IF_INTERNAL_, cond)(result_if_true, __VA_ARGS__)
41 
42 /*
43   PetscIfPetscDefined - Like PetscIf(), but passes cond through PetscDefined() first
44 
45   No Fortran Support
46 
47   Input Parameters:
48 + cond           - Condition passed to PetscDefined()
49 . result_if_true - Result of macro expansion if PetscDefined(cond) expands to 1
50 - __VA_ARGS__    - Result of macro expansion if PetscDefined(cond) expands to 0
51 
52   Level: intermediate
53 
54   Note:
55   cond must satisfy all conditions for PetscDefined(). Must have at least 1 argument for
56   __VA_ARGS__, but it may expand empty.
57 
58   Example usage:
59 .vb
60   #define PETSC_HAVE_FOO 1
61   PetscIfPetscDefined(HAVE_FOO,foo,bar) -> foo
62 
63   #undef PETSC_HAVE_FOO
64   PetscIfPetscDefined(HAVE_FOO,foo,bar,baz,bop) -> bar,baz,bop
65 .ve
66 
67 .seealso: `PetscIf()`, `PetscDefined()`, `PetscConcat()`, `PetscExpand()`, `PetscCompl()`
68 */
69 #define PetscIfPetscDefined(cond, result_if_true, ...) PetscIf(PetscDefined(cond), result_if_true, __VA_ARGS__)
70