stv_rs/types/util.rs
1// Copyright 2023 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Utilities for election types.
16
17use std::collections::BTreeMap;
18
19pub fn count_vec_allocations<T>(allocations: &mut BTreeMap<usize, usize>, v: &Vec<T>) {
20 let size = v.capacity() * std::mem::size_of::<T>();
21 *allocations.entry(size).or_insert(0) += 1;
22}
23
24pub fn count_slice_allocations<T>(allocations: &mut BTreeMap<usize, usize>, v: &[T]) {
25 let size = std::mem::size_of_val(v);
26 // Heuristic: allocator aligns to 32 bytes.
27 let size = (size + 31) & !31;
28 *allocations.entry(size).or_insert(0) += 1;
29}
30
31/// Returns the address of the beginning of the slice, or none if the slice is
32/// empty.
33pub fn address_of_slice<T>(v: &[T]) -> Option<usize> {
34 if v.is_empty() {
35 None
36 } else {
37 Some(v.as_ptr() as usize)
38 }
39}