X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=dev%2Fgraph-container.lisp;h=c856db0c918e46278c0932633f5923ad71e1e668;hb=1fe64e8b966450697100fae6ec35cc5688a88bd6;hp=afafddaaf55f3317b7c71043294f81395f630c07;hpb=65b29b990908dd664a3326096cdc78cb36a07162;p=cl-graph.git diff --git a/dev/graph-container.lisp b/dev/graph-container.lisp index afafdda..c856db0 100644 --- a/dev/graph-container.lisp +++ b/dev/graph-container.lisp @@ -9,7 +9,7 @@ DISCUSSION |# -(in-package metabang.graph) +(in-package #:metabang.graph) ;;; --------------------------------------------------------------------------- ;;; class defs @@ -20,7 +20,8 @@ DISCUSSION initial-contents-mixin basic-graph container-uses-nodes-mixin) - () + ((vertex-pair->edge (make-container 'simple-associative-container + :test #'equal) r)) (:default-initargs :vertex-class 'graph-container-vertex :directed-edge-class 'graph-container-directed-edge @@ -155,7 +156,8 @@ DISCUSSION (add-edge-to-vertex edge vertex-1)) (t (add-edge-to-vertex edge vertex-1) - (add-edge-to-vertex edge vertex-2)))) + (add-edge-to-vertex edge vertex-2))) + (push edge (item-at-1 (vertex-pair->edge graph) (cons vertex-1 vertex-2)))) edge) ;;; --------------------------------------------------------------------------- @@ -175,10 +177,14 @@ DISCUSSION (vertex-1 graph-container-vertex) (vertex-2 graph-container-vertex) &key error-if-not-found?) - (declare (ignore error-if-not-found?)) - (search-for-match (vertex-edges vertex-1) - (lambda (edge) - (eq vertex-2 (other-vertex edge vertex-1))))) + (multiple-value-bind (value found?) + (item-at-1 (vertex-pair->edge graph) + (cons vertex-1 vertex-2)) + (when (and error-if-not-found? + (not found?)) + (error 'graph-edge-not-found-error + :vertex-1 vertex-1 :vertex-2 vertex-1)) + (first value))) ;;; --------------------------------------------------------------------------- @@ -208,7 +214,6 @@ DISCUSSION ;;; --------------------------------------------------------------------------- - (defmethod find-edge ((graph graph-container) (edge graph-container-edge) &optional error-if-not-found?) (find-edge-between-vertexes @@ -218,12 +223,26 @@ DISCUSSION ;;; --------------------------------------------------------------------------- (defmethod delete-edge ((graph graph-container) (edge graph-container-edge)) - (delete-item (vertex-edges (vertex-1 edge)) edge) - (delete-item (vertex-edges (vertex-2 edge)) edge) + (let ((vertex-1 (vertex-1 edge)) + (vertex-2 (vertex-2 edge))) + (delete-item (vertex-edges vertex-1) edge) + (delete-item (vertex-edges vertex-2) edge) + (setf (item-at-1 (vertex-pair->edge graph) (cons vertex-1 vertex-2)) + (delete (cons vertex-1 vertex-2) + (item-at-1 (vertex-pair->edge graph) (cons vertex-1 vertex-2)) + :test #'equal))) edge) ;;; --------------------------------------------------------------------------- +(defmethod empty! :after ((graph graph-container)) + (empty! (vertex-pair->edge graph))) + + +;;; --------------------------------------------------------------------------- +;;; iteration +;;; --------------------------------------------------------------------------- + (defmethod iterate-edges ((graph graph-container) fn) (iterate-elements (graph-edges graph) fn)) @@ -312,7 +331,8 @@ DISCUSSION (values nil)) +;;; --------------------------------------------------------------------------- + +(defmethod edge-count ((graph graph-container)) + (size (graph-edges graph))) -;;; *************************************************************************** -;;; * End of File * -;;; *************************************************************************** \ No newline at end of file