1 | /* |
2 | * Copyright 2018 Sven Verdoolaege |
3 | * |
4 | * Use of this software is governed by the MIT license |
5 | * |
6 | * Written by Sven Verdoolaege. |
7 | */ |
8 | |
9 | #include <stdlib.h> |
10 | |
11 | #include <isl/ctx.h> |
12 | #include <isl/options.h> |
13 | #include <isl/cpp-checked-conversion.h> |
14 | |
15 | /* Check that converting a NULL object from the checked C++ bindings |
16 | * (where the user is expected to check for NULL return values) |
17 | * to the default C++ bindings (where exceptions are raised |
18 | * instead of returning a NULL object) raises an exception. |
19 | */ |
20 | static void check_conversion_null(isl_ctx *ctx) |
21 | { |
22 | isl::checked::set checked_set; |
23 | isl::set set; |
24 | |
25 | bool caught = false; |
26 | try { |
27 | set = isl::uncheck(checked_set); |
28 | isl_die(ctx, isl_error_unknown, "no exception raised" , return); |
29 | } catch (const isl::exception &e) { |
30 | caught = true; |
31 | } |
32 | if (!caught) |
33 | isl_die(ctx, isl_error_unknown, "no exception raised" , return); |
34 | } |
35 | |
36 | /* Dummy function on a set in the checked C++ bindings. |
37 | */ |
38 | static void f_checked(isl::checked::set set) |
39 | { |
40 | } |
41 | |
42 | /* Dummy function on a set in the default C++ bindings. |
43 | */ |
44 | static void f_unchecked(isl::set set) |
45 | { |
46 | } |
47 | |
48 | /* Check the conversion between C++ bindings in function calls. |
49 | * An incorrect call will result in a compiler error. |
50 | */ |
51 | static void check_conversion_call(isl_ctx *ctx) |
52 | { |
53 | isl::set set(ctx, "{ S[i] : 0 <= i < 10 }" ); |
54 | isl::checked::set checked_set(ctx, "{ S[i] : 0 <= i < 10 }" ); |
55 | |
56 | f_unchecked(set); |
57 | f_checked(isl::check(set)); |
58 | f_unchecked(isl::uncheck(checked_set)); |
59 | f_checked(checked_set); |
60 | } |
61 | |
62 | /* Check that a double conversion results in the original set, |
63 | * or at least something that is equal to the original set. |
64 | */ |
65 | static void check_conversion_equal(isl_ctx *ctx) |
66 | { |
67 | isl::set set(ctx, "{ S[i] : 0 <= i < 10 }" ); |
68 | isl::set set2; |
69 | isl::checked::set checked_set; |
70 | |
71 | checked_set = isl::check(set); |
72 | set2 = isl::uncheck(checked_set); |
73 | |
74 | if (!set.is_equal(set2)) |
75 | isl_die(ctx, isl_error_unknown, "bad conversion" , return); |
76 | } |
77 | |
78 | /* Perform some tests on the conversion between the default C++ bindings and |
79 | * the checked C++ bindings. |
80 | */ |
81 | static void check_conversion(isl_ctx *ctx) |
82 | { |
83 | check_conversion_null(ctx); |
84 | check_conversion_call(ctx); |
85 | check_conversion_equal(ctx); |
86 | } |
87 | |
88 | int main() |
89 | { |
90 | isl_ctx *ctx = isl_ctx_alloc(); |
91 | |
92 | isl_options_set_on_error(ctx, ISL_ON_ERROR_ABORT); |
93 | |
94 | check_conversion(ctx); |
95 | |
96 | isl_ctx_free(ctx); |
97 | |
98 | return EXIT_SUCCESS; |
99 | } |
100 | |