List extraction fixed.
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __LIST_HH__
14 #define __LIST_HH__
15
16 #include <list>
17 #include "container.hxx"
18
19 namespace types
20 {
21 class EXTERN_AST List : public Container
22 {
23 public :
24     List();
25     ~List();
26
27 protected :
28     std::vector<InternalType *>*    getData();
29     List(List *_oListCopyMe);
30 public :
31     int                             getSize();
32
33     void                            whoAmI(void)
34     {
35         std::cout << "types::List";
36     };
37
38     inline ScilabType               getType(void)
39     {
40         return ScilabList;
41     }
42     inline ScilabId                 getId(void)
43     {
44         return IdList;
45     }
46
47     /**
48     ** append(InternalType *_typedValue)
49     ** Append the given value to the end of the List
50     */
51     void                            append(InternalType *_typedValue);
52
53     /**
54     ** Clone
55     ** Create a new List and Copy all values.
56     */
57     InternalType*                   clone();
58
59     bool                            toString(std::wostringstream& ostr);
60
61     bool                            isList()
62     {
63         return true;
64     }
65
66     InternalType*                   insert(typed_list* _pArgs, InternalType* _pSource);
67     InternalType*                   extract(typed_list* _pArgs);
68
69     virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & /*e*/)
70     {
71         if (in.size() == 0)
72         {
73             out.push_back(this);
74         }
75         else
76         {
77             InternalType * _out = extract(&in);
78             if (_out == NULL)
79             {
80                 // invalid index
81                 return false;
82             }
83
84             List* pList = _out->getAs<types::List>();
85             for (int i = 0; i < pList->getSize(); i++)
86             {
87                 out.push_back(pList->get(i));
88             }
89             delete pList;
90         }
91
92         return true;
93     }
94
95     virtual bool isInvokable() const
96     {
97         return true;
98     }
99
100     virtual bool hasInvokeOption() const
101     {
102         return false;
103     }
104
105     virtual int getInvokeNbIn()
106     {
107         return -1;
108     }
109
110     virtual int getInvokeNbOut()
111     {
112         return -1;
113     }
114
115     virtual InternalType*           get(const int _iIndex);
116     virtual bool                    set(const int _iIndex, InternalType* _pIT);
117
118     /* return type as string ( double, int, cell, list, ... )*/
119     virtual std::wstring            getTypeStr()
120     {
121         return L"list";
122     }
123     /* return type as short string ( s, i, ce, l, ... )*/
124     virtual std::wstring            getShortTypeStr()
125     {
126         return L"l";
127     }
128
129     virtual bool                    operator==(const InternalType& it);
130
131 protected :
132     std::vector<InternalType *>*    m_plData;
133 };
134 }
135
136 #endif /* __LIST_HH__ */