alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (NetworkBuilder.java)

This example Java source code file (NetworkBuilder.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

beta, configurablemutablenetwork, elementorder, mutablenetwork, networkbuilder, object, optional, suppresswarnings, the

The NetworkBuilder.java Java example source code

/*
 * Copyright (C) 2016 The Guava Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.common.graph;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.annotations.Beta;
import com.google.common.base.Optional;

/**
 * A builder for constructing instances of {@link Network} with user-defined properties.
 *
 * <p>A graph built by this class will have the following properties by default:
 * <ul>
 * <li>does not allow parallel edges
 * <li>allows self-loops
 * <li>orders {@code nodes()} and {@code edges()} in the order in which the elements were added
 * </ul>
 *
 * @author James Sexton
 * @author Joshua O'Madadhain
 * @since 20.0
 */
@Beta
public final class NetworkBuilder<N, E> {
  final boolean directed;
  boolean allowsParallelEdges = false;
  boolean allowsSelfLoops = true;
  ElementOrder<? super N> nodeOrder = ElementOrder.insertion();
  ElementOrder<? super E> edgeOrder = ElementOrder.insertion();
  Optional<Integer> expectedNodeCount = Optional.absent();
  Optional<Integer> expectedEdgeCount = Optional.absent();

  /**
   * Creates a new instance with the specified edge directionality.
   *
   * @param directed if true, creates an instance for graphs whose edges are each directed;
   *      if false, creates an instance for graphs whose edges are each undirected.
   */
  private NetworkBuilder(boolean directed) {
    this.directed = directed;
  }

  /**
   * Returns a {@link NetworkBuilder} for building directed graphs.
   */
  public static NetworkBuilder<Object, Object> directed() {
    return new NetworkBuilder<Object, Object>(true);
  }

  /**
   * Returns a {@link NetworkBuilder} for building undirected graphs.
   */
  public static NetworkBuilder<Object, Object> undirected() {
    return new NetworkBuilder<Object, Object>(false);
  }

  /**
   * Returns a {@link NetworkBuilder} initialized with all properties queryable from {@code graph}.
   *
   * <p>The "queryable" properties are those that are exposed through the {@link Network} interface,
   * such as {@link Network#isDirected()}. Other properties, such as
   * {@link #expectedNodeCount(int)}, are not set in the new builder.
   */
  public static <N, E> NetworkBuilder from(Network graph) {
    checkNotNull(graph);
    return new NetworkBuilder<Object, Object>(graph.isDirected())
        .allowsParallelEdges(graph.allowsParallelEdges())
        .allowsSelfLoops(graph.allowsSelfLoops())
        .nodeOrder(graph.nodeOrder())
        .edgeOrder(graph.edgeOrder())
        .cast();
  }

  /**
   * Specifies whether the graph will allow parallel edges. Attempting to add a parallel edge to
   * a graph that does not allow them will throw an {@link UnsupportedOperationException}.
   */
  public NetworkBuilder<N, E> allowsParallelEdges(boolean allowsParallelEdges) {
    this.allowsParallelEdges = allowsParallelEdges;
    return this;
  }

  /**
   * Specifies whether the graph will allow self-loops (edges that connect a node to itself).
   * Attempting to add a self-loop to a graph that does not allow them will throw an
   * {@link UnsupportedOperationException}.
   */
  public NetworkBuilder<N, E> allowsSelfLoops(boolean allowsSelfLoops) {
    this.allowsSelfLoops = allowsSelfLoops;
    return this;
  }

  /**
   * Specifies the expected number of nodes in the graph.
   *
   * @throws IllegalArgumentException if {@code expectedNodeCount} is negative
   */
  public NetworkBuilder<N, E> expectedNodeCount(int expectedNodeCount) {
    checkArgument(expectedNodeCount >= 0, "The expected number of nodes can't be negative: %s",
        expectedNodeCount);
    this.expectedNodeCount = Optional.of(expectedNodeCount);
    return this;
  }

  /**
   * Specifies the expected number of edges in the graph.
   *
   * @throws IllegalArgumentException if {@code expectedEdgeCount} is negative
   */
  public NetworkBuilder<N, E> expectedEdgeCount(int expectedEdgeCount) {
    checkArgument(expectedEdgeCount >= 0, "The expected number of edges can't be negative: %s",
        expectedEdgeCount);
    this.expectedEdgeCount = Optional.of(expectedEdgeCount);
    return this;
  }

  /**
   * Specifies the order of iteration for the elements of {@link Network#nodes()}.
   */
  public <N1 extends N> NetworkBuilder nodeOrder(ElementOrder nodeOrder) {
    checkNotNull(nodeOrder);
    NetworkBuilder<N1, E> newBuilder = cast();
    newBuilder.nodeOrder = nodeOrder;
    return newBuilder;
  }

  /**
   * Specifies the order of iteration for the elements of {@link Network#edges()}.
   */
  public <E1 extends E> NetworkBuilder edgeOrder(ElementOrder edgeOrder) {
    checkNotNull(edgeOrder);
    NetworkBuilder<N, E1> newBuilder = cast();
    newBuilder.edgeOrder = edgeOrder;
    return newBuilder;
  }

  /**
   * Returns an empty {@link MutableNetwork} with the properties of this {@link NetworkBuilder}.
   */
  public <N1 extends N, E1 extends E> MutableNetwork build() {
    return new ConfigurableMutableNetwork<N1, E1>(this);
  }

  @SuppressWarnings("unchecked")
  private <N1 extends N, E1 extends E> NetworkBuilder cast() {
    return (NetworkBuilder<N1, E1>) this;
  }
}

Other Java examples (source code examples)

Here is a short list of links related to this Java NetworkBuilder.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.