fixed-map 0.9.6

A fixed map where storage layout is calculated by a procedural macro.
Documentation
#![cfg(feature = "musli-zerocopy01")]

use fixed_map::{Key, Set};
use musli_zerocopy01 as musli_zerocopy;

use musli_zerocopy::{OwnedBuf, ZeroCopy};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Key)]
#[key(bitset)]
enum Form {
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H,
    I,
}

#[derive(Debug, PartialEq, ZeroCopy)]
#[repr(transparent)]
struct Inflection {
    form: Set<Form>,
}

#[derive(Debug, PartialEq, ZeroCopy)]
#[repr(C)]
struct Entry {
    id: u32,
    inflection: Inflection,
    forms: Set<Form>,
}

#[test]
fn store_load() {
    let entry = Entry {
        id: 42,
        inflection: Inflection {
            form: Set::from([Form::A, Form::I]),
        },
        forms: Set::from([Form::C]),
    };

    let mut buf = OwnedBuf::new();
    let set = buf.store(&Set::from([Form::B, Form::H])).unwrap();
    let entry_ref = buf.store(&entry).unwrap();

    assert_eq!(buf.load(set).unwrap(), &Set::from([Form::B, Form::H]));
    assert_eq!(buf.load(entry_ref).unwrap(), &entry);
}

#[test]
fn swap_bytes() {
    let set = Set::from([Form::A, Form::I]);
    let swapped = set.swap_bytes::<musli_zerocopy::endian::Other>();
    assert_eq!(swapped.as_raw(), set.as_raw().swap_bytes());
    assert_eq!(swapped.swap_bytes::<musli_zerocopy::endian::Other>(), set);
}