evaluate method

  1. @override
dynamic evaluate(
  1. EvaluationType type,
  2. ContextModel context
)
override

Evaluates this expression according to given type and context.

Implementation

@override
dynamic evaluate(EvaluationType type, ContextModel context) {
  if (type == EvaluationType.VECTOR) {
    // XXX Support for vectors in vectors
    final EvaluationType elementType = EvaluationType.REAL;

    if (length == 1) {
      // Does not seem to be a vector, try to return REAL.
      return elements[0].evaluate(elementType, context);
    }

    // Interpret vector elements as REAL.
    if (length == 2) {
      double x, y;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      return Vector2(x, y);
    }

    if (length == 3) {
      double x, y, z;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      z = elements[2].evaluate(elementType, context);
      return Vector3(x, y, z);
    }

    if (length == 4) {
      double x, y, z, w;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      z = elements[2].evaluate(elementType, context);
      w = elements[3].evaluate(elementType, context);
      return Vector4(x, y, z, w);
    }

    if (length > 4) {
      throw UnimplementedError(
          'Vector of arbitrary length (> 4) are not supported yet.');
    }
  }

  if (type == EvaluationType.REAL && length == 1) {
    // Interpret vector as real number.
    return elements[0].evaluate(type, context);
  }

  throw UnsupportedError(
      'Vector $this with length $length can not be interpreted as: $type');
}