use crate::monomap::{MonoReadHandle, MonoWriteHandle};
use pointcloud::*;
use super::node::*;
use crate::tree_file_format::*;
use crate::*;
use std::iter::FromIterator;
pub struct CoverLayerReader<D: PointCloud> {
scale_index: i32,
node_reader: MonoReadHandle<usize, CoverNode<D>>,
}
impl<D: PointCloud> Clone for CoverLayerReader<D> {
fn clone(&self) -> CoverLayerReader<D> {
CoverLayerReader {
scale_index: self.scale_index,
node_reader: self.node_reader.clone(),
}
}
}
impl<D: PointCloud> CoverLayerReader<D> {
pub fn get_node_and<F, T>(&self, pi: usize, f: F) -> Option<T>
where
F: FnOnce(&CoverNode<D>) -> T,
{
self.node_reader.get_and(&pi, |n| f(n))
}
pub fn get_node_plugin_and<T: Send + Sync + 'static, F, S>(
&self,
center_index: usize,
transform_fn: F,
) -> Option<S>
where
F: FnOnce(&T) -> S,
{
self.get_node_and(center_index, |n| n.get_plugin_and(transform_fn))
.flatten()
}
pub fn for_each_node<F>(&self, f: F)
where
F: FnMut(&usize, &CoverNode<D>),
{
self.node_reader.for_each(f)
}
pub fn map_nodes<Map, Target, Collector>(&self, f: Map) -> Collector
where
Map: FnMut(&usize, &CoverNode<D>) -> Target,
Collector: FromIterator<Target>,
{
self.node_reader.map_into(f)
}
pub fn get_node_children_and<F, T>(&self, pi: usize, f: F) -> Option<T>
where
F: FnOnce(NodeAddress, &[NodeAddress]) -> T,
{
self.node_reader
.get_and(&pi, |n| n.children().map(|(si, c)| f((si, pi), c)))
.flatten()
}
pub fn node_center_indexes(&self) -> Vec<usize> {
self.node_reader.map_into(|pi, _| *pi)
}
pub fn len(&self) -> usize {
self.node_reader.len()
}
pub fn is_empty(&self) -> bool {
self.node_reader.is_empty()
}
pub fn scale_index(&self) -> i32 {
self.scale_index
}
pub fn reader(&self) -> CoverLayerReader<D> {
CoverLayerReader {
scale_index: self.scale_index,
node_reader: self.node_reader.factory().handle(),
}
}
}
pub struct CoverLayerWriter<D: PointCloud> {
scale_index: i32,
node_writer: MonoWriteHandle<usize, CoverNode<D>>,
}
impl<D: PointCloud> CoverLayerWriter<D> {
pub(crate) fn reader(&self) -> CoverLayerReader<D> {
CoverLayerReader {
scale_index: self.scale_index,
node_reader: self.node_writer.factory().handle(),
}
}
pub(crate) fn new(scale_index: i32) -> CoverLayerWriter<D> {
let (_node_reader, node_writer) = monomap::new();
CoverLayerWriter {
scale_index,
node_writer,
}
}
pub(crate) unsafe fn update_node<F>(&mut self, pi: usize, update_fn: F)
where
F: Fn(&mut CoverNode<D>) + 'static + Send + Sync,
{
self.node_writer.update(pi, update_fn);
}
pub(crate) fn load(layer_proto: &LayerProto) -> CoverLayerWriter<D> {
let scale_index = layer_proto.get_scale_index();
let (_node_reader, mut node_writer) = monomap::new();
for node_proto in layer_proto.get_nodes() {
let index = node_proto.get_center_index() as usize;
let node = CoverNode::load(node_proto);
node_writer.insert(index, node);
}
node_writer.refresh();
node_writer.refresh();
CoverLayerWriter {
scale_index,
node_writer,
}
}
pub(crate) fn scale_index(&self) -> i32 {
self.scale_index
}
pub(crate) fn save(&self) -> LayerProto {
let mut layer_proto = LayerProto::new();
let mut node_protos = layer_proto.take_nodes();
self.node_writer.for_each(|_pi, node| {
node_protos.push(node.save());
});
layer_proto.set_nodes(node_protos);
layer_proto.set_scale_index(self.scale_index);
layer_proto
}
pub(crate) fn insert_raw(&mut self, index: usize, node: CoverNode<D>) {
self.node_writer.insert(index, node);
}
pub(crate) fn refresh(&mut self) {
self.node_writer.refresh();
}
}