Skip to main content

ParallelArchive

Struct ParallelArchive 

Source
pub struct ParallelArchive { /* private fields */ }
Expand description

A thread-safe wrapper around an MPQ archive for parallel operations

ParallelArchive enables concurrent reads from a single MPQ archive by giving each thread its own file handle. This avoids seek conflicts that would occur with a shared file handle.

§Examples

use wow_mpq::single_archive_parallel::ParallelArchive;

let archive = ParallelArchive::open("data.mpq")?;

// Extract multiple files in parallel
let files = vec!["file1.txt", "file2.txt", "file3.txt"];
let results = archive.extract_files_parallel(&files)?;

for (filename, data) in results {
    println!("{}: {} bytes", filename, data.len());
}

Implementations§

Source§

impl ParallelArchive

Source

pub fn open<P: AsRef<Path>>(path: P) -> Result<Self>

Open an MPQ archive for parallel processing

This caches the file list upfront to enable efficient parallel operations.

Source

pub fn extract_files_parallel( &self, filenames: &[&str], ) -> Result<Vec<(String, Vec<u8>)>>

Extract multiple files from the archive in parallel

Each file is extracted in a separate thread with its own file handle. This allows true parallel I/O without seek conflicts.

§Returns

A vector of (filename, data) tuples in the same order as the input

Source

pub fn extract_matching_parallel<F>( &self, predicate: F, ) -> Result<Vec<(String, Vec<u8>)>>
where F: Fn(&str) -> bool + Sync,

Extract files matching a predicate in parallel

This method lists all files in the archive and extracts those that match the given predicate function.

Source

pub fn process_files_parallel<F, T>( &self, filenames: &[&str], processor: F, ) -> Result<Vec<T>>
where F: Fn(&str, Vec<u8>) -> Result<T> + Sync, T: Send,

Process files in parallel with a custom function

This is the most flexible method, allowing custom processing of each file.

Source

pub fn read_file_with_new_handle(&self, filename: &str) -> Result<Vec<u8>>

Read a file using a new file handle

This is the core method that enables parallel reads. Each call opens a new file handle, avoiding conflicts with other threads.

Source

pub fn list_files(&self) -> &[String]

Get the cached file list

Source

pub fn thread_count(&self) -> usize

Get the number of worker threads that will be used

Source

pub fn extract_files_batched( &self, filenames: &[&str], batch_size: usize, ) -> Result<Vec<(String, Vec<u8>)>>

Extract files in batches for better performance with many small files

When extracting many small files, the overhead of opening file handles can dominate. This method processes files in batches per thread.

Trait Implementations§

Source§

impl Debug for ParallelArchive

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V