* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / types / type_traits.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __TYPE_TRAITS_HXX__
17 #define __TYPE_TRAITS_HXX__
18
19 #include <cmath>
20 #include "types_transposition.hxx"
21
22 namespace types
23 {
24
25 struct type_traits
26 {
27
28     template<typename T>
29     inline static bool isTrue(const int size, const T * const data)
30     {
31         for (int i = 0; i < size; i++)
32         {
33             if (data[i] == 0)
34             {
35                 return false;
36             }
37         }
38
39         return true;
40     }
41
42     inline static bool isTrue(const double start, const double step, const double end)
43     {
44         if (start == 0 || end == 0 || step == 0)
45         {
46             return false;
47         }
48
49         if ((start < 0 && end > 0) || (start > 0 && end < 0))
50         {
51             double q = start / step;
52             if (std::floor(q) == q)
53             {
54                 return false;
55             }
56         }
57
58         return true;
59     }
60
61     template<typename T, typename U>
62     inline static void neg(const int size, const T * const in, U * const out)
63     {
64         for (int i = 0; i < size; i++)
65         {
66             out[i] = !in[i]; //in[i] == 0 ? 1 : 0;
67         }
68     }
69
70     template<typename T>
71     inline static void neg(const T start, const T step, const T end, int * const out)
72     {
73         int j = 0;
74         for (T i = start; i < end; i += step, j++)
75         {
76             out[j] = i == 0;
77         }
78     }
79
80     //template<typename T>
81     //inline static void neg(const int r, const int c, const T * const in, Eigen::SparseMatrix<bool, Eigen::RowMajor> * const out)
82     //{
83     //    for (int i = 0; i < r; i++)
84     //    {
85     //        for (int j = 0; j < c; j++)
86     //        {
87     //            out->coeffRef(i, j) = !in->coeff(i, j);
88     //        }
89     //    }
90
91     //    out->prune(&keepForSparse<bool>);
92     //    out->finalize();
93     //}
94
95     template<typename T, typename U>
96     inline static void bin_neg(const int size, const T * const in, U * const out)
97     {
98         for (int i = 0; i < size; i++)
99         {
100             out[i] = ~in[i];
101         }
102     }
103
104     template<typename T>
105     inline static bool transpose(T & in, InternalType *& out)
106     {
107         if (in.isScalar())
108         {
109             out = in.clone();
110             return true;
111         }
112
113         if (in.getDims() == 2)
114         {
115             T * pReturn = new T(in.getCols(), in.getRows());
116             out = pReturn;
117             Transposition::transpose(in.getRows(), in.getCols(), in.get(), pReturn->get());
118
119             return true;
120         }
121
122         return false;
123     }
124 };
125
126 } // namespace types
127
128 #endif // __TYPE_TRAITS_HXX__