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#ifndef Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
21#define Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION 1
24namespace Stroika::Foundation::Math::LinearAlgebra {
33 Vector (
size_t dimension);
34 Vector (
size_t dimension, Common::ArgByValueType<T> fillValue);
35 Vector (
size_t dimension,
const function<T ()>& filler);
36 template <Traversal::IIterableOfTo<T> CONTAINER_OF_T>
37 Vector (
const CONTAINER_OF_T& c);
39#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
44 nonvirtual
void Fill (T value);
45 nonvirtual
void Fill (function<T ()> filler);
51 nonvirtual
size_t GetDimension ()
const;
57 nonvirtual Vector<T>
Transform (
const function<T (T)>& f)
const;
63 nonvirtual T Norm ()
const;
68 nonvirtual Containers::Sequence<T> GetItems ()
const;
70#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
74 template <
typename CONTAINER>
75 nonvirtual
void SetItems (
const CONTAINER& s);
81 nonvirtual T GetAt (
size_t i)
const;
83#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
87 nonvirtual
void SetAt (
size_t i, Common::ArgByValueType<T> v);
93 nonvirtual T operator[] (
size_t i)
const;
95#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
103 fV.SetAt (fIndex, fValue);
114 nonvirtual TMP_ operator[] (
size_t i)
116 return TMP_{*
this, i, GetAt (i)};
121 nonvirtual Characters::String
ToString ()
const;
127 Memory::SharedByValue<IRep_> fRep_;
130 template <
typename T>
131 Vector<T> operator* (T lhs,
const Vector<T>& rhs)
134 for (
const auto& i : rhs.GetItems ()) {
135 tmp.push_back (lhs * i);
139 template <
typename T>
140 Vector<T> operator* (
const Vector<T>& lhs, T rhs)
143 for (
const auto& i : lhs.GetItems ()) {
144 tmp.push_back (i * rhs);
149 template <
typename T>
150 Vector<T> operator+ (
const Vector<T>& lhs,
const Vector<T>& rhs)
152 Require (lhs.GetDimension () == rhs.GetDimension ());
154 for (
size_t i = 0; i < lhs.GetDimension (); ++i) {
155 tmp.push_back (lhs[i] + rhs[i]);
159 template <
typename T>
160 Vector<T> operator+ (T lhs,
const Vector<T>& rhs)
163 for (
const auto& i : rhs.GetItems ()) {
164 tmp.push_back (lhs + i);
168 template <
typename T>
169 Vector<T> operator+ (
const Vector<T>& lhs, T rhs)
172 for (
const auto& i : lhs.GetItems ()) {
173 tmp.push_back (i + rhs);
178 template <
typename T>
179 Vector<T> operator- (
const Vector<T>& lhs,
const Vector<T>& rhs)
181 Require (lhs.GetDimension () == rhs.GetDimension ());
183 for (
size_t i = 0; i < lhs.GetDimension (); ++i) {
184 tmp.push_back (lhs[i] - rhs[i]);
188 template <
typename T>
189 Vector<T> operator- (T lhs,
const Vector<T>& rhs)
192 for (
const T& i : rhs.GetItems ()) {
193 tmp.push_back (lhs - i);
197 template <
typename T>
198 Vector<T> operator- (
const Vector<T>& lhs, T rhs)
201 for (
const auto& i : lhs.GetItems ()) {
202 tmp.push_back (i - rhs);
constexpr auto Transform(const optional< T > &o, F &&f)
STRING_TYPE ToString(FLOAT_TYPE f, const ToStringOptions &options={})