remainder/
circuit_building_context.rs

1//! For assigning ids to nodes and various sorts of layers.
2
3use once_cell::sync::Lazy;
4use std::sync::atomic::{AtomicUsize, Ordering};
5
6/// [CircuitBuildingContext] keeps track of the ids of the nodes and layers that are created.
7/// Contains a consistently incrementing counters to prevent id collisions.
8#[derive(Debug, Default)]
9pub struct CircuitBuildingContext {
10    node_id: AtomicUsize,
11    input_layer_id: AtomicUsize,
12    layer_id: AtomicUsize,
13    fiat_shamir_challenge_layer_id: AtomicUsize,
14}
15
16static CONTEXT: Lazy<CircuitBuildingContext> = Lazy::new(|| CircuitBuildingContext {
17    node_id: AtomicUsize::new(0),
18    input_layer_id: AtomicUsize::new(0),
19    layer_id: AtomicUsize::new(0),
20    fiat_shamir_challenge_layer_id: AtomicUsize::new(0),
21});
22
23impl CircuitBuildingContext {
24    /// Retrieves a new node id that is guaranteed to be unique.
25    pub fn next_node_id() -> usize {
26        CONTEXT.node_id.fetch_add(1, Ordering::Relaxed)
27    }
28
29    /// Retrieves a new input layer id that is guaranteed to be unique.
30    pub fn next_input_layer_id() -> usize {
31        CONTEXT.input_layer_id.fetch_add(1, Ordering::Relaxed)
32    }
33
34    /// Retrieves a new layer id that is guaranteed to be unique.
35    pub fn next_layer_id() -> usize {
36        CONTEXT.layer_id.fetch_add(1, Ordering::Relaxed)
37    }
38
39    /// Retrieves a new fiat shamir challenge layer id that is guaranteed to be unique.
40    pub fn next_fiat_shamir_challenge_layer_id() -> usize {
41        CONTEXT
42            .fiat_shamir_challenge_layer_id
43            .fetch_add(1, Ordering::Relaxed)
44    }
45}