pipecircuit 0.0.24

Correct. Robust. Fast. Portable. Pick four.
Documentation
use alloc::vec::Vec;
use core::ops::DerefMut;

use super::super::{AllocatedStorage, IndexKey};

pub trait UniqueIndexBacking<Key: IndexKey> {
    type Keys;
    type Buckets: DerefMut<Target = [u32]>;

    fn keys(keys: &Self::Keys) -> &[Key];
    fn keys_mut(keys: &mut Self::Keys) -> &mut [Key];
    fn append(keys: &mut Self::Keys, key: Key);
    fn remove(keys: &mut Self::Keys, row: usize);
}

impl<Key: IndexKey> UniqueIndexBacking<Key> for AllocatedStorage {
    type Keys = Vec<Key>;
    type Buckets = Vec<u32>;

    fn keys(keys: &Self::Keys) -> &[Key] {
        keys
    }

    fn keys_mut(keys: &mut Self::Keys) -> &mut [Key] {
        keys
    }

    fn append(keys: &mut Self::Keys, key: Key) {
        keys.push(key);
    }

    fn remove(keys: &mut Self::Keys, row: usize) {
        keys.swap_remove(row);
    }
}