msla_format 0.2.0

Library for encoding and decoding various MSLA file formats: Elegoo (.goo), Chitu Encrypted (.ctb), NanoDLP (.nanodlp).
Documentation
//! Progress tracking utilities.

use std::{
    sync::{
        Arc,
        atomic::{AtomicU64, Ordering},
    },
};

/// Tracks the progress of an operation.
///
/// The inner state is reference counted, so cloning will maintain references to the same values.
#[derive(Clone)]
pub struct Progress(Arc<ProgressInner>);

struct ProgressInner {
    complete: AtomicU64,
    total: AtomicU64,
}


impl Progress {
    pub fn new() -> Self {
        Self(Arc::new(ProgressInner {
            complete: AtomicU64::new(0),
            total: AtomicU64::new(0),
        }))
    }

    pub fn get_complete(&self) -> u64 {
        self.0.complete.load(Ordering::Relaxed)
    }

    pub fn progress(&self) -> f32 {
        let total = self.0.total.load(Ordering::Relaxed);
        if total == 0 {
            return 0.0;
        }

        self.0.complete.load(Ordering::Relaxed) as f32 / total as f32
    }

    pub fn complete(&self) -> bool {
        let total = self.0.total.load(Ordering::Relaxed);
        if total == 0 {
            return false;
        }

        self.0.complete.load(Ordering::Relaxed) >= total
    }

    pub fn set_total(&self, total: u64) {
        self.0.total.store(total, Ordering::Relaxed);
    }

    pub fn set_complete(&self, complete: u64) {
        self.0.complete.store(complete, Ordering::Relaxed);
    }

    pub fn add_complete(&self, delta: u64) {
        self.0.complete.fetch_add(delta, Ordering::Relaxed);
    }

    pub fn set_finished(&self) {
        let total = self.0.total.load(Ordering::Relaxed);
        self.0.complete.store(total, Ordering::Relaxed);
    }
}