001/* 002 * Copyright 2006 - 2013 003 * Stefan Balev <stefan.balev@graphstream-project.org> 004 * Julien Baudry <julien.baudry@graphstream-project.org> 005 * Antoine Dutot <antoine.dutot@graphstream-project.org> 006 * Yoann Pigné <yoann.pigne@graphstream-project.org> 007 * Guilhelm Savin <guilhelm.savin@graphstream-project.org> 008 * 009 * This file is part of GraphStream <http://graphstream-project.org>. 010 * 011 * GraphStream is a library whose purpose is to handle static or dynamic 012 * graph, create them from scratch, file or any source and display them. 013 * 014 * This program is free software distributed under the terms of two licenses, the 015 * CeCILL-C license that fits European law, and the GNU Lesser General Public 016 * License. You can use, modify and/ or redistribute the software under the terms 017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following 018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by 019 * the Free Software Foundation, either version 3 of the License, or (at your 020 * option) any later version. 021 * 022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY 023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 024 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 025 * 026 * You should have received a copy of the GNU Lesser General Public License 027 * along with this program. If not, see <http://www.gnu.org/licenses/>. 028 * 029 * The fact that you are presently reading this means that you have had 030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms. 031 */ 032package org.graphstream.algorithm; 033 034import java.util.Iterator; 035 036import org.graphstream.graph.Edge; 037import org.graphstream.graph.Graph; 038 039/** 040 * This interface defines the basic functionalities of a spanning tree algorithm. 041 * 042 * <p> It defines methods related to tagging the edges of the spanning tree and for iterating on them.</p> 043 */ 044public interface SpanningTree extends Algorithm { 045 /** 046 * Get key attribute which will be used to set if edges are in the spanning 047 * tree, or not. 048 * 049 * @return flag attribute 050 */ 051 String getFlagAttribute(); 052 053 /** 054 * Set the flag attribute. 055 * 056 * @param flagAttribute 057 * New attribute used. If {@code null} edges are not tagged. 058 * @throws IllegalStateException 059 * if {@link #init(Graph)} is already called 060 */ 061 void setFlagAttribute(String flagAttribute); 062 063 /** 064 * Get value used to set that an edge is in the spanning tree. 065 * 066 * @return on value 067 */ 068 Object getFlagOn(); 069 070 /** 071 * Set value used to set that an edge is in the spanning tree. 072 * 073 * @param flagOn 074 * on value. If {@code null} edges in the tree are not tagged. 075 * @throws IllegalStateException 076 * if {@link #init(Graph)} is already called 077 */ 078 void setFlagOn(Object flagOn); 079 080 /** 081 * Get value used to set that an edge is not in the spanning tree. 082 * 083 * @return off value 084 */ 085 Object getFlagOff(); 086 087 088 /** 089 * Set value used to set that an edge is not in the spanning tree. 090 * 091 * @param newFlagOff 092 * off value. If {@code null} edges out of the tree are not 093 * tagged. 094 * @throws IllegalStateException 095 * if {@link #init(Graph)} is already called 096 */ 097 void setFlagOff(Object flagOff); 098 099 /** 100 * Removes the tags of all edges. Use this method to save memory if the 101 * spanning tree is used no more. 102 */ 103 void clear(); 104 105 /** 106 * An iterator on the tree edges. 107 * 108 * @return An iterator on the tree edges 109 */ 110 <T extends Edge> Iterator<T> getTreeEdgesIterator(); 111 112 113 /** 114 * Iterable view of the spanning tree edges. This implementation uses 115 * {@link #getTreeEdgesIterator()}. 116 * 117 * @return Iterable view of the tree edges. 118 */ 119 <T extends Edge> Iterable<T> getTreeEdges(); 120}