diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bb0c619..61978c83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `Array::builder()` and `ArrayBuilder::from_array()` - Added more `ArrayBuilder` modifiers and made internals public - Added a fast path to `Array::retrieve_array_subset` methods if the array subset matches a chunk - - Added `ZARR_NAN_F64/F32/F16/BF16` which match the zarr nan bit representation on all implementations + - Added `array::{ZARR_NAN_F64,ZARR_NAN_F32,ZARR_NAN_F16,ZARR_NAN_BF16}` which match the zarr nan bit representation on all implementations - Added `size_usize()` to `ArrayRepresentation` - Add generic implementations of storage supertraits (`ReadableWritableStorageTraits` and `ReadableListableStorageTraits`) - Add `size_prefix()` to stores diff --git a/examples/array_write_read.rs b/examples/array_write_read.rs index 3f52a6af..3eb22026 100644 --- a/examples/array_write_read.rs +++ b/examples/array_write_read.rs @@ -3,12 +3,10 @@ fn array_write_read() -> Result<(), Box> { use rayon::prelude::{IntoParallelIterator, ParallelIterator}; use std::sync::Arc; use zarrs::{ - array::FillValue, - array::{chunk_grid::ChunkGridTraits, DataType}, + array::{chunk_grid::ChunkGridTraits, DataType, FillValue, ZARR_NAN_F32}, array_subset::ArraySubset, node::Node, storage::store, - ZARR_NAN_F32, }; // Create a store diff --git a/examples/rectangular_array_write_read.rs b/examples/rectangular_array_write_read.rs index 1326180f..5612e939 100644 --- a/examples/rectangular_array_write_read.rs +++ b/examples/rectangular_array_write_read.rs @@ -2,12 +2,15 @@ fn rectangular_array_write_read() -> Result<(), Box> { use rayon::prelude::{IntoParallelIterator, ParallelIterator}; use zarrs::array::ChunkGrid; - use zarrs::ZARR_NAN_F32; - use zarrs::{array::DataType, array_subset::ArraySubset, storage::store}; use zarrs::{ array::{chunk_grid::RectangularChunkGrid, codec, FillValue}, node::Node, }; + use zarrs::{ + array::{DataType, ZARR_NAN_F32}, + array_subset::ArraySubset, + storage::store, + }; // Create a store // let path = tempfile::TempDir::new()?; diff --git a/examples/zip_array_write_read.rs b/examples/zip_array_write_read.rs index 3e1fb7c1..167da4bf 100644 --- a/examples/zip_array_write_read.rs +++ b/examples/zip_array_write_read.rs @@ -6,10 +6,9 @@ use std::{ }; use zarrs::{ - array::Array, + array::{Array, ZARR_NAN_F32}, array_subset::ArraySubset, storage::{ReadableStorageTraits, ReadableWritableStorageTraits}, - ZARR_NAN_F32, }; // const ARRAY_PATH: &'static str = "/array"; diff --git a/src/array.rs b/src/array.rs index 4d7e403d..6534fadf 100644 --- a/src/array.rs +++ b/src/array.rs @@ -41,6 +41,7 @@ pub mod data_type; mod dimension_name; mod fill_value; mod fill_value_metadata; +mod nan_representations; mod unsafe_cell_slice; use std::{collections::HashMap, sync::Arc}; @@ -58,6 +59,7 @@ pub use self::{ dimension_name::DimensionName, fill_value::FillValue, fill_value_metadata::FillValueMetadata, + nan_representations::{ZARR_NAN_BF16, ZARR_NAN_F16, ZARR_NAN_F32, ZARR_NAN_F64}, }; use parking_lot::Mutex; @@ -1739,7 +1741,7 @@ mod tests { use itertools::Itertools; use rayon::prelude::{IntoParallelIterator, ParallelIterator}; - use crate::{storage::store::MemoryStore, ZARR_NAN_F32}; + use crate::storage::store::MemoryStore; use super::*; diff --git a/src/array/array_builder.rs b/src/array/array_builder.rs index 5cfdbece..da4f4c5e 100644 --- a/src/array/array_builder.rs +++ b/src/array/array_builder.rs @@ -27,13 +27,13 @@ use super::{ /// ```rust /// # fn main() -> Result<(), Box> { /// # use std::sync::Arc; -/// use zarrs::array::{ArrayBuilder, DataType, FillValue}; +/// use zarrs::array::{ArrayBuilder, DataType, FillValue, ZARR_NAN_F32}; /// # let store = Arc::new(zarrs::storage::store::MemoryStore::default()); /// let mut array = ArrayBuilder::new( /// vec![8, 8], // array shape /// DataType::Float32, /// vec![4, 4].into(), // regular chunk shape -/// FillValue::from(zarrs::ZARR_NAN_F32), +/// FillValue::from(ZARR_NAN_F32), /// ) /// .bytes_to_bytes_codecs(vec![ /// #[cfg(feature = "gzip")] diff --git a/src/array/data_type.rs b/src/array/data_type.rs index 4f26817d..87b5f608 100644 --- a/src/array/data_type.rs +++ b/src/array/data_type.rs @@ -6,7 +6,10 @@ use derive_more::From; use half::{bf16, f16}; use thiserror::Error; -use crate::{metadata::Metadata, ZARR_NAN_F32, ZARR_NAN_F64}; +use crate::{ + array::{ZARR_NAN_F32, ZARR_NAN_F64}, + metadata::Metadata, +}; use super::{ fill_value_metadata::{ @@ -407,7 +410,7 @@ impl core::fmt::Display for DataType { #[cfg(test)] mod tests { - use crate::{ZARR_NAN_BF16, ZARR_NAN_F32, ZARR_NAN_F64}; + use crate::array::{ZARR_NAN_BF16, ZARR_NAN_F32, ZARR_NAN_F64}; use super::*; diff --git a/src/array/fill_value_metadata.rs b/src/array/fill_value_metadata.rs index 2ca7bd3c..4b558ccb 100644 --- a/src/array/fill_value_metadata.rs +++ b/src/array/fill_value_metadata.rs @@ -12,7 +12,7 @@ use half::{bf16, f16}; use num::traits::float::FloatCore; use serde::{Deserialize, Serialize}; -use crate::{ZARR_NAN_BF16, ZARR_NAN_F16, ZARR_NAN_F32, ZARR_NAN_F64}; +use crate::array::{ZARR_NAN_BF16, ZARR_NAN_F16, ZARR_NAN_F32, ZARR_NAN_F64}; /// Fill value metadata. #[derive(Serialize, Deserialize, Clone, PartialEq, Debug, Display)] diff --git a/src/array/nan_representations.rs b/src/array/nan_representations.rs new file mode 100644 index 00000000..0220a1bb --- /dev/null +++ b/src/array/nan_representations.rs @@ -0,0 +1,41 @@ +use std::mem::transmute; + +use half::{bf16, f16}; + +// https://github.com/rust-lang/rust/issues/72447 + +/// The Zarr "NaN" fill value for a 64-bit IEEE 754 floating point number. +#[allow(clippy::unusual_byte_groupings)] +pub const ZARR_NAN_F64: f64 = unsafe { + transmute::(0b0_11111111111_1000000000000000000000000000000000000000000000000000) +}; +// const ZARR_NAN_F64: f64 = f64::from_bits(0b0_11111111111_1000000000000000000000000000000000000000000000000000); + +/// The Zarr "NaN" fill value for a 32-bit IEEE 754 floating point number. +#[allow(clippy::unusual_byte_groupings)] +pub const ZARR_NAN_F32: f32 = + unsafe { transmute::(0b0_11111111_10000000000000000000000) }; +// const ZARR_NAN_F32: f32 = f32::from_bits(0b0_11111111_10000000000000000000000); + +/// The Zarr "NaN" fill value for a 16-bit IEEE 754 floating point number. +pub const ZARR_NAN_F16: f16 = f16::NAN; + +/// The Zarr "NaN" fill value for a 16-bit brain floating point number. +pub const ZARR_NAN_BF16: bf16 = bf16::NAN; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn nan_representations() { + assert_eq!( + bf16::NAN.to_ne_bytes(), + bf16::from_bits(0b0_11111111_1000000).to_ne_bytes() + ); + assert_eq!( + f16::NAN.to_ne_bytes(), + f16::from_bits(0b0_11111_1000000000).to_ne_bytes() + ); + } +} diff --git a/src/lib.rs b/src/lib.rs index 854876d9..1e7b1c8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,10 +59,6 @@ #![deny(clippy::missing_panics_doc)] #![cfg_attr(nightly, feature(doc_auto_cfg))] -use std::mem::transmute; - -use half::{bf16, f16}; - pub mod array; pub mod array_subset; pub mod byte_range; @@ -72,41 +68,3 @@ pub mod node; pub mod plugin; pub mod storage; pub mod version; - -// https://github.com/rust-lang/rust/issues/72447 - -/// The Zarr "NaN" fill value for a 64-bit IEEE 754 floating point number. -#[allow(clippy::unusual_byte_groupings)] -pub const ZARR_NAN_F64: f64 = unsafe { - transmute::(0b0_11111111111_1000000000000000000000000000000000000000000000000000) -}; -// const ZARR_NAN_F64: f64 = f64::from_bits(0b0_11111111111_1000000000000000000000000000000000000000000000000000); - -/// The Zarr "NaN" fill value for a 32-bit IEEE 754 floating point number. -#[allow(clippy::unusual_byte_groupings)] -pub const ZARR_NAN_F32: f32 = - unsafe { transmute::(0b0_11111111_10000000000000000000000) }; -// const ZARR_NAN_F32: f32 = f32::from_bits(0b0_11111111_10000000000000000000000); - -/// The Zarr "NaN" fill value for a 16-bit IEEE 754 floating point number. -pub const ZARR_NAN_F16: f16 = f16::NAN; - -/// The Zarr "NaN" fill value for a 16-bit brain floating point number. -pub const ZARR_NAN_BF16: bf16 = bf16::NAN; - -#[cfg(test)] -pub mod tests { - use super::*; - - #[test] - fn nan_representations() { - assert_eq!( - bf16::NAN.to_ne_bytes(), - bf16::from_bits(0b0_11111111_1000000).to_ne_bytes() - ); - assert_eq!( - f16::NAN.to_ne_bytes(), - f16::from_bits(0b0_11111_1000000000).to_ne_bytes() - ); - } -}