* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / operations / types_transposition.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 __TYPES_TRANSPOSITION_HXX__
17 #define __TYPES_TRANSPOSITION_HXX__
18
19 extern "C"
20 {
21 #include "os_string.h"
22 }
23
24 struct Transposition
25 {
26     template<typename T, typename U>
27     inline static void transpose(const int r, const int c, const T * const in, U * const out)
28     {
29         for (int i = 0, k = 0; i < c; i++, k += r)
30         {
31             for (int j = 0, l = 0; j < r; j++, l += c)
32             {
33                 out[i + l] = in[j + k];
34             }
35         }
36     }
37
38     template<typename T, typename U>
39     inline static void transpose_clone(const int r, const int c, const T * const in, U * const out)
40     {
41         for (int i = 0, k = 0; i < c; i++, k += r)
42         {
43             for (int j = 0, l = 0; j < r; j++, l += c)
44             {
45                 out[i + l] = in[j + k]->clone();
46             }
47         }
48     }
49
50     template<typename T, typename U>
51     inline static void transpose(const int r, const int c, const T * const in_R, U * const out_R, const T * const in_I, U * const out_I)
52     {
53         for (int i = 0, k = 0; i < c; i++, k += r)
54         {
55             for (int j = 0, l = 0; j < r; j++, l += c)
56             {
57                 out_R[i + l] = in_R[j + k];
58                 out_I[i + l] = in_I[j + k];
59             }
60         }
61     }
62
63     template<typename T, typename U>
64     inline static void adjoint(const int r, const int c, const T * const in_R, U * const out_R, const T * const in_I, U * const out_I)
65     {
66         for (int i = 0, k = 0; i < c; i++, k += r)
67         {
68             for (int j = 0, l = 0; j < r; j++, l += c)
69             {
70                 out_R[i + l] = in_R[j + k];
71                 out_I[i + l] = -in_I[j + k];
72             }
73         }
74     }
75
76     template<typename T, typename U>
77     inline static void adjoint_clone(const int r, const int c, const T * const in, U * const out)
78     {
79         for (int i = 0, k = 0; i < c; i++, k += r)
80         {
81             for (int j = 0, l = 0; j < r; j++, l += c)
82             {
83                 out[i + l] = in[j + k]->conjugate();
84             }
85         }
86     }
87
88     template<typename T, typename U>
89     inline static void adjoint(const int r, const int c, const T * const in, U * const out)
90     {
91         return transpose(r, c, in, out);
92     }
93
94     template<typename T, typename U>
95     inline static void conjugate(const int size, const T * const in_R, U * const out_R, const T * const in_I, U * const out_I)
96     {
97         for (int i = 0; i < size; i++)
98         {
99             out_R[i] = in_R[i];
100             out_I[i] = -in_I[i];
101         }
102     }
103 };
104
105 template<>
106 inline void Transposition::transpose<wchar_t *, wchar_t *>(const int r, const int c, wchar_t * const * const in, wchar_t ** const out)
107 {
108     for (int i = 0, k = 0; i < c; i++, k += r)
109     {
110         for (int j = 0, l = 0; j < r; j++, l += c)
111         {
112             out[i + l] = os_wcsdup(in[j + k]);
113         }
114     }
115 }
116
117
118
119 #endif // __TYPES_TRANSPOSITION_HXX__