pdftract/notes/pdftract-1uhee.md
jedarden db92403bd5
Some checks are pending
Schema Generation Validation / Validate JSON Schema (push) Waiting to run
Schema Generation Validation / Validate JSON Syntax (push) Waiting to run
chore(pdftract-36glh): remove unused JpxDecoder import and add verification note
- Remove unused jpx::JpxDecoder import from stream.rs (code uses fully qualified paths)
- Add notes/pdftract-36glh.md with acceptance criteria verification

The JPXDecode passthrough implementation was already complete in commit 4ba4687.
This change is minor cleanup only.

References: pdftract-36glh
2026-05-28 05:23:13 -04:00

56 lines
2.2 KiB
Markdown

# pdftract-1uhee: MmapSource Implementation
## Summary
The MmapSource implementation was already complete in `crates/pdftract-core/src/source/mmap.rs`. This task verified the implementation and fixed two incorrect test assertions.
## Changes Made
### Test Fixes (commit: ba5d101)
1. **test_open_valid_file**: Fixed assertion from 20 to 22 bytes
- The byte string `b"%PDF-1.4\ntest content\n"` is 22 bytes
- `%PDF-1.4` (8) + `\n` (1) + `test content` (12) + `\n` (1) = 22
2. **test_seek_from_end**: Fixed expected result from `b"el"` to `b"lo"`
- Content: `b"Hello"` (indices 0='H', 1='e', 2='l', 3='l', 4='o')
- `SeekFrom::End(-2)` puts position at index 3
- Reading 2 bytes from position 3 gives `b"lo"`
## Acceptance Criteria Status
| Criterion | Status | Test |
|-----------|--------|------|
| MmapSource::open(/path/to/file.pdf) returns Ok for valid file | PASS | test_open_valid_file |
| MmapSource::open(/nonexistent) returns Err | PASS | test_open_nonexistent_file |
| read_range(0, 10) returns first 10 bytes | PASS | test_read_range |
| read_range past EOF returns Err | PASS | test_read_range_past_eof |
| len() matches file size | PASS | test_len_matches_file_size |
| Read+Seek trait usage works | PASS | test_read_trait, test_seek_trait |
| Send + Sync: can send across threads | PASS | test_send_sync, test_sync_multiple_threads |
| MADV_SEQUENTIAL compiles and runs | PASS | test_advise_sequential, test_prefetch |
## Implementation Details (Already Complete)
### MmapSource Structure
```rust
pub struct MmapSource {
mmap: Mmap,
cursor: Cursor<u64>,
}
```
### Key Methods
- `open(path)`: Creates memory-mapped file using `memmap2::MmapOptions`
- `read_range(offset, length)`: Zero-copy read via `Bytes::copy_from_slice`
- `advise_sequential(offset, length)`: Applies `MADV_SEQUENTIAL` for content streams
- `prefetch(offset, length)`: Wrapper for `advise_sequential`
### Thread Safety
- `unsafe impl Send for MmapSource`
- `unsafe impl Sync for MmapSource`
- Verified by `test_send_sync` and `test_sync_multiple_threads`
### Files
- Implementation: `crates/pdftract-core/src/source/mmap.rs` (460 lines)
- Module: `crates/pdftract-core/src/source/mod.rs` (exports MmapSource)