1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud (at) 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_ALLANDANY_H 11 #define EIGEN_ALLANDANY_H 12 13 namespace Eigen { 14 15 namespace internal { 16 17 template<typename Derived, int UnrollCount> 18 struct all_unroller 19 { 20 enum { 21 col = (UnrollCount-1) / Derived::RowsAtCompileTime, 22 row = (UnrollCount-1) % Derived::RowsAtCompileTime 23 }; 24 25 static inline bool run(const Derived &mat) 26 { 27 return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col); 28 } 29 }; 30 31 template<typename Derived> 32 struct all_unroller<Derived, 1> 33 { 34 static inline bool run(const Derived &mat) { return mat.coeff(0, 0); } 35 }; 36 37 template<typename Derived> 38 struct all_unroller<Derived, Dynamic> 39 { 40 static inline bool run(const Derived &) { return false; } 41 }; 42 43 template<typename Derived, int UnrollCount> 44 struct any_unroller 45 { 46 enum { 47 col = (UnrollCount-1) / Derived::RowsAtCompileTime, 48 row = (UnrollCount-1) % Derived::RowsAtCompileTime 49 }; 50 51 static inline bool run(const Derived &mat) 52 { 53 return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col); 54 } 55 }; 56 57 template<typename Derived> 58 struct any_unroller<Derived, 1> 59 { 60 static inline bool run(const Derived &mat) { return mat.coeff(0, 0); } 61 }; 62 63 template<typename Derived> 64 struct any_unroller<Derived, Dynamic> 65 { 66 static inline bool run(const Derived &) { return false; } 67 }; 68 69 } // end namespace internal 70 71 /** \returns true if all coefficients are true 72 * 73 * Example: \include MatrixBase_all.cpp 74 * Output: \verbinclude MatrixBase_all.out 75 * 76 * \sa any(), Cwise::operator<() 77 */ 78 template<typename Derived> 79 inline bool DenseBase<Derived>::all() const 80 { 81 enum { 82 unroll = SizeAtCompileTime != Dynamic 83 && CoeffReadCost != Dynamic 84 && NumTraits<Scalar>::AddCost != Dynamic 85 && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT 86 }; 87 if(unroll) 88 return internal::all_unroller<Derived, 89 unroll ? int(SizeAtCompileTime) : Dynamic 90 >::run(derived()); 91 else 92 { 93 for(Index j = 0; j < cols(); ++j) 94 for(Index i = 0; i < rows(); ++i) 95 if (!coeff(i, j)) return false; 96 return true; 97 } 98 } 99 100 /** \returns true if at least one coefficient is true 101 * 102 * \sa all() 103 */ 104 template<typename Derived> 105 inline bool DenseBase<Derived>::any() const 106 { 107 enum { 108 unroll = SizeAtCompileTime != Dynamic 109 && CoeffReadCost != Dynamic 110 && NumTraits<Scalar>::AddCost != Dynamic 111 && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT 112 }; 113 if(unroll) 114 return internal::any_unroller<Derived, 115 unroll ? int(SizeAtCompileTime) : Dynamic 116 >::run(derived()); 117 else 118 { 119 for(Index j = 0; j < cols(); ++j) 120 for(Index i = 0; i < rows(); ++i) 121 if (coeff(i, j)) return true; 122 return false; 123 } 124 } 125 126 /** \returns the number of coefficients which evaluate to true 127 * 128 * \sa all(), any() 129 */ 130 template<typename Derived> 131 inline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const 132 { 133 return derived().template cast<bool>().template cast<Index>().sum(); 134 } 135 136 } // end namespace Eigen 137 138 #endif // EIGEN_ALLANDANY_H 139