35#ifndef _BLAZE_MATH_SPARSE_ZEROVECTOR_H_
36#define _BLAZE_MATH_SPARSE_ZEROVECTOR_H_
178template<
typename Type
182 :
public Expression< SparseVector< ZeroVector<Type,TF,Tag>, TF > >
214 template<
typename NewType >
223 template<
size_t NewN >
260 constexpr
ConstReference operator[](
size_t index ) const noexcept;
272 template< typename VT >
283 constexpr
size_t size() const noexcept;
284 constexpr
size_t capacity() const noexcept;
285 constexpr
size_t nonZeros() const noexcept;
286 constexpr
void clear() noexcept;
287 constexpr
void resize(
size_t n ) noexcept;
304 template< typename Other > inline
bool canAlias ( const Other* alias ) const noexcept;
305 template< typename Other > inline
bool isAliased( const Other* alias ) const noexcept;
341template< typename Type
358template<
typename Type
372template<
typename Type
390template<
typename Type
393template<
typename VT >
399 if( !IsZero_v<VT> && !
isZero( *v ) ) {
420template<
typename Type
445template<
typename Type
451 if( index >= size_ ) {
465template<
typename Type
481template<
typename Type
497template<
typename Type
513template<
typename Type
542template<
typename Type
545template<
typename VT >
551 if( !IsZero_v<VT> && !
isZero( *rhs ) ) {
555 size_ = (*rhs).size();
575template<
typename Type
590template<
typename Type
608template<
typename Type
625template<
typename Type
645template<
typename Type
661template<
typename Type
666 const size_t tmp( size_ );
692template<
typename Type
717template<
typename Type
742template<
typename Type
775template<
typename Type
778template<
typename Other >
798template<
typename Type
801template<
typename Other >
821template<
typename Type
846template< RelaxationFlag RF,
typename Type,
bool TF,
typename Tag >
849template<
typename Type,
bool TF,
typename Tag >
852template<
typename Type,
bool TF,
typename Tag >
888 return ( v.size() == 0UL );
910template<
typename Type
930template<
typename Type
949template<
typename Type
952inline void erase( ZeroVector<Type,TF,Tag>& v,
size_t index )
971template<
typename Type
974 ,
typename Iterator >
975inline Iterator erase( ZeroVector<Type,TF,Tag>& v, Iterator pos )
997template<
typename Type
1000 ,
typename Iterator >
1001inline Iterator erase( ZeroVector<Type,TF,Tag>& m, Iterator first, Iterator last )
1035template<
typename Type
1039inline void erase( ZeroVector<Type,TF,Tag>& v, Pred predicate )
1073template<
typename Type
1078inline void erase( ZeroVector<Type,TF,Tag>& m, Iterator first, Iterator last, Pred predicate )
1120template<
typename T,
bool TF = defaultTransposeFlag >
1121constexpr decltype(
auto)
zero(
size_t n )
noexcept
1144template<
typename VT
1146inline ZeroVector<ElementType_t<VT>,TF>
1166template<
typename Type,
bool TF,
typename Tag >
1167struct IsUniform< ZeroVector<Type,TF,Tag> >
1184template<
typename Type,
bool TF,
typename Tag >
1185struct IsZero< ZeroVector<Type,TF,Tag> >
1202template<
typename T1,
typename T2 >
1203struct AddTraitEval1< T1, T2
1206 !IsZero_v<T1> && IsZero_v<T2> > >
1208 using Type = Rebind_t< ResultType_t<T1>, AddTrait_t< ElementType_t<T1>, ElementType_t<T2> > >;
1211template<
typename T1,
typename T2 >
1212struct AddTraitEval1< T1, T2
1215 IsZero_v<T1> && !IsZero_v<T2> > >
1217 using Type = Rebind_t< ResultType_t<T2>, AddTrait_t< ElementType_t<T1>, ElementType_t<T2> > >;
1220template<
typename T1,
typename T2 >
1221struct AddTraitEval1< T1, T2
1224 IsZero_v<T1> && IsZero_v<T2> > >
1226 using Type = ZeroVector< AddTrait_t< ElementType_t<T1>, ElementType_t<T2> >
1227 , TransposeFlag_v<T1>
1228 , AddTrait_t< TagType_t<T1>, TagType_t<T2> > >;
1244template<
typename T1,
typename T2 >
1245struct SubTraitEval1< T1, T2
1248 !IsZero_v<T1> && IsZero_v<T2> > >
1250 using Type = Rebind_t< ResultType_t<T1>, SubTrait_t< ElementType_t<T1>, ElementType_t<T2> > >;
1253template<
typename T1,
typename T2 >
1254struct SubTraitEval1< T1, T2
1257 IsZero_v<T1> && !IsZero_v<T2> > >
1259 using Type = Rebind_t< ResultType_t<T2>, SubTrait_t< ElementType_t<T1>, ElementType_t<T2> > >;
1262template<
typename T1,
typename T2 >
1263struct SubTraitEval1< T1, T2
1266 IsZero_v<T1> && IsZero_v<T2> > >
1268 using Type = ZeroVector< SubTrait_t< ElementType_t<T1>, ElementType_t<T2> >
1269 , TransposeFlag_v<T1>
1270 , SubTrait_t< TagType_t<T1>, TagType_t<T2> > >;
1286template<
typename T1,
typename T2 >
1287struct MultTraitEval1< T1, T2
1292 using Type = ZeroVector< MultTrait_t< ElementType_t<T1>, T2 >
1293 , TransposeFlag_v<T1>
1294 , MultTrait_t< TagType_t<T1>, T2 > >;
1297template<
typename T1,
typename T2 >
1298struct MultTraitEval1< T1, T2
1303 using Type = ZeroVector< MultTrait_t< T1, ElementType_t<T2> >
1304 , TransposeFlag_v<T2>
1305 , MultTrait_t< T1, TagType_t<T2> > >;
1308template<
typename T1,
typename T2 >
1309struct MultTraitEval1< T1, T2
1311 ( IsColumnVector_v<T1> && IsColumnVector_v<T2> ) ) &&
1312 ( IsZero_v<T1> || IsZero_v<T2> ) > >
1314 using Type = ZeroVector< MultTrait_t< ElementType_t<T1>, ElementType_t<T2> >
1315 , TransposeFlag_v<T1>
1316 , MultTrait_t< TagType_t<T1>, TagType_t<T2> > >;
1319template<
typename T1,
typename T2 >
1320struct MultTraitEval1< T1, T2
1322 IsColumnVector_v<T2> &&
1323 ( IsZero_v<T1> || IsZero_v<T2> ) > >
1325 using MultType = MultTrait_t< ElementType_t<T1>, ElementType_t<T2> >;
1326 using MultTag = MultTrait_t< TagType_t<T1>, TagType_t<T2> >;
1328 using Type = ZeroVector< AddTrait_t<MultType,MultType>
1330 , AddTrait_t<MultTag,MultTag> >;
1333template<
typename T1,
typename T2 >
1334struct MultTraitEval1< T1, T2
1337 ( IsZero_v<T1> || IsZero_v<T2> ) > >
1339 using MultType = MultTrait_t< ElementType_t<T1>, ElementType_t<T2> >;
1340 using MultTag = MultTrait_t< TagType_t<T1>, TagType_t<T2> >;
1342 using Type = ZeroVector< AddTrait_t<MultType,MultType>
1344 , AddTrait_t<MultTag,MultTag> >;
1360template<
typename T1,
typename T2 >
1361struct KronTraitEval1< T1, T2
1367 using Type = ZeroVector< MultTrait_t< ElementType_t<T1>, ElementType_t<T2> >
1368 , ( IsZero_v<T2> ? TransposeFlag_v<T2> : TransposeFlag_v<T1> )
1385template<
typename T1,
typename T2 >
1386struct DivTraitEval1< T1, T2
1391 using Type = ZeroVector< DivTrait_t< ElementType_t<T1>, T2 >
1392 , TransposeFlag_v<T1>
1393 , DivTrait_t< TagType_t<T1>, T2 > >;
1396template<
typename T1,
typename T2 >
1397struct DivTraitEval1< T1, T2
1399 ( IsColumnVector_v<T1> && IsColumnVector_v<T2> ) ) &&
1400 ( IsZero_v<T1> || IsZero_v<T2> ) > >
1402 using Type = ZeroVector< DivTrait_t< ElementType_t<T1>, ElementType_t<T2> >
1403 , TransposeFlag_v<T1>
1404 , DivTrait_t< TagType_t<T1>, TagType_t<T2> > >;
1420template<
typename T1,
typename T2 >
1421struct CrossTraitEval1< T1, T2
1424 ( IsZero_v<T1> || IsZero_v<T2> ) > >
1426 using MultType = MultTrait_t< ElementType_t<T1>, ElementType_t<T2> >;
1427 using MultTag = MultTrait_t< TagType_t<T1>, TagType_t<T2> >;
1429 using Type = ZeroVector< SubTrait_t<MultType,MultType>
1430 , TransposeFlag_v<T1>
1431 , SubTrait_t<MultTag,MultTag> >;
1447template<
typename T,
typename OP >
1448struct UnaryMapTraitEval1< T, OP
1450 YieldsZero_v<OP,T> > >
1452 using ElementType =
decltype( std::declval<OP>()( std::declval< ElementType_t<T> >() ) );
1454 using Type = ZeroVector< EvaluateTrait_t<ElementType>
1455 , TransposeFlag_v<T>
1456 , MapTrait_t< TagType_t<T>, OP > >;
1464template<
typename T1,
typename T2,
typename OP >
1465struct BinaryMapTraitEval1< T1, T2, OP
1468 YieldsZero_v<OP,T1,T2> > >
1470 using ElementType =
decltype( std::declval<OP>()( std::declval< ElementType_t<T1> >()
1471 , std::declval< ElementType_t<T2> >() ) );
1473 using Type = ZeroVector< EvaluateTrait_t<ElementType>
1474 , TransposeFlag_v<T1>
1475 , MapTrait_t< TagType_t<T1>, TagType_t<T2>, OP > >;
1491template<
typename T,
size_t R0 >
1492struct RepeatTraitEval1< T, R0,
inf,
inf
1496 using Type = ZeroVector< ElementType_t<T>
1497 , TransposeFlag_v<T>
1514template<
typename T1,
bool TF,
typename Tag,
typename T2 >
1515struct HighType< ZeroVector<T1,TF,Tag>, ZeroVector<T2,TF,Tag> >
1517 using Type = ZeroVector< typename HighType<T1,T2>::Type, TF, Tag >;
1533template<
typename T1,
bool TF,
typename Tag,
typename T2 >
1534struct LowType< ZeroVector<T1,TF,Tag>, ZeroVector<T2,TF,Tag> >
1536 using Type = ZeroVector< typename LowType<T1,T2>::Type, TF, Tag >;
1552template<
typename VT,
size_t I,
size_t N >
1553struct SubvectorTraitEval1< VT, I, N
1556 using Type = ZeroVector< RemoveConst_t< ElementType_t<VT> >
1557 , TransposeFlag_v<VT>
1574template<
typename VT,
size_t N >
1575struct ElementsTraitEval1< VT, N
1578 using Type = ZeroVector< RemoveConst_t< ElementType_t<VT> >
1579 , TransposeFlag_v<VT>
1596template<
typename MT,
size_t I >
1597struct RowTraitEval1< MT, I
1600 using Type = ZeroVector< RemoveConst_t< ElementType_t<MT> >
1618template<
typename MT,
size_t I >
1619struct ColumnTraitEval1< MT, I
1622 using Type = ZeroVector< RemoveConst_t< ElementType_t<MT> >
1640template<
typename MT, ptrdiff_t I >
1641struct BandTraitEval1< MT, I
1644 using Type = ZeroVector< RemoveConst_t< ElementType_t<MT> >
Header file for the addition trait.
Header file for auxiliary alias declarations.
typename ResultType_t< T >::TagType TagType_t
Alias declaration for nested TagType type definitions.
Definition: Aliases.h:530
Header file for run time assertion macros.
Header file for the band trait.
Header file for the column trait.
Constraint on the data type.
Header file for the cross product trait.
Header file for the division trait.
Header file for the elements trait.
Header file for the EnableIf class template.
Header file for the EvaluateTrait class template.
Header file for the function trace functionality.
Header file for the HighType type trait.
Header file for the IntegralConstant class template.
Header file for the IsColumnVector type trait.
Header file for the IsMatrix type trait.
Header file for the IsRowVector type trait.
Header file for the IsSMPAssignable type trait.
Header file for the IsScalar type trait.
Header file for the IsVector type trait.
Header file for the Kron product trait.
Header file for the LowType type trait.
Header file for the map trait.
Header file for the MAYBE_UNUSED function template.
Header file for the multiplication trait.
Constraint on the data type.
Constraint on the data type.
Header file for the relaxation flag enumeration.
Header file for the RemoveConst type trait.
Header file for the repeat trait.
Header file for the row trait.
Header file for the subtraction trait.
Header file for the subvector trait.
Header file for the ValueIndexPair class.
Constraint on the data type.
Header file for the YieldsZero type trait.
Index-value-pair for sparse vectors and matrices.
Definition: ValueIndexPair.h:75
Base class for N-dimensional vectors.
Definition: Vector.h:82
Efficient implementation of an arbitrary sized zero vector.
Definition: ZeroVector.h:183
ConstIterator upperBound(size_t index) const
Returns an iterator to the first index greater then the given index.
Definition: ZeroVector.h:746
ConstIterator find(size_t index) const
Searches for a specific vector element.
Definition: ZeroVector.h:696
constexpr ConstIterator begin() const noexcept
Returns an iterator to the first non-zero element of the zero vector.
Definition: ZeroVector.h:469
const Type & ReturnType
Return type for expression template evaluations.
Definition: ZeroVector.h:202
constexpr void resize(size_t n) noexcept
Changing the size of the zero vector.
Definition: ZeroVector.h:648
constexpr size_t capacity() const noexcept
Returns the maximum capacity of the zero vector.
Definition: ZeroVector.h:593
constexpr ConstReference operator[](size_t index) const noexcept
Subscript operator for the direct access to the zero vector elements.
Definition: ZeroVector.h:424
Type ElementType
Type of the zero vector elements.
Definition: ZeroVector.h:200
constexpr ZeroVector() noexcept
The default constructor for ZeroVector.
Definition: ZeroVector.h:361
constexpr size_t nonZeros() const noexcept
Returns the number of non-zero elements in the zero vector.
Definition: ZeroVector.h:611
constexpr size_t size() const noexcept
Returns the current size/dimension of the zero vector.
Definition: ZeroVector.h:578
constexpr ConstIterator cbegin() const noexcept
Returns an iterator to the first non-zero element of the zero vector.
Definition: ZeroVector.h:485
ConstIterator lowerBound(size_t index) const
Returns an iterator to the first index not less then the given index.
Definition: ZeroVector.h:721
bool canSMPAssign() const noexcept
Returns whether the vector can be used in SMP assignments.
Definition: ZeroVector.h:824
constexpr void swap(ZeroVector &v) noexcept
Swapping the contents of two zero vectors.
Definition: ZeroVector.h:664
Tag TagType
Tag type of this ZeroVector instance.
Definition: ZeroVector.h:201
ZeroVector< Type, TF, Tag > This
Type of this ZeroVector instance.
Definition: ZeroVector.h:191
constexpr ConstIterator cend() const noexcept
Returns an iterator just past the last non-zero element of the zero vector.
Definition: ZeroVector.h:517
constexpr ConstIterator end() const noexcept
Returns an iterator just past the last non-zero element of the zero vector.
Definition: ZeroVector.h:501
static const Type zero_
The zero element.
Definition: ZeroVector.h:317
const Type & Reference
Reference to a zero vector element.
Definition: ZeroVector.h:205
constexpr void clear() noexcept
Clearing the zero vector.
Definition: ZeroVector.h:628
bool isAliased(const Other *alias) const noexcept
Returns whether the vector is aliased with the given address alias.
Definition: ZeroVector.h:802
const Type & ConstReference
Reference to a constant zero vector element.
Definition: ZeroVector.h:206
ConstReference at(size_t index) const
Checked access to the zero vector elements.
Definition: ZeroVector.h:449
size_t size_
The current size/dimension of the zero vector.
Definition: ZeroVector.h:315
static constexpr bool smpAssignable
Compilation flag for SMP assignments.
Definition: ZeroVector.h:234
bool canAlias(const Other *alias) const noexcept
Returns whether the vector can alias with the given address alias.
Definition: ZeroVector.h:779
Header file for the Expression base class.
Header file for the SparseVector base class.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_VOLATILE(T)
Constraint on the data type.
Definition: Volatile.h:79
#define BLAZE_CONSTRAINT_MUST_NOT_BE_POINTER_TYPE(T)
Constraint on the data type.
Definition: Pointer.h:79
#define BLAZE_CONSTRAINT_MUST_NOT_BE_CONST(T)
Constraint on the data type.
Definition: Const.h:79
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TAG(A, B)
Data type constraint.
Definition: SameTag.h:68
#define BLAZE_CONSTRAINT_MUST_NOT_BE_REFERENCE_TYPE(T)
Constraint on the data type.
Definition: Reference.h:79
bool isZero(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is a zero matrix.
Definition: DenseMatrix.h:1819
typename MultTrait< T1, T2 >::Type MultTrait_t
Auxiliary alias declaration for the MultTrait class template.
Definition: MultTrait.h:165
constexpr bool IsScalar_v
Auxiliary variable template for the IsScalar type trait.
Definition: IsScalar.h:104
constexpr bool IsVector_v
Auxiliary variable template for the IsVector type trait.
Definition: IsVector.h:125
constexpr bool IsZero_v
Auxiliary variable template for the IsZero type trait.
Definition: IsZero.h:166
constexpr bool IsMatrix_v
Auxiliary variable template for the IsMatrix type trait.
Definition: IsMatrix.h:124
constexpr bool IsRowVector_v
Auxiliary variable template for the IsRowVector type trait.
Definition: IsRowVector.h:126
RelaxationFlag
Relaxation flag for strict or relaxed semantics.
Definition: RelaxationFlag.h:66
constexpr Infinity inf
Global Infinity instance.
Definition: Infinity.h:1080
constexpr size_t size(const Matrix< MT, SO > &matrix) noexcept
Returns the total number of elements of the matrix.
Definition: Matrix.h:676
#define BLAZE_USER_ASSERT(expr, msg)
Run time assertion macro for user checks.
Definition: Assert.h:117
constexpr bool defaultTransposeFlag
The default transpose flag for all vectors of the Blaze library.
Definition: TransposeFlag.h:75
BoolConstant< true > TrueType
Type traits base class.
Definition: IntegralConstant.h:132
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
constexpr void MAYBE_UNUSED(const Args &...)
Suppression of unused parameter warnings.
Definition: MaybeUnused.h:81
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.
Definition: Exception.h:331
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
#define BLAZE_FUNCTION_TRACE
Function trace macro.
Definition: FunctionTrace.h:94
constexpr bool isIntact(const ZeroVector< Type, TF, Tag > &v) noexcept
Returns whether the invariants of the given zero vector are intact.
Definition: ZeroVector.h:913
constexpr decltype(auto) zero(size_t n) noexcept
Creating a zero vector.
Definition: ZeroVector.h:1121
constexpr void swap(ZeroVector< Type, TF, Tag > &a, ZeroVector< Type, TF, Tag > &b) noexcept
Swapping the contents of two zero vectors.
Definition: ZeroVector.h:933
ZeroVector< ElementType_t< VT >, TF > declzero(const Vector< VT, TF > &v)
Declares the given vector expression v as zero vector.
Definition: ZeroVector.h:1147
constexpr bool isDefault(const ZeroVector< Type, TF, Tag > &v) noexcept
Returns whether the given zero vector is in default state.
Definition: ZeroVector.h:886
Header file for the exception macros of the math module.
Header file for all forward declarations of the math module.
Header file for all forward declarations for sparse vectors and matrices.
Header file for the TransposeFlag type trait.
Header file for the isZero shim.
Base class for all expression templates.
Definition: Expression.h:60
Rebind mechanism to obtain a ZeroVector with different data/element type.
Definition: ZeroVector.h:215
Resize mechanism to obtain a ZeroVector with a different fixed number of elements.
Definition: ZeroVector.h:224
Header file for the default transpose flag for all vectors of the Blaze library.
Header file for the IsZero type trait.
Header file for basic type definitions.