package org.checkerframework.dataflow.cfg.block;

import java.util.Collections;
import java.util.Set;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.dataflow.analysis.Store.FlowRule;

/**
 * A basic block that has at most one successor. SpecialBlockImpl extends this, but exit blocks have
 * no successor.
 */
public abstract class SingleSuccessorBlockImpl extends BlockImpl implements SingleSuccessorBlock {

  /** Internal representation of the successor. */
  protected @Nullable BlockImpl successor;

  /**
   * The initial value for the rule below says that EACH store at the end of a single successor
   * block flows to the corresponding store of the successor.
   */
  protected FlowRule flowRule = FlowRule.EACH_TO_EACH;

  /**
   * Creates a new SingleSuccessorBlock.
   *
   * @param type the type of this basic block
   */
  protected SingleSuccessorBlockImpl(BlockType type) {
    super(type);
  }

  @Override
  public @Nullable Block getSuccessor() {
    return successor;
  }

  @Override
  public Set<Block> getSuccessors() {
    if (successor == null) {
      return Collections.emptySet();
    } else {
      return Collections.singleton(successor);
    }
  }

  /**
   * Set a basic block as the successor of this block.
   *
   * @param successor the block that will be the successor of this
   */
  public void setSuccessor(BlockImpl successor) {
    this.successor = successor;
    successor.addPredecessor(this);
  }

  @Override
  public FlowRule getFlowRule() {
    return flowRule;
  }

  @Override
  public void setFlowRule(FlowRule rule) {
    flowRule = rule;
  }
}
