package de.axone.data.collections; import java.util.HashSet; import java.util.Set; public class DoubleLinkedMesh<T> { private T payload; private Set<DoubleLinkedMesh<T>> prev = new HashSet<DoubleLinkedMesh<T>>(); private Set<DoubleLinkedMesh<T>> next = new HashSet<DoubleLinkedMesh<T>>(); public T get(){ return payload; } public void put(T t){ this.payload = t; } public void addNext( DoubleLinkedMesh<T> mesh ){ mesh.prev.add( this ); next.add( mesh ); } public void remNext( DoubleLinkedMesh<T> mesh ){ mesh.prev.remove( this ); next.remove( mesh ); } public void remAllNext(){ for( DoubleLinkedMesh<T> mesh : next ){ mesh.prev.remove( this ); } next.clear(); } public void addPrev( DoubleLinkedMesh<T> mesh ){ mesh.next.add( this ); prev.add( mesh ); } public void remPrev( DoubleLinkedMesh<T> mesh ){ mesh.next.remove( this ); prev.remove( mesh ); } public void remAllPrev(){ for( DoubleLinkedMesh<T> mesh : prev ){ mesh.next.remove( this ); } prev.clear(); } public void insertBetween( DoubleLinkedMesh<T> prev, DoubleLinkedMesh<T> next ){ prev.remNext( next ); prev.addNext( this ); this.addNext( next ); } public void disconnect(){ remAllPrev(); remAllNext(); } public void resolve(){ for( DoubleLinkedMesh<T> prevMesh : prev ){ prevMesh.next.remove( this ); for( DoubleLinkedMesh<T> nextMesh : next ){ prevMesh.addNext( nextMesh ); } } for( DoubleLinkedMesh<T> nextMesh : next ){ nextMesh.prev.remove( this ); for( DoubleLinkedMesh<T> prevMesh : prev ){ nextMesh.addPrev( prevMesh ); } } } }