IoObject IoRange_next IoRange self IoObject locals IoMessage doc Range

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
IoObject *IoRange_next(IoRange *self, IoObject *locals, IoMessage *m)
{
/*doc Range next
Sets the current item in the range to the next item in the range,
and returns a boolean value indicating whether it is not at the end of the range.
*/
IoRangeData *rd = DATA(self);
IoObject *context;
IoObject *v = IoObject_rawGetSlot_context_(rd->curr, IOSYMBOL("nextInSequence"), &context);
IoObject *lt = IoObject_rawGetSlot_context_(rd->curr, IOSYMBOL("compare"), &context);
if (v && lt)
{
IoMessage *newMessage = IoMessage_new(IOSTATE);
IoObject *r_lt, *ret;
// Получаем следующий элемент диапозона. Тут всё происходит как ожидается
IoMessage_setCachedArg_to_(newMessage, 0, rd->increment);
ret = IoObject_activate(v, rd->curr, locals, newMessage, context);
// Получаю результат сравнения следующего элемента с концом
// диапозона — ret compare(end)
// В качестве аргумента будем передавать конец диапозона
IoMessage_addCachedArg_(newMessage, rd->end);
// Аргументы: слот, получатель, , аргументы,
r_lt = IoObject_activate(lt, ret, locals, newMessage, context);
// кажестя что тут что-то идёт не так
// Зависит убывающая это последовательность или возрастающая
if (rd->end > rd->start ? IoNumber_asInt(r_lt) < 0 : IoNumber_asInt(r_lt) > 0)
{
IoRange_setCurrent(self, ret);
IoRange_setIndex(self, IONUMBER(CNUMBER(rd->index) + 1));
return self;
}
}
return IONIL(self);
}