Skip to content

Commit 5debca5

Browse files
committed
arrat.assign extended to have indexing
1 parent fe58b49 commit 5debca5

File tree

1 file changed

+242
-29
lines changed

1 file changed

+242
-29
lines changed

src/arraywrapper.cpp

+242-29
Original file line numberDiff line numberDiff line change
@@ -884,15 +884,15 @@ NAN_METHOD(ArrayWrapper::At)
884884

885885
Guard();
886886

887-
if (args.Length() < 2)
887+
if (args.Length() == 1)
888888
{
889889
NanReturnValue(New(GetArray(args.This())->operator()(ToIndex(args[0]))));
890890
}
891-
else if (args.Length() < 3)
891+
else if (args.Length() == 2)
892892
{
893893
NanReturnValue(New(GetArray(args.This())->operator()(ToIndex(args[0]), ToIndex(args[1]))));
894894
}
895-
else if (args.Length() < 4)
895+
else if (args.Length() == 3)
896896
{
897897
NanReturnValue(New(GetArray(args.This())->operator()(ToIndex(args[0]), ToIndex(args[1]), ToIndex(args[2]))));
898898
}
@@ -963,55 +963,268 @@ NAN_METHOD(ArrayWrapper::F)\
963963
try\
964964
{\
965965
auto pArray = GetArray(args.This());\
966-
auto& Array = *pArray;\
967-
bool isDouble = NeedsDouble(Array);\
966+
auto& array = *pArray;\
967+
bool isDouble = NeedsDouble(array);\
968968
ARGS_LEN(1)\
969-
auto value = args[0];\
970-
auto pOtherArray = TryGetArray(value);\
971-
Guard();\
972-
if (pOtherArray)\
969+
if (args.Length() == 1)\
973970
{\
974-
auto& otherArray = *pOtherArray;\
975-
Array Op otherArray;\
971+
auto value = args[0];\
972+
auto pOtherArray = TryGetArray(value);\
973+
Guard();\
974+
if (pOtherArray)\
975+
{\
976+
auto& otherArray = *pOtherArray;\
977+
array Op otherArray;\
978+
}\
979+
else if (value->IsNumber())\
980+
{\
981+
double v = value->NumberValue();\
982+
if (floor(v) == v)\
983+
{\
984+
array Op value->Int32Value();\
985+
}\
986+
else if (isDouble)\
987+
{\
988+
array Op v;\
989+
}\
990+
else\
991+
{\
992+
array Op (float)v;\
993+
}\
994+
}\
995+
else if (value->IsObject())\
996+
{\
997+
if (isDouble)\
998+
{\
999+
auto v = ToDComplex(value);\
1000+
array Op v;\
1001+
}\
1002+
else\
1003+
{\
1004+
auto v = ToFComplex(value);\
1005+
array Op v;\
1006+
}\
1007+
}\
1008+
else if (value->IsString())\
1009+
{\
1010+
String::Utf8Value str(value);\
1011+
long long v = strtoll(*str, nullptr, 10);\
1012+
array Op v;\
1013+
}\
1014+
else\
1015+
{\
1016+
return NAN_THROW_INVALID_ARGS();\
1017+
}\
9761018
}\
977-
else if (value->IsNumber())\
1019+
else if (args.Length() == 2)\
9781020
{\
979-
double v = value->NumberValue();\
980-
if (floor(v) == v)\
1021+
auto idx0 = ToIndex(args[0]);\
1022+
auto value = args[1];\
1023+
auto pOtherArray = TryGetArray(value);\
1024+
Guard();\
1025+
if (pOtherArray)\
9811026
{\
982-
Array Op value->Int32Value();\
1027+
auto& otherArray = *pOtherArray;\
1028+
array(idx0) Op otherArray;\
9831029
}\
984-
else if (isDouble)\
1030+
else if (value->IsNumber())\
1031+
{\
1032+
double v = value->NumberValue();\
1033+
if (floor(v) == v)\
1034+
{\
1035+
array(idx0) Op value->Int32Value();\
1036+
}\
1037+
else if (isDouble)\
1038+
{\
1039+
array(idx0) Op v;\
1040+
}\
1041+
else\
1042+
{\
1043+
array(idx0) Op (float)v;\
1044+
}\
1045+
}\
1046+
else if (value->IsObject())\
9851047
{\
986-
Array Op v;\
1048+
if (isDouble)\
1049+
{\
1050+
auto v = ToDComplex(value);\
1051+
array(idx0) Op v;\
1052+
}\
1053+
else\
1054+
{\
1055+
auto v = ToFComplex(value);\
1056+
array(idx0) Op v;\
1057+
}\
1058+
}\
1059+
else if (value->IsString())\
1060+
{\
1061+
String::Utf8Value str(value);\
1062+
long long v = strtoll(*str, nullptr, 10);\
1063+
array(idx0) Op v;\
9871064
}\
9881065
else\
9891066
{\
990-
Array Op (float)v;\
1067+
return NAN_THROW_INVALID_ARGS();\
9911068
}\
9921069
}\
993-
else if (value->IsObject())\
1070+
else if (args.Length() == 3)\
9941071
{\
995-
if (isDouble)\
1072+
auto idx0 = ToIndex(args[0]);\
1073+
auto idx1 = ToIndex(args[1]);\
1074+
auto value = args[2];\
1075+
auto pOtherArray = TryGetArray(value);\
1076+
Guard();\
1077+
if (pOtherArray)\
9961078
{\
997-
auto v = ToDComplex(value);\
998-
Array Op v;\
1079+
auto& otherArray = *pOtherArray;\
1080+
array(idx0, idx1) Op otherArray;\
1081+
}\
1082+
else if (value->IsNumber())\
1083+
{\
1084+
double v = value->NumberValue();\
1085+
if (floor(v) == v)\
1086+
{\
1087+
array(idx0, idx1) Op value->Int32Value();\
1088+
}\
1089+
else if (isDouble)\
1090+
{\
1091+
array(idx0, idx1) Op v;\
1092+
}\
1093+
else\
1094+
{\
1095+
array(idx0, idx1) Op (float)v;\
1096+
}\
1097+
}\
1098+
else if (value->IsObject())\
1099+
{\
1100+
if (isDouble)\
1101+
{\
1102+
auto v = ToDComplex(value);\
1103+
array(idx0, idx1) Op v;\
1104+
}\
1105+
else\
1106+
{\
1107+
auto v = ToFComplex(value);\
1108+
array(idx0, idx1) Op v;\
1109+
}\
1110+
}\
1111+
else if (value->IsString())\
1112+
{\
1113+
String::Utf8Value str(value);\
1114+
long long v = strtoll(*str, nullptr, 10);\
1115+
array(idx0, idx1) Op v;\
9991116
}\
10001117
else\
10011118
{\
1002-
auto v = ToFComplex(value);\
1003-
Array Op v;\
1119+
return NAN_THROW_INVALID_ARGS();\
10041120
}\
10051121
}\
1006-
else if (value->IsString())\
1122+
else if (args.Length() == 4)\
10071123
{\
1008-
String::Utf8Value str(value);\
1009-
long long v = strtoll(*str, nullptr, 10);\
1010-
Array Op v;\
1124+
auto idx0 = ToIndex(args[0]);\
1125+
auto idx1 = ToIndex(args[1]);\
1126+
auto idx2 = ToIndex(args[2]);\
1127+
auto value = args[3];\
1128+
auto pOtherArray = TryGetArray(value);\
1129+
Guard();\
1130+
if (pOtherArray)\
1131+
{\
1132+
auto& otherArray = *pOtherArray;\
1133+
array(idx0, idx1, idx2) Op otherArray;\
1134+
}\
1135+
else if (value->IsNumber())\
1136+
{\
1137+
double v = value->NumberValue();\
1138+
if (floor(v) == v)\
1139+
{\
1140+
array(idx0, idx1, idx2) Op value->Int32Value();\
1141+
}\
1142+
else if (isDouble)\
1143+
{\
1144+
array(idx0, idx1, idx2) Op v;\
1145+
}\
1146+
else\
1147+
{\
1148+
array(idx0, idx1, idx2) Op (float)v;\
1149+
}\
1150+
}\
1151+
else if (value->IsObject())\
1152+
{\
1153+
if (isDouble)\
1154+
{\
1155+
auto v = ToDComplex(value);\
1156+
array(idx0, idx1, idx2) Op v;\
1157+
}\
1158+
else\
1159+
{\
1160+
auto v = ToFComplex(value);\
1161+
array(idx0, idx1, idx2) Op v;\
1162+
}\
1163+
}\
1164+
else if (value->IsString())\
1165+
{\
1166+
String::Utf8Value str(value);\
1167+
long long v = strtoll(*str, nullptr, 10);\
1168+
array(idx0, idx1, idx2) Op v;\
1169+
}\
1170+
else\
1171+
{\
1172+
return NAN_THROW_INVALID_ARGS();\
1173+
}\
10111174
}\
10121175
else\
10131176
{\
1014-
return NAN_THROW_INVALID_ARGS();\
1177+
auto idx0 = ToIndex(args[0]);\
1178+
auto idx1 = ToIndex(args[1]);\
1179+
auto idx2 = ToIndex(args[2]);\
1180+
auto idx3 = ToIndex(args[3]);\
1181+
auto value = args[4];\
1182+
auto pOtherArray = TryGetArray(value);\
1183+
Guard();\
1184+
if (pOtherArray)\
1185+
{\
1186+
auto& otherArray = *pOtherArray;\
1187+
array(idx0, idx1, idx2, idx3) Op otherArray;\
1188+
}\
1189+
else if (value->IsNumber())\
1190+
{\
1191+
double v = value->NumberValue();\
1192+
if (floor(v) == v)\
1193+
{\
1194+
array(idx0, idx1, idx2, idx3) Op value->Int32Value();\
1195+
}\
1196+
else if (isDouble)\
1197+
{\
1198+
array(idx0, idx1, idx2, idx3) Op v;\
1199+
}\
1200+
else\
1201+
{\
1202+
array(idx0, idx1, idx2, idx3) Op (float)v;\
1203+
}\
1204+
}\
1205+
else if (value->IsObject())\
1206+
{\
1207+
if (isDouble)\
1208+
{\
1209+
auto v = ToDComplex(value);\
1210+
array(idx0, idx1, idx2, idx3) Op v;\
1211+
}\
1212+
else\
1213+
{\
1214+
auto v = ToFComplex(value);\
1215+
array(idx0, idx1, idx2, idx3) Op v;\
1216+
}\
1217+
}\
1218+
else if (value->IsString())\
1219+
{\
1220+
String::Utf8Value str(value);\
1221+
long long v = strtoll(*str, nullptr, 10);\
1222+
array(idx0, idx1, idx2, idx3) Op v;\
1223+
}\
1224+
else\
1225+
{\
1226+
return NAN_THROW_INVALID_ARGS();\
1227+
}\
10151228
}\
10161229
\
10171230
NanReturnValue(args.This());\

0 commit comments

Comments
 (0)