1 const char help[] = "Test PetscAssertPointer type generics"; 2 3 #include <petsc/private/petscimpl.h> 4 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)) 20 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 } 46 47 /*TEST 48 49 test: 50 suffix: 0 51 52 TEST*/ 53