///|
fn pdf_classic_plain_xref_should_load(
  xref : @reader.PdfClassicXRefEntry,
  xref_stream_ref_set : @reader.PdfReaderXRefStreamRefSet,
) -> Bool {
  xref.in_use &&
  xref.object_number != 0 &&
  xref.object_stream is None &&
  !xref_stream_ref_set.contains(xref.object_number, xref.offset)
}

///|
fn PdfDocument::load_classic_plain_xref_objects(
  self : PdfDocument,
  cursor : @core.ByteCursor,
  xrefs : ArrayView[@reader.PdfClassicXRefEntry],
  xref_stream_refs : ArrayView[(Int, Int)],
) -> Unit raise @core.PdfError {
  let xref_stream_ref_set = @reader.pdf_reader_xref_stream_ref_set(
    xref_stream_refs,
  )
  let xref_index = @reader.pdf_classic_xref_index(xrefs)
  for xref in xrefs {
    if pdf_classic_plain_xref_should_load(xref, xref_stream_ref_set) {
      cursor.seek_absolute(xref.offset)
      let parsed = pdf_cursor_read_first_indirect_object_at_current(
        cursor,
        xrefs,
        xref_index=Some(xref_index),
      )
      if parsed.number != xref.object_number ||
        parsed.generation != xref.generation {
        raise XRefEntryExpected
      }
      self.load_object_given_number(
        parsed.number,
        parsed.object,
        generation=parsed.generation,
      )
    }
  }
}

///|
fn PdfDocument::load_classic_object_stream_entries(
  self : PdfDocument,
  xrefs : ArrayView[@reader.PdfClassicXRefEntry],
  user_password : BytesView?,
  owner_password : BytesView?,
) -> Unit raise @core.PdfError {
  for group in @reader.pdf_reader_object_stream_groups(xrefs) {
    let object_stream_number = group.0
    let (context, already_decrypted) = self.read_object_stream_context_with_passwords(
      object_stream_number, user_password, owner_password,
    )
    self.load_embedded_objects_from_context(
      group.1,
      object_stream_number,
      context,
      already_decrypted,
    )
  }
}

///|
fn PdfDocument::load_classic_xrefs(
  self : PdfDocument,
  cursor : @core.ByteCursor,
  xrefs : ArrayView[@reader.PdfClassicXRefEntry],
  xref_stream_refs : ArrayView[(Int, Int)],
  user_password : BytesView?,
  owner_password : BytesView?,
) -> Unit raise @core.PdfError {
  self.load_classic_plain_xref_objects(cursor, xrefs, xref_stream_refs)
  self.load_classic_object_stream_entries(xrefs, user_password, owner_password)
  self.sanitize_reader_trailer()
}