WaSH Docs
vector.hpp
1 #pragma once
2 
3 #include <array>
4 #include <cmath>
5 #include <initializer_list>
6 #include <iostream>
7 #include <memory>
8 #include <ostream>
9 #include <string>
10 
11 // DIM is the compile-time flag for the dimensionality of the simulation, dictating
12 // the dimensionality of the vector to use. If it's not defined as a flag, we default
13 // it to 2 here.
14 #ifndef DIM
15 #define DIM 2
16 #endif
17 
18 namespace wash {
19 
26  template <typename T, int dim>
37  class Vec {
38  public:
39  // static int dim = dim;
40 
41  // Underlying data for the vector
42  std::array<T, dim> data;
43 
44  T& operator[](int i) {
45  return data[i];
46  }
47 
48  const T& operator[](int i) const {
49  return data[i];
50  }
51 
52  // Scalar addition (broadcast a T to all components)
53  Vec<T, dim> operator+(T d) {
54  Vec<T, dim> v;
55  for (int i = 0; i < dim; i++) {
56  v[i] = data[i] + d;
57  }
58  return v;
59  }
60 
61  // Elementwise vector addition
62  Vec<T, dim> operator+(Vec<T, dim> v) {
63  Vec<T, dim> vp;
64  for (int i = 0; i < dim; i++) {
65  vp[i] = data[i] + v[i];
66  }
67  return vp;
68  }
69 
70  // Elementwise vector addition
71  void operator+=(Vec<T, dim> v) {
72  for (int i = 0; i < dim; i++) {
73  data[i] += v[i];
74  }
75  }
76 
77  // Elementwise vector subtraction
78  Vec<T, dim> operator-(Vec<T, dim> v) const {
79  Vec<T, dim> vp;
80  for (int i = 0; i < dim; i++) {
81  vp[i] = data[i] - v[i];
82  }
83  return vp;
84  }
85 
86  // Scalar division
87  Vec<T, dim> operator/(T d) {
88  Vec<T, dim> v;
89  for (int i = 0; i < dim; i++) {
90  v[i] = data[i] / d;
91  }
92  return v;
93  }
94 
95  // Scalar multiplication
96  Vec<T, dim> operator*(T d) {
97  Vec<T, dim> v;
98  for (int i = 0; i < dim; i++) {
99  v[i] = data[i] * d;
100  }
101  return v;
102  }
103 
104  T magnitude() {
105  T sum = T(0);
106  for (int i = 0; i < dim; i++) {
107  sum += data[i] * data[i];
108  }
109  return std::sqrt(sum);
110  }
111 
112  T at(const size_t i) const { return data.at(i); }
113 
114  Vec<T, dim> abs() const {
115  auto vec = Vec<T, dim>();
116  for (size_t i = 0; i < dim; i++) {
117  vec[i] = std::abs(data[i]);
118  }
119 
120  return vec;
121  }
122  };
123 
125 
126  typedef Vec<double, 2> Vec2D;
127  typedef Vec<double, 3> Vec3D;
128 }
129 
130 template <typename T, int dim>
131 std::ostream& operator<<(std::ostream& s, const wash::Vec<T, dim>& vec) {
132  s << std::string("vector [");
133  for (int i = 0; i < dim; i++) {
134  s << vec.at(i);
135  if (i < dim - 1)
136  s << std::string(", ");
137  }
138  s << std::string("]");
139  return s;
140 };
141 
142 template <typename T, int dim>
143 wash::Vec<T, dim> operator*(const wash::Vec<T, dim> vec, const double d) {
145  for (int i = 0; i < dim; i++) {
146  v[i] = vec[i] * d;
147  }
148  return v;
149 }
Custom vector class for WaSH simulation.
Definition: vector.hpp:37
TODO: Consider having this as a private header in WISB/WS2ST/etc implementations. ...
Definition: ascii.hpp:5