| 
									
										
										
										
											2024-04-02 11:03:40 +01:00
										 |  |  | package structr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"sync" | 
					
						
							|  |  |  | 	"unsafe" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type indexed_item struct { | 
					
						
							|  |  |  | 	// linked list elem this item | 
					
						
							|  |  |  | 	// is stored in a main list. | 
					
						
							|  |  |  | 	elem list_elem | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-14 12:08:24 +00:00
										 |  |  | 	// cached data with type. | 
					
						
							|  |  |  | 	data interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-02 11:03:40 +01:00
										 |  |  | 	// indexed stores the indices | 
					
						
							|  |  |  | 	// this item is stored under. | 
					
						
							|  |  |  | 	indexed []*index_entry | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var indexed_item_pool sync.Pool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // new_indexed_item returns a new prepared indexed_item. | 
					
						
							|  |  |  | func new_indexed_item() *indexed_item { | 
					
						
							|  |  |  | 	v := indexed_item_pool.Get() | 
					
						
							|  |  |  | 	if v == nil { | 
					
						
							|  |  |  | 		v = new(indexed_item) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	item := v.(*indexed_item) | 
					
						
							|  |  |  | 	ptr := unsafe.Pointer(item) | 
					
						
							|  |  |  | 	item.elem.data = ptr | 
					
						
							|  |  |  | 	return item | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // free_indexed_item releases the indexed_item. | 
					
						
							|  |  |  | func free_indexed_item(item *indexed_item) { | 
					
						
							|  |  |  | 	item.elem.data = nil | 
					
						
							|  |  |  | 	item.indexed = item.indexed[:0] | 
					
						
							|  |  |  | 	item.data = nil | 
					
						
							|  |  |  | 	indexed_item_pool.Put(item) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // drop_index will drop the given index entry from item's indexed. | 
					
						
							|  |  |  | // note this also handles freeing the index_entry memory (e.g. to pool) | 
					
						
							|  |  |  | func (i *indexed_item) drop_index(entry *index_entry) { | 
					
						
							|  |  |  | 	for x := 0; x < len(i.indexed); x++ { | 
					
						
							|  |  |  | 		if i.indexed[x] != entry { | 
					
						
							|  |  |  | 			// Prof. Obiwan: | 
					
						
							|  |  |  | 			// this is not the index | 
					
						
							|  |  |  | 			// we are looking for. | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 19:44:22 +00:00
										 |  |  | 		// Unset tptr value to | 
					
						
							|  |  |  | 		// ensure GC can take it. | 
					
						
							|  |  |  | 		i.indexed[x] = nil | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-02 11:03:40 +01:00
										 |  |  | 		// Move all index entries down + reslice. | 
					
						
							| 
									
										
										
										
											2024-05-06 19:44:22 +00:00
										 |  |  | 		_ = copy(i.indexed[x:], i.indexed[x+1:]) | 
					
						
							| 
									
										
										
										
											2024-04-02 11:03:40 +01:00
										 |  |  | 		i.indexed = i.indexed[:len(i.indexed)-1] | 
					
						
							|  |  |  | 		break | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |