///|
fn PdfDocument::pdf_merge_copy_objects_from(
  self : PdfDocument,
  source : PdfDocument,
) -> Unit {
  for number in source.object_numbers() {
    let entry = source.objects.get_entry(number).unwrap()
    self.objects.set_entry(number, {
      data: entry.data,
      generation: entry.generation,
    })
  }
}

///|
priv struct PdfMergeNameSet {
  values : @hashmap.HashMap[Bytes, Bool]
}

///|
fn pdf_merge_name_set() -> PdfMergeNameSet {
  { values: HashMap([]), }
}

///|
fn PdfMergeNameSet::contains(
  self : PdfMergeNameSet,
  name : @core.PdfName,
) -> Bool {
  self.values.contains(name.bytes())
}

///|
fn PdfMergeNameSet::add(self : PdfMergeNameSet, name : @core.PdfName) -> Unit {
  self.values[name.bytes()] = true
}

///|
priv struct PdfMergeBytesSet {
  values : @hashmap.HashMap[Bytes, Bool]
}

///|
fn pdf_merge_bytes_set() -> PdfMergeBytesSet {
  { values: HashMap([]), }
}

///|
fn PdfMergeBytesSet::contains(
  self : PdfMergeBytesSet,
  bytes : @core.PdfBytes,
) -> Bool {
  self.values.contains(bytes)
}

///|
fn PdfMergeBytesSet::add(
  self : PdfMergeBytesSet,
  bytes : @core.PdfBytes,
) -> Unit {
  self.values[bytes] = true
}