5 //ARRAY DEFAULT DELEGATE///////////////////////////////////////
7 VXInteger
array_append(VXState
* v
)
9 VXObject arr
= v
->StackGet(1);
10 arr
.Array()->Append(v
->StackGet(2));
14 VXInteger
array_extend(VXState
* v
)
16 VXArrayObj
* self
= v
->StackGet(1).Array();
17 self
->Extend(v
->StackGet(2).Array());
22 VXInteger
array_reverse(VXState
* v
)
27 VXArrayObj
* arr
= v
->StackGet(1).Array();
28 VXArrayObj
* narr
= arr
->Clone();
38 narr
->_values
[i
] = arr
->_values
[size
-i
];
39 narr
->_values
[size
-i
] = t
;
46 VXInteger
array_pop(VXState
* v
)
48 VXArrayObj
* arr
= v
->StackGet(1).Array();
55 return v
->ThrowError("pop() on an empty array");
58 VXInteger
array_top(VXState
* v
)
60 VXArrayObj
* arr
= v
->StackGet(1).Array();
66 return v
->ThrowError("top() on a empty array");
69 VXInteger
array_insert(VXState
* v
)
71 VXArrayObj
* arr
= v
->StackGet(1).Array();
72 VXObject
& idx
= v
->StackGet(2);
73 VXObject
& val
= v
->StackGet(3);
74 if(!arr
->Insert(idx
.Integer(), val
))
76 return v
->ThrowError("insert() failed: index out of range");
81 VXInteger
array_remove(VXState
* v
)
84 VXObject
& o
= v
->StackGet(1);
85 VXObject
& idx
= v
->StackGet(2);
88 return v
->ThrowError("wrong type");
90 if(o
.Array()->Get(idx
.Integer(), val
))
92 o
.Array()->Remove(idx
.Integer());
96 return v
->ThrowError("index out of range");
99 VXInteger
array_resize(VXState
* v
)
101 VXObject
&o
= v
->StackGet(1);
102 VXObject
&nsize
= v
->StackGet(2);
104 if(nsize
.IsNumeric())
108 fill
= v
->StackGet(3);
110 o
.Array()->Resize(nsize
.Integer(), fill
);
113 return v
->ThrowError("size must be a number");
116 VXInteger
__map_array(VXState
* v
, VXArrayObj
*dest
,VXArrayObj
*src
)
122 for(n
=0; n
<size
; n
++)
127 if(VX_FAILED(v
->StackCall(2, true, false)))
131 dest
->Set(n
, v
->GetUp(-1));
138 VXInteger
array_map(VXState
* v
)
140 VXObject
& o
= v
->StackGet(1);
141 VXInteger size
= o
.Array()->Size();
142 VXObject ret
= v
->NewArray(size
);
143 if(VX_FAILED(__map_array(v
, ret
.Array(), o
.Array())))
150 VXInteger
array_apply(VXState
* v
)
152 VXObject
& o
= v
->StackGet(1);
153 if(VX_FAILED(__map_array(v
, o
.Array(), o
.Array())))
160 VXInteger
array_reduce(VXState
* v
)
162 VXObject
& o
= stack_get(v
,1);
163 VXArrayObj
*a
= o
.Array();
164 VXInteger size
= a
->Size();
174 for(VXInteger n
= 1; n
< size
; n
++)
180 if(VX_FAILED(v
->StackCall(3,true,false)))
192 VXInteger
array_filter(VXState
* v
)
194 VXObject
& o
= v
->StackGet(1);
195 VXArrayObj
* a
= o
.Array();
196 VXObject ret
= v
->NewArray();
197 VXInteger size
= a
->Size();
199 for(VXInteger n
= 0; n
< size
; n
++)
205 if(VX_FAILED(v
->StackCall(3, true, false)))
209 if(!VXState::IsFalse(v
->GetUp(-1)))
211 ret
.Array()->Append(val
);
219 VXInteger
array_find(VXState
* v
)
223 VXInteger found_elements
;
225 VXObject
& o
= v
->StackGet(1);
226 VXObject
& val
= v
->StackGet(2);
227 VXArrayObj
* a
= o
.Array();
228 VXInteger size
= a
->Size();
231 for(n
=0; n
<size
; n
++)
234 if(VXState::IsEqual(temp
, val
, res
) && res
)
239 v
->Push(found_elements
);
243 //QSORT ala Sedgewick
244 bool _qsort_compare(VXState
* v
,VXObject
&arr
,VXObject
&a
,VXObject
&b
,VXInteger func
,VXInteger
&ret
)
249 if(!v
->ObjCmp(a
,b
,ret
))
256 VXInteger top
= v
->GetTop();
258 v
->Push(v
->GetRootTable());
261 if(VX_FAILED(v
->CallStack(3, true, false)))
263 if(!v
->_lasterror
.IsString())
265 v
->ThrowError("compare func failed");
269 v
->GetInteger(-1, &ret
);
276 //QSORT ala Sedgewick
277 bool _qsort(VXState
* v
,VXObject
&arr
, VXInteger l
, VXInteger r
,VXInteger func
)
281 VXArrayObj
*a
= arr
.Array();
285 pivot
= a
->_values
[l
];
298 if(!_qsort_compare(v
,arr
,a
->_values
[i
],pivot
,func
,ret
))
308 v
->ThrowError("Invalid qsort, probably compare function defect");
311 if(!_qsort_compare(v
,arr
,a
->_values
[j
],pivot
,func
,ret
))
322 a
->_values
[i
] = a
->_values
[j
];
326 a
->_values
[l
] = a
->_values
[j
];
328 if(!_qsort( v
, arr
, l
, j
-1,func
))
332 if(!_qsort( v
, arr
, j
+1, r
,func
))
341 VXInteger
array_sort(VXState
* v
)
344 VXObject
&o
= v
->StackGet(1);
345 if(_array(o
)->Size() > 1)
347 VXObject clone
= o
.Array()->Clone();
352 if(!_qsort(v
, clone
, 0, clone
.Array()->Size()-1, func
))
360 VXInteger
array_slice(VXState
* v
)
365 if(get_slice_params(v
, sidx
, eidx
, o
) == -1)
369 VXInteger alen
= o
.Array()->Size();
380 return v
->ThrowError("wrong indexes");
384 return v
->ThrowError("slice out of range");
386 VXArrayObj
* arr
= v
->NewArray(eidx
- sidx
);
389 for(VXInteger i
=sidx
;i
<eidx
;i
++)
399 VXInteger
array_join(VXState
* v
)
402 std::stringstream strm
;
403 VXObject
& o
= v
->StackGet(1);
404 VXArrayObj
*a
= o
.Array();
405 VXInteger size
= a
->Size();
408 v
->GetString(2, &delim
);
409 for(n
=0; n
<size
; n
++)
411 const char* stringval
;
416 if(v
->ToString(temp
, res
))
418 res
.String()->Get(&stringval
, &stringlen
);
424 strm
.write(stringval
, stringlen
);
431 v
->Push(v
->NewString(strm
.str().c_str(), strm
.str().length()));
435 return v
->ThrowError("join(): cannot convert element to string");
438 VXInteger
array_isset(VXState
* v
)
443 VXObject
& o
= v
->StackGet(1);
444 VXArrayObj
*a
= o
.Array();
445 v
->GetInteger(2, &index
);
446 if(a
->Get(index
, val
))
458 VXInteger
array_first(VXState
* v
)
461 VXObject
& o
= v
->StackGet(1);
462 VXArrayObj
* a
= o
.Array();
468 VXInteger
array_last(VXState
* v
)
471 VXObject
& o
= v
->StackGet(1);
472 VXArrayObj
* a
= o
.Array();
473 a
->Get(a
->Size()-1, val
);
478 VXRegFunction
VXSharedState::_array_default_delegate_funcz
[]=
480 {"weakref", obj_delegate_weakref
, 1, NULL
},
481 {"tostring", default_delegate_tostring
, -1, ".b"},
482 {"len", default_delegate_len
, 1, "a"},
483 {"clear", obj_clear
, 1, "."},
484 {"first", array_first
, 1, "a"},
485 {"last", array_last
, 1, "a"},
486 {"append", array_append
, 2, "a"},
487 {"push", array_append
, 2, "a"},
488 {"extend", array_extend
, 2, "aa"},
489 {"pop", array_pop
, 1, "a"},
490 {"top", array_top
, 1, "a"},
491 {"insert", array_insert
, 3, "an"},
492 {"remove", array_remove
, 2, "an"},
493 {"resize", array_resize
, -2, "an"},
494 {"reverse", array_reverse
, 1, "a"},
495 {"sort", array_sort
, -1, "ac"},
496 {"slice", array_slice
, -1, "ann"},
497 {"map", array_map
, 2, "ac"},
498 {"apply", array_apply
, 2, "ac"},
499 {"reduce", array_reduce
, 2, "ac"},
500 {"filter", array_filter
, 2, "ac"},
501 {"find", array_find
, 2, "a."},
502 {"join", array_join
, 2, "as"},
503 {"isset", array_isset
, 2, "an"},
504 {"repr", default_delegate_repr
, 1, "."},