creusot_contracts/
model.rs1use crate::prelude::*;
3
4#[diagnostic::on_unimplemented(
10 message = "Cannot take the view of `{Self}`",
11 label = "no implementation for `{Self}@`"
12)]
13pub trait View {
14 type ViewTy;
15 #[logic]
16 #[intrinsic("view")]
17 fn view(self) -> Self::ViewTy;
18}
19
20pub use crate::base_macros::DeepModel;
21
22pub trait DeepModel {
27 type DeepModelTy;
28 #[logic]
29 fn deep_model(self) -> Self::DeepModelTy;
30}
31
32impl<T: DeepModel + ?Sized> DeepModel for &T {
33 type DeepModelTy = T::DeepModelTy;
34 #[logic(open, inline)]
35 fn deep_model(self) -> Self::DeepModelTy {
36 (*self).deep_model()
37 }
38}
39
40impl<T: DeepModel + ?Sized> DeepModel for &mut T {
41 type DeepModelTy = T::DeepModelTy;
42 #[logic(open, inline)]
43 fn deep_model(self) -> Self::DeepModelTy {
44 (*self).deep_model()
45 }
46}
47
48impl DeepModel for bool {
49 type DeepModelTy = bool;
50
51 #[logic(open, inline)]
52 fn deep_model(self) -> Self::DeepModelTy {
53 self
54 }
55}
56
57impl DeepModel for Int {
58 type DeepModelTy = Int;
59
60 #[logic(open, inline)]
61 fn deep_model(self) -> Self::DeepModelTy {
62 self
63 }
64}
65
66impl View for String {
67 type ViewTy = Seq<char>;
68
69 #[logic(opaque)]
70 fn view(self) -> Self::ViewTy {
71 dead
72 }
73}
74
75impl DeepModel for std::cmp::Ordering {
76 type DeepModelTy = std::cmp::Ordering;
77
78 #[logic(open, inline)]
79 fn deep_model(self) -> Self::DeepModelTy {
80 self
81 }
82}