/*******************************************************************************
 * Copyright (c) 2009, 2019 STMicroelectronics and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation
 *******************************************************************************/
package org.eclipse.linuxtools.internal.gcov.parser;

import java.io.Serializable;
import java.util.List;

public class Arc implements Serializable{

    /**
     *
     */
    private static final long serialVersionUID = 4104429137191407662L;

    private static final int VCOV_ARC_ON_TREE = (1 << 0);
    private static final int VCOV_ARC_FAKE = (1 << 1);
    private static final int VCOV_ARC_FALLTHROUGH = (1 << 2);

    private final Block srcBlock;
    private final Block dstnatnBlock;
	private final int dstnatnBlockIndice;
    private final long flag;
    private final boolean fake;
    private final boolean onTree;
    private final boolean fallthrough;

    private long count = 0;
    private boolean countValid = false;
    private boolean isCallNonReturn = false; // Arc is for a function that abnormally returns
    private boolean isNonLoclaReturn = false; // Arc is for catch/setjump
    private boolean isUnconditionnal = false; // Is an unconditional branch.

    /**
     * Constructor
     */
    public Arc(int srcBlockIndice, int dstnatnBlockIndice, long flag, List<Block> otherArcParams) {
        this.flag = flag;
		this.dstnatnBlockIndice = dstnatnBlockIndice;
        this.dstnatnBlock = otherArcParams.get(dstnatnBlockIndice);
        this.srcBlock = otherArcParams.get(srcBlockIndice);
        this.count = 0;
        this.countValid = false;
        if ((flag & VCOV_ARC_ON_TREE) != 0) {
            onTree = true;
            fake = false;
            fallthrough = false;
        } else if ((flag & VCOV_ARC_FAKE) != 0) {
            onTree = false;
            fake = true;
            fallthrough = true;
        } else if ((flag & VCOV_ARC_FALLTHROUGH) != 0) {
            onTree = false;
            fake = false;
            fallthrough = true;
        } else {
            onTree = false;
            fake = false;
            fallthrough = false;
        }
    }

    public Block getDstnatnBlock() {
        return dstnatnBlock;
    }

	public int getDstnatnBlockIndice() {
		return dstnatnBlockIndice;
	}

    public long getFlag() {
        return flag;
    }

    public boolean isFake() {
        return fake;
    }

    public boolean isOnTree() {
        return onTree;
    }

    public boolean isFallthrough() {
        return fallthrough;
    }

    public boolean isUnconditionnal() {
        return isUnconditionnal;
    }

    public boolean isNonLoclaReturn() {
        return isNonLoclaReturn;
    }

    public boolean isCallNonReturn() {
        return isCallNonReturn;
    }

    public void setCallNonReturn(boolean isCallNonReturn) {
        this.isCallNonReturn = isCallNonReturn;
    }

    public void setNonLoclaReturn(boolean isNonLoclaReturn) {
        this.isNonLoclaReturn = isNonLoclaReturn;
    }

    public void setUnconditionnal(boolean isUnconditionnal) {
        this.isUnconditionnal = isUnconditionnal;
    }

    public Block getSrcBlock() {
        return srcBlock;
    }

    public void setCount(long count) {
        this.count = count;
    }

    public void setCountValid(boolean countValid) {
        this.countValid = countValid;
    }

    public long getCount() {
        return count;
    }

    public boolean isCountValid() {
        return countValid;
    }
}
