Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / extern / Eigen2 / Eigen / src / Array / BooleanRedux.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <g.gael@free.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 template<typename Derived, int UnrollCount>
29 struct ei_all_unroller
30 {
31   enum {
32     col = (UnrollCount-1) / Derived::RowsAtCompileTime,
33     row = (UnrollCount-1) % Derived::RowsAtCompileTime
34   };
35
36   inline static bool run(const Derived &mat)
37   {
38     return ei_all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col);
39   }
40 };
41
42 template<typename Derived>
43 struct ei_all_unroller<Derived, 1>
44 {
45   inline static bool run(const Derived &mat) { return mat.coeff(0, 0); }
46 };
47
48 template<typename Derived>
49 struct ei_all_unroller<Derived, Dynamic>
50 {
51   inline static bool run(const Derived &) { return false; }
52 };
53
54 template<typename Derived, int UnrollCount>
55 struct ei_any_unroller
56 {
57   enum {
58     col = (UnrollCount-1) / Derived::RowsAtCompileTime,
59     row = (UnrollCount-1) % Derived::RowsAtCompileTime
60   };
61
62   inline static bool run(const Derived &mat)
63   {
64     return ei_any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col);
65   }
66 };
67
68 template<typename Derived>
69 struct ei_any_unroller<Derived, 1>
70 {
71   inline static bool run(const Derived &mat) { return mat.coeff(0, 0); }
72 };
73
74 template<typename Derived>
75 struct ei_any_unroller<Derived, Dynamic>
76 {
77   inline static bool run(const Derived &) { return false; }
78 };
79
80 /** \array_module
81   * 
82   * \returns true if all coefficients are true
83   *
84   * \addexample CwiseAll \label How to check whether a point is inside a box (using operator< and all())
85   *
86   * Example: \include MatrixBase_all.cpp
87   * Output: \verbinclude MatrixBase_all.out
88   *
89   * \sa MatrixBase::any(), Cwise::operator<()
90   */
91 template<typename Derived>
92 inline bool MatrixBase<Derived>::all() const
93 {
94   const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost)
95                       <= EIGEN_UNROLLING_LIMIT;
96   if(unroll)
97     return ei_all_unroller<Derived,
98                            unroll ? int(SizeAtCompileTime) : Dynamic
99      >::run(derived());
100   else
101   {
102     for(int j = 0; j < cols(); ++j)
103       for(int i = 0; i < rows(); ++i)
104         if (!coeff(i, j)) return false;
105     return true;
106   }
107 }
108
109 /** \array_module
110   * 
111   * \returns true if at least one coefficient is true
112   *
113   * \sa MatrixBase::all()
114   */
115 template<typename Derived>
116 inline bool MatrixBase<Derived>::any() const
117 {
118   const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost)
119                       <= EIGEN_UNROLLING_LIMIT;
120   if(unroll)
121     return ei_any_unroller<Derived,
122                            unroll ? int(SizeAtCompileTime) : Dynamic
123            >::run(derived());
124   else
125   {
126     for(int j = 0; j < cols(); ++j)
127       for(int i = 0; i < rows(); ++i)
128         if (coeff(i, j)) return true;
129     return false;
130   }
131 }
132
133 /** \array_module
134   * 
135   * \returns the number of coefficients which evaluate to true
136   *
137   * \sa MatrixBase::all(), MatrixBase::any()
138   */
139 template<typename Derived>
140 inline int MatrixBase<Derived>::count() const
141 {
142   return this->cast<bool>().cast<int>().sum();
143 }
144
145 #endif // EIGEN_ALLANDANY_H