pub trait ValueRangeProvider<S, V>: Send + Sync {
fn get_values(&self, solution: &S) -> Vec<V>;
fn value_count(&self, solution: &S) -> usize {
self.get_values(solution).len()
}
fn is_empty(&self, solution: &S) -> bool {
self.value_count(solution) == 0
}
}
pub struct FieldValueRangeProvider<S, V, F>
where
F: Fn(&S) -> &Vec<V> + Send + Sync,
{
getter: F,
_marker: std::marker::PhantomData<(fn() -> S, fn() -> V)>,
}
impl<S, V, F> FieldValueRangeProvider<S, V, F>
where
F: Fn(&S) -> &Vec<V> + Send + Sync,
{
pub fn new(getter: F) -> Self {
Self {
getter,
_marker: std::marker::PhantomData,
}
}
}
impl<S, V, F> ValueRangeProvider<S, V> for FieldValueRangeProvider<S, V, F>
where
S: Send + Sync,
V: Clone + Send + Sync,
F: Fn(&S) -> &Vec<V> + Send + Sync,
{
fn get_values(&self, solution: &S) -> Vec<V> {
(self.getter)(solution).clone()
}
fn value_count(&self, solution: &S) -> usize {
(self.getter)(solution).len()
}
}
pub struct ComputedValueRangeProvider<S, V, F>
where
F: Fn(&S) -> Vec<V> + Send + Sync,
{
compute: F,
_marker: std::marker::PhantomData<(fn() -> S, fn() -> V)>,
}
impl<S, V, F> ComputedValueRangeProvider<S, V, F>
where
F: Fn(&S) -> Vec<V> + Send + Sync,
{
pub fn new(compute: F) -> Self {
Self {
compute,
_marker: std::marker::PhantomData,
}
}
pub fn value_range_type() -> ValueRangeType {
ValueRangeType::EntityDependent
}
}
impl<S, V, F> ValueRangeProvider<S, V> for ComputedValueRangeProvider<S, V, F>
where
S: Send + Sync,
V: Send + Sync,
F: Fn(&S) -> Vec<V> + Send + Sync,
{
fn get_values(&self, solution: &S) -> Vec<V> {
(self.compute)(solution)
}
}
pub struct StaticValueRange<V> {
values: Vec<V>,
}
impl<V> StaticValueRange<V> {
pub fn new(values: Vec<V>) -> Self {
Self { values }
}
}
impl<S, V> ValueRangeProvider<S, V> for StaticValueRange<V>
where
S: Send + Sync,
V: Clone + Send + Sync,
{
fn get_values(&self, _solution: &S) -> Vec<V> {
self.values.clone()
}
fn value_count(&self, _solution: &S) -> usize {
self.values.len()
}
}
pub struct IntegerRange {
start: i64,
end: i64,
}
use super::variable::ValueRangeType;
impl IntegerRange {
pub fn new(start: i64, end: i64) -> Self {
Self { start, end }
}
pub fn from_zero(n: i64) -> Self {
Self::new(0, n)
}
pub fn value_range_type(&self) -> ValueRangeType {
ValueRangeType::CountableRange {
from: self.start,
to: self.end,
}
}
}
impl<S> ValueRangeProvider<S, i64> for IntegerRange
where
S: Send + Sync,
{
fn get_values(&self, _solution: &S) -> Vec<i64> {
(self.start..self.end).collect()
}
fn value_count(&self, _solution: &S) -> usize {
let count = (self.end - self.start).max(0);
usize::try_from(count).expect("IntegerRange count overflows usize")
}
}
impl<S> ValueRangeProvider<S, i32> for IntegerRange
where
S: Send + Sync,
{
fn get_values(&self, _solution: &S) -> Vec<i32> {
let start_i32 =
i32::try_from(self.start).expect("IntegerRange start overflows i32 for i32 provider");
let end_i32 =
i32::try_from(self.end).expect("IntegerRange end overflows i32 for i32 provider");
(start_i32..end_i32).collect()
}
fn value_count(&self, _solution: &S) -> usize {
let count = (self.end - self.start).max(0);
usize::try_from(count).expect("IntegerRange count overflows usize")
}
}