/**********************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.impl;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.core.resources.IResource;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraphNode;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.IControlFlowGraph;

/**
 * Implementation of a call graph node, which represents a user-defined
 * function
 *
 */
public class CallGraphNode implements ICallGraphNode {
	protected IResource resource_;
	protected String fileName_;
	protected String funcName_;
	protected IASTFunctionDefinition fdef_;
	protected List<ICallGraphNode> callers_;
	protected List<ICallGraphNode> callees_;
	protected boolean nested; //nested function declaration?
	protected IControlFlowGraph CFG_;
	
	/** next node in reverse-topological (bottom-up) order */
	protected ICallGraphNode botNext_;
	/** next node in topological (top-down) order */
	protected ICallGraphNode topNext_; 
	protected Hashtable<String,Object> attrs_;

	protected boolean recursive;
	
	public CallGraphNode(IResource resource, String filename, 
				String funcname, IASTFunctionDefinition fdef){
		resource_ = resource;
		fileName_ = filename;
		funcName_ = funcname;
		fdef_ = fdef;
		init();
	}
	
	public CallGraphNode(IResource resource, String filename, 
				IASTFunctionDefinition fdef){
		resource_ = resource;
		fileName_ = filename;
		fdef_ = fdef;
		funcName_ = getFuncName(fdef);	
		init();
	}
	
	private void init(){
		callers_ = new ArrayList<ICallGraphNode>();
		callees_ = new ArrayList<ICallGraphNode>();
		nested = false;
		CFG_ = null; 
		topNext_ = null;
		botNext_ = null;
		attrs_ = new Hashtable<String,Object>();
		recursive = false;
	}
	
	private String getFuncName(IASTFunctionDefinition fdef){
		IASTDeclarator fdecl = (IASTDeclarator)fdef.getDeclarator();
		return new String(((IASTName)fdecl.getName()).toCharArray());
	}
	
	public String getFuncName(){
		return funcName_;
	}
	
	public String getFileName(){
		return fileName_;
	}
	
	public IResource getResource(){
		return resource_;
	}
	
	public IASTFunctionDefinition getFuncDef(){
		return fdef_;
	}
	
	public boolean isNested(){
		return nested;
	}
	
	public List<ICallGraphNode> getCallers(){
		return callers_;
	}
	
	public void addCaller(ICallGraphNode caller){
		if(!callers_.contains(caller))
			callers_.add(caller);
	}
	
	public List<ICallGraphNode>	getCallees(){
		return callees_;
	}
	
	public void addCallee(ICallGraphNode callee){
		if(!callees_.contains(callee))
			callees_.add(callee);
	}
	/** Returns next node in reverse-topological (bottom-up) order */
	public ICallGraphNode botNext() {
		return botNext_;
	}

	public void setBotNext(ICallGraphNode node){
		botNext_ = node;
	}
	
	public IControlFlowGraph getCFG() {
		return CFG_;
	}
	/** Returns next node in topological (top-down) order */
	public ICallGraphNode topNext() {
		return topNext_;
	}

	public void setTopNext(ICallGraphNode node){
		topNext_ = node;
	}
	
	public void setCFG(IControlFlowGraph cfg) {
		CFG_ = cfg;
	}
	
	public void setAttr(String name, Object attr){
		attrs_.put(name, attr);
	}
	public Object getAttr(String name){
		return attrs_.get(name);
	}
	
	public void removeAttr(String name){
		attrs_.remove(name);
	}
	
	public void setRecursive(boolean val){
		recursive = val;
	}
	
	public boolean isRecursive(){
		return recursive;
	}

}
