#![warn(missing_docs)]
#[cfg(all(test, feature = "cgc-gen"))]
#[global_allocator]
static TEST_ALLOCATOR: audit_alloc::TrackingAllocator = audit_alloc::TrackingAllocator;
#[cfg(all(test, feature = "cgc-gen"))]
mod audit_alloc {
use std::alloc::{GlobalAlloc, Layout, System};
use std::sync::atomic::{AtomicUsize, Ordering};
static LIVE: AtomicUsize = AtomicUsize::new(0);
static PEAK: AtomicUsize = AtomicUsize::new(0);
static ALLOC_CALLS: AtomicUsize = AtomicUsize::new(0);
static ALLOC_BYTES: AtomicUsize = AtomicUsize::new(0);
pub(crate) struct TrackingAllocator;
unsafe impl GlobalAlloc for TrackingAllocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let ptr = unsafe { System.alloc(layout) };
if !ptr.is_null() {
ALLOC_CALLS.fetch_add(1, Ordering::Relaxed);
ALLOC_BYTES.fetch_add(layout.size(), Ordering::Relaxed);
let live = LIVE.fetch_add(layout.size(), Ordering::Relaxed) + layout.size();
PEAK.fetch_max(live, Ordering::Relaxed);
}
ptr
}
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
let ptr = unsafe { System.alloc_zeroed(layout) };
if !ptr.is_null() {
ALLOC_CALLS.fetch_add(1, Ordering::Relaxed);
ALLOC_BYTES.fetch_add(layout.size(), Ordering::Relaxed);
let live = LIVE.fetch_add(layout.size(), Ordering::Relaxed) + layout.size();
PEAK.fetch_max(live, Ordering::Relaxed);
}
ptr
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
unsafe { System.dealloc(ptr, layout) };
LIVE.fetch_sub(layout.size(), Ordering::Relaxed);
}
unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, size: usize) -> *mut u8 {
let new = unsafe { System.realloc(ptr, layout, size) };
if !new.is_null() {
if size >= layout.size() {
let delta = size - layout.size();
ALLOC_CALLS.fetch_add(1, Ordering::Relaxed);
ALLOC_BYTES.fetch_add(delta, Ordering::Relaxed);
let live = LIVE.fetch_add(delta, Ordering::Relaxed) + delta;
PEAK.fetch_max(live, Ordering::Relaxed);
} else {
LIVE.fetch_sub(layout.size() - size, Ordering::Relaxed);
}
}
new
}
}
pub(crate) fn snapshot() -> (usize, usize) {
(LIVE.load(Ordering::Relaxed), PEAK.load(Ordering::Relaxed))
}
pub(crate) fn reset_peak_to_live() {
PEAK.store(LIVE.load(Ordering::Relaxed), Ordering::Relaxed);
}
pub(crate) fn allocation_totals() -> (usize, usize) {
(
ALLOC_CALLS.load(Ordering::Relaxed),
ALLOC_BYTES.load(Ordering::Relaxed),
)
}
}
pub mod cache;
mod exact;
mod primefactor;
#[cfg(all(test, feature = "cgc-gen"))]
mod cache_audit;
#[cfg(all(test, feature = "cgc-gen"))]
mod cache_budget_pressure;
#[cfg(all(test, feature = "cgc-gen"))]
mod cache_trim_pressure;
pub mod su2;
#[cfg(feature = "cgc-gen")]
pub mod sun;
#[cfg(feature = "cgc-gen")]
pub mod bcd;
#[cfg(feature = "cgc-gen")]
mod frcore;
pub use exact::SignedSqrtRational;
pub use su2::{
canonical_regge_3j, canonical_regge_6j, clebsch_gordan, clebsch_gordan_checked,
su2_authority_fingerprint, su2_f_symbol, su2_f_symbol_checked, su2_frobenius_schur,
su2_r_symbol, su2_r_symbol_checked, wigner_3j, wigner_3j_checked, wigner_6j, wigner_6j_checked,
AdmissibilityViolation, Regge3j, Regge6j, ReggeError, ReggePhase, Su2Error, Su2Fusion,
Su2Irrep,
};