spartan 0.8.0

High-speed zkSNARKs without trusted setup
Documentation
#[cfg(feature = "profile")]
use colored::Colorize;
#[cfg(feature = "profile")]
use core::sync::atomic::AtomicUsize;
#[cfg(feature = "profile")]
use core::sync::atomic::Ordering;
#[cfg(feature = "profile")]
use std::time::Instant;

#[cfg(feature = "profile")]
pub static CALL_DEPTH: AtomicUsize = AtomicUsize::new(0);

#[cfg(feature = "profile")]
pub struct Timer {
  label: String,
  timer: Instant,
}

#[cfg(feature = "profile")]
impl Timer {
  #[inline(always)]
  pub fn new(label: &str) -> Self {
    let timer = Instant::now();
    CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
    let star = "* ";
    println!(
      "{:indent$}{}{}",
      "",
      star,
      label.yellow().bold(),
      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
    );
    Self {
      label: label.to_string(),
      timer,
    }
  }

  #[inline(always)]
  pub fn stop(&self) {
    let duration = self.timer.elapsed();
    let star = "* ";
    println!(
      "{:indent$}{}{} {:?}",
      "",
      star,
      self.label.blue().bold(),
      duration,
      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
    );
    CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
  }

  #[inline(always)]
  pub fn print(msg: &str) {
    CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
    let star = "* ";
    println!(
      "{:indent$}{}{}",
      "",
      star,
      msg.to_string().green().bold(),
      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
    );
    CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
  }
}

#[cfg(not(feature = "profile"))]
pub struct Timer {
  _label: String,
}

#[cfg(not(feature = "profile"))]
impl Timer {
  #[inline(always)]
  pub fn new(label: &str) -> Self {
    Self {
      _label: label.to_string(),
    }
  }

  #[inline(always)]
  pub fn stop(&self) {}

  #[inline(always)]
  pub fn print(_msg: &str) {}
}