package parser.ServletParser.library;

/** 이 클래스는 특정 클래스에 소속된 멤버 함수들의 리스트를 관리한다.
 */
public final
class MethodList extends List 
{
	/** 버전 제어를 위한 시리얼 넘버이다.
	 */
	public static final long serialVersionUID = -7847094760243475948L;
	/** 생성자이다.
	 */
	public MethodList() {
		super();
	}
	/** return type을 모르는 상태에서 인자 갯수만을 이용하여 메소드 정보를 찾는 함수이다.
	 */
	public MethodInfoNode findMethodInfoNArgNoReturnType(String functionName,StringList argTypes) {
		MethodInfoNode node = getFirst();
		while (node != null) {
			if (node.matchesNArgNoReturnType(functionName,argTypes) == true) {
				return node;
			}
			node = getNext(); 
		}
		return null;
	}
	/** return type을 모르는 상태에서 정확한 메소드 정보를 찾는 함수이다.
	 */
	public MethodInfoNode findExactMethodInfoNoReturnType(String functionName,StringList argTypes) {
		MethodInfoNode node = getFirst();
		while (node != null) {
			if (node.exactMatchesNoReturnType(functionName,argTypes) == true) {
				return node;
			}
			node = getNext(); 
		}
		return null;
	}
	/** 이 리스트에서 메소드 정보를 찾는 함수이다.
	 */
	public MethodInfoNode findMethodInfo(String signature) {
		MethodInfoNode node = getFirst();
		while (node != null) {
			if (node.getAsTreeNodeString().equals(signature) == true) {
				return node;
			}
			node = getNext(); 
		}
		return null;
	}
	/** 이 리스트에서 메소드 정보를 찾는 함수이다.
	 */
	public MethodInfoNode findMethodInfo(String name,StringList argTypes) {
		MethodInfoNode node = getFirst();
		while (node != null) {
			if (node.exactMatches(name,null,argTypes) == true) {
				return node;
			}
			node = getNext(); 
		}
		return null;
	}
	/** 이 리스트에서 메소드 정보를 찾는 함수이다.
	 */
	public MethodInfoNode findMethodInfo(String name,String type,StringList argTypes) {
		MethodInfoNode node = getFirst();
		while (node != null) {
			if (node.exactMatches(name,type,argTypes) == true) {
				return node;
			}
			node = getNext(); 
		}
		return null;
	}
	/** 이 리스트의 마지막에 새로운 객체를 insert 하는 함수이다.
	 */
	public void insert(MethodInfoNode ptr,int tag) {
		super._insert((Object)ptr,tag);
	}
	/** 이 리스트의 마지막에 새로운 객체를 insert 하는 함수이다.
	 * 리스트에 이미 객체가 있으면 insert 하지 않는다.
	 */
	public void insert(MethodInfoNode ptr) {
		insert(ptr,0);
	}
	/** 이 리스트에 객체가 존재하는지 확인하는 함수이다.
	 */
	public boolean inList(MethodInfoNode ptr) {
		return super._inList((Object)ptr);
	}
	/** 이 리스트로 부터 객체를 삭제하는 함수이다.
	 */
	public void remove(MethodInfoNode ptr) {
		super._remove((Object)ptr,0);
	}
	/** 이 리스트를 비우는 함수이다.
	 */
	public void clear() {
		super._clear();
	}
	/** 리스트의 객체들을 traverse 할 때 맨 첫번째 객체를 찾아오는 함수이다.
	 * 만약 리스트가 비어있게되면 null 값을 리턴한다.
	 */
	public MethodInfoNode getFirst() {
		return (MethodInfoNode)super._getFirst();
	}
	/** 리스트의 객체들을 반대 방향으로 traverse 하기위해 맨 마지막 객체를 찾아오는 함수이다.
	 * 만약 리스트가 비어있게되면 null 값을 리턴한다.
	 */
	public MethodInfoNode getLast() {
		return (MethodInfoNode)super._getLast();
	}
	/** 리스트의 객체들을 traverse 할 때 다음 객체를 찾아오는 함수이다.
	 * 만약 리스트의 끝에 도달하면 null 값을 리턴한다.
	 */
	public MethodInfoNode getNext() {
		return (MethodInfoNode)super._getNext();
	}
	/** 리스트의 객체들을 반대 방향으로 traverse 할 때 다음 객체를 찾아오는 함수이다.
	 * 만약 리스트의 앞에 도달하면 null 값을 리턴한다.
	 */
	public MethodInfoNode getPrevious() {
		return (MethodInfoNode)super._getPrevious();
	}
}
