1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use std::sync::Arc;
use must_future::MustBoxFuture;
use crate::{
arq::ArqBoundsSet,
hash::AgentKey,
op::*,
region::*,
region_set::*,
spacetime::{GossipParams, TelescopingTimes, TimeQuantum, Topology},
test_utils::OpData,
Arq,
};
pub trait AccessOpStore<O: OpRegion<D>, D: RegionDataConstraints = RegionData>: Send {
fn query_op_data(&self, region: &RegionCoords) -> Vec<Arc<O>>;
fn query_region_data(&self, region: &RegionCoords) -> D;
fn fetch_region_set(
&self,
coords: RegionCoordSetLtcs,
) -> MustBoxFuture<Result<RegionSetLtcs<D>, ()>>;
fn integrate_ops<Ops: Clone + Iterator<Item = Arc<O>>>(&mut self, ops: Ops);
fn integrate_op(&mut self, op: Arc<O>) {
self.integrate_ops([op].into_iter())
}
fn gossip_params(&self) -> GossipParams;
fn topo(&self) -> &Topology;
fn region_set(&self, arq_set: ArqBoundsSet, now: TimeQuantum) -> RegionSet<D> {
let coords = RegionCoordSetLtcs::new(TelescopingTimes::new(now), arq_set);
coords
.into_region_set_infallible(|(_, coords)| self.query_region_data(&coords))
.into()
}
}
pub trait AccessPeerStore {
fn get_agent_arq(&self, agent: &AgentKey) -> Arq;
fn get_arq_set(&self) -> ArqBoundsSet;
}
pub trait HostAccess<O: OpRegion<D>, D: RegionDataConstraints = RegionData>:
AccessOpStore<O, D> + AccessPeerStore
{
}
impl<T, O: OpRegion<D>, D: RegionDataConstraints> HostAccess<O, D> for T where
T: AccessOpStore<O, D> + AccessPeerStore
{
}
pub trait HostAccessTest: HostAccess<OpData, RegionData> {}
impl<T> HostAccessTest for T where T: HostAccess<OpData, RegionData> {}