* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[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     // _bInit: true, fill the struct by empty SingleStructs.
36     // _bInit: false, Only alocate the array and fill each element by NULL.
37     //           that mean you have to fill it by SingleStructs and increase there ref.
38     Struct(int _iRows, int _iCols, bool _bInit = true);
39     Struct(int _iDims, const int* _piDims, bool _bInit = true);
40
41 private :
42     Struct(Struct* _oCellCopyMe);
43
44 public :
45
46     void                        whoAmI(void) override
47     {
48         std::cout << "types::Struct";
49     };
50
51     inline ScilabType           getType(void) override
52     {
53         return ScilabStruct;
54     }
55     inline ScilabId             getId(void) override
56     {
57         return IdStruct;
58     }
59
60     bool                        isStruct() override
61     {
62         return true;
63     }
64     bool                        isEmpty();
65
66     bool transpose(InternalType *& out) override;
67
68
69     /**
70     ** Clone
71     ** Create a new List and Copy all values.
72     */
73     Struct*                     clone() override;
74
75     Struct*                     set(int _iRows, int _iCols, SingleStruct* _pIT) override;
76     Struct*                     set(int _iRows, int _iCols, const SingleStruct* _pIT);
77     Struct*                     set(int _iIndex, SingleStruct* _pIT) override;
78     Struct*                     set(int _iIndex, const SingleStruct* _pIT);
79     Struct*                     set(SingleStruct** _pIT) override;
80
81     bool                        operator==(const InternalType& it) override;
82     bool                        operator!=(const InternalType& it) override;
83
84     /* return type as string ( double, int, cell, list, ... )*/
85     virtual std::wstring        getTypeStr() const override
86     {
87         return L"struct";
88     }
89     /* return type as short string ( s, i, ce, l, ... )*/
90     virtual std::wstring        getShortTypeStr() const override
91     {
92         return L"st";
93     }
94     virtual bool                isContainer(void) override
95     {
96         return true;
97     }
98
99     bool isTrue() override
100     {
101         return false;
102     }
103
104     virtual bool neg(InternalType *& /*out*/) override
105     {
106         return false;
107     }
108
109     bool                        subMatrixToString(std::wostringstream& ostr, int* _piDims, int _iDims) override;
110     String*                     getFieldNames();
111     bool                        exists(const std::wstring& _sKey);
112     Struct*                     addField(const std::wstring& _sKey);
113     Struct*                     addFieldFront(const std::wstring& _sKey);
114     Struct*                     removeField(const std::wstring& _sKey);
115     bool                        toString(std::wostringstream& ostr) override;
116     List*                       extractFieldWithoutClone(const std::wstring& _wstField);
117     typed_list                  extractFields(std::vector<std::wstring> _wstFields);
118     typed_list                  extractFields(typed_list* _pArgs);
119     InternalType *              extractField(const std::wstring& wstField);
120
121     Struct*                     resize(int* _piDims, int _iDims) override;
122     Struct*                     resize(int _iNewRows, int _iNewCols) override;
123
124     /*specials functions to disable clone operation during copydata*/
125     InternalType*               insertWithoutClone(typed_list* _pArgs, InternalType* _pSource);
126     InternalType*               extractWithoutClone(typed_list* _pArgs);
127     void                        setCloneInCopyValue(bool _val);
128
129     using ArrayOf<SingleStruct *>::extract;
130     bool extract(const std::wstring& name, InternalType *& out) override;
131
132     virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e) override;
133
134     virtual int getInvokeNbOut() override
135     {
136         return -1;
137     }
138
139     bool                        getMemory(long long* _piSize, long long* _piSizePlusType) override;
140
141 private :
142     virtual SingleStruct*       getNullValue() override;
143     virtual Struct*             createEmpty(int _iDims, int* _piDims, bool _bComplex = false) override;
144     virtual Struct*             createEmpty() override;
145     virtual SingleStruct*       copyValue(SingleStruct* _pData) override;
146     virtual void                deleteAll() override;
147     virtual void                deleteImg() override;
148     virtual SingleStruct**      allocData(int _iSize) override;
149     virtual void                deleteData(SingleStruct* data) override;
150
151     bool                        m_bDisableCloneInCopyValue;
152
153 };
154 }
155
156 #ifdef _MSC_VER
157 template class types::ArrayOf<types::SingleStruct*>; //Struct
158 #endif
159 #endif /* !__STRUCT_HXX__ */