xref: /netbsd-src/external/mit/isl/dist/isl_test_cpp17-generic.cc (revision 5971e316fdea024efff6be8f03536623db06833e)
1 /* A class that sets a boolean when an object of the class gets destroyed.
2  */
3 struct S {
SS4 	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  */
~S()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  */
construct_id(isl::ctx ctx,bool * freed)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  */
test_try_user(isl::ctx ctx)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