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