remove $Id: tags after discussion on the mailign list: http://markmail.org/message...
[blender.git] / extern / Eigen3 / Eigen / src / Core / BooleanRedux.h
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 // Eigen is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 3 of the License, or (at your option) any later version.
10 //
11 // Alternatively, you can redistribute it and/or
12 // modify it under the terms of the GNU General Public License as
13 // published by the Free Software Foundation; either version 2 of
14 // the License, or (at your option) any later version.
15 //
16 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License and a copy of the GNU General Public License along with
23 // Eigen. If not, see <http://www.gnu.org/licenses/>.
24
25 #ifndef EIGEN_ALLANDANY_H
26 #define EIGEN_ALLANDANY_H
27
28 namespace internal {
29
30 template<typename Derived, int UnrollCount>
31 struct all_unroller
32 {
33   enum {
34     col = (UnrollCount-1) / Derived::RowsAtCompileTime,
35     row = (UnrollCount-1) % Derived::RowsAtCompileTime
36   };
37
38   inline static bool run(const Derived &mat)
39   {
40     return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col);
41   }
42 };
43
44 template<typename Derived>
45 struct all_unroller<Derived, 1>
46 {
47   inline static bool run(const Derived &mat) { return mat.coeff(0, 0); }
48 };
49
50 template<typename Derived>
51 struct all_unroller<Derived, Dynamic>
52 {
53   inline static bool run(const Derived &) { return false; }
54 };
55
56 template<typename Derived, int UnrollCount>
57 struct any_unroller
58 {
59   enum {
60     col = (UnrollCount-1) / Derived::RowsAtCompileTime,
61     row = (UnrollCount-1) % Derived::RowsAtCompileTime
62   };
63
64   inline static bool run(const Derived &mat)
65   {
66     return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col);
67   }
68 };
69
70 template<typename Derived>
71 struct any_unroller<Derived, 1>
72 {
73   inline static bool run(const Derived &mat) { return mat.coeff(0, 0); }
74 };
75
76 template<typename Derived>
77 struct any_unroller<Derived, Dynamic>
78 {
79   inline static bool run(const Derived &) { return false; }
80 };
81
82 } // end namespace internal
83
84 /** \returns true if all coefficients are true
85   *
86   * Example: \include MatrixBase_all.cpp
87   * Output: \verbinclude MatrixBase_all.out
88   *
89   * \sa any(), Cwise::operator<()
90   */
91 template<typename Derived>
92 inline bool DenseBase<Derived>::all() const
93 {
94   enum {
95     unroll = SizeAtCompileTime != Dynamic
96           && CoeffReadCost != Dynamic
97           && NumTraits<Scalar>::AddCost != Dynamic
98           && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT
99   };
100   if(unroll)
101     return internal::all_unroller<Derived,
102                            unroll ? int(SizeAtCompileTime) : Dynamic
103      >::run(derived());
104   else
105   {
106     for(Index j = 0; j < cols(); ++j)
107       for(Index i = 0; i < rows(); ++i)
108         if (!coeff(i, j)) return false;
109     return true;
110   }
111 }
112
113 /** \returns true if at least one coefficient is true
114   *
115   * \sa all()
116   */
117 template<typename Derived>
118 inline bool DenseBase<Derived>::any() const
119 {
120   enum {
121     unroll = SizeAtCompileTime != Dynamic
122           && CoeffReadCost != Dynamic
123           && NumTraits<Scalar>::AddCost != Dynamic
124           && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT
125   };
126   if(unroll)
127     return internal::any_unroller<Derived,
128                            unroll ? int(SizeAtCompileTime) : Dynamic
129            >::run(derived());
130   else
131   {
132     for(Index j = 0; j < cols(); ++j)
133       for(Index i = 0; i < rows(); ++i)
134         if (coeff(i, j)) return true;
135     return false;
136   }
137 }
138
139 /** \returns the number of coefficients which evaluate to true
140   *
141   * \sa all(), any()
142   */
143 template<typename Derived>
144 inline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const
145 {
146   return derived().template cast<bool>().template cast<Index>().sum();
147 }
148
149 #endif // EIGEN_ALLANDANY_H