Skip to content

Commit 2d789b3

Browse files
committed
Added extended STL functionality
1 parent ac68257 commit 2d789b3

6 files changed

Lines changed: 466 additions & 25 deletions

File tree

examples/src/generic_sorting.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <var.h>
2+
#include <var_math.h>
3+
#include <var_test.h>
4+
5+
using namespace variable;
6+
7+
int main(void) {
8+
9+
try {
10+
11+
var list = {1, 2, {"I", "am", "a", "good", "programmer"}, {"Hello"}, 56.9, var::Null};
12+
std::sort( list.begin(), list.end() );
13+
cout<<list<<"\n";
14+
15+
var str = "Im good one";
16+
str.reverse();
17+
cout<<str<<"\n";
18+
19+
} catch(var_exception e) {
20+
cout<<"[Exception] "<<e.what()<<"\n";
21+
}
22+
23+
return 0;
24+
}

examples/src/sorting.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <var.h>
2+
#include <var_math.h>
3+
#include <var_test.h>
4+
5+
using namespace variable;
6+
7+
int main(void) {
8+
9+
try {
10+
11+
while(true) {
12+
var a = "";
13+
cin>>a.castToString();
14+
a.castToArray();
15+
for(var el : a) {
16+
cout<<"# => "<<el<<"\n";
17+
}
18+
a.sort();
19+
cout<<"sorted string := "<<a<<"\n";
20+
}
21+
22+
} catch(var_exception e) {
23+
cout<<"[Exception] "<<e.what()<<"\n";
24+
}
25+
26+
return 0;
27+
}

include/var.h

Lines changed: 158 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -778,13 +778,13 @@ namespace var_typeconversion {
778778
case VAR_TYPE_NULL: return vector<var>();
779779
case VAR_TYPE_INFINITY: return var::makeArrayFrom( var::Infinity );
780780
case VAR_TYPE_REFERENCE: return dereferenceConst().toArray();
781-
case VAR_TYPE_CHAR: return var::makeArrayFrom( getAutoCastedValue<char>() );
782-
case VAR_TYPE_INT: return var::makeArrayFrom( getAutoCastedValue<int>() );
783-
case VAR_TYPE_DOUBLE: return var::makeArrayFrom( getAutoCastedValue<double>() );
784-
case VAR_TYPE_FLOAT: return var::makeArrayFrom( getAutoCastedValue<float>() );
781+
case VAR_TYPE_CHAR: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<char>() ) );
782+
case VAR_TYPE_INT: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<int>() ) );
783+
case VAR_TYPE_DOUBLE: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<double>() ) );
784+
case VAR_TYPE_FLOAT: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<float>() ) );
785+
case VAR_TYPE_BOOL: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<bool>() ) );
786+
case VAR_TYPE_LONG_LONG: return var::makeArrayFromString( var_typeconversion::genericTypeToString( getAutoCastedValue<long long>() ) );
785787
case VAR_TYPE_STRING: return var::makeArrayFromString( getAutoCastedValue<string>() );
786-
case VAR_TYPE_BOOL: return var::makeArrayFrom( getAutoCastedValue<bool>() );
787-
case VAR_TYPE_LONG_LONG: return var::makeArrayFrom( getAutoCastedValue<long long>() );
788788
case VAR_TYPE_ARRAY: return getAutoCastedValue<varray>();
789789
case VAR_TYPE_HASHMAP: return var::makeArrayFromHashmap( getAutoCastedValue<h_varray>() );
790790
case VAR_TYPE_FUNCT: return apply().toArray();
@@ -1272,6 +1272,84 @@ namespace var_typeconversion {
12721272
return size()==v.size() && isSubsetOf(v);
12731273
}
12741274

