/*******************************************************************************
 * Copyright (c) 2009, 2018 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.gprof.symbolManager;

import java.util.LinkedList;

import org.eclipse.cdt.core.IBinaryParser.ISymbol;

/**
 * This class represents a node of a call graph
 *
 * @author Xavier Raynaud <xavier.raynaud@st.com>
 */
public class CallGraphNode {

    private final ISymbol symbol;
    private final LinkedList<CallGraphArc> parents = new LinkedList<>();
    private final LinkedList<CallGraphArc> children = new LinkedList<>();

    /**
     * Constructor
     *
     * @param symbol
     */
    public CallGraphNode(ISymbol symbol) {
        this.symbol = symbol;
    }

    /**
     * @param parent
     * @return the input arc caming from the given parent, if any.
     */
    public CallGraphArc getInputArc(CallGraphNode parent) {
        for (CallGraphArc inputArc : parents) {
            if (inputArc.parent == parent) {
                return inputArc;
            }
        }
        return null;
    }

    /**
     *
     * @param child
     * @return the arc to the given child, if any.
     */
    public CallGraphArc getOutputArc(CallGraphNode child) {
        for (CallGraphArc outputArc : children) {
            if (outputArc.child == child) {
                return outputArc;
            }
        }
        return null;
    }

    /**
     * @return the symbol
     */
    public ISymbol getSymbol() {
        return symbol;
    }

    /**
     * @return the parents
     */
    public LinkedList<CallGraphArc> getParents() {
        return parents;
    }

    /**
     * @return the children
     */
    public LinkedList<CallGraphArc> getChildren() {
        return children;
    }

    /**
     * Print on System.out, for debugging purpose
     */
    public void print() {
        System.out.println(this.symbol.getName());
        System.out.println(" -- parents --"); //$NON-NLS-1$
        for (CallGraphArc arc : this.parents) {
            arc.print();
        }
        System.out.println(" -- children --"); //$NON-NLS-1$
        for (CallGraphArc arc : this.children) {
            arc.print();
        }
    }

    /**
     * @return the total calls for this function
     */
    public int getCalls() {
        int ret = 0;
        for (CallGraphArc arc : this.parents) {
            ret += arc.getCount();
        }
        return ret;
    }

}
