// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // @dart=2.9 class Complex { final double real; final double imaginary; const Complex(this.real, this.imaginary); Complex add(Complex other) { return new Complex(real + other.real, imaginary + other.imaginary); } Complex sub(Complex other) { return new Complex(real - other.real, imaginary - other.imaginary); } Complex negate() { return new Complex(-real, -imaginary); } int get hashCode => real.hashCode * 13 + imaginary.hashCode * 19; bool operator ==(Object other) { if (identical(this, other)) return true; return other is Complex && real == other.real && imaginary == other.imaginary; } String toString() => 'Complex($real,$imaginary)'; } extension Operators on Complex { Complex operator +(Complex other) => add(other); Complex operator -(Complex other) => sub(other); Complex operator -() => negate(); } main() { implicit(); explicit(); } implicit() { Complex c_m2 = new Complex(-2, 2); Complex c_m1 = new Complex(-1, 1); Complex c0 = new Complex(0, 0); Complex c1 = new Complex(1, -1); Complex c2 = new Complex(2, -2); expect(c_m2, c0 + c_m2); expect(c_m2, c_m2 + c0); expect(c_m2, c_m1 + c_m1); expect(c_m1, c0 + c_m1); expect(c_m1, c_m1 + c0); expect(c0, c_m2 + c2); expect(c0, c2 + c_m2); expect(c0, c_m1 + c1); expect(c0, c1 + c_m1); expect(c0, c0 + c0); expect(c1, c0 + c1); expect(c1, c1 + c0); expect(c2, c0 + c2); expect(c2, c2 + c0); expect(c2, c1 + c1); expect(c_m2, c0 - c2); expect(c2, c2 - c0); expect(c_m2, -c2); expect(c_m1, c1 - c2); expect(c1, c2 - c1); expect(c_m1, c0 - c1); expect(c1, c1 - c0); expect(c_m1, -c1); expect(c0, c2 - c2); expect(c0, c1 - c1); expect(c0, c0 - c0); expect(c0, c_m1 - c_m1); expect(c0, c_m2 - c_m2); expect(c0, -c0); } explicit() { Complex c_m2 = new Complex(-2, 2); Complex c_m1 = new Complex(-1, 1); Complex c0 = new Complex(0, 0); Complex c1 = new Complex(1, -1); Complex c2 = new Complex(2, -2); expect(c_m2, Operators(c0) + c_m2); expect(c_m2, Operators(c_m2) + c0); expect(c_m2, Operators(c_m1) + c_m1); expect(c_m1, Operators(c0) + c_m1); expect(c_m1, Operators(c_m1) + c0); expect(c0, Operators(c_m2) + c2); expect(c0, Operators(c2) + c_m2); expect(c0, Operators(c_m1) + c1); expect(c0, Operators(c1) + c_m1); expect(c0, Operators(c0) + c0); expect(c1, Operators(c0) + c1); expect(c1, Operators(c1) + c0); expect(c2, Operators(c0) + c2); expect(c2, Operators(c2) + c0); expect(c2, Operators(c1) + c1); expect(c_m2, Operators(c0) - c2); expect(c2, Operators(c2) - c0); expect(c_m2, -Operators(c2)); expect(c_m1, Operators(c1) - c2); expect(c1, Operators(c2) - c1); expect(c_m1, Operators(c0) - c1); expect(c1, Operators(c1) - c0); expect(c_m1, -Operators(c1)); expect(c0, Operators(c2) - c2); expect(c0, Operators(c1) - c1); expect(c0, Operators(c0) - c0); expect(c0, Operators(c_m1) - c_m1); expect(c0, Operators(c_m2) - c_m2); expect(c0, -c0); } void errors(Complex c) { Operators(c) == c; Operators(c) != c; } expect(expected, actual) { if (expected != actual) { throw 'Mismatch: expected=$expected, actual=$actual'; } }