1275+
inline void var::reverse() {
1276+
vartypeid t = type;
1277+
std::reverse(begin(), end());
1278+
castToType(t);
1279+
}
1280+
1281+
inline void var::pop() {
1282+
vartypeid t = type;
1283+
varray a = toArray();
1284+
if(a.size()>0) {
1285+
a.pop_back();
1286+
}
1287+
operator=(a);
1288+
castToType(t);
1289+
}
1290+
1291+
inline void var::push(var v) {
1292+
vartypeid t = type;
1293+
varray a = toArray();
1294+
a.push_back(v);
1295+
operator=(a);
1296+
castToType(t);
1297+
}
1298+
1299+
inline void var::pop_front() {
1300+
vartypeid t = type;
1301+
varray a = toArray();
1302+
if(a.size()>0) {
1303+
a.erase(a.begin());
1304+
}
1305+
operator=(a);
1306+
castToType(t);
1307+
}
1308+
1309+
inline void var::push_front(var v) {
1310+
vartypeid t = type;
1311+
varray a = toArray();
1312+
a.insert(a.begin(), v);
1313+
operator=(a);
1314+
castToType(t);
1315+
}
1316+
1317+
inline void var::sort() {
1318+
vartypeid t = type;
1319+
std::sort(begin(), end());
1320+
castToType(t);
1321+
}
1322+
1323+
inline void var::sort(var f) {
1324+
vartypeid t = type;
1325+
std::sort(begin(), end(), [f](const var &a, const var &b) -> bool {
1326+
return f(a, b).toBool();
1327+
});
1328+
castToType(t);
1329+
}
1330+
1331+
inline long long var::hash() {
1332+
switch(type) {
1333+
case VAR_TYPE_FUNCT:
1334+
case VAR_TYPE_UNKNOWN: {
1335+
return getType()*1000+3219;
1336+
}
1337+
default: {
1338+
std::hash<std::string> str_hash;
1339+
return (long long)str_hash(toReadableString());
1340+
}
1341+
}
1342+
return 0;
1343+
}
1344+
1345+
inline void var::unique() {
1346+
vartypeid t = type;
1347+
varray a = toArray();
1348+
std::unique(a.begin(), a.end());
1349+
operator=(a);
1350+
castToType(t);
1351+
}
1352+
12751353
inline var var::apply(var args) const {
12761354
if(type==VAR_TYPE_FUNCT) {
12771355
return (*(static_cast<var_funct*>(data)))(args);
@@ -1280,7 +1358,59 @@ namespace var_typeconversion {
12801358
}
12811359

12821360
inline var var::apply() const {
1283-
apply({});
1361+
apply(var::newArray());
1362+
}
1363+
1364+
inline var var::appliedTo(var f) const {
1365+
return f.apply(*this);
1366+
}
1367+
1368+
inline var var::call(var v1, var v2, var v3, var v4, var v5) const {
1369+
return apply({v1, v2, v3, v4, v5});
1370+
}
1371+
1372+
inline var var::call(var v1, var v2, var v3, var v4) const {
1373+
return apply({v1, v2, v3, v4});
1374+
}
1375+
1376+
inline var var::call(var v1, var v2, var v3) const {
1377+
return apply({v1, v2, v3});
1378+
}
1379+
1380+
inline var var::call(var v1, var v2) const {
1381+
return apply({v1, v2});
1382+
}
1383+
1384+
inline var var::call(var v1) const {
1385+
return apply({v1});
1386+
}
1387+
1388+
inline var var::call() const {
1389+
return apply();
1390+
}
1391+
1392+
inline var var::operator()(var v1, var v2, var v3, var v4, var v5) const {
1393+
return apply({v1, v2, v3, v4, v5});
1394+
}
1395+
1396+
inline var var::operator()(var v1, var v2, var v3, var v4) const {
1397+
return apply({v1, v2, v3, v4});
1398+
}
1399+
1400+
inline var var::operator()(var v1, var v2, var v3) const {
1401+
return apply({v1, v2, v3});
1402+
}
1403+
1404+
inline var var::operator()(var v1, var v2) const {
1405+
return apply({v1, v2});
1406+
}
1407+
1408+
inline var var::operator()(var v1) const {
1409+
return apply({v1});
1410+
}
1411+
1412+
inline var var::operator()() const {
1413+
return apply();
12841414
}
12851415

12861416
inline void var::foreachMutate(function<var(var)> callback) {
@@ -1455,6 +1585,17 @@ namespace var_typeconversion {
14551585
eachMutate(x, x.apply());
14561586
}
14571587

1588+
inline void var::iterate(var f) {
1589+
eachMutate(x, f.call(x, key));
1590+
}
1591+
1592+
inline var var::fold(var f, var acc) {
1593+
foreach([&acc, f](var element)->void {
1594+
acc = f(acc, element);
1595+
});
1596+
return acc;
1597+
}
1598+
14581599
inline var::varray var::doForeach(function<var(var)> callback, varray obj) {
14591600
for(var& el : obj) {
14601601
el = callback(el);
@@ -2049,10 +2190,9 @@ namespace var_typeconversion {
20492190
return (*(static_cast<h_varray*>(data)))[key];
20502191
} else if(type == VAR_TYPE_ARRAY) {
20512192
return (*(static_cast<varray*>(data)))[(int)key];
2052-
//} else if(type == VAR_TYPE_FUNCT) {
2053-
// return apply(key);
2054-
} else {
2055-
return *this;
2193+
} else if(type == VAR_TYPE_STRING) {
2194+
castToArray();
2195+
return (*(static_cast<varray*>(data)))[(int)key];
20562196
}
20572197
}
20582198

@@ -2144,29 +2284,29 @@ namespace var_typeconversion {
21442284
}
21452285

21462286
template <typename T>
2147-
inline var var::operator<(T v) {
2287+
inline var var::operator<(T v) const {
21482288
return var::operator_comparsion_less( type, *this, v );
21492289
}
21502290

21512291
template <typename T>
2152-
inline var var::operator>(T v) {
2292+
inline var var::operator>(T v) const {
21532293
return var::operator_comparsion_more( type, *this, v );
21542294
}
21552295

21562296
template <typename T>
2157-
inline var var::operator<=(T v) {
2297+
inline var var::operator<=(T v) const {
21582298
if(var::operator_comparsion_equal( type, *this, v )) return true;
21592299
return var::operator_comparsion_less( type, *this, v );
21602300
}
21612301

21622302
template <typename T>
2163-
inline var var::operator>=(T v) {
2303+
inline var var::operator>=(T v) const {
21642304
if(var::operator_comparsion_equal( type, *this, v )) return true;
21652305
return var::operator_comparsion_more( type, *this, v );
21662306
}
21672307

21682308
template <typename T>
2169-
inline var var::operator==(T v) {
2309+
inline var var::operator==(T v) const {
21702310
return var::operator_comparsion_equal( type, *this, v );
21712311
}
21722312

@@ -2184,7 +2324,7 @@ namespace var_typeconversion {
21842324
type = VAR_TYPE_NULL;
21852325
}
21862326

2187-
inline var::varray::iterator var::begin() {
2327+
/*inline var::varray::iterator var::begin() {
21882328
castToArray();
21892329
//return toArray().begin();
21902330
return ((varray*)data)->begin();
@@ -2194,7 +2334,7 @@ namespace var_typeconversion {
21942334
castToArray();
21952335
//return toArray().end();
21962336
return ((varray*)data)->end();
2197-
}
2337+
}*/
21982338

21992339

22002340
#include "var_operator_toolkit.cpp"

0 commit comments

Comments
 (0)