Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Vector.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include <vector>
5
8
9namespace Stroika::Foundation::Math::LinearAlgebra {
10
11 /*
12 ********************************************************************************
13 ******************************** Vector<T>::IRep_ ******************************
14 ********************************************************************************
15 */
16 template <typename T>
17 class Vector<T>::IRep_ {
18 public:
19 Containers::Sequence<T> fData;
20 };
21
22 /*
23 ********************************************************************************
24 ********************************** Vector<T> ***********************************
25 ********************************************************************************
26 */
27 template <typename T>
28 inline Vector<T>::Vector (size_t dimension)
29 : Vector{dimension, 0}
30 {
31 }
32 template <typename T>
33 Vector<T>::Vector (size_t dimension, Common::ArgByValueType<T> fillValue)
34 : fRep_{make_shared<IRep_> ()}
35 {
36 for (size_t i = 0; i < dimension; ++i) {
37 fRep_.rwget ()->fData.Append (fillValue);
38 }
39 }
40 template <typename T>
41 Vector<T>::Vector (size_t dimension, const function<T ()>& filler)
42 : fRep_{make_shared<IRep_> ()}
43 {
44 for (size_t i = 0; i < dimension; ++i) {
45 fRep_.rwget ()->fData.Append (filler ());
46 }
47 }
48 template <typename T>
49 template <Traversal::IIterableOfTo<T> CONTAINER_OF_T>
50 Vector<T>::Vector (const CONTAINER_OF_T& c)
51 : fRep_{make_shared<IRep_> ()}
52 {
53 fRep_->fData = Containers::Sequence<T>{c};
54 }
55#if 0
56 template <typename T>
57 void Vector<T>::Fill (T value)
58 {
59 for (size_t i = 0; i < dimension; ++i) {
60 fRep_->get ()->SetAt (i, value);
61 }
62 }
63 template <typename T>
64 void Vector<T>::Fill (function<T ()> filler)
65 {
66 for (size_t i = 0; i < dimension; ++i) {
67 fRep_->get ()->SetAt (i, filler ());
68 }
69 }
70#endif
71 template <typename T>
72 inline size_t Vector<T>::GetDimension () const
73 {
74 return fRep_.cget ()->fData.size ();
75 }
76 template <typename T>
77 Vector<T> Vector<T>::Transform (const function<T (T)>& f) const
78 {
79 vector<T> tmp;
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)));
84 }
85 return tmp;
86 }
87 template <typename T>
88 T Vector<T>::Norm () const
89 {
90 T result{};
91 fRep_.cget ()->Apply ([&] (T v) { result += v * v; });
92 return sqrt (result);
93 }
94 template <typename T>
95 inline Containers::Sequence<T> Vector<T>::GetItems () const
96 {
97 return fRep_.cget ()->fData;
98 }
99 template <typename T>
100 inline T Vector<T>::GetAt (size_t i) const
101 {
102 return fRep_.cget ()->fData[i];
103 }
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)
107 {
108 fRep_.rwget ()->fData.SetAt (i, v);
109 }
110#endif
111 template <typename T>
112 inline T Vector<T>::operator[] (size_t i) const
113 {
114 return GetAt (i);
115 }
116 template <typename T>
117 Characters::String Vector<T>::ToString () const
118 {
119 Characters::StringBuilder sb;
120 sb << "["sv;
121 for (const T& i : fRep_.cget ()->fData) {
122 sb << i << ", "sv;
123 }
124 sb << "]"sv;
125 return sb;
126 }
127
128}