WPILibC++ 2023.4.3-108-ge5452e3
SparseVector.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SPARSEVECTOR_H
11#define EIGEN_SPARSEVECTOR_H
12
13namespace Eigen {
14
15/** \ingroup SparseCore_Module
16 * \class SparseVector
17 *
18 * \brief a sparse vector class
19 *
20 * \tparam _Scalar the scalar type, i.e. the type of the coefficients
21 *
22 * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
23 *
24 * This class can be extended with the help of the plugin mechanism described on the page
25 * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN.
26 */
27
28namespace internal {
29template<typename _Scalar, int _Options, typename _StorageIndex>
30struct traits<SparseVector<_Scalar, _Options, _StorageIndex> >
31{
32 typedef _Scalar Scalar;
33 typedef _StorageIndex StorageIndex;
36 enum {
37 IsColVector = (_Options & RowMajorBit) ? 0 : 1,
38
39 RowsAtCompileTime = IsColVector ? Dynamic : 1,
40 ColsAtCompileTime = IsColVector ? 1 : Dynamic,
41 MaxRowsAtCompileTime = RowsAtCompileTime,
42 MaxColsAtCompileTime = ColsAtCompileTime,
43 Flags = _Options | NestByRefBit | LvalueBit | (IsColVector ? 0 : RowMajorBit) | CompressedAccessBit,
44 SupportedAccessPatterns = InnerRandomAccessPattern
45 };
46};
47
48// Sparse-Vector-Assignment kinds:
49enum {
53};
54
55template< typename Dest, typename Src,
56 int AssignmentKind = !bool(Src::IsVectorAtCompileTime) ? SVA_RuntimeSwitch
57 : Src::InnerSizeAtCompileTime==1 ? SVA_Outer
58 : SVA_Inner>
60
61}
62
63template<typename _Scalar, int _Options, typename _StorageIndex>
65 : public SparseCompressedBase<SparseVector<_Scalar, _Options, _StorageIndex> >
66{
69 public:
73
74 typedef internal::CompressedStorage<Scalar,StorageIndex> Storage;
76
77 enum {
78 Options = _Options
79 };
80
84 EIGEN_STRONG_INLINE Index outerSize() const { return 1; }
85
86 EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return m_data.valuePtr(); }
88
91
92 inline const StorageIndex* outerIndexPtr() const { return 0; }
93 inline StorageIndex* outerIndexPtr() { return 0; }
94 inline const StorageIndex* innerNonZeroPtr() const { return 0; }
95 inline StorageIndex* innerNonZeroPtr() { return 0; }
96
97 /** \internal */
98 inline Storage& data() { return m_data; }
99 /** \internal */
100 inline const Storage& data() const { return m_data; }
101
102 inline Scalar coeff(Index row, Index col) const
103 {
104 eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
105 return coeff(IsColVector ? row : col);
106 }
107 inline Scalar coeff(Index i) const
108 {
109 eigen_assert(i>=0 && i<m_size);
110 return m_data.at(StorageIndex(i));
111 }
112
114 {
115 eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
116 return coeffRef(IsColVector ? row : col);
117 }
118
119 /** \returns a reference to the coefficient value at given index \a i
120 * This operation involes a log(rho*size) binary search. If the coefficient does not
121 * exist yet, then a sorted insertion into a sequential buffer is performed.
122 *
123 * This insertion might be very costly if the number of nonzeros above \a i is large.
124 */
126 {
127 eigen_assert(i>=0 && i<m_size);
128
130 }
131
132 public:
133
136
137 inline void setZero() { m_data.clear(); }
138
139 /** \returns the number of non zero coefficients */
140 inline Index nonZeros() const { return m_data.size(); }
141
142 inline void startVec(Index outer)
143 {
145 eigen_assert(outer==0);
146 }
147
149 {
151 eigen_assert(outer==0);
152 return insertBack(inner);
153 }
155 {
156 m_data.append(0, i);
157 return m_data.value(m_data.size()-1);
158 }
159
161 {
163 eigen_assert(outer==0);
164 return insertBackUnordered(inner);
165 }
167 {
168 m_data.append(0, i);
169 return m_data.value(m_data.size()-1);
170 }
171
173 {
174 eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
175
176 Index inner = IsColVector ? row : col;
177 Index outer = IsColVector ? col : row;
179 eigen_assert(outer==0);
180 return insert(inner);
181 }
183 {
184 eigen_assert(i>=0 && i<m_size);
185
186 Index startId = 0;
187 Index p = Index(m_data.size()) - 1;
188 // TODO smart realloc
189 m_data.resize(p+2,1);
190
191 while ( (p >= startId) && (m_data.index(p) > i) )
192 {
193 m_data.index(p+1) = m_data.index(p);
194 m_data.value(p+1) = m_data.value(p);
195 --p;
196 }
197 m_data.index(p+1) = convert_index(i);
198 m_data.value(p+1) = 0;
199 return m_data.value(p+1);
200 }
201
202 /**
203 */
204 inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); }
205
206
207 inline void finalize() {}
208
209 /** \copydoc SparseMatrix::prune(const Scalar&,const RealScalar&) */
210 void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
211 {
212 m_data.prune(reference,epsilon);
213 }
214
215 /** Resizes the sparse vector to \a rows x \a cols
216 *
217 * This method is provided for compatibility with matrices.
218 * For a column vector, \a cols must be equal to 1.
219 * For a row vector, \a rows must be equal to 1.
220 *
221 * \sa resize(Index)
222 */
224 {
225 eigen_assert((IsColVector ? cols : rows)==1 && "Outer dimension must equal 1");
227 }
228
229 /** Resizes the sparse vector to \a newSize
230 * This method deletes all entries, thus leaving an empty sparse vector
231 *
232 * \sa conservativeResize(), setZero() */
233 void resize(Index newSize)
234 {
235 m_size = newSize;
236 m_data.clear();
237 }
238
239 /** Resizes the sparse vector to \a newSize, while leaving old values untouched.
240 *
241 * If the size of the vector is decreased, then the storage of the out-of bounds coefficients is kept and reserved.
242 * Call .data().squeeze() to free extra memory.
243 *
244 * \sa reserve(), setZero()
245 */
247 {
248 if (newSize < m_size)
249 {
250 Index i = 0;
251 while (i<m_data.size() && m_data.index(i)<newSize) ++i;
252 m_data.resize(i);
253 }
254 m_size = newSize;
255 }
256
258
260
262
264
265 template<typename OtherDerived>
267 : m_size(0)
268 {
269 #ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
270 EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
271 #endif
273 *this = other.derived();
274 }
275
276 inline SparseVector(const SparseVector& other)
277 : Base(other), m_size(0)
278 {
280 *this = other.derived();
281 }
282
283 /** Swaps the values of \c *this and \a other.
284 * Overloaded for performance: this version performs a \em shallow swap by swapping pointers and attributes only.
285 * \sa SparseMatrixBase::swap()
286 */
287 inline void swap(SparseVector& other)
288 {
289 std::swap(m_size, other.m_size);
290 m_data.swap(other.m_data);
291 }
292
293 template<int OtherOptions>
295 {
296 eigen_assert(other.outerSize()==1);
298 m_data.swap(other.m_data);
299 }
300
301 inline SparseVector& operator=(const SparseVector& other)
302 {
303 if (other.isRValue())
304 {
305 swap(other.const_cast_derived());
306 }
307 else
308 {
309 resize(other.size());
310 m_data = other.m_data;
311 }
312 return *this;
313 }
314
315 template<typename OtherDerived>
317 {
318 SparseVector tmp(other.size());
320 this->swap(tmp);
321 return *this;
322 }
323
324 #ifndef EIGEN_PARSED_BY_DOXYGEN
325 template<typename Lhs, typename Rhs>
327 {
328 return Base::operator=(product);
329 }
330 #endif
331
332 friend std::ostream & operator << (std::ostream & s, const SparseVector& m)
333 {
334 for (Index i=0; i<m.nonZeros(); ++i)
335 s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
336 s << std::endl;
337 return s;
338 }
339
340 /** Destructor */
341 inline ~SparseVector() {}
342
343 /** Overloaded for performance */
344 Scalar sum() const;
345
346 public:
347
348 /** \internal \deprecated use setZero() and reserve() */
350 {
351 setZero();
353 }
354
355 /** \internal \deprecated use insertBack(Index,Index) */
357 {
358 eigen_assert(r==0 || c==0);
359 return fill(IsColVector ? r : c);
360 }
361
362 /** \internal \deprecated use insertBack(Index) */
364 {
365 m_data.append(0, i);
366 return m_data.value(m_data.size()-1);
367 }
368
369 /** \internal \deprecated use insert(Index,Index) */
371 {
372 eigen_assert(r==0 || c==0);
373 return fillrand(IsColVector ? r : c);
374 }
375
376 /** \internal \deprecated use insert(Index) */
378 {
379 return insert(i);
380 }
381
382 /** \internal \deprecated use finalize() */
384
385 // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them.
386 /** \internal \deprecated use data() */
388 /** \internal \deprecated use data() */
389 EIGEN_DEPRECATED const Storage& _data() const { return m_data; }
390
391# ifdef EIGEN_SPARSEVECTOR_PLUGIN
392# include EIGEN_SPARSEVECTOR_PLUGIN
393# endif
394
395protected:
396
398 {
399 EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);
400 EIGEN_STATIC_ASSERT((_Options&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS);
401 }
402
405};
406
407namespace internal {
408
409template<typename _Scalar, int _Options, typename _Index>
410struct evaluator<SparseVector<_Scalar,_Options,_Index> >
411 : evaluator_base<SparseVector<_Scalar,_Options,_Index> >
412{
417
418 enum {
420 Flags = SparseVectorType::Flags
421 };
422
424
425 explicit evaluator(const SparseVectorType &mat) : m_matrix(&mat)
426 {
427 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
428 }
429
430 inline Index nonZerosEstimate() const {
431 return m_matrix->nonZeros();
432 }
433
434 operator SparseVectorType&() { return m_matrix->const_cast_derived(); }
435 operator const SparseVectorType&() const { return *m_matrix; }
436
438};
439
440template< typename Dest, typename Src>
442 static void run(Dest& dst, const Src& src) {
443 eigen_internal_assert(src.innerSize()==src.size());
444 typedef internal::evaluator<Src> SrcEvaluatorType;
445 SrcEvaluatorType srcEval(src);
446 for(typename SrcEvaluatorType::InnerIterator it(srcEval, 0); it; ++it)
447 dst.insert(it.index()) = it.value();
448 }
449};
450
451template< typename Dest, typename Src>
453 static void run(Dest& dst, const Src& src) {
454 eigen_internal_assert(src.outerSize()==src.size());
455 typedef internal::evaluator<Src> SrcEvaluatorType;
456 SrcEvaluatorType srcEval(src);
457 for(Index i=0; i<src.size(); ++i)
458 {
459 typename SrcEvaluatorType::InnerIterator it(srcEval, i);
460 if(it)
461 dst.insert(i) = it.value();
462 }
463 }
464};
465
466template< typename Dest, typename Src>
468 static void run(Dest& dst, const Src& src) {
469 if(src.outerSize()==1) sparse_vector_assign_selector<Dest,Src,SVA_Inner>::run(dst, src);
471 }
472};
473
474}
475
476} // end namespace Eigen
477
478#endif // EIGEN_SPARSEVECTOR_H
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ColXpr col(Index i)
This is the const version of col().
Definition: BlockMethods.h:1097
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RowXpr row(Index i)
This is the const version of row(). *‍/.
Definition: BlockMethods.h:1118
#define EIGEN_DEPRECATED
Definition: Macros.h:1068
#define eigen_internal_assert(x)
Definition: Macros.h:1053
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:1086
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition: Macros.h:1059
#define eigen_assert(x)
Definition: Macros.h:1047
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition: SparseUtil.h:43
#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op)
Definition: SparseUtil.h:21
#define EIGEN_INTERNAL_CHECK_COST_VALUE(C)
Definition: StaticAssert.h:218
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition: StaticAssert.h:127
Definition: SparseCompressedBase.h:159
Definition: SparseCompressedBase.h:245
Common base class for sparse [compressed]-{row|column}-storage format.
Definition: SparseCompressedBase.h:38
Derived & operator=(const EigenBase< OtherDerived > &other)
Definition: SparseAssign.h:17
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
internal::traits< SparseVector< _Scalar, _Options, _StorageIndex > >::StorageIndex StorageIndex
The integer type used to store indices within a SparseMatrix.
Definition: SparseMatrixBase.h:43
const Derived & derived() const
Definition: SparseMatrixBase.h:143
bool isRValue() const
Definition: SparseMatrixBase.h:194
internal::traits< SparseVector< _Scalar, _Options, _StorageIndex > >::Scalar Scalar
Definition: SparseMatrixBase.h:31
Derived & const_cast_derived() const
Definition: SparseMatrixBase.h:145
NumTraits< Scalar >::Real RealScalar
This is the "real scalar" type; if the Scalar type is already real numbers (e.g.
Definition: SparseMatrixBase.h:128
static StorageIndex convert_index(const Index idx)
Definition: SparseMatrixBase.h:389
A versatible sparse matrix representation.
Definition: SparseMatrix.h:98
Index outerSize() const
Definition: SparseMatrix.h:145
Storage m_data
Definition: SparseMatrix.h:133
Index m_innerSize
Definition: SparseMatrix.h:130
Definition: SparseUtil.h:61
a sparse vector class
Definition: SparseVector.h:66
SparseVector(Index size)
Definition: SparseVector.h:261
Scalar sum() const
Overloaded for performance.
Definition: SparseRedux.h:41
Base::ReverseInnerIterator ReverseInnerIterator
Definition: SparseVector.h:135
EIGEN_DEPRECATED void startFill(Index reserve)
Definition: SparseVector.h:349
void resize(Index newSize)
Resizes the sparse vector to newSize This method deletes all entries, thus leaving an empty sparse ve...
Definition: SparseVector.h:233
EIGEN_DEPRECATED Scalar & fill(Index r, Index c)
Definition: SparseVector.h:356
@ IsColVector
Definition: SparseVector.h:75
EIGEN_DEPRECATED void endFill()
Definition: SparseVector.h:383
EIGEN_DEPRECATED Scalar & fillrand(Index r, Index c)
Definition: SparseVector.h:370
void startVec(Index outer)
Definition: SparseVector.h:142
void resize(Index rows, Index cols)
Resizes the sparse vector to rows x cols.
Definition: SparseVector.h:223
Scalar & coeffRef(Index row, Index col)
Definition: SparseVector.h:113
Scalar & insertBackByOuterInnerUnordered(Index outer, Index inner)
Definition: SparseVector.h:160
EIGEN_DEPRECATED Scalar & fill(Index i)
Definition: SparseVector.h:363
StorageIndex * innerNonZeroPtr()
Definition: SparseVector.h:95
Scalar coeff(Index i) const
Definition: SparseVector.h:107
void swap(SparseMatrix< Scalar, OtherOptions, StorageIndex > &other)
Definition: SparseVector.h:294
EIGEN_DEPRECATED const Storage & _data() const
Definition: SparseVector.h:389
@ Options
Definition: SparseVector.h:78
EIGEN_STRONG_INLINE Index outerSize() const
Definition: SparseVector.h:84
void reserve(Index reserveSize)
Definition: SparseVector.h:204
Scalar & coeffRef(Index i)
Definition: SparseVector.h:125
Scalar & insert(Index i)
Definition: SparseVector.h:182
SparseVector & operator=(const SparseVector &other)
Definition: SparseVector.h:301
SparseVector & operator=(const SparseSparseProduct< Lhs, Rhs > &product)
Definition: SparseVector.h:326
EIGEN_STRONG_INLINE const StorageIndex * innerIndexPtr() const
Definition: SparseVector.h:89
EIGEN_STRONG_INLINE Index cols() const
Definition: SparseVector.h:82
Scalar & insertBackByOuterInner(Index outer, Index inner)
Definition: SparseVector.h:148
SparseVector & operator=(const SparseMatrixBase< OtherDerived > &other)
Definition: SparseVector.h:316
void finalize()
Definition: SparseVector.h:207
Base::InnerIterator InnerIterator
Definition: SparseVector.h:134
friend std::ostream & operator<<(std::ostream &s, const SparseVector &m)
Definition: SparseVector.h:332
SparseVector(const SparseMatrixBase< OtherDerived > &other)
Definition: SparseVector.h:266
EIGEN_STRONG_INLINE Index innerSize() const
Definition: SparseVector.h:83
void swap(SparseVector &other)
Swaps the values of *this and other.
Definition: SparseVector.h:287
Storage m_data
Definition: SparseVector.h:403
Scalar coeff(Index row, Index col) const
Definition: SparseVector.h:102
SparseVector(Index rows, Index cols)
Definition: SparseVector.h:263
void conservativeResize(Index newSize)
Resizes the sparse vector to newSize, while leaving old values untouched.
Definition: SparseVector.h:246
void resizeNonZeros(Index size)
Definition: SparseVector.h:257
SparseVector()
Definition: SparseVector.h:259
const Storage & data() const
Definition: SparseVector.h:100
void setZero()
Definition: SparseVector.h:137
static void check_template_parameters()
Definition: SparseVector.h:397
const StorageIndex * outerIndexPtr() const
Definition: SparseVector.h:92
Scalar & insertBack(Index i)
Definition: SparseVector.h:154
Storage & data()
Definition: SparseVector.h:98
EIGEN_STRONG_INLINE Index rows() const
Definition: SparseVector.h:81
StorageIndex * outerIndexPtr()
Definition: SparseVector.h:93
EIGEN_STRONG_INLINE Scalar * valuePtr()
Definition: SparseVector.h:87
~SparseVector()
Destructor.
Definition: SparseVector.h:341
Scalar & insertBackUnordered(Index i)
Definition: SparseVector.h:166
EIGEN_DEPRECATED Storage & _data()
Definition: SparseVector.h:387
EIGEN_STRONG_INLINE StorageIndex * innerIndexPtr()
Definition: SparseVector.h:90
Index nonZeros() const
Definition: SparseVector.h:140
const StorageIndex * innerNonZeroPtr() const
Definition: SparseVector.h:94
void prune(const Scalar &reference, const RealScalar &epsilon=NumTraits< RealScalar >::dummy_precision())
Suppresses all nonzeros which are much smaller than reference under the tolerance epsilon.
Definition: SparseVector.h:210
EIGEN_STRONG_INLINE const Scalar * valuePtr() const
Definition: SparseVector.h:86
SparseVector(const SparseVector &other)
Definition: SparseVector.h:276
EIGEN_DEPRECATED Scalar & fillrand(Index i)
Definition: SparseVector.h:377
Index m_size
Definition: SparseVector.h:404
Scalar & insert(Index row, Index col)
Definition: SparseVector.h:172
Scalar at(Index key, const Scalar &defaultValue=Scalar(0)) const
Definition: CompressedStorage.h:146
void reserve(Index size)
Definition: CompressedStorage.h:76
Index size() const
Definition: CompressedStorage.h:109
Scalar & value(Index i)
Definition: CompressedStorage.h:118
const Scalar * valuePtr() const
Definition: CompressedStorage.h:113
void clear()
Definition: CompressedStorage.h:111
void append(const Scalar &v, Index i)
Definition: CompressedStorage.h:101
StorageIndex & index(Index i)
Definition: CompressedStorage.h:121
Scalar & atWithInsertion(Index key, const Scalar &defaultValue=Scalar(0))
Definition: CompressedStorage.h:174
void resize(Index size, double reserveSizeFactor=0)
Definition: CompressedStorage.h:89
void swap(CompressedStorage &other)
Definition: CompressedStorage.h:62
void prune(const Scalar &reference, const RealScalar &epsilon=NumTraits< RealScalar >::dummy_precision())
Definition: CompressedStorage.h:226
const StorageIndex * indexPtr() const
Definition: CompressedStorage.h:115
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition: Constants.h:319
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition: Constants.h:321
const unsigned int LvalueBit
Means the expression has a coeffRef() method, i.e.
Definition: Constants.h:144
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
const unsigned int CompressedAccessBit
Means that the underlying coefficients can be accessed through pointers to the sparse (un)compressed ...
Definition: Constants.h:191
@ SVA_Inner
Definition: SparseVector.h:51
@ SVA_Outer
Definition: SparseVector.h:52
@ SVA_RuntimeSwitch
Definition: SparseVector.h:50
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const unsigned int NestByRefBit
Definition: Constants.h:169
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int InnerRandomAccessPattern
Definition: SparseUtil.h:48
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
Definition: Eigen_Colamd.h:50
void swap(wpi::SmallPtrSet< T, N > &LHS, wpi::SmallPtrSet< T, N > &RHS)
Implement std::swap in terms of SmallPtrSet swap.
Definition: SmallPtrSet.h:512
static constexpr const velocity::meters_per_second_t c(299792458.0)
Speed of light in vacuum.
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:39
The type used to identify a matrix expression.
Definition: Constants.h:522
Holds information about the various numeric (i.e.
Definition: NumTraits.h:233
The type used to identify a general sparse storage.
Definition: Constants.h:510
const SparseVectorType * m_matrix
Definition: SparseVector.h:437
evaluator_base< SparseVectorType > Base
Definition: SparseVector.h:414
evaluator(const SparseVectorType &mat)
Definition: SparseVector.h:425
SparseVectorType::InnerIterator InnerIterator
Definition: SparseVector.h:415
SparseVector< _Scalar, _Options, _Index > SparseVectorType
Definition: SparseVector.h:413
Index nonZerosEstimate() const
Definition: SparseVector.h:430
SparseVectorType::ReverseInnerIterator ReverseInnerIterator
Definition: SparseVector.h:416
Definition: CoreEvaluators.h:111
Definition: CoreEvaluators.h:91
static void run(Dest &dst, const Src &src)
Definition: SparseVector.h:442
static void run(Dest &dst, const Src &src)
Definition: SparseVector.h:453
static void run(Dest &dst, const Src &src)
Definition: SparseVector.h:468
Definition: ForwardDeclarations.h:17