summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com>2025-04-24 11:02:23 -0400
committerSiddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com>2025-04-24 11:02:23 -0400
commit73633535288711de4850b9d9eec6326eb5de06c0 (patch)
tree9897c058f808e06f1ab3a71bc988d07d72cbb60e
parent8e33ba4499bced747f66ed436211876d220342d6 (diff)
Template files for vectors to override arithmetic operations
-rw-r--r--inc/vec.h44
-rw-r--r--src/vec.cc113
2 files changed, 157 insertions, 0 deletions
diff --git a/inc/vec.h b/inc/vec.h
new file mode 100644
index 0000000..68482d5
--- /dev/null
+++ b/inc/vec.h
@@ -0,0 +1,44 @@
+// vec.h
+#ifndef VEC_H
+#define VEC_H
+
+#include <iostream>
+#include <vector>
+#include <stdexcept>
+
+template<typename T>
+class Vec {
+private:
+ std::vector<T> data;
+
+public:
+ Vec() = default;
+ Vec(const std::vector<T>& values) : data(values) {}
+
+ // Vector-Vector Operations
+ Vec<T> operator+(const Vec<T>& other) const;
+ Vec<T> operator-(const Vec<T>& other) const;
+ Vec<T> operator*(const Vec<T>& other) const;
+ Vec<T> operator/(const Vec<T>& other) const;
+ Vec<T> operator%(const Vec<T>& other) const;
+
+ // Vector-Scalar Operations
+ Vec<T> operator+(T scalar) const;
+ Vec<T> operator-(T scalar) const;
+ Vec<T> operator*(T scalar) const;
+ Vec<T> operator/(T scalar) const;
+ Vec<T> operator%(T scalar) const;
+
+ // Utility
+ void print() const;
+ size_t size() const { return data.size(); }
+
+ // Friend scalar-vector operations
+ friend Vec<T> operator+(T scalar, const Vec<T>& vec) { return vec + scalar; }
+ friend Vec<T> operator-(T scalar, const Vec<T>& vec);
+ friend Vec<T> operator*(T scalar, const Vec<T>& vec) { return vec * scalar; }
+ friend Vec<T> operator/(T scalar, const Vec<T>& vec);
+ friend Vec<T> operator%(T scalar, const Vec<T>& vec);
+};
+
+#endif
diff --git a/src/vec.cc b/src/vec.cc
new file mode 100644
index 0000000..e3e0a6c
--- /dev/null
+++ b/src/vec.cc
@@ -0,0 +1,113 @@
+#include "vec.h"
+
+template<typename T>
+Vec<T> Vec<T>::operator+(const Vec<T>& other) const {
+ if (data.size() != other.data.size()) throw std::invalid_argument("Size mismatch");
+ Vec<T> result;
+ for (size_t i = 0; i < data.size(); ++i)
+ result.data.push_back(data[i] + other.data[i]);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator-(const Vec<T>& other) const {
+ if (data.size() != other.data.size()) throw std::invalid_argument("Size mismatch");
+ Vec<T> result;
+ for (size_t i = 0; i < data.size(); ++i)
+ result.data.push_back(data[i] - other.data[i]);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator*(const Vec<T>& other) const {
+ if (data.size() != other.data.size()) throw std::invalid_argument("Size mismatch");
+ Vec<T> result;
+ for (size_t i = 0; i < data.size(); ++i)
+ result.data.push_back(data[i] * other.data[i]);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator/(const Vec<T>& other) const {
+ if (data.size() != other.data.size()) throw std::invalid_argument("Size mismatch");
+ Vec<T> result;
+ for (size_t i = 0; i < data.size(); ++i)
+ result.data.push_back(other.data[i] == 0 ? 0 : data[i] / other.data[i]);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator%(const Vec<T>& other) const {
+ if (data.size() != other.data.size()) throw std::invalid_argument("Size mismatch");
+ Vec<T> result;
+ for (size_t i = 0; i < data.size(); ++i)
+ result.data.push_back(other.data[i] == 0 ? 0 : data[i] % other.data[i]);
+ return result;
+}
+
+// Scalar versions
+template<typename T>
+Vec<T> Vec<T>::operator+(T scalar) const {
+ Vec<T> result;
+ for (const auto& val : data) result.data.push_back(val + scalar);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator-(T scalar) const {
+ Vec<T> result;
+ for (const auto& val : data) result.data.push_back(val - scalar);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator*(T scalar) const {
+ Vec<T> result;
+ for (const auto& val : data) result.data.push_back(val * scalar);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator/(T scalar) const {
+ Vec<T> result;
+ for (const auto& val : data) result.data.push_back(scalar == 0 ? 0 : val / scalar);
+ return result;
+}
+
+template<typename T>
+Vec<T> Vec<T>::operator%(T scalar) const {
+ Vec<T> result;
+ for (const auto& val : data) result.data.push_back(scalar == 0 ? 0 : val % scalar);
+ return result;
+}
+
+// Scalar - Vector versions
+template<typename T>
+Vec<T> operator-(T scalar, const Vec<T>& vec) {
+ Vec<T> result;
+ for (size_t i = 0; i < vec.size(); ++i)
+ result = result + (scalar - vec.data[i]);
+ return result;
+}
+
+template<typename T>
+Vec<T> operator/(T scalar, const Vec<T>& vec) {
+ Vec<T> result;
+ for (auto val : vec.data)
+ result = result + (val == 0 ? 0 : scalar / val);
+ return result;
+}
+
+template<typename T>
+Vec<T> operator%(T scalar, const Vec<T>& vec) {
+ Vec<T> result;
+ for (auto val : vec.data)
+ result = result + (val == 0 ? 0 : scalar % val);
+ return result;
+}
+
+template<typename T>
+void Vec<T>::print() const {
+ for (auto val : data) std::cout << val << " ";
+ std::cout << std::endl;
+}