use std::mem::transmute;
use crate::core::FieldId;
use crate::columnar::reader::ColumnReader;
use crate::segment::reader::SegmentReader;
pub(crate) struct OwnedColumn(Box<ColumnReader<'static>>);
impl OwnedColumn {
pub fn new(field_id: Option<FieldId>, reader: &SegmentReader) -> Option<Self> {
#[cfg(test)]
COLUMN_OPENS.with(|c| c.set(c.get() + 1));
let col = field_id.and_then(|fid| reader.column(fid))?;
let static_col: ColumnReader<'static> = unsafe { transmute(col) };
Some(Self(Box::new(static_col)))
}
pub fn inner<'s>(&'s self) -> &'s ColumnReader<'s> {
let col: &'s ColumnReader<'static> = &self.0;
unsafe { transmute::<&'s ColumnReader<'static>, &'s ColumnReader<'s>>(col) }
}
#[inline]
pub fn numeric_value(&self, doc_id: u32) -> Option<f64> {
self.0.numeric_value(doc_id)
}
#[inline]
pub fn keyword_ordinal(&self, doc_id: u32) -> Option<u32> {
self.0.keyword_ordinal(doc_id)
}
#[inline]
pub fn ordinal_to_string(&self, ordinal: u32) -> Option<&str> {
self.0.ordinal_to_string(ordinal)
}
#[inline]
pub fn dict_size(&self) -> usize {
self.0.dict_size()
}
#[inline]
pub fn ensure_dict(&self) {
self.0.ensure_dict();
}
}
#[cfg(test)]
thread_local! {
pub(crate) static COLUMN_OPENS: std::cell::Cell<usize> = std::cell::Cell::new(0);
}