use super::ark_group::{ArkG1, ArkG2};
use ark_bn254::{Bn254, G1Affine, G2Affine};
use ark_ec::pairing::Pairing;
use std::sync::{Arc, RwLock};
#[derive(Debug, Clone)]
pub struct PreparedCache {
pub g1_prepared: Vec<<Bn254 as Pairing>::G1Prepared>,
pub g2_prepared: Vec<<Bn254 as Pairing>::G2Prepared>,
}
static CACHE: RwLock<Option<Arc<PreparedCache>>> = RwLock::new(None);
pub fn init_cache(g1_vec: &[ArkG1], g2_vec: &[ArkG2]) {
{
let read_guard = CACHE.read().unwrap();
if let Some(ref cache) = *read_guard {
if cache.g1_prepared.len() >= g1_vec.len() && cache.g2_prepared.len() >= g2_vec.len() {
return; }
}
}
let mut write_guard = CACHE.write().unwrap();
if let Some(ref cache) = *write_guard {
if cache.g1_prepared.len() >= g1_vec.len() && cache.g2_prepared.len() >= g2_vec.len() {
return; }
}
let g1_prepared: Vec<<Bn254 as Pairing>::G1Prepared> = g1_vec
.iter()
.map(|g| {
let affine: G1Affine = g.0.into();
affine.into()
})
.collect();
let g2_prepared: Vec<<Bn254 as Pairing>::G2Prepared> = g2_vec
.iter()
.map(|g| {
let affine: G2Affine = g.0.into();
affine.into()
})
.collect();
*write_guard = Some(Arc::new(PreparedCache {
g1_prepared,
g2_prepared,
}));
}
pub fn get_prepared_cache() -> Option<Arc<PreparedCache>> {
CACHE.read().unwrap().clone()
}
pub fn is_cached() -> bool {
CACHE.read().unwrap().is_some()
}