use crate::{
messages::{Message, MessageCopyState, MessageRingBuffer},
progress::{Key, Task},
tree::Item,
};
use dashmap::DashMap;
use parking_lot::Mutex;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct Root {
pub(crate) inner: Arc<Mutex<Item>>,
}
impl Default for Root {
fn default() -> Self {
Self::new()
}
}
impl Root {
pub fn new() -> Root {
Options::default().into()
}
pub fn messages_capacity(&self) -> usize {
self.inner.lock().messages.lock().buf.capacity()
}
pub fn num_tasks(&self) -> usize {
self.inner.lock().tree.len()
}
pub fn add_child(&self, name: impl Into<String>) -> Item {
self.inner.lock().add_child(name)
}
pub fn sorted_snapshot(&self, out: &mut Vec<(Key, Task)>) {
out.clear();
out.extend(self.inner.lock().tree.iter().map(|r| (*r.key(), r.value().clone())));
out.sort_by_key(|t| t.0);
}
pub fn copy_messages(&self, out: &mut Vec<Message>) {
self.inner.lock().messages.lock().copy_all(out);
}
pub fn copy_new_messages(&self, out: &mut Vec<Message>, prev: Option<MessageCopyState>) -> MessageCopyState {
self.inner.lock().messages.lock().copy_new(out, prev)
}
pub fn deep_clone(&self) -> Root {
Root {
inner: Arc::new(Mutex::new(self.inner.lock().deep_clone())),
}
}
}
#[derive(Clone, Debug)]
pub struct Options {
pub initial_capacity: usize,
pub message_buffer_capacity: usize,
}
impl Options {
pub fn create(self) -> Root {
self.into()
}
}
impl Default for Options {
fn default() -> Self {
Options {
initial_capacity: 100,
message_buffer_capacity: 20,
}
}
}
impl From<Options> for Root {
fn from(
Options {
initial_capacity,
message_buffer_capacity,
}: Options,
) -> Self {
Root {
inner: Arc::new(Mutex::new(Item {
highest_child_id: 0,
key: Key::default(),
tree: Arc::new(DashMap::with_capacity(initial_capacity)),
messages: Arc::new(Mutex::new(MessageRingBuffer::with_capacity(message_buffer_capacity))),
})),
}
}
}
impl crate::Root for Root {
fn messages_capacity(&self) -> usize {
self.messages_capacity()
}
fn num_tasks(&self) -> usize {
self.num_tasks()
}
fn sorted_snapshot(&self, out: &mut Vec<(Key, Task)>) {
self.sorted_snapshot(out)
}
fn copy_messages(&self, out: &mut Vec<Message>) {
self.copy_messages(out)
}
fn copy_new_messages(&self, out: &mut Vec<Message>, prev: Option<MessageCopyState>) -> MessageCopyState {
self.copy_new_messages(out, prev)
}
}