faedfdebcd0d05d995abca6bcbed5688e0074f96
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __TYPE_TRAITS_HXX__
14 #define __TYPE_TRAITS_HXX__
15
16 #include <cmath>
17 #include <Eigen/Sparse>
18 #include "types_transposition.hxx"
19 #include "keepForSparse.hxx"
20
21 namespace types
22 {
23
24 struct type_traits
25 {
26
27     template<typename T>
28     inline static bool isTrue(const int size, const T * const data)
29     {
30         for (int i = 0; i < size; i++)
31         {
32             if (data[i] == 0)
33             {
34                 return false;
35             }
36         }
37
38         return true;
39     }
40
41     inline static bool isTrue(const double start, const double step, const double end)
42     {
43         if (start == 0 || end == 0 || step == 0)
44         {
45             return false;
46         }
47
48         if ((start < 0 && end > 0) || (start > 0 && end < 0))
49         {
50             double q = start / step;
51             if (std::floor(q) == q)
52             {
53                 return false;
54             }
55         }
56
57         return true;
58     }
59
60     template<typename T, typename U>
61     inline static void neg(const int size, const T * const in, U * const out)
62     {
63         for (int i = 0; i < size; i++)
64         {
65             out[i] = !in[i]; //in[i] == 0 ? 1 : 0;
66         }
67     }
68
69     template<typename T>
70     inline static void neg(const T start, const T step, const T end, int * const out)
71     {
72         int j = 0;
73         for (T i = start; i < end; i += step, j++)
74         {
75             out[j] = i == 0;
76         }
77     }
78
79     template<typename T>
80     inline static void neg(const int r, const int c, const T * const in, Eigen::SparseMatrix<bool> * const out)
81     {
82         for (int i = 0; i < r; i++)
83         {
84             for (int j = 0; j < c; j++)
85             {
86                 out->coeffRef(i, j) = !in->coeff(i, j);
87             }
88         }
89
90         out->prune(&keepForSparse<bool>);
91         out->finalize();
92     }
93
94     template<typename T, typename U>
95     inline static void bin_neg(const int size, const T * const in, U * const out)
96     {
97         for (int i = 0; i < size; i++)
98         {
99             out[i] = ~in[i];
100         }
101     }
102
103     template<typename T>
104     inline static bool transpose(T & in, InternalType *& out)
105     {
106         if (in.isScalar())
107         {
108             out = in.clone();
109             return true;
110         }
111
112         if (in.getDims() == 2)
113         {
114             T * pReturn = new T(in.getCols(), in.getRows());
115             out = pReturn;
116             Transposition::transpose(in.getRows(), in.getCols(), in.get(), pReturn->get());
117
118             return true;
119         }
120
121         return false;
122     }
123 };
124
125 } // namespace types
126
127 #endif // __TYPE_TRAITS_HXX__