correctly reparent edges when splitting internal node
This commit is contained in:
		
							parent
							
								
									c8864b7e02
								
							
						
					
					
						commit
						b190719970
					
				
							
								
								
									
										17
									
								
								src/main.zig
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/main.zig
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -3,8 +3,13 @@ const std = @import("std");
 | 
			
		|||
const BTree = struct {
 | 
			
		||||
    const Self = @This();
 | 
			
		||||
 | 
			
		||||
    const B: usize = 3;
 | 
			
		||||
    const B: usize = 4;
 | 
			
		||||
    // guaranteed to be odd, so can't insert into the middle of a full node
 | 
			
		||||
    // which would complicate splitting
 | 
			
		||||
    const CAPACITY: usize = 2 * B - 1;
 | 
			
		||||
    const MIN_AFTER_SPLIT: usize = B - 1;
 | 
			
		||||
    const E_LEFT_OF_CENTER: usize = B - 1;
 | 
			
		||||
    const E_RIGHT_OF_CENTER: usize = B;
 | 
			
		||||
    const NUM_EDGES: usize = 2 * B;
 | 
			
		||||
 | 
			
		||||
    ally: std.mem.Allocator = std.heap.c_allocator,
 | 
			
		||||
| 
						 | 
				
			
			@ -134,6 +139,12 @@ const BTree = struct {
 | 
			
		|||
                    const node = try Node.create(leaf.ally);
 | 
			
		||||
                    std.mem.copy(?NodeOrLeaf, &node.edges, internal.edges[B..]);
 | 
			
		||||
 | 
			
		||||
                    for (node.edges, 0..) |edge, i| {
 | 
			
		||||
                        if (edge) |edge_node| {
 | 
			
		||||
                            edge_node.as_leaf().parent = .{ .parent = node, .idx = @intCast(u16, i) };
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    new = node.as_leaf();
 | 
			
		||||
                },
 | 
			
		||||
                .leaf => {
 | 
			
		||||
| 
						 | 
				
			
			@ -212,7 +223,9 @@ const BTree = struct {
 | 
			
		|||
                                    leaf = child.as_leaf();
 | 
			
		||||
                                    // TODO: incredibly hacky I think..
 | 
			
		||||
                                    // gotta figure out WHERE this would even happen..
 | 
			
		||||
                                    leaf.parent = .{ .parent = internal, .idx = edge.idx };
 | 
			
		||||
                                    // leaf.parent = .{ .parent = internal, .idx = edge.idx };
 | 
			
		||||
                                    // it happened when splitting nodes, and not reparenting
 | 
			
		||||
                                    // the split-off edges :|
 | 
			
		||||
                                    continue;
 | 
			
		||||
                                }
 | 
			
		||||
                            },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue