diff options
| author | y-jan137 <yousefjan24000@gmail.com> | 2026-04-27 07:24:41 +0300 |
|---|---|---|
| committer | y-jan137 <yousefjan24000@gmail.com> | 2026-04-27 07:24:41 +0300 |
| commit | 4602b36e9d5ea08656e3222846a1f161bbb1cec1 (patch) | |
| tree | 87618f154f7ebe91657ba1501d695d45a31e7881 /src/vector.cpp | |
| parent | b8bc28c70a6f2b0e7de81e85a796303d514df008 (diff) | |
Module refactor
Diffstat (limited to 'src/vector.cpp')
| -rw-r--r-- | src/vector.cpp | 59 |
1 files changed, 49 insertions, 10 deletions
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 <algorithm> -#include <numeric> -#include <sstream> -#include <stdexcept> +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<double> 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<double> 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 |