* Bug 15781 fixed: display of complex matrix was ugly
[scilab.git] / scilab / modules / ast / includes / types / tostring_common.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2009 - DIGITEO - Antoine ELIAS
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 __TOSTRING_COMMON_HXX__
17 #define __TOSTRING_COMMON_HXX__
18
19 #include <type_traits>
20 #include <sstream>
21 #include "os_string.h"
22 #include "dynlib_ast.h"
23
24 #define BLANK_SIZE 1
25 #define SIZE_BETWEEN_TWO_VALUES         1
26 #define SPACE_BETWEEN_TWO_VALUES        L" "
27 #define SIZE_BOOL                       1
28 #define SIZE_BETWEEN_BOOL               1
29 #define SPACE_BETWEEN_BOOL              L" "
30 #define SIGN_LENGTH                     1
31 #define NO_SIGN                         L" "
32 #define MINUS_STRING                    L"-"
33 #define PLUS_STRING                     L"+"
34 #define SYMBOL_I                        L"i"
35 #define SIZE_SYMBOL_I                   1
36
37
38 #define MAX_LINES                       100
39 #ifndef _MSC_VER
40 #include <inttypes.h>
41 #define _abs64(x) llabs(x)
42 #endif
43
44 typedef struct __DOUBLE_FORMAT__
45 {
46     __DOUBLE_FORMAT__() : iWidth(0), iPrec(0), bExp(false), bPrintPoint(true), bPrintPlusSign(false), bPrintOne(true), bPaddSign(true), iSignLen(SIGN_LENGTH), bPrintBlank(true), bPrintComplexPlusSpace(false) {}
47     int iWidth;
48     int iPrec;
49     bool bExp;
50     bool bPrintPoint;
51     bool bPrintPlusSign;
52     bool bPrintOne;
53     bool bPaddSign;
54     int iSignLen;
55     bool bPrintBlank;
56     bool bPrintComplexPlusSpace;
57 } DoubleFormat;
58
59 /*double*/
60 //void getDoubleFormat(double _dblVal, int *_piWidth, int *_piPrec, bool* _pExp);
61 EXTERN_AST void getDoubleFormat(double _dblVal, DoubleFormat* _pDF);
62 //void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, int *_piWidthR, int *_piWidthI, int *_piPrecR, int *_piPrecI, bool* _pExpR, bool* _pExpI);
63 EXTERN_AST void getComplexFormat(double _dblR, double _dblI, int *_piTotalWidth, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
64
65 //addDoubleValue(int _iWidth, int _iPrec, bool _bExp, bool _bPrintPoint = true, bool _bPrintPlusSign = false, bool _bPrintOne = true, bool _bPaddSign = true, int _iSignLen = 2);
66 EXTERN_AST void addDoubleValue(std::wostringstream *_postr, double _dblVal, DoubleFormat* _pDF);
67 EXTERN_AST void addDoubleComplexValue(std::wostringstream *_postr, double _dblR, double _dblI, int _iTotalLen, DoubleFormat* _pDFR, DoubleFormat* _pDFI);
68
69 /*Common*/
70 EXTERN_AST void configureStream(std::wostringstream *_postr, int _iWidth, int _iPrec, char _cFill);
71 EXTERN_AST void addSpaces(std::wostringstream *_postr, int _iSpace);
72 void addColumnString(std::wostringstream& ostr, int _iFrom, int _iTo);
73 EXTERN_AST void printEmptyString(std::wostringstream& ostr);
74 EXTERN_AST void printDoubleValue(std::wostringstream& ostr, double val);
75 EXTERN_AST void printComplexValue(std::wostringstream& ostr, double val_r, double val_i);
76
77 /*int*/
78 /*
79   We will specify all "signed" / "unsigned" cases to avoid Compilation Warning
80 */
81
82 template <typename T>
83 void getIntFormat(T _TVal, int *_piWidth,
84                   typename std::enable_if <
85                   std::is_unsigned<T>::value
86                   >::type* = 0)
87 {
88     if (_TVal == 0)
89     {
90         *_piWidth = 0;
91     }
92     else
93     {
94         *_piWidth = static_cast<int>(log10(static_cast<long double>(_TVal)) + 1);
95     }
96     *_piWidth += 1;
97 }
98
99 template <typename T>
100 void getIntFormat(T _TVal, int *_piWidth,
101                   typename std::enable_if <
102                   std::is_signed<T>::value
103                   >::type* = 0)
104 {
105     if (_TVal == 0)
106     {
107         *_piWidth = 0;
108     }
109     else
110     {
111         unsigned long long a = _abs64(_TVal);
112         long double b = static_cast<long double>(a);
113         long double c = log10(b) + 1;
114         *_piWidth = static_cast<int>(c);
115         //*_piWidth = static_cast<int>(log10(static_cast<unsigned long double>(_abs64(_TVal))) + 1);
116     }
117     *_piWidth += 1;
118 }
119
120 template <typename T>
121 void addIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true,
122                  typename std::enable_if <
123                  std::is_unsigned<T>::value
124                  >::type* = 0)
125 {
126     const wchar_t * pwstSign = PLUS_STRING;
127     wchar_t pwstFormat[32];
128     wchar_t pwstOutput[32];
129     if (bPrintPlusSign == true)
130     {
131         pwstSign = PLUS_STRING;
132     }
133     else
134     {
135         pwstSign = NO_SIGN;
136     }
137
138     if (bPrintOne == true || _TVal != 1)
139     {
140         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, (unsigned long long)(_TVal));
141         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
142         *_postr << pwstOutput;
143     }
144 }
145
146 template <typename T>
147 void addIntValue(std::wostringstream *_postr, T _TVal, int _iWidth, bool bPrintPlusSign = false, bool bPrintOne = true,
148                  typename std::enable_if <
149                  std::is_signed<T>::value
150                  >::type* = 0)
151 {
152     const wchar_t* pwstSign = NULL;
153     wchar_t pwstFormat[32];
154     wchar_t pwstOutput[32];
155     if (bPrintPlusSign == true)
156     {
157         pwstSign = (_TVal < 0 ? L"-" : L"+");
158     }
159     else
160     {
161         pwstSign = (_TVal < 0 ? L"-" : L" ");
162     }
163
164     if (bPrintOne == true || _TVal != 1)
165     {
166         unsigned long long a = _abs64(_TVal);
167         os_swprintf(pwstFormat, 32, L" %ls%llu", pwstSign, a);
168         os_swprintf(pwstOutput, 32, L"%*ls", _iWidth + 1, pwstFormat);//+1 for blank
169         *_postr << pwstOutput;
170     }
171 }
172
173
174 #endif /* __TOSTRING_COMMON_HXX__ */