9namespace Stroika::Foundation::Math::LinearAlgebra {
17 class Vector<T>::IRep_ {
19 Containers::Sequence<T> fData;
28 inline Vector<T>::Vector (
size_t dimension)
29 : Vector{dimension, 0}
33 Vector<T>::Vector (
size_t dimension, Common::ArgByValueType<T> fillValue)
34 : fRep_{make_shared<IRep_> ()}
36 for (
size_t i = 0; i < dimension; ++i) {
37 fRep_.rwget ()->fData.Append (fillValue);
41 Vector<T>::Vector (
size_t dimension,
const function<T ()>& filler)
42 : fRep_{make_shared<IRep_> ()}
44 for (
size_t i = 0; i < dimension; ++i) {
45 fRep_.rwget ()->fData.Append (filler ());
49 template <Traversal::IIterableOfTo<T> CONTAINER_OF_T>
50 Vector<T>::Vector (
const CONTAINER_OF_T& c)
51 : fRep_{make_shared<IRep_> ()}
53 fRep_->fData = Containers::Sequence<T>{c};
57 void Vector<T>::Fill (T value)
59 for (
size_t i = 0; i < dimension; ++i) {
60 fRep_->get ()->SetAt (i, value);
64 void Vector<T>::Fill (function<T ()> filler)
66 for (
size_t i = 0; i < dimension; ++i) {
67 fRep_->get ()->SetAt (i, filler ());
72 inline size_t Vector<T>::GetDimension ()
const
74 return fRep_.cget ()->fData.size ();
77 Vector<T> Vector<T>::Transform (
const function<T (T)>& f)
const
80 size_t dimension = GetDimension ();
81 tmp.reserve (dimension);
82 for (
size_t i = 0; i < dimension; ++i) {
83 tmp.push_back (f (GetAt (i)));
88 T Vector<T>::Norm ()
const
91 fRep_.cget ()->Apply ([&] (T v) { result += v * v; });
95 inline Containers::Sequence<T> Vector<T>::GetItems ()
const
97 return fRep_.cget ()->fData;
100 inline T Vector<T>::GetAt (
size_t i)
const
102 return fRep_.cget ()->fData[i];
104#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
105 template <
typename T>
106 void Vector<T>::SetAt (
size_t i, Common::ArgByValueType<T> v)
108 fRep_.rwget ()->fData.SetAt (i, v);
111 template <
typename T>
112 inline T Vector<T>::operator[] (
size_t i)
const
116 template <
typename T>
117 Characters::String Vector<T>::ToString ()
const
119 Characters::StringBuilder sb;
121 for (
const T& i : fRep_.cget ()->fData) {