about summary refs log tree commit diff
path: root/lang/cpptour/mycomplex.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lang/cpptour/mycomplex.cc')
-rw-r--r--lang/cpptour/mycomplex.cc67
1 files changed, 67 insertions, 0 deletions
diff --git a/lang/cpptour/mycomplex.cc b/lang/cpptour/mycomplex.cc
new file mode 100644
index 0000000..fade98f
--- /dev/null
+++ b/lang/cpptour/mycomplex.cc
@@ -0,0 +1,67 @@
+#include "mycomplex.h"
+
+constexpr double
+square (double x)
+{
+  return x * x;
+}
+
+complex&
+operator*= (complex& a, complex b)
+{
+  double r = a.real() * b.real() - a.imag() * b.imag();
+  double i = a.real() * b.imag() + a.imag() * b.real();
+  a.real(r);
+  a.imag(i);
+  return a;
+}
+
+complex&
+operator/= (complex& a, complex b)
+{
+  double d = square(b.real()) + square(b.imag());
+  complex c {b.real() / d, -b.imag() / d};
+  return a *= c;
+}
+
+complex
+operator+ (complex a, complex b)
+{
+  return a += b;
+}
+
+complex
+operator- (complex a, complex b)
+{
+  return a -= b;
+}
+
+complex
+operator- (complex a)
+{
+  return {-a.real(), -a.imag()};
+}
+
+complex
+operator* (complex a, complex b)
+{
+  return a *= b;
+}
+
+complex
+operator/ (complex a, complex b)
+{
+  return a /= b;
+}
+
+bool
+operator== (complex a, complex b)
+{
+  return a.real() == b.real() && a.imag() == b.imag();
+}
+
+bool
+operator!= (complex a, complex b)
+{
+  return !(a == b);
+}