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