Improve memory safety of hash table
This commit is contained in:
		
							parent
							
								
									2792f27473
								
							
						
					
					
						commit
						98372cc85f
					
				| @ -56,16 +56,18 @@ pub fn Hashed(comptime Key: type, comptime Value: type, | ||||
|         } | ||||
| 
 | ||||
|         /// | ||||
|         /// Searches for `key` to delete it, returning the deleted value or `null` if no matching | ||||
|         /// key was found. | ||||
|         /// Searches for `key` and deletes it from `self. | ||||
|         /// | ||||
|         pub fn remove(self: Self, key: Key) ?Value { | ||||
|         /// The removed value is returned or `null` if no key matching `key` was found. | ||||
|         /// | ||||
|         pub fn remove(self: *Self, key: Key) ?Value { | ||||
|             var bucket = &(self.buckets[@mod(key_context.hash(key), self.buckets.len)]); | ||||
| 
 | ||||
|             if (bucket.maybe_entry) |*entry| if (key_context.equals(entry.key, key)) { | ||||
|                 defer entry.value = null; | ||||
| 
 | ||||
|                 self.filled -= 1; | ||||
|                 defer { | ||||
|                     bucket.maybe_entry = null; | ||||
|                     self.filled -= 1; | ||||
|                 } | ||||
| 
 | ||||
|                 return entry.value; | ||||
|             }; | ||||
| @ -74,9 +76,10 @@ pub fn Hashed(comptime Key: type, comptime Value: type, | ||||
|                 bucket = &(self.buckets[index]); | ||||
| 
 | ||||
|                 if (bucket.maybe_entry) |*entry| if (key_context.equals(entry.key, key)) { | ||||
|                     defer entry.value = null; | ||||
| 
 | ||||
|                     self.filled -= 1; | ||||
|                     defer { | ||||
|                         bucket.maybe_entry = null; | ||||
|                         self.filled -= 1; | ||||
|                     } | ||||
| 
 | ||||
|                     return entry.value; | ||||
|                 }; | ||||
| @ -129,20 +132,21 @@ pub fn Hashed(comptime Key: type, comptime Value: type, | ||||
|         } | ||||
| 
 | ||||
|         /// | ||||
|         /// Searches for a value indexed with `key` in `self`, returning it or `null` if no matching | ||||
|         /// entry was found. | ||||
|         /// Searches for a value indexed with `key` in `self`. | ||||
|         /// | ||||
|         pub fn lookup(self: Self, key: Key) ?*Value { | ||||
|         /// The found value is returned or `null` if an key matching `key` failed to be found. | ||||
|         /// | ||||
|         pub fn lookup(self: Self, key: Key) ?Value { | ||||
|             var bucket = &(self.buckets[@mod(key_context.hash(key), self.buckets.len)]); | ||||
| 
 | ||||
|             if (bucket.maybe_entry) |*entry| | ||||
|                 if (key_context.equals(entry.key, key)) return &entry.value; | ||||
|             if (bucket.maybe_entry) |entry| | ||||
|                 if (key_context.equals(entry.key, key)) return entry.value; | ||||
| 
 | ||||
|             while (bucket.maybe_next_index) |index| { | ||||
|                 bucket = &(self.buckets[index]); | ||||
| 
 | ||||
|                 if (bucket.maybe_entry) |*entry| | ||||
|                     if (key_context.equals(entry.key, key)) return &entry.value; | ||||
|                 if (bucket.maybe_entry) |entry| | ||||
|                     if (key_context.equals(entry.key, key)) return entry.value; | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user