#[derive(Debug)]
pub struct UserOrGroupIdentifierMap<U: UserOrGroupIdentifier>
{
inside_namespace_to_outside_namespace_user_or_group_identifiers: Intervals<U>,
reverse_mapping_does_not_overlap_check: Intervals<()>,
}
impl<U: UserOrGroupIdentifier> UserOrGroupIdentifierMap<U>
{
#[inline(always)]
pub fn unitary_for_current_user_identifier() -> Self
{
let mut this = Self
{
inside_namespace_to_outside_namespace_user_or_group_identifiers: Intervals::default(),
reverse_mapping_does_not_overlap_check: Intervals::default(),
};
this.add_mapping(U::Zero, U::current_real(), new_non_zero_u32(1));
this
}
#[inline(always)]
pub fn add_mapping(&mut self, inside_namespace_user_or_group_identifier: U, outside_namespace_user_or_group_identifier: U, length: NonZeroU32)
{
let inside_namespace_user_or_group_identifier: u32 = inside_namespace_user_or_group_identifier.into();
self.inside_namespace_to_outside_namespace_user_or_group_identifiers.add_interval(inside_namespace_user_or_group_identifier, length, outside_namespace_user_or_group_identifier);
let outside_namespace_user_or_group_identifier: u32 = outside_namespace_user_or_group_identifier.into();
self.reverse_mapping_does_not_overlap_check.add_interval(outside_namespace_user_or_group_identifier, length, ());
}
pub fn write_to_map_file(&self, path: &Path) -> io::Result<()>
{
let file = path.open_file_for_writing()?;
let mut buf_writer = BufWriter::new(file);
for (&inside_namespace_user_or_group_identifier, &(length, outside_namespace_user_or_group_identifier)) in self.inside_namespace_to_outside_namespace_user_or_group_identifiers.iter()
{
let outside_namespace_user_or_group_identifier: u32 = outside_namespace_user_or_group_identifier.into();
writeln!(buf_writer, "{} {} {}", inside_namespace_user_or_group_identifier, outside_namespace_user_or_group_identifier, length)?;
}
buf_writer.flush()?;
Ok(())
}
}