package org.checkerframework.dataflow.cfg.block;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.checkerframework.dataflow.cfg.node.Node;

/**
 * Implementation of a regular basic block.
 *
 * @author Stefan Heule
 */
public class RegularBlockImpl extends SingleSuccessorBlockImpl implements RegularBlock {

    /** Internal representation of the contents. */
    protected List<Node> contents;

    /**
     * Initialize an empty basic block to be filled with contents and linked to other basic blocks
     * later.
     */
    public RegularBlockImpl() {
        contents = new LinkedList<>();
        type = BlockType.REGULAR_BLOCK;
    }

    /** Add a node to the contents of this basic block. */
    public void addNode(Node t) {
        contents.add(t);
        t.setBlock(this);
    }

    /** Add multiple nodes to the contents of this basic block. */
    public void addNodes(List<? extends Node> ts) {
        for (Node t : ts) {
            addNode(t);
        }
    }

    @Override
    public List<Node> getContents() {
        return Collections.unmodifiableList(contents);
    }

    @Override
    public BlockImpl getRegularSuccessor() {
        return successor;
    }

    @Override
    public String toString() {
        return "RegularBlock(" + contents + ")";
    }

    @Override
    public boolean isEmpty() {
        return contents.isEmpty();
    }
}
