[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251215121145.19b99bb0.gary@garyguo.net>
Date: Mon, 15 Dec 2025 12:11:45 +0000
From: Gary Guo <gary@...yguo.net>
To: Matthew Maurer <mmaurer@...gle.com>
Cc: Dmitry Baryshkov <dmitry.baryshkov@....qualcomm.com>, Bjorn Andersson
<andersson@...nel.org>, Konrad Dybcio <konradybcio@...nel.org>, Satya Durga
Srinivasu Prabhala <satyap@...cinc.com>, Miguel Ojeda <ojeda@...nel.org>,
Boqun Feng <boqun.feng@...il.com>, Björn Roy Baron
<bjorn3_gh@...tonmail.com>, Benno Lossin <lossin@...nel.org>, Andreas
Hindborg <a.hindborg@...nel.org>, Alice Ryhl <aliceryhl@...gle.com>, Trevor
Gross <tmgross@...ch.edu>, Danilo Krummrich <dakr@...nel.org>, Trilok Soni
<tsoni@...cinc.com>, linux-kernel@...r.kernel.org,
linux-arm-msm@...r.kernel.org, rust-for-linux@...r.kernel.org
Subject: Re: [PATCH RFC] soc: qcom: socinfo: Re-implement in Rust
On Sat, 13 Dec 2025 08:58:56 -0800
Matthew Maurer <mmaurer@...gle.com> wrote:
> Some options:
> 1. Make holes explicit
> ```
> pub(crate) const PMIC_MODELS: &[Option<&'str>] = &[
> Some("foo"),
> Some("bar"),
> None,
> Some("baz"),
> // ...
> };
> ```
> This is the one I'd suggest if we want to get rid of the 92. It has
> the downside of some extra explicit `None` entries, but the array
> isn't *that* sparse.
>
> 2. Factor out 92 into a constant.
> 3. Define the constant in terms of index/value pairs instead. I could
> use `const`-time code to produce the array we want:
> ```
> const PMIC_ENTRIES: &[(usize, &str)] = &[(1, "foo"), (9, "bar"), (42, "baz")];
>
> const PMIC_MODELS_LEN: usize = {
> let mut max = 0;
> let mut i = 0;
> while i < PMIC_ENTRIES.len() {
> if PMIC_ENTRIES[i].0 > max {
> max = PMIC_ENTRIES[i].0;
> }
> i += 1;
> }
> max + 1
> };
>
> pub const PMIC_MODELS: [Option<&'static str>; PMIC_MODELS_LEN] = {
> let mut models = [None; PMIC_MODELS_LEN];
> let mut i = 0;
> while i < PMIC_ENTRIES.len() {
> let (idx, val) = PMIC_ENTRIES[i];
> models[idx] = Some(val);
> i += 1;
> }
> models
> };
> ```
> (The slightly icky looking loops are because not all features are
> available in const mode.)
> This seems a bit overkill for what's going on.
How about making a macro for this and make it available from kernel crate?
Looks like this should do what you need?
/// Create a sparse array of `[Option<T>; _]`.
macro_rules! sparse_array {
($(
$index:literal: $value:expr
),* $(,)?) => {{
const SIZE: usize = {
let mut size = 0;
$(if $index >= size {
size = $index + 1;
})*
size
};
const {
let mut arr = [None; SIZE];
$(arr[$index] = Some($value);)*
arr
}
}}
}
fn main() {
const EXAMPLE: &[Option<u32>] = &sparse_array! {
0: 1,
5: 2,
};
println!("{:?}", EXAMPLE);
}
Best,
Gary
Powered by blists - more mailing lists