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.graph.implementations;
033
034import org.graphstream.graph.Graph;
035import org.graphstream.graph.NodeFactory;
036
037/**
038 * A graph implementation that supports multiple edges between two nodes.
039 */
040
041public class MultiGraph extends AdjacencyListGraph {
042
043        /**
044         * Creates an empty graph.
045         * 
046         * @param id
047         *            Unique identifier of the graph.
048         * @param strictChecking
049         *            If true any non-fatal error throws an exception.
050         * @param autoCreate
051         *            If true (and strict checking is false), nodes are
052         *            automatically created when referenced when creating a edge,
053         *            even if not yet inserted in the graph.
054         * @param initialNodeCapacity
055         *            Initial capacity of the node storage data structures. Use this
056         *            if you know the approximate maximum number of nodes of the
057         *            graph. The graph can grow beyond this limit, but storage
058         *            reallocation is expensive operation.
059         * @param initialEdgeCapacity
060         *            Initial capacity of the edge storage data structures. Use this
061         *            if you know the approximate maximum number of edges of the
062         *            graph. The graph can grow beyond this limit, but storage
063         *            reallocation is expensive operation.
064         */
065        public MultiGraph(String id, boolean strictChecking, boolean autoCreate,
066                        int initialNodeCapacity, int initialEdgeCapacity) {
067                super(id, strictChecking, autoCreate, initialNodeCapacity,
068                                initialEdgeCapacity);
069                // All we need to do is to change the node factory
070                setNodeFactory(new NodeFactory<MultiNode>() {
071                        public MultiNode newInstance(String id, Graph graph) {
072                                return new MultiNode((AbstractGraph) graph, id);
073                        }
074                });
075        }
076
077        /**
078         * Creates an empty graph with default edge and node capacity.
079         * 
080         * @param id
081         *            Unique identifier of the graph.
082         * @param strictChecking
083         *            If true any non-fatal error throws an exception.
084         * @param autoCreate
085         *            If true (and strict checking is false), nodes are
086         *            automatically created when referenced when creating a edge,
087         *            even if not yet inserted in the graph.
088         */
089        public MultiGraph(String id, boolean strictChecking, boolean autoCreate) {
090                this(id, strictChecking, autoCreate, DEFAULT_NODE_CAPACITY,
091                                DEFAULT_EDGE_CAPACITY);
092        }
093
094        /**
095         * Creates an empty graph with strict checking and without auto-creation.
096         * 
097         * @param id
098         *            Unique identifier of the graph.
099         */
100        public MultiGraph(String id) {
101                this(id, true, false);
102        }
103}