solverforge_core/domain/
value_range.rs1pub trait ValueRangeProvider<S, V>: Send + Sync {
43 fn get_values(&self, solution: &S) -> Vec<V>;
48
49 fn value_count(&self, solution: &S) -> usize {
55 self.get_values(solution).len()
56 }
57
58 fn is_empty(&self, solution: &S) -> bool {
60 self.value_count(solution) == 0
61 }
62}
63
64pub struct FieldValueRangeProvider<S, V, F>
68where
69 F: Fn(&S) -> &Vec<V> + Send + Sync,
70{
71 getter: F,
72 _marker: std::marker::PhantomData<(fn() -> S, fn() -> V)>,
73}
74
75impl<S, V, F> FieldValueRangeProvider<S, V, F>
76where
77 F: Fn(&S) -> &Vec<V> + Send + Sync,
78{
79 pub fn new(getter: F) -> Self {
81 Self {
82 getter,
83 _marker: std::marker::PhantomData,
84 }
85 }
86}
87
88impl<S, V, F> ValueRangeProvider<S, V> for FieldValueRangeProvider<S, V, F>
89where
90 S: Send + Sync,
91 V: Clone + Send + Sync,
92 F: Fn(&S) -> &Vec<V> + Send + Sync,
93{
94 fn get_values(&self, solution: &S) -> Vec<V> {
95 (self.getter)(solution).clone()
96 }
97
98 fn value_count(&self, solution: &S) -> usize {
99 (self.getter)(solution).len()
100 }
101}
102
103pub struct ComputedValueRangeProvider<S, V, F>
108where
109 F: Fn(&S) -> Vec<V> + Send + Sync,
110{
111 compute: F,
112 _marker: std::marker::PhantomData<(fn() -> S, fn() -> V)>,
113}
114
115impl<S, V, F> ComputedValueRangeProvider<S, V, F>
116where
117 F: Fn(&S) -> Vec<V> + Send + Sync,
118{
119 pub fn new(compute: F) -> Self {
121 Self {
122 compute,
123 _marker: std::marker::PhantomData,
124 }
125 }
126
127 pub fn value_range_type() -> ValueRangeType {
130 ValueRangeType::EntityDependent
131 }
132}
133
134impl<S, V, F> ValueRangeProvider<S, V> for ComputedValueRangeProvider<S, V, F>
135where
136 S: Send + Sync,
137 V: Send + Sync,
138 F: Fn(&S) -> Vec<V> + Send + Sync,
139{
140 fn get_values(&self, solution: &S) -> Vec<V> {
141 (self.compute)(solution)
142 }
143}
144
145pub struct StaticValueRange<V> {
149 values: Vec<V>,
150}
151
152impl<V> StaticValueRange<V> {
153 pub fn new(values: Vec<V>) -> Self {
155 Self { values }
156 }
157}
158
159impl<S, V> ValueRangeProvider<S, V> for StaticValueRange<V>
160where
161 S: Send + Sync,
162 V: Clone + Send + Sync,
163{
164 fn get_values(&self, _solution: &S) -> Vec<V> {
165 self.values.clone()
166 }
167
168 fn value_count(&self, _solution: &S) -> usize {
169 self.values.len()
170 }
171}
172
173pub struct IntegerRange {
177 start: i64,
178 end: i64,
179}
180
181use super::variable::ValueRangeType;
182
183impl IntegerRange {
184 pub fn new(start: i64, end: i64) -> Self {
186 Self { start, end }
187 }
188
189 pub fn from_zero(n: i64) -> Self {
191 Self::new(0, n)
192 }
193
194 pub fn value_range_type(&self) -> ValueRangeType {
198 ValueRangeType::CountableRange {
199 from: self.start,
200 to: self.end,
201 }
202 }
203}
204
205impl<S> ValueRangeProvider<S, i64> for IntegerRange
206where
207 S: Send + Sync,
208{
209 fn get_values(&self, _solution: &S) -> Vec<i64> {
210 (self.start..self.end).collect()
211 }
212
213 fn value_count(&self, _solution: &S) -> usize {
214 let count = (self.end - self.start).max(0);
215 usize::try_from(count).expect("IntegerRange count overflows usize")
216 }
217}
218
219impl<S> ValueRangeProvider<S, i32> for IntegerRange
220where
221 S: Send + Sync,
222{
223 fn get_values(&self, _solution: &S) -> Vec<i32> {
224 let start_i32 =
225 i32::try_from(self.start).expect("IntegerRange start overflows i32 for i32 provider");
226 let end_i32 =
227 i32::try_from(self.end).expect("IntegerRange end overflows i32 for i32 provider");
228 (start_i32..end_i32).collect()
229 }
230
231 fn value_count(&self, _solution: &S) -> usize {
232 let count = (self.end - self.start).max(0);
233 usize::try_from(count).expect("IntegerRange count overflows usize")
234 }
235}