Skip to main content

vortex_alp/alp/
ops.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_array::scalar::Scalar;
5use vortex_array::vtable::OperationsVTable;
6use vortex_error::VortexExpect;
7use vortex_error::VortexResult;
8
9use crate::ALPArray;
10use crate::ALPFloat;
11use crate::ALPVTable;
12use crate::match_each_alp_float_ptype;
13
14impl OperationsVTable<ALPVTable> for ALPVTable {
15    fn scalar_at(array: &ALPArray, index: usize) -> VortexResult<Scalar> {
16        if let Some(patches) = array.patches()
17            && let Some(patch) = patches.get_patched(index)?
18        {
19            return patch.cast(array.dtype());
20        }
21
22        let encoded_val = array.encoded().scalar_at(index)?;
23
24        Ok(match_each_alp_float_ptype!(array.ptype(), |T| {
25            let encoded_val: <T as ALPFloat>::ALPInt =
26                (&encoded_val).try_into().vortex_expect("invalid ALPInt");
27            Scalar::primitive(
28                <T as ALPFloat>::decode_single(encoded_val, array.exponents()),
29                array.dtype().nullability(),
30            )
31        }))
32    }
33}