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