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
main(int argc,char ** argv)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 requires: defined(PETSC_HAVE_COMPLEX)
51
52 suffix: 0
53 output_file: output/empty.out
54
55 TEST*/
56