Skip to content

Commit 6073504

Browse files
committed
Implemented some methods for arguments and arrays
1 parent 4018728 commit 6073504

5 files changed

Lines changed: 245 additions & 3 deletions

File tree

src/interpreter/datatypes/argumentdatatype.cpp

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
#include "argumentdatatype.h"
22
#include "interpreter/values/literalvalue.h"
3+
#include "interpreter/context.h"
34

45
using namespace CS;
6+
using namespace std;
57

6-
ArgumentDataType::ArgumentDataType() {}
8+
ArgumentDataType::ArgumentDataType() {
9+
_methods.insert(
10+
pair<string,method_function_t>(
11+
"pop",
12+
&ArgumentDataType::pop)
13+
);
14+
_methods.insert(
15+
pair<string,method_function_t>(
16+
"push",
17+
&ArgumentDataType::push)
18+
);
19+
}
720

821
ArgumentDataType::~ArgumentDataType() {}
922

@@ -18,3 +31,63 @@ LiteralValue* ArgumentDataType::cast(LiteralValue* value) const {
1831
break;
1932
}
2033
}
34+
35+
LiteralValue* ArgumentDataType::pop(
36+
string variableName,
37+
const LiteralValue* value,
38+
const LiteralValue* args
39+
) {
40+
41+
if( args->getDataTypeId() != DataTypesId::Argument )
42+
return nullptr;
43+
44+
auto argumentValues = (list<LiteralValue*>*)args->getValue();
45+
46+
if( argumentValues->size() != 0 )
47+
return nullptr;
48+
49+
if( !value )
50+
return nullptr;
51+
52+
auto array = (list<LiteralValue*>*)value->getValue();
53+
54+
if( !array->empty() )
55+
{
56+
delete array->back();
57+
array->pop_back();
58+
}
59+
60+
auto newLiteralValue = new ArgumentLiteralValue(*array);
61+
62+
Context::getInstance()->setVariableValue(variableName,newLiteralValue);
63+
64+
return new NullLiteralValue();
65+
}
66+
67+
LiteralValue* ArgumentDataType::push(
68+
string variableName,
69+
const LiteralValue* value,
70+
const LiteralValue* args
71+
) {
72+
73+
if( args->getDataTypeId() != DataTypesId::Argument )
74+
return nullptr;
75+
76+
auto argumentValues = (list<LiteralValue*>*)args->getValue();
77+
78+
if( argumentValues->size() != 1 )
79+
return nullptr;
80+
81+
if( !value )
82+
return nullptr;
83+
84+
auto array = (list<LiteralValue*>*)value->getValue();
85+
86+
array->push_back(argumentValues->front()->clone());
87+
88+
auto newValue = new ArgumentLiteralValue(*array);
89+
90+
Context::getInstance()->setVariableValue(variableName,newValue);
91+
92+
return new NullLiteralValue();
93+
}

src/interpreter/datatypes/argumentdatatype.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ class ArgumentDataType : public DataType
1111
ArgumentDataType();
1212
~ArgumentDataType();
1313
LiteralValue* cast(LiteralValue*) const;
14+
private:
15+
static LiteralValue* push(std::string,const LiteralValue*,const LiteralValue*);
16+
static LiteralValue* pop(std::string,const LiteralValue*,const LiteralValue*);
1417
};
1518

1619
}

src/interpreter/datatypes/arraydatatype.cpp

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "arraydatatype.h"
22
#include "interpreter/values/literalvalue.h"
3-
#include <iterator>
3+
#include "interpreter/context.h"
44

55
using namespace CS;
66
using 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

2141
ArrayDataType::~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+
}

src/interpreter/datatypes/arraydatatype.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class ArrayDataType : public DataType
1414
private:
1515
static LiteralValue* size(std::string,const LiteralValue*,const LiteralValue*);
1616
static LiteralValue* at(std::string,const LiteralValue*,const LiteralValue*);
17+
static LiteralValue* append(std::string,const LiteralValue*,const LiteralValue*);
18+
static LiteralValue* insert(std::string,const LiteralValue*,const LiteralValue*);
19+
static LiteralValue* remove(std::string,const LiteralValue*,const LiteralValue*);
20+
static LiteralValue* pop(std::string,const LiteralValue*,const LiteralValue*);
1721
};
1822

1923
}

src/interpreter/datatypes/sounddatatype.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ LiteralValue* SoundDataType::play(
151151
}
152152
case DataTypesId::Argument:
153153
{
154+
if( ((list<LiteralValue*>*)((ArgumentLiteralValue*)(*it))->getValue())->front()->getDataTypeId() == DataTypesId::Argument )
155+
{
156+
argumentValues = (list<LiteralValue*>*)((ArgumentLiteralValue*)(*it))->getValue();
157+
it = argumentValues->begin();
158+
}
154159
for( ; it != argumentValues->end(); it++ )
155160
{
156161
const list<LiteralValue*>* argumentList = (list<LiteralValue*>*)((ArgumentLiteralValue*)(*it))->getValue();
@@ -171,7 +176,10 @@ LiteralValue* SoundDataType::play(
171176
}
172177
argIt++;
173178
if( argIt == argumentList->end() )
174-
return nullptr;
179+
{
180+
generator->play(freqList,0,startTick,variableName);
181+
return new NullLiteralValue();
182+
}
175183

176184
if( (*argIt)->getDataTypeId() != DataTypesId::Numeric )
177185
return nullptr;

0 commit comments

Comments
 (0)