From bb66467386cfb2d88650bc26151f97ad073bedba Mon Sep 17 00:00:00 2001 From: noamteyssier <22600644+noamteyssier@users.noreply.github.com> Date: Thu, 20 Aug 2026 11:12:03 -0700 Subject: [PATCH 1/2] refactor: use numbuffer instead of itoa --- src/bq/reader.rs | 5 +++-- src/cbq/core/block.rs | 11 ++++++----- src/vbq/reader.rs | 7 ++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/bq/reader.rs b/src/bq/reader.rs index 679b210..db0ea2a 100644 --- a/src/bq/reader.rs +++ b/src/bq/reader.rs @@ -7,6 +7,7 @@ //! It supports both sequential and parallel processing of records, //! with configurable record layouts for different sequence types. +use core::fmt::NumBuffer; use std::fs::File; use std::io::Read; use std::ops::Range; @@ -920,7 +921,7 @@ impl ParallelReader for MmapReader { } // create a reusable buffer for translating record IDs - let mut translater = itoa::Buffer::new(); + let mut translater = NumBuffer::new(); // initialize a decoding buffer let mut dbuf = Vec::new(); @@ -959,7 +960,7 @@ impl ParallelReader for MmapReader { // iterate over each index in the range for (inner_idx, idx) in (range_start..range_end).enumerate() { // translate the index - let id_str = translater.format(idx); + let id_str = idx.format_into(&mut translater); // create the index buffer let mut header_buf = [0; 20]; diff --git a/src/cbq/core/block.rs b/src/cbq/core/block.rs index 1045fd7..1a45300 100644 --- a/src/cbq/core/block.rs +++ b/src/cbq/core/block.rs @@ -1,3 +1,4 @@ +use core::fmt::NumBuffer; use std::io; use bytemuck::{cast_slice, cast_slice_mut}; @@ -731,7 +732,7 @@ impl ColumnarBlock { index: 0, is_paired: self.header.is_paired(), has_headers: self.header.has_headers(), - header_buffer: itoa::Buffer::new(), + header_buffer: NumBuffer::new(), } } } @@ -756,8 +757,8 @@ pub struct RefRecordIter<'a> { /// Preallocated buffer for quality scores qbuf: &'a [u8], - /// Preallocated itoa buffer for converting global record index to string - header_buffer: itoa::Buffer, + /// Preallocated NumBuffer for converting global record index to string + header_buffer: NumBuffer, } impl<'a> Iterator for RefRecordIter<'a> { type Item = RefRecord<'a>; @@ -830,9 +831,9 @@ struct RefRecordIndex { index_len: usize, } impl RefRecordIndex { - fn new(index: usize, itoa_buf: &mut itoa::Buffer) -> Self { + fn new(index: usize, buf: &mut NumBuffer) -> Self { let mut index_buf = [0u8; 20]; - let header_str = itoa_buf.format(index); + let header_str = index.format_into(buf); let index_len = header_str.len(); index_buf[..index_len].copy_from_slice(header_str.as_bytes()); Self { diff --git a/src/vbq/reader.rs b/src/vbq/reader.rs index ef5b931..174321f 100644 --- a/src/vbq/reader.rs +++ b/src/vbq/reader.rs @@ -49,6 +49,7 @@ //! } //! ``` +use core::fmt::NumBuffer; use std::fs::File; use std::ops::Range; use std::path::Path; @@ -542,7 +543,7 @@ impl RecordBlock { pub struct RecordBlockIter<'a> { block: &'a RecordBlock, pos: usize, - header_buffer: itoa::Buffer, + header_buffer: NumBuffer, qbuf: &'a [u8], } impl<'a> RecordBlockIter<'a> { @@ -551,7 +552,7 @@ impl<'a> RecordBlockIter<'a> { Self { block, pos: 0, - header_buffer: itoa::Buffer::new(), + header_buffer: NumBuffer::new(), qbuf: &block.qbuf, } } @@ -571,7 +572,7 @@ impl<'a> Iterator for RecordBlockIter<'a> { let mut header_buf = [0; 20]; let mut header_len = 0; if meta.s_header_span.len == 0 && meta.x_header_span.len == 0 { - let header_str = self.header_buffer.format(index); + let header_str = index.format_into(&mut self.header_buffer); header_len = header_str.len(); header_buf[..header_len].copy_from_slice(header_str.as_bytes()); } From 9afb075ce3cdb0e68ce0a732c9d7e5d10f45e660 Mon Sep 17 00:00:00 2001 From: noamteyssier <22600644+noamteyssier@users.noreply.github.com> Date: Thu, 20 Aug 2026 11:12:11 -0700 Subject: [PATCH 2/2] dep: drop itoa as dependency --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index bb976a0..50fc46b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ bitnuc-deprec = { package ="bitnuc", version = "0.4.1" } bitnuc = { version = "0.5.1" } bytemuck = { version = "1.25.1", features = ["derive", "extern_crate_alloc"] } byteorder = "1.5.0" -itoa = "1.0.18" memchr = "2.8.3" memmap2 = "0.9.11" num_cpus = "1.17.0"