use std::{
io::{Error, Write},
marker::PhantomData,
};
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct ObjId<T = ()> {
id: u64,
_marker: PhantomData<T>,
}
impl<T> Clone for ObjId<T> {
fn clone(&self) -> Self {
Self {
id: self.id,
_marker: PhantomData,
}
}
}
impl<T> ObjId<T> {
const START_OBJ_MARKER: &[u8] = b"obj";
pub fn write_ref(&self, writer: &mut dyn Write) -> Result<usize, Error> {
Ok(pdfgen_macros::write_chain! {
crate::write_fmt!(&mut *writer, "{}", self.id),
writer.write(b" 0 R"),
})
}
pub fn write_def(&self, writer: &mut dyn Write) -> Result<usize, Error> {
Ok(pdfgen_macros::write_chain! {
crate::write_fmt!(&mut *writer, "{}", self.id),
writer.write(b" 0 "),
writer.write(Self::START_OBJ_MARKER),
})
}
pub(crate) fn cast<U>(self) -> ObjId<U> {
ObjId {
id: self.id,
_marker: PhantomData,
}
}
}
pub(crate) struct IdManager {
curr: u64,
}
impl IdManager {
pub(crate) fn new() -> Self {
Self { curr: 1 }
}
pub(in crate::document) fn clone(&self) -> Self {
Self { curr: self.curr }
}
pub fn create_id<T>(&mut self) -> ObjId<T> {
let inner_id = self.curr;
self.curr += 1;
ObjId {
id: inner_id,
_marker: PhantomData,
}
}
}