pub struct FastInput { /* private fields */ }
Expand description

Simplifies reading and parsing of known input in a speedy fashion.

Reads all data on standard in into a byte buffer. Provides methods to simplify reading and parsing of lines, specifically aimed to aid in competetive programming where the input is known and correct. Most functions panic if the input is not correct and on the specified format. Note: FastInput assumes *nix line-endings (\n).

FastInput uses interior mutability to allow for zero-copy reading and referencing of string input.

Examples

Creating a new FastInput and reading two lines:

// Input:
// Hello!
// 12 2000
use fast_input::{FastInput, FastParse};

let input = FastInput::new();
// Must make into String as next_line returns a slice to the internal buffer
// and the second input line advances the internal buffer.
let first_line = input.next_line().to_owned();
let (a, b): (u32, u32) = input.next();

println!("First line was: {}, a + b = {}", first_line, a + b);

Mixing &str with parseables:

To facilitate simple, zero-copy reading of string slices, FastInput defines the Str type. The following example reads (name, age) (&str, u8) pairs and stores them in a HashMap.

use fast_input::{FastInput, FastParse, Str};
use std::collections::HashMap;

// Input:
// Sven 12
// Lorna 22
let input = FastInput::new();
let mut map = HashMap::new();
let (sven, sven_age): (Str, u16) = input.next();
let (lorna, lorna_age): (Str, u16) = input.next();

// Deref the Str to a &str
map.insert(*sven, sven_age);
map.insert(*lorna, lorna_age);
assert_eq!(map["Sven"], 12);

Implementations

Creates a new FastInput.

Upon creation the entire contents of standard input will be read. The function will block until EOF is reached. If you are using a terminal you can send EOF using CTRL + D. The initial buffer size is 8196 bytes.

Creates a new FastInput with a specified buffer size.

For more information, see [new].

Creates a new FastInput with a given input that implements Read

Examples

Creating a FastInput over a byte slice:

use fast_input::{FastInput, FastParse};
use std::io::Read;

let data = "1 2\n3 4".as_bytes();

let input = FastInput::with_reader(data);

let (one, two) = input.next();
let (three, four) = input.next();

assert_eq!((1, 2), (one, two));
assert_eq!((3, 4), (three, four));
assert_eq!(false, input.has_next_line());

For more information, see [new].

Reads the next line and returns it.

Panics

The function panics if there is no more data in the buffer. If you are unsure if there is a next line, see [has_next_line].

Reads the next line as a single value and parses it.

Examples

Reading an integer:

//Input:
//123
use fast_input::FastInput;

let input = FastInput::new();
let number: i32 = input.next_parsed();
println!("{}", number);

Reads the next line and returns an iterator over the elements of the line.

Examples

Collecting a line into a Vec of integers.

use fast_input::FastInput;

let input = FastInput::new();
let numbers: Vec<u32> = input.next_as_iter().collect();
println!("Last line contained {} numbers!", numbers.len());
Panics

If there is no more data in the buffer. See [has_next_line].

Reads the next line and returns an iterator over the elements (no parsing).

Examples

Reading a sentence and printing the individual words:

use fast_input::FastInput;

let input = FastInput::new();
let words = input.next_split();
for (i, word) in words.enumerate() {
    println!("Word {} was: {}", i, word);
}
Panics

If there is no more data in the buffer. See [has_next_line].

Checks if there is more data available in the buffer.

Examples

Reading until EOF:

use fast_input::FastInput;

let input = FastInput::new();
while input.has_next_line() {
    println!("{}", input.next_line());
}

Returns a (consuming) iterator over all remaining lines.

Examples

Printing all lines:

use fast_input::FastInput;

let data = "First\nSecond\nThird".as_bytes();
let input = FastInput::with_reader(data);
let all_lines: Vec<_> = input.lines().collect();

assert_eq!(&all_lines, &["First", "Second", "Third"]);
assert_eq!(input.has_next_line(), false);

Trait Implementations

Returns the “default value” for a type. Read more

Reads five elements separated by a space, and returns them as a quintuple.

Panics

If there is no more data in the buffer. See [has_next_line].

Reads four elements separated by a space, and returns them as a quad-tuple.

Panics

If there is no more data in the buffer. See [has_next_line].

Reads three elements separated by a space, and returns them as a triple.

Panics

If there is no more data in the buffer. See [has_next_line].

Reads two elements separated by a space, and returns them parsed as a tuple.

Examples

Reading an i32 and a f64:

use fast_input::{FastInput, FastParse};

let input = FastInput::new();
let (age, length): (i32, f64) = input.next();
println!("{} {}", age, length);
Panics

If there is no more data in the buffer. See [has_next_line].

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

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

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.