License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / types / list.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
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 __LIST_HH__
17 #define __LIST_HH__
18
19 #include <list>
20 #include "container.hxx"
21
22 namespace types
23 {
24 class EXTERN_AST List : public Container
25 {
26 public :
27     List();
28     virtual ~List();
29
30 protected :
31     std::vector<InternalType *>*    getData();
32     List(List *_oListCopyMe);
33 public :
34     int                             getSize();
35
36     void                            whoAmI(void)
37     {
38         std::cout << "types::List";
39     };
40
41     inline ScilabType               getType(void)
42     {
43         return ScilabList;
44     }
45     inline ScilabId                 getId(void)
46     {
47         return IdList;
48     }
49
50     /**
51     ** append(InternalType *_typedValue)
52     ** Append the given value to the end of the List
53     */
54     List*                           append(InternalType *_typedValue);
55
56     /**
57     ** Clone
58     ** Create a new List and Copy all values.
59     */
60     virtual List*                   clone();
61
62     bool                            toString(std::wostringstream& ostr);
63
64     bool                            isList()
65     {
66         return true;
67     }
68
69     List*                           insert(typed_list* _pArgs, InternalType* _pSource);
70     InternalType*                   extract(typed_list* _pArgs);
71
72     virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, const ast::Exp & /*e*/) override
73     {
74         if (in.size() == 0)
75         {
76             out.push_back(this);
77         }
78         else
79         {
80             InternalType * _out = extract(&in);
81             if (_out == NULL)
82             {
83                 // invalid index
84                 return false;
85             }
86
87             List* pList = _out->getAs<types::List>();
88             for (int i = 0; i < pList->getSize(); i++)
89             {
90                 out.push_back(pList->get(i));
91             }
92             pList->killMe();
93         }
94
95         return true;
96     }
97
98     virtual bool isInvokable() const
99     {
100         return true;
101     }
102
103     virtual bool hasInvokeOption() const
104     {
105         return false;
106     }
107
108     virtual int getInvokeNbIn()
109     {
110         return -1;
111     }
112
113     virtual int getInvokeNbOut()
114     {
115         return -1;
116     }
117
118     virtual InternalType*           get(const int _iIndex);
119     virtual List*                   set(const int _iIndex, InternalType* _pIT);
120
121     /* return type as string ( double, int, cell, list, ... )*/
122     virtual std::wstring            getTypeStr()
123     {
124         return L"list";
125     }
126     /* return type as short string ( s, i, ce, l, ... )*/
127     virtual std::wstring            getShortTypeStr()
128     {
129         return L"l";
130     }
131
132     virtual bool                    operator==(const InternalType& it);
133
134 protected :
135     std::vector<InternalType *>*    m_plData;
136 };
137 }
138
139 #endif /* __LIST_HH__ */