Merge 6.0 into master
[scilab.git] / scilab / modules / ast / includes / types / struct.hxx
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2011 - 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 __STRUCT_HXX__
17 #define __STRUCT_HXX__
18
19 #include "list.hxx"
20 #include "arrayof.hxx"
21 #include "singlestruct.hxx"
22
23 extern "C"
24 {
25 #include "localization.h"
26 }
27
28 namespace types
29 {
30 class EXTERN_AST Struct : public ArrayOf<SingleStruct*>
31 {
32 public :
33     ~Struct();
34     Struct();
35     Struct(int _iRows, int _iCols);
36     Struct(int _iDims, const int* _piDims);
37
38 private :
39     Struct(Struct* _oCellCopyMe);
40
41 public :
42
43     void                        whoAmI(void)
44     {
45         std::cout << "types::Struct";
46     };
47
48     inline ScilabType           getType(void)
49     {
50         return ScilabStruct;
51     }
52     inline ScilabId             getId(void)
53     {
54         return IdStruct;
55     }
56
57     bool                        isStruct()
58     {
59         return true;
60     }
61     bool                        isEmpty();
62
63     bool transpose(InternalType *& out);
64
65
66     /**
67     ** Clone
68     ** Create a new List and Copy all values.
69     */
70     Struct*                     clone();
71
72     Struct*                     set(int _iRows, int _iCols, SingleStruct* _pIT);
73     Struct*                     set(int _iRows, int _iCols, const SingleStruct* _pIT);
74     Struct*                     set(int _iIndex, SingleStruct* _pIT);
75     Struct*                     set(int _iIndex, const SingleStruct* _pIT);
76     Struct*                     set(SingleStruct** _pIT);
77
78     bool                        operator==(const InternalType& it);
79     bool                        operator!=(const InternalType& it);
80
81     /* return type as string ( double, int, cell, list, ... )*/
82     virtual std::wstring        getTypeStr() const
83     {
84         return L"struct";
85     }
86     /* return type as short string ( s, i, ce, l, ... )*/
87     virtual std::wstring        getShortTypeStr() const
88     {
89         return L"st";
90     }
91     virtual bool                isContainer(void)
92     {
93         return true;
94     }
95
96     bool isTrue()
97     {
98         return false;
99     }
100
101     virtual bool neg(InternalType *& /*out*/)
102     {
103         return false;
104     }
105
106     bool                        subMatrixToString(std::wostringstream& ostr, int* _piDims, int _iDims) override;
107     String*                     getFieldNames();
108     bool                        exists(const std::wstring& _sKey);
109     Struct*                     addField(const std::wstring& _sKey);
110     Struct*                     addFieldFront(const std::wstring& _sKey);
111     Struct*                     removeField(const std::wstring& _sKey);
112     bool                        toString(std::wostringstream& ostr);
113     List*                       extractFieldWithoutClone(const std::wstring& _wstField);
114     typed_list                  extractFields(std::vector<std::wstring> _wstFields);
115     typed_list                  extractFields(typed_list* _pArgs);
116     InternalType *              extractField(const std::wstring& wstField);
117
118     Struct*                     resize(int* _piDims, int _iDims);
119     Struct*                     resize(int _iNewRows, int _iNewCols);
120
121     /*specials functions to disable clone operation during copydata*/
122     InternalType*               insertWithoutClone(typed_list* _pArgs, InternalType* _pSource);
123     InternalType*               extractWithoutClone(typed_list* _pArgs);
124     void                        setCloneInCopyValue(bool _val);
125
126     using ArrayOf<SingleStruct *>::extract;
127     bool extract(const std::wstring& name, InternalType *& out);
128
129     virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e) override;
130
131     virtual int getInvokeNbOut()
132     {
133         return -1;
134     }
135
136     bool                        getMemory(int* _piSize, int* _piSizePlusType);
137
138 private :
139     virtual SingleStruct*       getNullValue();
140     virtual Struct*             createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
141     virtual Struct*             createEmpty();
142     virtual SingleStruct*       copyValue(SingleStruct* _pData);
143     virtual void                deleteAll();
144     virtual void                deleteImg();
145     virtual SingleStruct**      allocData(int _iSize);
146     virtual void                deleteData(SingleStruct* data);
147
148     bool                        m_bDisableCloneInCopyValue;
149
150 };
151 }
152
153 #ifdef _MSC_VER
154 template class types::ArrayOf<types::SingleStruct*>; //Struct
155 #endif
156 #endif /* !__STRUCT_HXX__ */