🚧 wip: Vec seems to be faster than BTreeMap here, slightly
							parent
							
								
									4e23f51634
								
							
						
					
					
						commit
						7878efc235
					
				|  | @ -247,6 +247,7 @@ impl Value { | |||
| pub struct Table { | ||||
| 	array: Vec <Value>, | ||||
| 	hash: HashMap <Value, Value>, | ||||
| 	strings: Vec <(InternedString, Value)>, | ||||
| 	map: BTreeMap <InternedString, Value>, | ||||
| } | ||||
| 
 | ||||
|  | @ -262,7 +263,7 @@ impl Table { | |||
| 	fn get_inner (&self, key: &Value) -> &Value { | ||||
| 		match key { | ||||
| 			Value::Nil => &NIL, | ||||
| 			Value::String (x) => self.map.get (x).unwrap_or (&NIL), | ||||
| 			Value::String (x) => self.get_str (*x), | ||||
| 			Value::Integer (x) => self.array.get (usize::try_from (*x).unwrap ()).unwrap_or (&NIL), | ||||
| 			x => self.hash.get (x).unwrap_or (&NIL), | ||||
| 		} | ||||
|  | @ -277,10 +278,7 @@ impl Table { | |||
| 	} | ||||
| 	
 | ||||
| 	pub fn get_str (&self, key: InternedString) -> &Value { | ||||
| 		match self.map.get (&key) { | ||||
| 			None => &NIL, | ||||
| 			Some (x) => x, | ||||
| 		} | ||||
| 		self.strings.iter ().find (|(hay, _)| hay == &key).map (|(_, v)| v).unwrap_or (&NIL) | ||||
| 	} | ||||
| 	
 | ||||
| 	/// Insert value at arbitrary key
 | ||||
|  | @ -293,9 +291,7 @@ impl Table { | |||
| 		match a.into () { | ||||
| 			Value::Integer (x) => self.insert_int (x, b), | ||||
| 			Value::Nil => (), | ||||
| 			Value::String (x) => { | ||||
| 				self.map.insert (x, b.into ()); | ||||
| 			}, | ||||
| 			Value::String (x) => self.insert_str (x, b.into ()), | ||||
| 			x => { | ||||
| 				self.hash.insert (x, b.into ()); | ||||
| 			}, | ||||
|  | @ -312,7 +308,11 @@ impl Table { | |||
| 	} | ||||
| 	
 | ||||
| 	pub fn insert_str (&mut self, key: InternedString, v: Value) { | ||||
| 		self.map.insert (key, v); | ||||
| 		match self.strings.iter_mut ().find (|(hay, _)| hay == &key).map (|(_, v)| v) | ||||
| 		{ | ||||
| 			None => self.strings.push ((key, v)), | ||||
| 			Some (x) => *x = v, | ||||
| 		} | ||||
| 	} | ||||
| 	
 | ||||
| 	pub fn length (&self) -> i64 { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 _
						_