1
1
use serde:: { Serialize , Serializer , Deserialize , Deserializer } ;
2
2
use serde:: ser:: SerializeMap ;
3
- use serde_json:: Value ;
4
3
use serde:: de:: { self , Unexpected } ;
5
- use std:: rc:: Rc ;
6
- use std:: cell:: RefCell ;
7
- use std:: collections:: HashMap ;
8
4
9
5
use super :: ModelMessage ;
10
6
use crate :: input_modeling:: UniformRNG ;
@@ -13,13 +9,14 @@ use crate::utils::error::SimulationError;
13
9
/// `Model` wraps `model_type` and provides common ID functionality (a struct
14
10
/// field and associated accessor method). The simulator requires all models
15
11
/// to have an ID.
12
+ #[ derive( Clone ) ]
16
13
pub struct Model {
17
14
id : String ,
18
- inner : Rc < RefCell < dyn AsModel > > ,
15
+ inner : Box < dyn AsModel > ,
19
16
}
20
17
21
18
impl Model {
22
- pub fn new ( id : String , inner : Rc < RefCell < dyn AsModel > > ) -> Self {
19
+ pub fn new ( id : String , inner : Box < dyn AsModel > ) -> Self {
23
20
Self { id, inner }
24
21
}
25
22
@@ -28,22 +25,31 @@ impl Model {
28
25
}
29
26
}
30
27
31
- impl Clone for Model {
32
- fn clone ( & self ) -> Self {
33
- // Fix self.inner cloning
34
- Model {
35
- id : self . id . clone ( ) ,
36
- inner : self . inner . clone ( )
37
- }
28
+ pub trait ModelClone {
29
+ fn clone_box ( & self ) -> Box < dyn AsModel > ;
30
+ }
31
+
32
+ impl < T > ModelClone for T
33
+ where
34
+ T : ' static + AsModel + Clone ,
35
+ {
36
+ fn clone_box ( & self ) -> Box < dyn AsModel > {
37
+ Box :: new ( self . clone ( ) )
38
+ }
39
+ }
40
+
41
+ impl Clone for Box < dyn AsModel > {
42
+ fn clone ( & self ) -> Box < dyn AsModel > {
43
+ self . clone_box ( )
38
44
}
39
45
}
40
46
41
47
impl Serialize for Model {
42
48
fn serialize < S : Serializer > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error > {
43
- let extra_fields: serde_json:: Value = self . inner . borrow ( ) . serialize ( ) ;
49
+ let extra_fields: serde_json:: Value = self . inner . serialize ( ) ;
44
50
let mut model = serializer. serialize_map ( None ) ?;
45
51
model. serialize_entry ( "id" , & self . id ) ?;
46
- model. serialize_entry ( "type" , self . inner . borrow ( ) . get_type ( ) ) ?;
52
+ model. serialize_entry ( "type" , self . inner . get_type ( ) ) ?;
47
53
if let serde_json:: Value :: Object ( map) = extra_fields {
48
54
for ( key, value) in map. iter ( ) {
49
55
model. serialize_entry ( & key, & value) ?;
@@ -63,10 +69,11 @@ impl<'de> Deserialize<'de> for Model {
63
69
match & model_extra. model_type [ ..] {
64
70
"Generator" => {
65
71
if let Ok ( generator) = serde_json:: from_value :: < super :: Generator > ( model_extra. extra ) {
66
- Ok ( Model :: new (
72
+ let model = Model :: new (
67
73
model_extra. id ,
68
- Rc :: new ( RefCell :: new ( generator) )
69
- ) )
74
+ Box :: new ( generator)
75
+ ) ;
76
+ Ok ( model)
70
77
} else {
71
78
Err ( de:: Error :: invalid_value ( Unexpected :: Other ( "Generator" ) , & "Generator" ) )
72
79
}
@@ -75,7 +82,7 @@ impl<'de> Deserialize<'de> for Model {
75
82
if let Ok ( exclusive_gateway) = serde_json:: from_value :: < super :: ExclusiveGateway > ( model_extra. extra ) {
76
83
Ok ( Model :: new (
77
84
model_extra. id ,
78
- Rc :: new ( RefCell :: new ( exclusive_gateway) )
85
+ Box :: new ( exclusive_gateway)
79
86
) )
80
87
} else {
81
88
Err ( de:: Error :: invalid_value ( Unexpected :: Other ( "ExclusiveGateway" ) , & "ExclusiveGateway" ) )
@@ -85,7 +92,7 @@ impl<'de> Deserialize<'de> for Model {
85
92
if let Ok ( processor) = serde_json:: from_value :: < super :: Processor > ( model_extra. extra ) {
86
93
Ok ( Model :: new (
87
94
model_extra. id ,
88
- Rc :: new ( RefCell :: new ( processor) )
95
+ Box :: new ( processor)
89
96
) )
90
97
} else {
91
98
Err ( de:: Error :: invalid_value ( Unexpected :: Other ( "Processor" ) , & "Processor" ) )
@@ -95,7 +102,7 @@ impl<'de> Deserialize<'de> for Model {
95
102
if let Ok ( storage) = serde_json:: from_value :: < super :: Storage > ( model_extra. extra ) {
96
103
Ok ( Model :: new (
97
104
model_extra. id ,
98
- Rc :: new ( RefCell :: new ( storage) )
105
+ Box :: new ( storage)
99
106
) )
100
107
} else {
101
108
Err ( de:: Error :: invalid_value ( Unexpected :: Other ( "Storage" ) , & "Storage" ) )
@@ -110,30 +117,30 @@ impl<'de> Deserialize<'de> for Model {
110
117
111
118
impl AsModel for Model {
112
119
fn status ( & self ) -> String {
113
- self . inner . borrow ( ) . status ( )
120
+ self . inner . status ( )
114
121
}
115
122
116
123
fn events_ext (
117
124
& mut self ,
118
125
uniform_rng : & mut UniformRNG ,
119
126
incoming_message : ModelMessage ,
120
127
) -> Result < Vec < ModelMessage > , SimulationError > {
121
- self . inner . borrow_mut ( ) . events_ext ( uniform_rng, incoming_message)
128
+ self . inner . events_ext ( uniform_rng, incoming_message)
122
129
}
123
130
124
131
fn events_int (
125
132
& mut self ,
126
133
uniform_rng : & mut UniformRNG ,
127
134
) -> Result < Vec < ModelMessage > , SimulationError > {
128
- self . inner . borrow_mut ( ) . events_int ( uniform_rng)
135
+ self . inner . events_int ( uniform_rng)
129
136
}
130
137
131
138
fn time_advance ( & mut self , time_delta : f64 ) {
132
- self . inner . borrow_mut ( ) . time_advance ( time_delta)
139
+ self . inner . time_advance ( time_delta)
133
140
}
134
141
135
142
fn until_next_event ( & self ) -> f64 {
136
- self . inner . borrow_mut ( ) . until_next_event ( )
143
+ self . inner . until_next_event ( )
137
144
}
138
145
}
139
146
@@ -143,7 +150,7 @@ impl AsModel for Model {
143
150
/// `time_advance`, and `until_next_event`. The additional `status` is for
144
151
/// facilitation of simulation reasoning, reporting, and debugging.
145
152
// #[enum_dispatch]
146
- pub trait AsModel {
153
+ pub trait AsModel : ModelClone {
147
154
fn get_type ( & self ) -> & ' static str {
148
155
""
149
156
}
0 commit comments