Package sizzle.types

Source Code of sizzle.types.SizzleArray

package sizzle.types;

import sizzle.compiler.TypeException;

/**
* A {@link SizzleType} representing an array of scalar values.
*
* @author anthonyu
*
*/
public class SizzleArray extends SizzleType {
  private SizzleType type;

  /**
   * Construct a SizzleArray.
   */
  public SizzleArray() {
  }

  /**
   * Construct a SizzleArray.
   *
   * @param sizzleType
   *            A {@link SizzleType} representing the type of the elements in
   *            this array
   */
  public SizzleArray(final SizzleType sizzleType) {
    this.type = sizzleType;
  }

  /** {@inheritDoc} */
  @Override
  public boolean assigns(final SizzleType that) {
    // if that is a function, check its return type
    if (that instanceof SizzleFunction)
      return this.assigns(((SizzleFunction) that).getType());

    // otherwise, if it's not an array, forget it
    if (!(that instanceof SizzleArray))
      return false;

    // if the element types are wrong, forget it
    if (this.type.assigns(((SizzleArray) that).type))
      return true;

    return false;
  }

  /** {@inheritDoc} */
  @Override
  public boolean accepts(final SizzleType that) {
    // if that is a function, check its return type
    if (that instanceof SizzleFunction)
      return this.assigns(((SizzleFunction) that).getType());

    // otherwise, if it's not an array, forget it
    if (!(that instanceof SizzleArray))
      return false;

    // if the element types are wrong, forget it
    if (this.type.accepts(((SizzleArray) that).type))
      return true;

    return false;
  }

  /** {@inheritDoc} */
  @Override
  public boolean compares(final SizzleType that) {
    // FIXME: is this needed?
    // if that is an array..
    if (that instanceof SizzleArray)
      // check against the element types of these arrays
      return this.type.compares(((SizzleArray) that).type);

    // otherwise, forget it
    return false;
  }

  /**
   * Get the element type of this array.
   *
   * @return A {@link SizzleScalar} representing the element type of this
   *         array
   */
  public SizzleScalar getType() {
    if (this.type instanceof SizzleScalar)
      return (SizzleScalar) this.type;

    throw new TypeException("this shouldn't happen");
  }

  /**
   * Set the element type of this array.
   *
   * @param type
   *            A {@link SizzleScalar} representing the element type of this
   *            array
   */
  public void setType(final SizzleScalar type) {
    this.type = type;
  }

  /** {@inheritDoc} */
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (this.type == null ? 0 : this.type.hashCode());
    return result;
  }

  /** {@inheritDoc} */
  @Override
  public boolean equals(final Object obj) {
    if (this == obj)
      return true;

    if (!super.equals(obj))
      return false;

    if (this.getClass() != obj.getClass())
      return false;

    final SizzleArray other = (SizzleArray) obj;

    if (this.type == null) {
      if (other.type != null)
        return false;
    } else if (!this.type.equals(other.type))
      return false;

    return true;
  }

  /** {@inheritDoc} */
  @Override
  public String toJavaType() {
    return this.type.toJavaType() + "[]";
  }

  /** {@inheritDoc} */
  @Override
  public String toString() {
    if (this.type == null)
      return "array of none";
    else
      return "array of " + this.type.toString();
  }
}
TOP

Related Classes of sizzle.types.SizzleArray

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.