afsort 0.3.1

American Flag sort implementation for faster sorting of Strings.
Documentation
#![feature(test)]

extern crate afsort;
extern crate rand;
extern crate regex;
extern crate test;

use afsort::AFSortable;
use rand::Rng;
use regex::Regex;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;
use test::Bencher;

#[bench]
fn sort_en_strings_rand_10_000_std(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r".*").unwrap(), 10_000);
    b.iter(|| strings.clone().sort_unstable())
}

#[bench]
fn sort_en_strings_rand_10_000_af(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r".*").unwrap(), 10_000);
    b.iter(|| strings.clone().af_sort_unstable())
}

#[bench]
fn sort_en_strings_rand_100_000_std(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r".*").unwrap(), 100_000);
    b.iter(|| strings.clone().sort_unstable())
}

#[bench]
fn sort_en_strings_rand_100_000_af(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r".*").unwrap(), 100_000);
    b.iter(|| strings.clone().af_sort_unstable())
}

#[bench]
fn sort_en_strings_sorted_10_000_std(b: &mut Bencher) {
    let mut strings = strings_en(&Regex::new(r".*").unwrap(), 10_000);
    strings.sort_unstable();
    b.iter(|| strings.clone().sort_unstable())
}

#[bench]
fn sort_en_strings_sorted_10_000_af(b: &mut Bencher) {
    let mut strings = strings_en(&Regex::new(r".*").unwrap(), 10_000);
    strings.sort_unstable();
    b.iter(|| strings.clone().af_sort_unstable())
}

#[bench]
fn sort_en_strings_lower_10_000_std(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r"^[a-z]+$").unwrap(), 10000);
    b.iter(|| strings.clone().sort_unstable())
}

#[bench]
fn sort_en_strings_lower_10_000_af(b: &mut Bencher) {
    let strings = strings_en(&Regex::new(r"^[a-z]+$").unwrap(), 10000);
    b.iter(|| strings.clone().af_sort_unstable())
}

#[bench]
fn sort_u8_1_000_std(b: &mut Bencher) {
    let nums = rand_u8(1_000);
    b.iter(|| nums.clone().sort_unstable())
}

#[bench]
fn sort_u8_1_000_af(b: &mut Bencher) {
    let nums = rand_u8(1_000);
    b.iter(|| nums.clone().af_sort_unstable())
}

#[bench]
fn sort_u16_1_000_000_std(b: &mut Bencher) {
    let nums = rand_u16(1_000_000);
    b.iter(|| nums.clone().sort_unstable())
}

#[bench]
fn sort_u16_1_000_000_af(b: &mut Bencher) {
    let nums = rand_u16(1_000_000);
    b.iter(|| nums.clone().af_sort_unstable())
}

#[bench]
fn sort_u32_1_000_000_std(b: &mut Bencher) {
    let nums = rand_u32(1_000_000);
    b.iter(|| nums.clone().sort_unstable())
}

#[bench]
fn sort_u32_1_000_000_af(b: &mut Bencher) {
    let nums = rand_u32(1_000_000);
    b.iter(|| nums.clone().af_sort_unstable())
}

#[bench]
fn sort_u64_1_000_000_std(b: &mut Bencher) {
    let nums = rand_u64(1_000_000);
    b.iter(|| nums.clone().sort_unstable())
}

#[bench]
fn sort_u64_1_000_000_af(b: &mut Bencher) {
    let nums = rand_u64(1_000_000);
    b.iter(|| nums.clone().af_sort_unstable())
}

fn rand_u8(n: usize) -> Vec<u8> {
    let mut rng = rand::thread_rng();
    let mut v = Vec::with_capacity(n);
    for _ in 0..n {
        v.push(rng.next_u32() as u8)
    }
    v
}

fn rand_u16(n: usize) -> Vec<u16> {
    let mut rng = rand::thread_rng();
    let mut v = Vec::with_capacity(n);
    for _ in 0..n {
        v.push(rng.next_u32() as u16)
    }
    v
}

fn rand_u32(n: usize) -> Vec<u32> {
    let mut rng = rand::thread_rng();
    let mut v = Vec::with_capacity(n);
    for _ in 0..n {
        v.push(rng.next_u32())
    }
    v
}

fn rand_u64(n: usize) -> Vec<u64> {
    let mut rng = rand::thread_rng();
    let mut v = Vec::with_capacity(n);
    for _ in 0..n {
        v.push(rng.next_u64())
    }
    v
}

fn strings_en(re: &Regex, n: usize) -> Vec<String> {
    let d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    let f = File::open(d.join("test_resources/american-english.txt")).unwrap();
    let b = BufReader::new(f);
    let mut strings = b
        .lines()
        .map(|l| l.unwrap())
        .filter(|l| re.is_match(l))
        .collect::<Vec<String>>();
    let mut rng = rand::thread_rng();
    rng.shuffle(&mut strings);
    strings.into_iter().take(n).collect::<Vec<String>>()
}