From 67182baa814ec4d2190d4ac6fdfbac82e2046f73 Mon Sep 17 00:00:00 2001 From: Folkert Date: Fri, 13 Aug 2021 10:07:58 +0200 Subject: [PATCH] add new AliasVariables type --- compiler/types/src/subs.rs | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/compiler/types/src/subs.rs b/compiler/types/src/subs.rs index a000926ceb..500419e295 100644 --- a/compiler/types/src/subs.rs +++ b/compiler/types/src/subs.rs @@ -850,6 +850,61 @@ pub enum Content { Error, } +struct AliasVariables { + lowercases_start: u32, + variables_start: u32, + lowercases_len: u16, + variables_len: u16, +} +impl AliasVariables { + pub const fn names(&self) -> SubsSlice { + SubsSlice::new(self.variables_start, self.variables_len) + } + + pub const fn variables(&self) -> VariableSubsSlice { + VariableSubsSlice { + slice: SubsSlice::new(self.variables_start, self.variables_len), + } + } + + pub fn insert_into_subs( + subs: &mut Subs, + type_arguments: I1, + unnamed_arguments: I2, + ) -> Self + where + I1: IntoIterator, + I2: IntoIterator, + { + let lowercases_start = subs.field_names.len() as u32; + let variables_start = subs.variables.len() as u32; + + let it1 = type_arguments.into_iter(); + let it2 = unnamed_arguments.into_iter(); + + subs.variables + .reserve(it1.size_hint().0 + it2.size_hint().0); + subs.field_names.reserve(it1.size_hint().0); + + for (field_name, var) in it1 { + subs.field_names.push(field_name); + subs.variables.push(var); + } + + subs.variables.extend(it2); + + let lowercases_len = (subs.field_names.len() as u32 - lowercases_start) as u16; + let variables_len = (subs.variables.len() as u32 - variables_start) as u16; + + Self { + lowercases_start, + variables_start, + lowercases_len, + variables_len, + } + } +} + impl Content { #[inline(always)] pub fn is_number(&self) -> bool {