Actual source code: ex67.c

  1: const char help[] = "Test PetscAssertPointer type generics";

  3: #include <petsc/private/petscimpl.h>

  5: #define PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(type, PETSC_TYPE, string) \
  6:   do { \
  7:     type         *h = NULL; \
  8:     PetscBool     same_string; \
  9:     PetscDataType data_type         = PetscAssertPointer_PetscDataType(h); \
 10:     const char    expected_string[] = string; \
 11:     PetscCall(PetscInfo(NULL, "PetscAssertPointer_PetscDataType(%s *h) = PETSC_%s\n", expected_string, PetscDataTypes[data_type])); \
 12:     PetscCall(PetscInfo(NULL, "PetscAssertPointer_String(%s *h) = \"%s\"\n", expected_string, PetscAssertPointer_String(h))); \
 13:     PetscCheck(data_type == PETSC_TYPE, PETSC_COMM_SELF, PETSC_ERR_PLIB, "[PetscAssertPointer_PetscDataType(%s *h) = %s] != PETSC_%s", expected_string, PetscDataTypes[data_type], PetscDataTypes[PETSC_TYPE]); \
 14:     PetscCall(PetscStrcmp(PetscAssertPointer_String(h), expected_string, &same_string)); \
 15:     PetscCheck(same_string, PETSC_COMM_SELF, PETSC_ERR_PLIB, "[PetscAssertPointer_String(%s *h) = \"%s\"] != \"%s\"", expected_string, PetscAssertPointer_String(h), expected_string); \
 16:   } while (0)
 17: #define PETSC_TEST_ASSERT_POINTER_GENERICS(type, PETSC_TYPE) \
 18:   PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(type, PETSC_TYPE, PetscStringize(type)); \
 19:   PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(const type, PETSC_TYPE, PetscStringize(type))

 21: int main(int argc, char **argv)
 22: {
 23:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 24: #if defined(PetscAssertPointer_PetscDataType) && (defined(__cplusplus) || (PETSC_C_VERSION >= 11))
 25:   // clang-format off
 26:   PETSC_TEST_ASSERT_POINTER_GENERICS(          char, PETSC_CHAR   );
 27:   PETSC_TEST_ASSERT_POINTER_GENERICS(   signed char, PETSC_CHAR   );
 28:   PETSC_TEST_ASSERT_POINTER_GENERICS( unsigned char, PETSC_CHAR   );
 29:   PETSC_TEST_ASSERT_POINTER_GENERICS(         short, PETSC_SHORT  );
 30:   PETSC_TEST_ASSERT_POINTER_GENERICS(unsigned short, PETSC_SHORT  );
 31:   PETSC_TEST_ASSERT_POINTER_GENERICS(         float, PETSC_FLOAT  );
 32:   PETSC_TEST_ASSERT_POINTER_GENERICS(        double, PETSC_DOUBLE );
 33:   PETSC_TEST_ASSERT_POINTER_GENERICS(  PetscComplex, PETSC_COMPLEX);
 34:   PETSC_TEST_ASSERT_POINTER_GENERICS(       int32_t, PETSC_INT32  );
 35:   PETSC_TEST_ASSERT_POINTER_GENERICS(      uint32_t, PETSC_INT32  );
 36:   PETSC_TEST_ASSERT_POINTER_GENERICS(       int64_t, PETSC_INT64  );
 37:   PETSC_TEST_ASSERT_POINTER_GENERICS(      uint64_t, PETSC_INT64  );
 38:   // clang-format on
 39: #endif
 40: #if defined(PetscAssertPointer_PetscDataType) && defined(__cplusplus)
 41:   PETSC_TEST_ASSERT_POINTER_GENERICS(PetscBool, PETSC_BOOL);
 42: #endif
 43:   PetscCall(PetscFinalize());
 44:   return 0;
 45: }

 47: /*TEST

 49:   test:
 50:     suffix: 0

 52: TEST*/