4#ifndef _Stroika_Foundation_Math_LinearAlgebra_Vector_h_
5#define _Stroika_Foundation_Math_LinearAlgebra_Vector_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
10#include "Stroika/Foundation/Containers/Sequence.h"
20#define Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION 1
21#ifndef Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
22#define Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION 0
25namespace Stroika::Foundation::Math::LinearAlgebra {
34 Vector (
size_t dimension);
35 Vector (
size_t dimension, Common::ArgByValueType<T> fillValue);
36 Vector (
size_t dimension,
const function<T ()>& filler);
37 template <Traversal::IIterableOfTo<T> CONTAINER_OF_T>
38 Vector (
const CONTAINER_OF_T& c);
40#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
45 nonvirtual
void Fill (T value);
46 nonvirtual
void Fill (function<T ()> filler);
52 nonvirtual
size_t GetDimension ()
const;
58 nonvirtual Vector<T>
Transform (
const function<T (T)>& f)
const;
64 nonvirtual T Norm ()
const;
69 nonvirtual Containers::Sequence<T> GetItems ()
const;
71#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
75 template <
typename CONTAINER>
76 nonvirtual
void SetItems (
const CONTAINER& s);
82 nonvirtual T GetAt (
size_t i)
const;
84#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
88 nonvirtual
void SetAt (
size_t i, Common::ArgByValueType<T> v);
94 nonvirtual T operator[] (
size_t i)
const;
96#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
104 fV.SetAt (fIndex, fValue);
115 nonvirtual TMP_ operator[] (
size_t i)
117 return TMP_{*
this, i, GetAt (i)};
122 nonvirtual Characters::String
ToString ()
const;
128 Memory::SharedByValue<IRep_> fRep_;
131 template <
typename T>
132 Vector<T> operator* (T lhs,
const Vector<T>& rhs)
135 for (
const auto& i : rhs.GetItems ()) {
136 tmp.push_back (lhs * i);
140 template <
typename T>
141 Vector<T> operator* (
const Vector<T>& lhs, T rhs)
144 for (
const auto& i : lhs.GetItems ()) {
145 tmp.push_back (i * rhs);
150 template <
typename T>
151 Vector<T> operator+ (
const Vector<T>& lhs,
const Vector<T>& rhs)
153 Require (lhs.GetDimension () == rhs.GetDimension ());
155 for (
size_t i = 0; i < lhs.GetDimension (); ++i) {
156 tmp.push_back (lhs[i] + rhs[i]);
160 template <
typename T>
161 Vector<T> operator+ (T lhs,
const Vector<T>& rhs)
164 for (
const auto& i : rhs.GetItems ()) {
165 tmp.push_back (lhs + i);
169 template <
typename T>
170 Vector<T> operator+ (
const Vector<T>& lhs, T rhs)
173 for (
const auto& i : lhs.GetItems ()) {
174 tmp.push_back (i + rhs);
179 template <
typename T>
180 Vector<T> operator- (
const Vector<T>& lhs,
const Vector<T>& rhs)
182 Require (lhs.GetDimension () == rhs.GetDimension ());
184 for (
size_t i = 0; i < lhs.GetDimension (); ++i) {
185 tmp.push_back (lhs[i] - rhs[i]);
189 template <
typename T>
190 Vector<T> operator- (T lhs,
const Vector<T>& rhs)
193 for (
const T& i : rhs.GetItems ()) {
194 tmp.push_back (lhs - i);
198 template <
typename T>
199 Vector<T> operator- (
const Vector<T>& lhs, T rhs)
202 for (
const auto& i : lhs.GetItems ()) {
203 tmp.push_back (i - rhs);
constexpr auto Transform(const optional< T > &o, F &&f)
STRING_TYPE ToString(FLOAT_TYPE f, const ToStringOptions &options={})