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