source: pacpussensors/trunk/Vislab/lib3dv/eigen/Eigen/src/Core/BooleanRedux.h@ 136

Last change on this file since 136 was 136, checked in by ldecherf, 7 years ago

Doc

File size: 3.8 KB
Line 
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@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
13namespace Eigen {
14
15namespace internal {
16
17template<typename Derived, int UnrollCount>
18struct 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
31template<typename Derived>
32struct all_unroller<Derived, 0>
33{
34 static inline bool run(const Derived &/*mat*/) { return true; }
35};
36
37template<typename Derived>
38struct all_unroller<Derived, Dynamic>
39{
40 static inline bool run(const Derived &) { return false; }
41};
42
43template<typename Derived, int UnrollCount>
44struct 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
57template<typename Derived>
58struct any_unroller<Derived, 0>
59{
60 static inline bool run(const Derived & /*mat*/) { return false; }
61};
62
63template<typename Derived>
64struct 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 */
78template<typename Derived>
79inline 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, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());
89 else
90 {
91 for(Index j = 0; j < cols(); ++j)
92 for(Index i = 0; i < rows(); ++i)
93 if (!coeff(i, j)) return false;
94 return true;
95 }
96}
97
98/** \returns true if at least one coefficient is true
99 *
100 * \sa all()
101 */
102template<typename Derived>
103inline bool DenseBase<Derived>::any() const
104{
105 enum {
106 unroll = SizeAtCompileTime != Dynamic
107 && CoeffReadCost != Dynamic
108 && NumTraits<Scalar>::AddCost != Dynamic
109 && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT
110 };
111 if(unroll)
112 return internal::any_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());
113 else
114 {
115 for(Index j = 0; j < cols(); ++j)
116 for(Index i = 0; i < rows(); ++i)
117 if (coeff(i, j)) return true;
118 return false;
119 }
120}
121
122/** \returns the number of coefficients which evaluate to true
123 *
124 * \sa all(), any()
125 */
126template<typename Derived>
127inline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const
128{
129 return derived().template cast<bool>().template cast<Index>().sum();
130}
131
132/** \returns true is \c *this contains at least one Not A Number (NaN).
133 *
134 * \sa allFinite()
135 */
136template<typename Derived>
137inline bool DenseBase<Derived>::hasNaN() const
138{
139 return !((derived().array()==derived().array()).all());
140}
141
142/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values.
143 *
144 * \sa hasNaN()
145 */
146template<typename Derived>
147inline bool DenseBase<Derived>::allFinite() const
148{
149 return !((derived()-derived()).hasNaN());
150}
151
152} // end namespace Eigen
153
154#endif // EIGEN_ALLANDANY_H
Note: See TracBrowser for help on using the repository browser.