10namespace Stroika::Foundation::Math::LinearAlgebra {
18 class Vector<T>::IRep_ {
20 Containers::Sequence<T> fData;
29 inline Vector<T>::Vector (
size_t dimension)
30 : Vector{dimension, 0}
34 Vector<T>::Vector (
size_t dimension, Common::ArgByValueType<T> fillValue)
37 for (
size_t i = 0; i < dimension; ++i) {
38 fRep_.rwget ()->fData.Append (fillValue);
42 Vector<T>::Vector (
size_t dimension,
const function<T ()>& filler)
45 for (
size_t i = 0; i < dimension; ++i) {
46 fRep_.rwget ()->fData.Append (filler ());
50 template <Traversal::IIterableOfTo<T> CONTAINER_OF_T>
51 Vector<T>::Vector (
const CONTAINER_OF_T& c)
54 fRep_->fData = Containers::Sequence<T>{c};
58 void Vector<T>::Fill (T value)
60 for (
size_t i = 0; i < dimension; ++i) {
61 fRep_->get ()->SetAt (i, value);
65 void Vector<T>::Fill (function<T ()> filler)
67 for (
size_t i = 0; i < dimension; ++i) {
68 fRep_->get ()->SetAt (i, filler ());
73 inline size_t Vector<T>::GetDimension ()
const
75 return fRep_.cget ()->fData.size ();
78 Vector<T> Vector<T>::Transform (
const function<T (T)>& f)
const
81 size_t dimension = GetDimension ();
82 tmp.reserve (dimension);
83 for (
size_t i = 0; i < dimension; ++i) {
84 tmp.push_back (f (GetAt (i)));
89 T Vector<T>::Norm ()
const
92 fRep_.cget ()->Apply ([&] (T v) { result += v * v; });
96 inline Containers::Sequence<T> Vector<T>::GetItems ()
const
98 return fRep_.cget ()->fData;
100 template <
typename T>
101 inline T Vector<T>::GetAt (
size_t i)
const
103 return fRep_.cget ()->fData[i];
105#if Stroika_Foundation_Math_LinearAlgebra_Vector_ALLOW_MUTATION
106 template <
typename T>
107 void Vector<T>::SetAt (
size_t i, Common::ArgByValueType<T> v)
109 fRep_.rwget ()->fData.SetAt (i, v);
112 template <
typename T>
113 inline T Vector<T>::operator[] (
size_t i)
const
117 template <
typename T>
118 Characters::String Vector<T>::ToString ()
const
120 Characters::StringBuilder sb;
122 for (
const T& i : fRep_.cget ()->fData) {
auto MakeSharedPtr(ARGS_TYPE &&... args) -> shared_ptr< T >
same as make_shared, but if type T has block allocation, then use block allocation for the 'shared pa...