@@ -26,6 +26,42 @@ pub fn half_3(x: f64) -> f64 {
2626 return ( ( * x. borrow ( ) ) / 2.0E+0 ) ;
2727}
2828#[ derive( Default ) ]
29+ pub struct Flag {
30+ pub v : Value < i32 > ,
31+ }
32+ impl Clone for Flag {
33+ fn clone ( & self ) -> Self {
34+ let __this: Value < Flag > = Rc :: new ( RefCell :: new ( Self {
35+ v : Rc :: new ( RefCell :: new ( ( * self . v . borrow ( ) ) ) ) ,
36+ } ) ) ;
37+ let this: Ptr < Flag > = __this. as_pointer ( ) ;
38+ Rc :: try_unwrap ( __this) . ok ( ) . unwrap ( ) . into_inner ( )
39+ }
40+ }
41+ impl ByteRepr for Flag {
42+ fn byte_size ( ) -> usize {
43+ 4
44+ }
45+ fn to_bytes ( & self , buf : & mut [ u8 ] ) {
46+ ( * self . v . borrow ( ) ) . to_bytes ( & mut buf[ 0 ..4 ] ) ;
47+ }
48+ fn from_bytes ( buf : & [ u8 ] ) -> Self {
49+ Self {
50+ v : Rc :: new ( RefCell :: new ( <i32 >:: from_bytes ( & buf[ 0 ..4 ] ) ) ) ,
51+ }
52+ }
53+ }
54+ pub fn use_4 ( f : Flag ) -> i32 {
55+ let f: Value < Flag > = Rc :: new ( RefCell :: new ( f) ) ;
56+ assert ! ( ( { FlagImpl :: operator__Bool( & f. as_pointer( ) , ) } ) ) ;
57+ return ( * ( * f. borrow ( ) ) . v . borrow ( ) ) ;
58+ }
59+ pub fn checked_5 ( x : i32 ) -> i32 {
60+ let x: Value < i32 > = Rc :: new ( RefCell :: new ( x) ) ;
61+ assert ! ( ( ( * x. borrow( ) ) > 0 ) ) ;
62+ return ( ( * x. borrow ( ) ) + 1 ) ;
63+ }
64+ #[ derive( Default ) ]
2965pub struct P {
3066 pub v : Value < i32 > ,
3167}
@@ -62,6 +98,26 @@ fn main_0() -> i32 {
6298 assert ! ( ( ( { scaled_2( 3 , ) } ) == 3 ) ) ;
6399 assert ! ( ( ( { scaled_2( -3_i32 , ) } ) == 6 ) ) ;
64100 assert ! ( ( ( { half_3( 5.0E+0 , ) } ) == 2.5E+0 ) ) ;
101+ assert ! ( ( ( { checked_5( 1 , ) } ) == 2 ) ) ;
102+ let c: Value < i32 > = Rc :: new ( RefCell :: new ( ( { checked_5 ( 4 ) } ) ) ) ;
103+ assert ! ( ( ( * c. borrow( ) ) == 5 ) ) ;
104+ assert ! (
105+ ( ( {
106+ use_4( Flag {
107+ v: Rc :: new( RefCell :: new( 2 ) ) ,
108+ } )
109+ } ) == 2 )
110+ ) ;
111+ let u: Value < i32 > = Rc :: new ( RefCell :: new (
112+ ( {
113+ use_4 ( Flag {
114+ v : Rc :: new ( RefCell :: new ( 3 ) ) ,
115+ } )
116+ } ) ,
117+ ) ) ;
118+ assert ! ( ( ( * u. borrow( ) ) == 3 ) ) ;
119+ let ptr: Value < Ptr < i32 > > = Rc :: new ( RefCell :: new ( ( arr. as_pointer ( ) as Ptr < i32 > ) ) ) ;
120+ assert ! ( !( * ptr. borrow( ) ) . is_null( ) ) ;
65121 let p: Value < P > = Rc :: new ( RefCell :: new ( P {
66122 v : Rc :: new ( RefCell :: new ( 9 ) ) ,
67123 } ) ) ;
@@ -70,6 +126,14 @@ fn main_0() -> i32 {
70126 assert ! ( ( ( * k. borrow( ) ) == 4 ) ) ;
71127 return 0 ;
72128}
129+ pub trait FlagImpl {
130+ fn operator__Bool ( & self ) -> bool ;
131+ }
132+ impl FlagImpl for Ptr < Flag > {
133+ fn operator__Bool ( & self ) -> bool {
134+ return ( ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . v . borrow ( ) ) != 0 ) ;
135+ }
136+ }
73137pub trait PImpl {
74138 fn get ( & self ) -> i32 ;
75139}
0 commit comments