# farena
File-backed arena allocator using `pread(2)` for RSS-conscious byte storage.
## Usage
```rust
use farena::{FileArena, FileArenaWriter, Location};
// Write phase
let mut writer = FileArenaWriter::new()?;
let (offset1, len1) = writer.push("hello")?;
let (offset2, len2) = writer.push(" world")?;
let file = writer.finish()?.unwrap();
// Read phase
let arena = FileArena::new(vec![file])?;
let loc1 = Location::new(0, offset1, len1);
let loc2 = Location::new(0, offset2, len2);
assert_eq!(arena.get(loc1)?, b"hello");
assert_eq!(arena.get(loc2)?, b" world");
```
### Multiple files
```rust
let mut w1 = FileArenaWriter::new()?;
let (o1, l1) = w1.push("data1")?;
let f1 = w1.finish()?.unwrap();
let mut w2 = FileArenaWriter::new()?;
let (o2, l2) = w2.push("data2")?;
let f2 = w2.finish()?.unwrap();
let arena = FileArena::new(vec![f1, f2])?;
let loc1 = Location::new(0, o1, l1); // file index 0
let loc2 = Location::new(1, o2, l2); // file index 1
```
### Buffer reuse
```rust
let mut buf = Vec::new();
arena.get_into(loc1, &mut buf)?; // appends to buf
```
## API
| `FileArenaWriter::new()` | Create writer backed by temp file |
| `writer.push(data)` | Append data, returns `(offset, len)` |
| `writer.finish()` | Flush and return file handle |
| `FileArena::new(files)` | Create arena from file handles |
| `arena.get(loc)` | Read bytes at location |
| `arena.get_into(loc, buf)` | Read bytes into buffer |