From 4602b36e9d5ea08656e3222846a1f161bbb1cec1 Mon Sep 17 00:00:00 2001 From: y-jan137 Date: Mon, 27 Apr 2026 07:24:41 +0300 Subject: Module refactor --- src/vector.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 10 deletions(-) (limited to 'src/vector.cpp') diff --git a/src/vector.cpp b/src/vector.cpp index 8c4a8c4..ed86f88 100644 --- a/src/vector.cpp +++ b/src/vector.cpp @@ -1,26 +1,65 @@ -#include "vector.hpp" -#include "linalg_error.hpp" +export module linalgebra:vector; +import std; +import :error; -#include -#include -#include -#include +export namespace linalgebra { -namespace linalg { +class Vector { +public: + Vector() = default; + explicit Vector(std::size_t n); + Vector(std::size_t n, double value); + Vector(std::initializer_list values); + + [[nodiscard]] std::size_t size() const noexcept; + [[nodiscard]] bool empty() const noexcept; + + double& operator[](std::size_t i); + const double& operator[](std::size_t i) const; + + void fill(double value); + + double* data() noexcept; + const double* data() const noexcept; + + auto begin() noexcept { return data_.begin(); } + auto end() noexcept { return data_.end(); } + auto begin() const noexcept { return data_.begin(); } + auto end() const noexcept { return data_.end(); } + auto cbegin() const noexcept { return data_.cbegin(); } + auto cend() const noexcept { return data_.cend(); } + +private: + void check_index(std::size_t i) const; + + std::vector data_; +}; + +Vector operator+(const Vector& lhs, const Vector& rhs); +Vector operator-(const Vector& lhs, const Vector& rhs); +Vector operator*(const Vector& v, double scalar); +Vector operator*(double scalar, const Vector& v); +Vector operator/(const Vector& v, double scalar); +double dot(const Vector& lhs, const Vector& rhs); + +} // namespace linalgebra namespace { -void check_same_size(const Vector& lhs, const Vector& rhs, const char* operation) { +void check_same_size(const linalgebra::Vector& lhs, const linalgebra::Vector& rhs, + const char* operation) { if (lhs.size() != rhs.size()) { std::ostringstream oss; oss << operation << " requires equal vector sizes, got " << lhs.size() << " and " << rhs.size(); - throw DimensionMismatchError(oss.str()); + throw linalgebra::DimensionMismatchError(oss.str()); } } } // namespace +namespace linalgebra { + Vector::Vector(std::size_t n) : data_(n) {} Vector::Vector(std::size_t n, double value) : data_(n, value) {} @@ -101,4 +140,4 @@ double dot(const Vector& lhs, const Vector& rhs) { return std::inner_product(lhs.begin(), lhs.end(), rhs.begin(), 0.0); } -} // namespace linalg +} // namespace linalgebra -- cgit v1.2.3