1 | /* A class that sets a boolean when an object of the class gets destroyed. |
2 | */ |
3 | struct S { |
4 | S(bool *freed) : freed(freed) {} |
5 | ~S(); |
6 | |
7 | bool *freed; |
8 | }; |
9 | |
10 | /* S destructor. |
11 | * |
12 | * Set the boolean, a pointer to which was passed to the constructor. |
13 | */ |
14 | S::~S() |
15 | { |
16 | *freed = true; |
17 | } |
18 | |
19 | /* Construct an isl::id with an S object attached that sets *freed |
20 | * when it gets destroyed. |
21 | */ |
22 | static isl::id construct_id(isl::ctx ctx, bool *freed) |
23 | { |
24 | auto s = std::make_shared<S>(freed); |
25 | isl::id id(ctx, "S" , s); |
26 | return id; |
27 | } |
28 | |
29 | /* Test id::try_user. |
30 | * |
31 | * In particular, check that the object attached to an identifier |
32 | * can be retrieved again, that trying to retrieve an object of the wrong type |
33 | * or trying to retrieve an object when no object was attached fails. |
34 | * Furthermore, check that the object attached to an identifier |
35 | * gets properly freed. |
36 | */ |
37 | static void test_try_user(isl::ctx ctx) |
38 | { |
39 | isl::id id(ctx, "test" , 5); |
40 | isl::id id2(ctx, "test2" ); |
41 | |
42 | auto maybe_int = id.try_user<int>(); |
43 | auto maybe_s = id.try_user<std::shared_ptr<S>>(); |
44 | auto maybe_int2 = id2.try_user<int>(); |
45 | |
46 | if (!maybe_int) |
47 | die("integer cannot be retrieved from isl::id" ); |
48 | if (maybe_int.value() != 5) |
49 | die("wrong integer retrieved from isl::id" ); |
50 | if (maybe_s) |
51 | die("structure unexpectedly retrieved from isl::id" ); |
52 | if (maybe_int2) |
53 | die("integer unexpectedly retrieved from isl::id" ); |
54 | |
55 | bool freed = false; |
56 | { |
57 | isl::id id = construct_id(ctx, &freed); |
58 | if (freed) |
59 | die("data structure freed prematurely" ); |
60 | auto maybe_s = id.try_user<std::shared_ptr<S>>(); |
61 | if (!maybe_s) |
62 | die("structure cannot be retrieved from isl::id" ); |
63 | if (maybe_s.value()->freed != &freed) |
64 | die("invalid structure retrieved from isl::id" ); |
65 | } |
66 | if (!freed) |
67 | die("data structure not freed" ); |
68 | } |
69 | |