package routing

import (
	
	
)

type pointerSnapshot[ any] struct {
	pointer *
	value   
}

func snapshotPointer[ any]( *) pointerSnapshot[] {
	if  == nil {
		return pointerSnapshot[]{}
	}
	return pointerSnapshot[]{pointer: , value: *}
}

func ( pointerSnapshot[]) () * {
	if .pointer == nil {
		return nil
	}
	*.pointer = .value
	return .pointer
}

type exactSliceSnapshot[ ~[],  any] struct {
	original 
	backing  []
}

func ( exactSliceSnapshot[, ]) ()  {
	if .original == nil {
		return nil
	}
	copy(.original[:cap(.original)], .backing)
	return .original
}

type edgeSnapshot struct {
	value layoutgraph.Edge

	d2ID                 pointerSnapshot[string]
	points               exactSliceSnapshot[[]*geo.Point, *geo.Point]
	pointValues          []pointerSnapshot[geo.Point]
	label                pointerSnapshot[layoutgraph.Label]
	sourceArrowheadLabel pointerSnapshot[layoutgraph.Label]
	targetArrowheadLabel pointerSnapshot[layoutgraph.Label]
	fromTableColumnIndex pointerSnapshot[int]
	toTableColumnIndex   pointerSnapshot[int]
}

func ( edgeSnapshot) ( *layoutgraph.Edge) {
	.d2ID.restore()
	.label.restore()
	.sourceArrowheadLabel.restore()
	.targetArrowheadLabel.restore()
	.fromTableColumnIndex.restore()
	.toTableColumnIndex.restore()
	for ,  := range .pointValues {
		.restore()
	}
	 := .points.restore()

	* = .value
	.D2ID = .d2ID.pointer
	.Points = 
	.Label = .label.pointer
	.SourceArrowheadLabel = .sourceArrowheadLabel.pointer
	.TargetArrowheadLabel = .targetArrowheadLabel.pointer
	.FromTableColumnIndex = .fromTableColumnIndex.pointer
	.ToTableColumnIndex = .toTableColumnIndex.pointer
}