@@ -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