polars_ops/series/ops/
index.rs1use polars_core::error::{PolarsResult, polars_ensure};
2use polars_core::prelude::arity::unary_elementwise_values;
3use polars_core::prelude::{ChunkedArray, DataType, IDX_DTYPE, IdxCa, PolarsIntegerType, Series};
4use polars_utils::index::ToIdx;
5
6fn convert<T>(ca: &ChunkedArray<T>, target_len: usize) -> PolarsResult<IdxCa>
7where
8 T: PolarsIntegerType,
9 T::Native: ToIdx,
10{
11 let target_len = target_len as u64;
12 Ok(unary_elementwise_values(ca, |v| v.to_idx(target_len)))
13}
14
15pub fn convert_to_unsigned_index(s: &Series, target_len: usize) -> PolarsResult<IdxCa> {
16 let dtype = s.dtype();
17 polars_ensure!(dtype.is_integer(), InvalidOperation: "expected integers as index");
18 if dtype.is_unsigned_integer() {
19 let nulls_before_cast = s.null_count();
20 let out = s.cast(&IDX_DTYPE).unwrap();
21 polars_ensure!(out.null_count() == nulls_before_cast, OutOfBounds: "some integers did not fit polars' index size");
22 return Ok(out.idx().unwrap().clone());
23 }
24 match dtype {
25 DataType::Int64 => {
26 let ca = s.i64().unwrap();
27 convert(ca, target_len)
28 },
29 DataType::Int32 => {
30 let ca = s.i32().unwrap();
31 convert(ca, target_len)
32 },
33 #[cfg(feature = "dtype-i16")]
34 DataType::Int16 => {
35 let ca = s.i16().unwrap();
36 convert(ca, target_len)
37 },
38 #[cfg(feature = "dtype-i8")]
39 DataType::Int8 => {
40 let ca = s.i8().unwrap();
41 convert(ca, target_len)
42 },
43 _ => unreachable!(),
44 }
45}