use crate::char::Pauli;
use std::fmt::Display;
use std::hash::Hash;
pub trait PauliIter {
fn iter(&self) -> impl Iterator<Item = Pauli>;
}
pub trait PauliWordTrait: Clone + Hash + Eq + PauliIter + From<String> + Display {
fn new(nqubits: usize) -> Self;
fn n_qubits(&self) -> usize;
fn get_xbit(&self, index: usize) -> bool;
fn get_zbit(&self, index: usize) -> bool;
fn get_lbit(&self, index: usize) -> bool;
fn set_xbit(&mut self, index: usize, value: bool);
fn set_zbit(&mut self, index: usize, value: bool);
fn weight(&self) -> usize;
fn loss_weight(&self) -> usize;
fn rehash(&mut self);
fn get(&self, index: usize) -> Pauli;
fn is(&self, index: usize, pauli: Pauli) -> bool;
fn set(&mut self, index: usize, pauli: Pauli) -> &mut Self;
#[inline(always)]
fn set_new(&self, index: usize, pauli: Pauli) -> Self {
if index >= self.n_qubits() {
panic!("Index out of bounds");
}
let mut new = self.clone();
new.set(index, pauli);
new
}
#[inline(always)]
fn anticommutes_at(&self, addr0: usize, pauli: (bool, bool)) -> bool {
(self.get_xbit(addr0) & pauli.1) ^ (self.get_zbit(addr0) & pauli.0)
}
}