use crate::circuit::Qubit;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
#[repr(transparent)]
pub struct LogicalQubit(Qubit);
impl LogicalQubit {
#[inline]
pub const fn new(id: u32) -> Self {
Self(Qubit::new(id))
}
#[inline]
pub const fn from_qubit(qubit: Qubit) -> Self {
Self(qubit)
}
#[inline]
pub const fn qubit(self) -> Qubit {
self.0
}
#[inline]
pub const fn id(self) -> u32 {
self.0.id()
}
}
impl From<Qubit> for LogicalQubit {
fn from(qubit: Qubit) -> Self {
Self::from_qubit(qubit)
}
}
impl From<LogicalQubit> for Qubit {
fn from(qubit: LogicalQubit) -> Self {
qubit.qubit()
}
}
impl fmt::Display for LogicalQubit {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "L{}", self.id())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
#[repr(transparent)]
pub struct PhysicalQubit(Qubit);
impl PhysicalQubit {
#[inline]
pub const fn new(id: u32) -> Self {
Self(Qubit::new(id))
}
#[inline]
pub const fn from_qubit(qubit: Qubit) -> Self {
Self(qubit)
}
#[inline]
pub const fn qubit(self) -> Qubit {
self.0
}
#[inline]
pub const fn id(self) -> u32 {
self.0.id()
}
}
impl From<Qubit> for PhysicalQubit {
fn from(qubit: Qubit) -> Self {
Self::from_qubit(qubit)
}
}
impl From<PhysicalQubit> for Qubit {
fn from(qubit: PhysicalQubit) -> Self {
qubit.qubit()
}
}
impl fmt::Display for PhysicalQubit {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "P{}", self.id())
}
}