/**
* Copyright (c) 2007 - 2009 OptXware Research and Development LLC.
* 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:
*   Daniel Varro - Initial API and implementation
*
* This file was generated automatically based upon the VTCL LPG Parser
* VTCLParser.g 
*/

package org.eclipse.viatra2.lpgparser.ast;

import lpg.lpgjavaruntime.*;

/**
 *<b>
 *<li>Rule 64:  PreconditionDefAST ::= precondition GraphPatternDefAST
 *</b>
 */
public class PreconditionDefAST0 extends ASTNode implements IPreconditionDefAST
{
    private GraphPatternDefAST _GraphPatternDefAST;

    public GraphPatternDefAST getGraphPatternDefAST() { return _GraphPatternDefAST; }

    public PreconditionDefAST0(IToken leftIToken, IToken rightIToken,
                               GraphPatternDefAST _GraphPatternDefAST)
    {
        super(leftIToken, rightIToken);

        this._GraphPatternDefAST = _GraphPatternDefAST;
        ((ASTNode) _GraphPatternDefAST).setParent(this);
        initialize();
    }

    public boolean equals(Object o)
    {
        if (o == this) return true;
        //
        // The supers call is not required for now because Ast nodes
        // can only extend the root Ast, AstToken and AstList and none
        // of these nodes contain children.
        //
        // if (! super.equals(o)) return false;
        //
        if (! (o instanceof PreconditionDefAST0)) return false;
        PreconditionDefAST0 other = (PreconditionDefAST0) o;
        if (! _GraphPatternDefAST.equals(other.getGraphPatternDefAST())) return false;
        return true;
    }

    public int hashCode()
    {
        int hash = 7;
        hash = hash * 31 + (getGraphPatternDefAST().hashCode());
        return hash;
    }

    public void accept(Visitor v) { v.visit(this); }
    public void accept(ArgumentVisitor v, Object o) { v.visit(this, o); }
    public Object accept(ResultVisitor v) { return v.visit(this); }
    public Object accept(ResultArgumentVisitor v, Object o) { return v.visit(this, o); }
}


