11#include " arraydatatype.h"
22#include " interpreter/values/literalvalue.h"
3- #include < iterator >
3+ #include " interpreter/context.h "
44
55using namespace CS ;
66using namespace std ;
@@ -16,6 +16,26 @@ ArrayDataType::ArrayDataType() {
1616 " at" ,
1717 &ArrayDataType::at)
1818 );
19+ _methods.insert (
20+ pair<string,method_function_t >(
21+ " append" ,
22+ &ArrayDataType::append)
23+ );
24+ _methods.insert (
25+ pair<string,method_function_t >(
26+ " insert" ,
27+ &ArrayDataType::insert)
28+ );
29+ _methods.insert (
30+ pair<string,method_function_t >(
31+ " remove" ,
32+ &ArrayDataType::remove)
33+ );
34+ _methods.insert (
35+ pair<string,method_function_t >(
36+ " pop" ,
37+ &ArrayDataType::pop)
38+ );
1939}
2040
2141ArrayDataType::~ArrayDataType () {}
@@ -87,3 +107,137 @@ LiteralValue* ArrayDataType::at(
87107
88108 return (*it)->clone ();
89109}
110+
111+ LiteralValue* ArrayDataType::append (
112+ string variableName,
113+ const LiteralValue* value,
114+ const LiteralValue* args
115+ ) {
116+
117+ if ( args->getDataTypeId () != DataTypesId::Argument )
118+ return nullptr ;
119+
120+ auto argumentValues = (list<LiteralValue*>*)args->getValue ();
121+
122+ if ( argumentValues->size () != 1 )
123+ return nullptr ;
124+
125+ if ( !value )
126+ return nullptr ;
127+
128+ auto array = (list<LiteralValue*>*)value->getValue ();
129+
130+ array->push_back (argumentValues->front ()->clone ());
131+
132+ auto newValue = new ArrayLiteralValue (*array);
133+
134+ Context::getInstance ()->setVariableValue (variableName,newValue);
135+
136+ return new NullLiteralValue ();
137+ }
138+
139+ LiteralValue* ArrayDataType::insert (
140+ string variableName,
141+ const LiteralValue* value,
142+ const LiteralValue* args
143+ ) {
144+
145+ if ( args->getDataTypeId () != DataTypesId::Argument )
146+ return nullptr ;
147+
148+ auto argumentValues = (list<LiteralValue*>*)args->getValue ();
149+
150+ if ( argumentValues->size () != 2 )
151+ return nullptr ;
152+
153+ if ( argumentValues->front ()->getDataTypeId () != DataTypesId::Numeric )
154+ return nullptr ;
155+
156+ unsigned index = *(double *)argumentValues->front ()->getValue ();
157+ argumentValues->pop_front ();
158+ LiteralValue* newValue = argumentValues->front ();
159+
160+ if ( !value )
161+ return nullptr ;
162+
163+ auto array = (list<LiteralValue*>*)value->getValue ();
164+
165+ auto it = array->begin ();
166+ for (unsigned i = 0 ; i < index; i++)
167+ it++;
168+
169+ array->insert (it,newValue->clone ());
170+
171+ auto newLiteralValue = new ArrayLiteralValue (*array);
172+
173+ Context::getInstance ()->setVariableValue (variableName,newLiteralValue);
174+
175+ return new NullLiteralValue ();
176+ }
177+
178+ LiteralValue* ArrayDataType::remove (
179+ string variableName,
180+ const LiteralValue* value,
181+ const LiteralValue* args
182+ ) {
183+
184+ if ( args->getDataTypeId () != DataTypesId::Argument )
185+ return nullptr ;
186+
187+ auto argumentValues = (list<LiteralValue*>*)args->getValue ();
188+
189+ if ( argumentValues->size () != 1 )
190+ return nullptr ;
191+
192+ if ( argumentValues->front ()->getDataTypeId () != DataTypesId::Numeric )
193+ return nullptr ;
194+
195+ unsigned index = *(double *)argumentValues->front ()->getValue ();
196+
197+ if ( !value )
198+ return nullptr ;
199+
200+ auto array = (list<LiteralValue*>*)value->getValue ();
201+
202+ auto it = array->begin ();
203+ for (unsigned i = 0 ; i < index; i++)
204+ it++;
205+
206+ delete *it;
207+ array->erase (it);
208+
209+ auto newLiteralValue = new ArrayLiteralValue (*array);
210+
211+ Context::getInstance ()->setVariableValue (variableName,newLiteralValue);
212+
213+ return new NullLiteralValue ();
214+ }
215+
216+ LiteralValue* ArrayDataType::pop (
217+ string variableName,
218+ const LiteralValue* value,
219+ const LiteralValue* args
220+ ) {
221+
222+ if ( args->getDataTypeId () != DataTypesId::Argument )
223+ return nullptr ;
224+
225+ auto argumentValues = (list<LiteralValue*>*)args->getValue ();
226+
227+ if ( argumentValues->size () != 0 )
228+ return nullptr ;
229+
230+ if ( !value )
231+ return nullptr ;
232+
233+ auto array = (list<LiteralValue*>*)value->getValue ();
234+
235+ delete array->back ();
236+ array->pop_back ();
237+
238+ auto newLiteralValue = new ArrayLiteralValue (*array);
239+
240+ Context::getInstance ()->setVariableValue (variableName,newLiteralValue);
241+
242+ return new NullLiteralValue ();
243+ }
0 commit comments