001package de.monochromata.anaphors.ast;
002
003import de.monochromata.anaphors.ast.relatedexp.RelatedExpression;
004import de.monochromata.anaphors.ast.relatedexp.strategy.RelatedExpressionStrategy;
005
006/**
007 * An default implementation of the {@link RelatedExpressionPart} interface.
008 *
009 * @param <N>  The node type in the AST
010 * @param <E>  The expression type
011 * @param <T>  The type type
012 * @param <B>  The binding type
013 * @param <VB> The variable binding type
014 * @param <TB> The type binding type
015 * @param <S>  The scope type (optional)
016 * @param <I>  The type used to represent identifiers
017 * @param <QI> The type used to represent qualified identifiers
018 * @param <R>  The sub-type of related expression to use
019 */
020public class DefaultRelatedExpressionPart<N, E, T, B, VB extends B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>>
021        implements RelatedExpressionPart<N, E, T, B, TB, S, I, QI, R> {
022
023    private final R relatedExpression;
024
025    /**
026     * Used in contract testing.
027     */
028    @SuppressWarnings("unused")
029    protected DefaultRelatedExpressionPart() {
030        this(null);
031    }
032
033    public DefaultRelatedExpressionPart(final R relatedExpression) {
034        this.relatedExpression = relatedExpression;
035    }
036
037    @Override
038    public R getRelatedExpression() {
039        return relatedExpression;
040    }
041
042    @Override
043    public RelatedExpressionStrategy<N, T, B, TB, S, QI, R> getRelatedExpressionStrategy() {
044        return relatedExpression.getStrategy();
045    }
046
047    @Override
048    public int hashCode() {
049        final int prime = 31;
050        int result = 1;
051        result = prime * result + ((relatedExpression == null) ? 0 : relatedExpression.hashCode());
052        return result;
053    }
054
055    @Override
056    public boolean equals(final Object obj) {
057        if (this == obj) {
058            return true;
059        }
060        if (obj == null) {
061            return false;
062        }
063        if (getClass() != obj.getClass()) {
064            return false;
065        }
066        final DefaultRelatedExpressionPart other = (DefaultRelatedExpressionPart) obj;
067        if (relatedExpression == null) {
068            if (other.relatedExpression != null) {
069                return false;
070            }
071        } else if (!relatedExpression.equals(other.relatedExpression)) {
072            return false;
073        }
074        return true;
075    }
076
077    @Override
078    public String toString() {
079        return "DefaultRelatedExpressionPart [relatedExpression=" + relatedExpression + "]";
080    }
081
082}