use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[repr(transparent)]
pub struct QubitId(pub u32);
impl QubitId {
#[inline]
pub const fn new(id: u32) -> Self {
Self(id)
}
#[inline]
pub const fn id(&self) -> u32 {
self.0
}
}
impl From<u32> for QubitId {
#[inline]
fn from(id: u32) -> Self {
Self(id)
}
}
impl From<QubitId> for u32 {
#[inline]
fn from(qubit: QubitId) -> Self {
qubit.0
}
}
impl From<usize> for QubitId {
#[inline]
fn from(id: usize) -> Self {
Self(id as u32)
}
}
impl From<QubitId> for usize {
#[inline]
fn from(qubit: QubitId) -> Self {
qubit.0 as Self
}
}
impl From<i32> for QubitId {
#[inline]
fn from(id: i32) -> Self {
Self(id as u32)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct QubitSet {
qubits: Vec<QubitId>,
}
impl QubitSet {
pub const fn new() -> Self {
Self { qubits: Vec::new() }
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
qubits: Vec::with_capacity(capacity),
}
}
pub fn add(&mut self, qubit: impl Into<QubitId>) {
self.qubits.push(qubit.into());
}
pub fn qubits(&self) -> &[QubitId] {
&self.qubits
}
pub fn len(&self) -> usize {
self.qubits.len()
}
pub fn is_empty(&self) -> bool {
self.qubits.is_empty()
}
}
impl Default for QubitSet {
fn default() -> Self {
Self::new()
}
}
impl From<Vec<QubitId>> for QubitSet {
fn from(qubits: Vec<QubitId>) -> Self {
Self { qubits }
}
}
impl<const N: usize> From<[QubitId; N]> for QubitSet {
fn from(qubits: [QubitId; N]) -> Self {
Self {
qubits: qubits.to_vec(),
}
}
}
impl<const N: usize> From<[u32; N]> for QubitSet {
fn from(ids: [u32; N]) -> Self {
let qubits = ids.iter().map(|&id| QubitId::new(id)).collect();
Self { qubits }
}
}