GPL + CeCILL Header change
[scilab.git] / scilab / modules / ast / includes / types / polynom.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - 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  * === LICENSE_END ===
14 *
15 */
16
17 // This code is separated in matrixpoly.hxx
18 // but will be inlined in arrayof.hxx
19 //
20 // If you need additionnal headers, please add it in arrayof.hxx
21
22 //#ifndef __ARRAYOF_HXX__
23 //    #error This file must only be include by arrayof.hxx
24 //#endif
25
26 #ifndef __POLYNOM_HXX__
27 #define __POLYNOM_HXX__
28
29 #include "arrayof.hxx"
30 #include "singlepoly.hxx"
31 #include "double.hxx"
32
33 //disable warnings about exports STL items
34 #ifdef _MSC_VER
35 #pragma warning (disable : 4251)
36 #endif
37
38 namespace types
39 {
40 class EXTERN_AST Polynom : public ArrayOf<SinglePoly*>
41 {
42 public :
43     Polynom();
44     Polynom(const std::wstring& _szVarName, int _iRows, int _iCols);
45     Polynom(const std::wstring& _szVarName, int _iRows, int _iCols, const int *_piRank);
46     Polynom(const std::wstring& _szVarName, int _iDims, const int* _piDims);
47     Polynom(const std::wstring& _szVarName, int _iDims, const int* _piDims, const int *_piRank);
48
49     virtual                 ~Polynom();
50
51     // FIXME : Should not return NULL
52     Polynom*                clone();
53
54     Polynom*                setCoef(int _iRows, int _iCols, Double *_pdblCoef);
55     Polynom*                setCoef(int _iIdx, Double *_pdblCoef);
56
57     virtual Polynom*        setComplex(bool _bComplex);
58
59     inline ScilabType       getType(void)
60     {
61         return ScilabPolynom;
62     }
63
64     inline ScilabId         getId(void)
65     {
66         return isScalar() ? isComplex() ? IdScalarPolynomComplex
67                : IdScalarPolynom
68        : isComplex() ? IdPolynomComplex
69                : IdPolynom;
70     }
71
72     bool isComplex(void);
73
74     bool isDollar();
75     inline bool             isPoly()
76     {
77         return true;
78     }
79
80     void                    whoAmI(void);
81     std::wstring&           getVariableName();
82     void                    setVariableName(const std::wstring&);
83     bool                    getSizes(int *_piSizes);
84     bool                    getRank(int *_piRank);
85     int                     getMaxRank(void);
86     Double*                 evaluate(Double* _pdblValue);
87     void                    updateRank(void);
88     Double*                 getCoef(void);
89     Polynom*                setCoef(Double *_pCoef);
90     Double*                 extractCoef(int _iRank);
91     bool                    insertCoef(int _iRank, Double* _pCoef);
92     void                    setZeros();
93     Polynom*                insert(typed_list* _pArgs, InternalType* _pSource);
94
95     Polynom*                set(int _iPos, SinglePoly* _pS);
96     Polynom*                set(int _iRows, int _iCols, SinglePoly* _pS);
97     Polynom*                set(SinglePoly** _pS);
98
99     std::wstring            getRowString(int* _piDims, int _iDims, bool _bComplex);
100     std::wstring            getColString(int* _piDims, int _iDims, bool _bComplex);
101     std::wstring            getMatrixString(int* _piDims, int _iDims, bool _bComplex);
102
103
104     bool                    operator==(const InternalType& it);
105     bool                    operator!=(const InternalType& it);
106
107     /* return type as string ( double, int, cell, list, ... )*/
108     virtual std::wstring    getTypeStr()
109     {
110         return L"polynomial";
111     }
112     /* return type as short string ( s, i, ce, l, ... )*/
113     virtual std::wstring    getShortTypeStr()
114     {
115         return L"p";
116     }
117
118     bool isTrue()
119     {
120         return false;
121     }
122
123     bool transpose(InternalType *& out);
124     bool adjoint(InternalType *& out);
125
126     static Polynom* Dollar();
127
128 protected :
129     std::wstring            m_szVarName;
130     void                    createPoly(const std::wstring& _szVarName, int _iDims, const int* _piDims, const int *_piRank);
131
132 private :
133     virtual bool            subMatrixToString(std::wostringstream& ostr, int* _piDims, int _iDims) override;
134
135     virtual SinglePoly*     getNullValue();
136     virtual Polynom*        createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
137     virtual SinglePoly*     copyValue(SinglePoly* _pData);
138     virtual void            deleteAll();
139     virtual void            deleteImg();
140     virtual SinglePoly**    allocData(int _iSize);
141     virtual void            deleteData(SinglePoly* data);
142 };
143 }
144
145 #ifdef _MSC_VER
146 template class types::ArrayOf<types::SinglePoly*>; //Polynom
147 #endif
148 #endif /* !__POLYNOM_HXX__ */