oxigdal_compress/lib.rs
1//! OxiGDAL Compression Library
2//!
3//! Advanced compression codecs and auto-selection for geospatial data.
4//!
5//! # Features
6//!
7//! - **Standard Codecs**: LZ4, Zstandard, Brotli, Snappy, DEFLATE
8//! - **Geospatial Codecs**: Delta encoding, RLE, Dictionary compression
9//! - **Floating-Point**: ZFP and SZ-style compression with error bounds
10//! - **Auto-Selection**: Intelligent codec selection based on data characteristics
11//! - **Parallel Processing**: Multi-threaded compression/decompression
12//! - **Benchmarking**: Built-in performance measurement
13//!
14//! # Examples
15//!
16//! ```rust
17//! use oxigdal_compress::{
18//! codecs::{Lz4Codec, ZstdCodec},
19//! auto_select::{AutoSelector, CompressionGoal, DataType, DataCharacteristics},
20//! };
21//!
22//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
23//! // Basic compression with LZ4
24//! let codec = Lz4Codec::new();
25//! let data = b"Hello, world!".repeat(1000);
26//! let compressed = codec.compress(&data)?;
27//! let decompressed = codec.decompress(&compressed, Some(data.len()))?;
28//! assert_eq!(decompressed, data);
29//!
30//! // Auto-selection
31//! let selector = AutoSelector::new(CompressionGoal::Balanced);
32//! let characteristics = DataCharacteristics {
33//! data_type: DataType::Categorical,
34//! size: 10000,
35//! entropy: 0.3,
36//! unique_count: Some(10),
37//! value_range: None,
38//! run_length_ratio: Some(50.0),
39//! };
40//! let recommendations = selector.recommend(&characteristics);
41//! println!("Recommended codec: {:?}", recommendations[0].codec);
42//! # Ok(())
43//! # }
44//! ```
45
46#![deny(missing_docs)]
47#![warn(clippy::unwrap_used, clippy::panic)]
48
49pub mod auto_select;
50pub mod benchmark;
51pub mod codecs;
52pub mod error;
53pub mod floating_point;
54pub mod metadata;
55pub mod parallel;
56
57pub use error::{CompressionError, Result};
58
59/// Prelude module for common imports
60pub mod prelude {
61 pub use crate::{
62 auto_select::{AutoSelector, CompressionGoal, DataCharacteristics, DataType},
63 codecs::{
64 BrotliCodec, CodecType, DeflateCodec, DeltaCodec, DictionaryCodec, Lz4Codec, RleCodec,
65 SnappyCodec, ZstdCodec,
66 },
67 error::{CompressionError, Result},
68 metadata::CompressionMetadata,
69 parallel::ParallelCompressor,
70 };
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn test_lz4_roundtrip() {
79 use codecs::Lz4Codec;
80
81 let codec = Lz4Codec::new();
82 let data = b"Test data".repeat(100);
83
84 let compressed = codec.compress(&data).expect("Compression failed");
85 let decompressed = codec
86 .decompress(&compressed, Some(data.len()))
87 .expect("Decompression failed");
88
89 assert_eq!(decompressed, data);
90 }
91
92 #[test]
93 fn test_zstd_roundtrip() {
94 use codecs::ZstdCodec;
95
96 let codec = ZstdCodec::new();
97 let data = b"Test data".repeat(100);
98
99 let compressed = codec.compress(&data).expect("Compression failed");
100 let decompressed = codec
101 .decompress(&compressed, Some(data.len() * 2))
102 .expect("Decompression failed");
103
104 assert_eq!(decompressed, data);
105 }
106}