Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,11 @@ Feature selection can be overridden with the `FASTPFOR_SIMD_MODE` environment va
### Using C++ Wrapper

```rust
use fastpfor::{AnyLenCodec as _, cpp};
use fastpfor::AnyLenCodec as _;
use fastpfor::cpp::CppSimdFastPFor128;

fn main() {
let mut codec = cpp::SimdFastPFor128Codec::new();
let mut codec = CppSimdFastPFor128::new();

let input = vec![1u32, 2, 3, 4, 5];
let mut compressed = Vec::new();
Expand Down
8 changes: 4 additions & 4 deletions benches/bench_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use std::num::NonZeroU32;
#[cfg(feature = "cpp")]
use fastpfor::AnyLenCodec as _;
#[cfg(feature = "cpp")]
use fastpfor::cpp;
use fastpfor::cpp::CppFastPFor128;
Comment thread
nyurik marked this conversation as resolved.
pub use fastpfor::rust::{BLOCK_SIZE_128, BLOCK_SIZE_256, DEFAULT_PAGE_SIZE, FastPFOR, Integer};
use rand::rngs::StdRng;
use rand::{RngExt as _, SeedableRng};
Expand Down Expand Up @@ -171,15 +171,15 @@ fn prepare_compressed_data(data: &[u32], block_size: NonZeroU32) -> Vec<u32> {
// ---------------------------------------------------------------------------

#[cfg(feature = "cpp")]
pub fn cpp_encode(codec: &mut cpp::FastPFor128Codec, data: &[u32]) -> Vec<u32> {
pub fn cpp_encode(codec: &mut CppFastPFor128, data: &[u32]) -> Vec<u32> {
let mut out = Vec::new();
codec.encode(data, &mut out).unwrap();
out
}

#[cfg(feature = "cpp")]
pub fn cpp_decode(
codec: &mut cpp::FastPFor128Codec,
codec: &mut CppFastPFor128,
compressed: &[u32],
decompressed: &mut [u32],
) -> usize {
Expand Down Expand Up @@ -275,7 +275,7 @@ pub struct CppDecodeFixture {
impl CppDecodeFixture {
fn new(name: &'static str, generator: DataGeneratorFn, size: usize) -> Self {
let data = generator(size);
let mut codec = cpp::FastPFor128Codec::new();
let mut codec = CppFastPFor128::new();
let cpp_compressed = cpp_encode(&mut codec, &data);
let rust_compressed = prepare_compressed_data(&data, BLOCK_SIZE_128);
Self {
Expand Down
6 changes: 3 additions & 3 deletions benches/fastpfor_benchmark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use bench_utils::{
#[cfg(feature = "cpp")]
use bench_utils::{cpp_decode, cpp_decode_fixtures, cpp_encode};
#[cfg(feature = "cpp")]
use fastpfor::cpp;
use fastpfor::cpp::CppFastPFor128;
Comment thread
nyurik marked this conversation as resolved.

const SIZES: &[usize] = &[1024, 4096];

Expand Down Expand Up @@ -153,7 +153,7 @@ fn benchmark_cpp_vs_rust(c: &mut Criterion) {
BenchmarkId::new(format!("cpp/{}", fix.name), size),
&fix.data,
|b, data| {
let mut codec = cpp::FastPFor128Codec::new();
let mut codec = CppFastPFor128::new();
b.iter(|| black_box(cpp_encode(&mut codec, black_box(data))));
},
);
Expand All @@ -175,7 +175,7 @@ fn benchmark_cpp_vs_rust(c: &mut Criterion) {
BenchmarkId::new(format!("cpp/{}", fix.name), size),
&fix.cpp_compressed,
|b, compressed| {
let mut codec = cpp::FastPFor128Codec::new();
let mut codec = CppFastPFor128::new();
let mut out = vec![0u32; fix.original_len];
b.iter(|| black_box(cpp_decode(&mut codec, black_box(compressed), &mut out)));
},
Expand Down
73 changes: 36 additions & 37 deletions fuzz/fuzz_targets/common.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use fastpfor::{AnyLenCodec, cpp, rust};
use fastpfor::cpp::*;
use fastpfor::{AnyLenCodec, rust};

pub type BoxedCppCodec = Box<dyn AnyLenCodec>;

Expand Down Expand Up @@ -78,42 +79,40 @@ pub enum CppCodec {
impl From<CppCodec> for BoxedCppCodec {
fn from(codec: CppCodec) -> Self {
match codec {
CppCodec::BP32 => Box::new(cpp::BP32Codec::default()),
CppCodec::Copy => Box::new(cpp::CopyCodec::default()),
CppCodec::FastBinaryPacking8 => Box::new(cpp::FastBinaryPacking8Codec::default()),
CppCodec::FastPFor128 => Box::new(cpp::FastPFor128Codec::default()),
CppCodec::FastPFor256 => Box::new(cpp::FastPFor256Codec::default()),
CppCodec::FastBinaryPacking16 => Box::new(cpp::FastBinaryPacking16Codec::default()),
CppCodec::FastBinaryPacking32 => Box::new(cpp::FastBinaryPacking32Codec::default()),
CppCodec::MaskedVByte => Box::new(cpp::MaskedVByteCodec::default()),
CppCodec::NewPFor => Box::new(cpp::NewPForCodec::default()),
CppCodec::OptPFor => Box::new(cpp::OptPForCodec::default()),
CppCodec::PFor2008 => Box::new(cpp::PFor2008Codec::default()),
CppCodec::PFor => Box::new(cpp::PForCodec::default()),
CppCodec::SimdBinaryPacking => Box::new(cpp::SimdBinaryPackingCodec::default()),
CppCodec::SimdFastPFor128 => Box::new(cpp::SimdFastPFor128Codec::default()),
CppCodec::SimdFastPFor256 => Box::new(cpp::SimdFastPFor256Codec::default()),
CppCodec::SimdGroupSimple => Box::new(cpp::SimdGroupSimpleCodec::default()),
CppCodec::SimdGroupSimpleRingBuf => {
Box::new(cpp::SimdGroupSimpleRingBufCodec::default())
}
CppCodec::SimdNewPFor => Box::new(cpp::SimdNewPForCodec::default()),
CppCodec::SimdOptPFor => Box::new(cpp::SimdOptPForCodec::default()),
CppCodec::SimdPFor => Box::new(cpp::SimdPForCodec::default()),
CppCodec::SimdSimplePFor => Box::new(cpp::SimdSimplePForCodec::default()),
// CppCodec::Simple16 => Box::new(cpp::Simple16Codec::default()),
// CppCodec::Simple8b => Box::new(cpp::Simple8bCodec::default()),
// CppCodec::Simple8bRle => Box::new(cpp::Simple8bRleCodec::default()),
// CppCodec::Simple9 => Box::new(cpp::Simple9Codec::default()),
// CppCodec::Simple9Rle => Box::new(cpp::Simple9RleCodec::default()),
// CppCodec::SimplePFor => Box::new(cpp::SimplePForCodec::default()),
// CppCodec::Snappy => Box::new(cpp::SnappyCodec::default()),
CppCodec::StreamVByte => Box::new(cpp::StreamVByteCodec::default()),
CppCodec::VByte => Box::new(cpp::VByteCodec::default()),
CppCodec::VarInt => Box::new(cpp::VarIntCodec::default()),
// CppCodec::VarIntG8iu => Box::new(cpp::VarIntG8iuCodec::default()),
CppCodec::VarIntGb => Box::new(cpp::VarIntGbCodec::default()),
// CppCodec::VsEncoding => Box::new(cpp::VsEncodingCodec::default()),
CppCodec::BP32 => Box::new(CppBP32::default()),
CppCodec::Copy => Box::new(CppCopy::default()),
CppCodec::FastBinaryPacking8 => Box::new(CppFastBinaryPacking8::default()),
CppCodec::FastPFor128 => Box::new(CppFastPFor128::default()),
CppCodec::FastPFor256 => Box::new(CppFastPFor256::default()),
CppCodec::FastBinaryPacking16 => Box::new(CppFastBinaryPacking16::default()),
CppCodec::FastBinaryPacking32 => Box::new(CppFastBinaryPacking32::default()),
CppCodec::MaskedVByte => Box::new(CppMaskedVByte::default()),
CppCodec::NewPFor => Box::new(CppNewPFor::default()),
CppCodec::OptPFor => Box::new(CppOptPFor::default()),
CppCodec::PFor2008 => Box::new(CppPFor2008::default()),
CppCodec::PFor => Box::new(CppPFor::default()),
CppCodec::SimdBinaryPacking => Box::new(CppSimdBinaryPacking::default()),
CppCodec::SimdFastPFor128 => Box::new(CppSimdFastPFor128::default()),
CppCodec::SimdFastPFor256 => Box::new(CppSimdFastPFor256::default()),
CppCodec::SimdGroupSimple => Box::new(CppSimdGroupSimple::default()),
CppCodec::SimdGroupSimpleRingBuf => Box::new(CppSimdGroupSimpleRingBuf::default()),
CppCodec::SimdNewPFor => Box::new(CppSimdNewPFor::default()),
CppCodec::SimdOptPFor => Box::new(CppSimdOptPFor::default()),
CppCodec::SimdPFor => Box::new(CppSimdPFor::default()),
CppCodec::SimdSimplePFor => Box::new(CppSimdSimplePFor::default()),
// CppCodec::Simple16 => Box::new(CppSimple16::default()),
// CppCodec::Simple8b => Box::new(CppSimple8b::default()),
// CppCodec::Simple8bRle => Box::new(CppSimple8bRle::default()),
// CppCodec::Simple9 => Box::new(CppSimple9::default()),
// CppCodec::Simple9Rle => Box::new(CppSimple9Rle::default()),
// CppCodec::SimplePFor => Box::new(CppSimplePFor::default()),
// CppCodec::Snappy => Box::new(CppSnappy::default()),
CppCodec::StreamVByte => Box::new(CppStreamVByte::default()),
CppCodec::VByte => Box::new(CppVByte::default()),
CppCodec::VarInt => Box::new(CppVarInt::default()),
// CppCodec::VarIntG8iu => Box::new(CppVarIntG8iu::default()),
CppCodec::VarIntGb => Box::new(CppVarIntGb::default()),
// CppCodec::VsEncoding => Box::new(CppVsEncoding::default()),
}
}
}
Expand Down
11 changes: 6 additions & 5 deletions fuzz/fuzz_targets/rust_compress_oracle.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#![no_main]

use fastpfor::{AnyLenCodec, CodecToSlice, cpp, rust};
use fastpfor::{AnyLenCodec, CodecToSlice, rust};
use libfuzzer_sys::fuzz_target;
mod common;
use common::*;
use fastpfor::cpp::*;

fuzz_target!(|data: FuzzInput<RustCodec>| {
let input = data.data;
Expand Down Expand Up @@ -40,16 +41,16 @@ fuzz_target!(|data: FuzzInput<RustCodec>| {
// Compress with C++ implementation (`AnyLenCodec` / Vec API)
let mut cpp_compressed = Vec::new();
match data.codec {
RustCodec::FastPFOR256 => cpp::FastPFor256Codec::new()
RustCodec::FastPFOR256 => CppFastPFor256::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::FastPFOR128 => cpp::FastPFor128Codec::new()
RustCodec::FastPFOR128 => CppFastPFor128::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::VariableByte => cpp::MaskedVByteCodec::new()
RustCodec::VariableByte => CppMaskedVByte::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::JustCopy => cpp::CopyCodec::new()
RustCodec::JustCopy => CppCopy::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
}
Expand Down
11 changes: 6 additions & 5 deletions fuzz/fuzz_targets/rust_decompress_oracle.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#![no_main]

use fastpfor::{AnyLenCodec, CodecToSlice, cpp, rust};
use fastpfor::{AnyLenCodec, CodecToSlice, rust};
use libfuzzer_sys::fuzz_target;
mod common;
use common::*;
use fastpfor::cpp::*;

fuzz_target!(|data: FuzzInput<RustCodec>| {
let input = data.data;
Expand Down Expand Up @@ -31,16 +32,16 @@ fuzz_target!(|data: FuzzInput<RustCodec>| {
// First, compress with C++ implementation to get valid compressed data
let mut cpp_compressed = Vec::new();
match data.codec {
RustCodec::FastPFOR256 => cpp::FastPFor256Codec::new()
RustCodec::FastPFOR256 => CppFastPFor256::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::FastPFOR128 => cpp::FastPFor128Codec::new()
RustCodec::FastPFOR128 => CppFastPFor128::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::VariableByte => cpp::MaskedVByteCodec::new()
RustCodec::VariableByte => CppMaskedVByte::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
RustCodec::JustCopy => cpp::CopyCodec::new()
RustCodec::JustCopy => CppCopy::new()
.encode(input, &mut cpp_compressed)
.expect("C++ compression failed"),
}
Expand Down
6 changes: 2 additions & 4 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,15 @@ fmt:
#!/usr/bin/env bash
set -euo pipefail
for dir in "./" "fuzz"; do
cd "$dir"
pushd "$dir"
Comment thread
nyurik marked this conversation as resolved.
if (rustup toolchain list | grep nightly && rustup component list --toolchain nightly | grep rustfmt) &> /dev/null; then
echo "Reformatting Rust code using nightly Rust fmt to sort imports in $dir"
cargo +nightly fmt --all -- --config imports_granularity=Module,group_imports=StdExternalCrate
else
echo "Reformatting Rust with the stable cargo fmt in $dir. Install nightly with \`rustup install nightly\` for better results"
cargo fmt --all
fi
if [ -f .git ]; then
cd ..
fi
popd
Comment thread
nyurik marked this conversation as resolved.
done

# Reformat all Cargo.toml files using cargo-sort
Expand Down
Loading