@@ -66,6 +66,55 @@ impl ByteRepr for Route {
6666 }
6767 }
6868}
69+ #[ derive( Default ) ]
70+ pub struct Counter {
71+ pub v : Value < i32 > ,
72+ pub calls : Value < i32 > ,
73+ }
74+ impl std:: cmp:: PartialEq for Counter {
75+ fn eq ( & self , other : & Self ) -> bool {
76+ {
77+ CounterImpl :: operator_eq (
78+ & Rc :: new ( RefCell :: new ( Counter {
79+ v : self . v . clone ( ) ,
80+ calls : self . calls . clone ( ) ,
81+ } ) )
82+ . as_pointer ( ) ,
83+ Rc :: new ( RefCell :: new ( Counter {
84+ v : other. v . clone ( ) ,
85+ calls : other. calls . clone ( ) ,
86+ } ) )
87+ . as_pointer ( ) ,
88+ )
89+ }
90+ }
91+ }
92+ impl std:: cmp:: Eq for Counter { }
93+ impl Clone for Counter {
94+ fn clone ( & self ) -> Self {
95+ let __this: Value < Counter > = Rc :: new ( RefCell :: new ( Self {
96+ v : Rc :: new ( RefCell :: new ( ( * self . v . borrow ( ) ) ) ) ,
97+ calls : Rc :: new ( RefCell :: new ( ( * self . calls . borrow ( ) ) ) ) ,
98+ } ) ) ;
99+ let this: Ptr < Counter > = __this. as_pointer ( ) ;
100+ Rc :: try_unwrap ( __this) . ok ( ) . unwrap ( ) . into_inner ( )
101+ }
102+ }
103+ impl ByteRepr for Counter {
104+ fn byte_size ( ) -> usize {
105+ 8
106+ }
107+ fn to_bytes ( & self , buf : & mut [ u8 ] ) {
108+ ( * self . v . borrow ( ) ) . to_bytes ( & mut buf[ 0 ..4 ] ) ;
109+ ( * self . calls . borrow ( ) ) . to_bytes ( & mut buf[ 4 ..8 ] ) ;
110+ }
111+ fn from_bytes ( buf : & [ u8 ] ) -> Self {
112+ Self {
113+ v : Rc :: new ( RefCell :: new ( <i32 >:: from_bytes ( & buf[ 0 ..4 ] ) ) ) ,
114+ calls : Rc :: new ( RefCell :: new ( <i32 >:: from_bytes ( & buf[ 4 ..8 ] ) ) ) ,
115+ }
116+ }
117+ }
69118pub fn RandomRoute_0 ( route : Ptr < Route > ) -> i32 {
70119 if ( ( ( * ( * ( * route. upgrade ( ) . deref ( ) ) . path . borrow ( ) ) . first . borrow ( ) ) % 2 ) != 0 ) {
71120 return ( {
@@ -115,8 +164,41 @@ fn main_0() -> i32 {
115164 + ( * old_cost. borrow( ) ) )
116165 == 9_f64 )
117166 ) ;
167+ let c1: Value < Counter > = Rc :: new ( RefCell :: new ( Counter {
168+ v : Rc :: new ( RefCell :: new ( 3 ) ) ,
169+ calls : Rc :: new ( RefCell :: new ( 0 ) ) ,
170+ } ) ) ;
171+ let c2: Value < Counter > = Rc :: new ( RefCell :: new ( Counter {
172+ v : Rc :: new ( RefCell :: new ( 3 ) ) ,
173+ calls : Rc :: new ( RefCell :: new ( 0 ) ) ,
174+ } ) ) ;
175+ let pc: Value < Ptr < Counter > > = Rc :: new ( RefCell :: new ( ( c1. as_pointer ( ) ) ) ) ;
176+ assert ! ( ( ( { CounterImpl :: Get ( & c1. as_pointer( ) , ) } ) == 3 ) ) ;
177+ assert ! ( ( ( { CounterImpl :: Get ( & c2. as_pointer( ) , ) } ) == 3 ) ) ;
178+ assert ! ( ( ( { CounterImpl :: Get ( & ( * pc. borrow( ) ) , ) } ) == 3 ) ) ;
179+ assert ! ( ( { CounterImpl :: operator_eq( & c1. as_pointer( ) , c2. as_pointer( ) , ) } ) ) ;
180+ assert ! ( ( { CounterImpl :: operator_eq( & c2. as_pointer( ) , c1. as_pointer( ) , ) } ) ) ;
181+ assert ! ( ( ( * ( * c1. borrow( ) ) . calls. borrow( ) ) == 3 ) ) ;
182+ assert ! ( ( ( * ( * c2. borrow( ) ) . calls. borrow( ) ) == 2 ) ) ;
118183 return 0 ;
119184}
185+ pub trait CounterImpl {
186+ fn Get ( & self ) -> i32 ;
187+ fn operator_eq ( & self , o : Ptr < Counter > ) -> bool ;
188+ }
189+ impl CounterImpl for Ptr < Counter > {
190+ fn Get ( & self ) -> i32 {
191+ ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . calls . borrow_mut ( ) ) . prefix_inc ( ) ;
192+ return ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . v . borrow ( ) ) ;
193+ }
194+ fn operator_eq ( & self , o : Ptr < Counter > ) -> bool {
195+ ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . calls . borrow_mut ( ) ) . prefix_inc ( ) ;
196+ return {
197+ let _lhs = ( * ( * ( * self ) . upgrade ( ) . deref ( ) ) . v . borrow ( ) ) ;
198+ _lhs == ( * ( * o. upgrade ( ) . deref ( ) ) . v . borrow ( ) )
199+ } ;
200+ }
201+ }
120202pub trait PairImpl {
121203 fn NOP ( & self ) ;
122204 fn GetFirst ( & self ) -> i32 ;
0 commit comments