Actual source code: macros.hpp

      1: #pragma once

      3: #include <petscmacros.h>

      5: // basic building blocks
      6: #define PETSC_DECLTYPE_AUTO(...) ->decltype(__VA_ARGS__)
      7: #define PETSC_NOEXCEPT_AUTO(...) noexcept(noexcept(__VA_ARGS__))
      8: #define PETSC_RETURNS(...) \
      9:   { \
     10:     return __VA_ARGS__; \
     11:   }

     13: // one without the other
     14: #define PETSC_DECLTYPE_AUTO_RETURNS(...) PETSC_DECLTYPE_AUTO(__VA_ARGS__) PETSC_RETURNS(__VA_ARGS__)
     15: #define PETSC_NOEXCEPT_AUTO_RETURNS(...) PETSC_NOEXCEPT_AUTO(__VA_ARGS__) PETSC_RETURNS(__VA_ARGS__)

     17: // both
     18: #define PETSC_DECLTYPE_NOEXCEPT_AUTO(...) PETSC_NOEXCEPT_AUTO(__VA_ARGS__) PETSC_DECLTYPE_AUTO(__VA_ARGS__)
     19: // all
     20: #define PETSC_DECLTYPE_NOEXCEPT_AUTO_RETURNS(...) PETSC_DECLTYPE_NOEXCEPT_AUTO(__VA_ARGS__) PETSC_RETURNS(__VA_ARGS__)

     22: // PETSC_CXX_COMPAT_DECL() - Helper macro to declare a C++ class member function or
     23: // free-standing function guaranteed to be compatible with C
     24: //
     25: // input params:
     26: // __VA_ARGS__ - the function declaration
     27: //
     28: // notes:
     29: // Normally member functions of C++ structs or classes are not callable from C as they have an
     30: // implicit "this" parameter tacked on the front (analogous to Pythons "self"). Static
     31: // functions on the other hand do not have this restriction. This macro applies static to the
     32: // function declaration as well as noexcept (as C++ exceptions escaping the C++ boundary is
     33: // undefined behavior anyways) and [[nodiscard]].
     34: //
     35: // Note that the user should take care that function arguments and return type are also C
     36: // compatible.
     37: //
     38: // example usage:
     39: // class myclass
     40: // {
     41: // public:
     42: //   PETSC_CXX_COMPAT_DECL(PetscErrorCode foo(int,Vec,char));
     43: // };
     44: //
     45: // use this to define inline as well
     46: //
     47: // class myclass
     48: // {
     49: // public:
     50: //   PETSC_CXX_COMPAT_DECL(PetscErrorCode foo(int a, Vec b, charc))
     51: //   {
     52: //     ...
     53: //   }
     54: // };
     55: //
     56: // or to define a free-standing function
     57: //
     58: // PETSC_CXX_COMPAT_DECL(bool bar(int x, int y))
     59: // {
     60: //   ...
     61: // }
     62: #define PETSC_CXX_COMPAT_DECL(...) PETSC_NODISCARD static inline __VA_ARGS__ noexcept

     64: // PETSC_CXX_COMPAT_DEFN() - Corresponding macro to define a C++ member function declared using
     65: // PETSC_CXX_COMPAT_DECL()
     66: //
     67: // input params:
     68: // __VA_ARGS__ - the function prototype (not the body!)
     69: //
     70: // notes:
     71: // prepends inline and appends noexcept to the function
     72: //
     73: // example usage:
     74: // PETSC_CXX_COMPAT_DEFN(PetscErrorCode myclass::foo(int a, Vec b, char c))
     75: // {
     76: //   ...
     77: // }
     78: #define PETSC_CXX_COMPAT_DEFN(...) inline __VA_ARGS__ noexcept