cvsuser 03/07/04 11:20:30
Modified: classes array.pmc sarray.pmc
. list.c
t/pmc sarray.t
Log:
add iterator to SArray
Revision Changes Path
1.53 +4 -4 parrot/classes/array.pmc
Index: array.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/array.pmc,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -w -r1.52 -r1.53
--- array.pmc 6 Jun 2003 15:14:59 -0000 1.52
+++ array.pmc 4 Jul 2003 18:20:27 -0000 1.53
@@ -1,7 +1,7 @@
/* array.pmc
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: array.pmc,v 1.52 2003/06/06 15:14:59 leo Exp $
+ * $Id: array.pmc,v 1.53 2003/07/04 18:20:27 leo Exp $
* Overview:
* These are the vtable functions for the Array base class
* Data Structure and Algorithms:
@@ -541,7 +541,7 @@
PMC* nextkey_keyed (PMC* key, INTVAL what) {
PMC *ret = key;
- SELF->cache.int_val = SELF.elements();
+ INTVAL n = SELF.elements();
PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
PObj_get_FLAGS(ret) |= KEY_integer_FLAG;
switch (what) {
@@ -549,7 +549,7 @@
ret->cache.int_val = 0;
break;
case 1: /* next key */
- if (ret->cache.int_val < SELF->cache.int_val)
+ if (ret->cache.int_val < n)
++ret->cache.int_val;
break;
case 2: /* prev key */
@@ -557,7 +557,7 @@
--ret->cache.int_val;
break;
case 3: /* reset key, iterate from end */
- ret->cache.int_val = SELF->cache.int_val - 1;
+ ret->cache.int_val = n - 1;
break;
}
return ret;
1.3 +48 -0 parrot/classes/sarray.pmc
Index: sarray.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/sarray.pmc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- sarray.pmc 4 Jul 2003 12:41:34 -0000 1.2
+++ sarray.pmc 4 Jul 2003 18:20:27 -0000 1.3
@@ -1,7 +1,7 @@
/* sarray.pmc
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: sarray.pmc,v 1.2 2003/07/04 12:41:34 leo Exp $
+ * $Id: sarray.pmc,v 1.3 2003/07/04 18:20:27 leo Exp $
* Overview:
* These are the vtable functions for the SArray base class
* Data Structure and Algorithms:
@@ -135,6 +135,12 @@
return e->val.int_val;
}
+ INTVAL get_integer_keyed (PMC* key) {
+ /* simple int keys only */
+ INTVAL k = key_integer(INTERP, key);
+ return SELF.get_integer_keyed_int(&k);
+ }
+
INTVAL shift_integer() {
HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF);
@@ -160,6 +166,11 @@
return e->val.num_val;
}
+ FLOATVAL get_number_keyed (PMC* key) {
+ INTVAL k = key_integer(INTERP, key);
+ return SELF.get_number_keyed_int(&k);
+ }
+
FLOATVAL shift_float() {
HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF);
@@ -185,6 +196,11 @@
return e->val.string_val;
}
+ STRING* get_string_keyed(PMC* key) {
+ INTVAL k = key_integer(INTERP, key);
+ return SELF.get_string_keyed_int(&k);
+ }
+
STRING* shift_string() {
HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF);
@@ -210,6 +226,11 @@
return e->val.pmc_val;
}
+ PMC* get_pmc_keyed(PMC* key) {
+ INTVAL k = key_integer(INTERP, key);
+ return SELF.get_pmc_keyed_int(&k);
+ }
+
PMC* shift_pmc() {
HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF);
@@ -326,5 +347,32 @@
DYNSELF.set_pmc_keyed_int(&nextix, value, NULL);
}
+ PMC* nextkey_keyed (PMC* key, INTVAL what) {
+ PMC *ret = key;
+ HASH_ENTRY *e;
+
+ PObj_get_FLAGS(ret) &= ~KEY_type_FLAGS;
+ PObj_get_FLAGS(ret) |= KEY_integer_FLAG;
+ if (!PMC_data(SELF))
+ return ret;
+ e = (HASH_ENTRY *) PMC_data(SELF);
+ switch (what) {
+ case 0: /* reset key, iterate from start */
+ ret->cache.int_val = e[0].val.int_val;
+ break;
+ case 1: /* next key */
+ if (ret->cache.int_val < e[1].val.int_val)
+ ++ret->cache.int_val;
+ break;
+ case 2: /* prev key */
+ if (ret->cache.int_val >= e[0].val.int_val)
+ --ret->cache.int_val;
+ break;
+ case 3: /* reset key, iterate from end */
+ ret->cache.int_val = e[1].val.int_val - 1;
+ break;
+ }
+ return ret;
+ }
}
1.34 +0 -0 parrot/list.c
Index: list.c
===================================================================
RCS file: /cvs/public/parrot/list.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -w -r1.33 -r1.34
--- list.c 4 Jul 2003 12:41:36 -0000 1.33
+++ list.c 4 Jul 2003 18:20:29 -0000 1.34
@@ -5,7 +5,7 @@
* Copyright: (c) 2002 Leopold Toetsch <[EMAIL PROTECTED]>
* License: Artistic/GPL, see README and LICENSES for details
* CVS Info
- * $Id: list.c,v 1.33 2003/07/04 12:41:36 leo Exp $
+ * $Id: list.c,v 1.34 2003/07/04 18:20:29 leo Exp $
* Overview:
* list aka array routines for Parrot
* History:
1.2 +79 -1 parrot/t/pmc/sarray.t
Index: sarray.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/sarray.t,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- sarray.t 4 Jul 2003 12:08:50 -0000 1.1
+++ sarray.t 4 Jul 2003 18:20:30 -0000 1.2
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 10;
+use Parrot::Test tests => 11;
use Test::More;
output_is(<<'CODE', <<'OUTPUT', "Setting sarray size");
@@ -332,3 +332,81 @@
string
42
OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "iterator");
+
+ new P0, .SArray # empty array
+ new P2, .SArray # array with 2 elements
+ set P2, 2
+ push P2, 10
+ push P2, 20
+ set I0, P2
+ new P1, .Iterator, P2
+ print "ok 1\n"
+ set I1, P1
+ eq I0, I1, ok2 # iter.length() == array.length()
+ print "not "
+ok2: print "ok 2\n"
+ new P1, .Iterator, P0
+ set P1, 0 # reset PIter
+ print "ok 3\n"
+ unless P1, ok4 # if(iter) == false on empty
+ print "not "
+ok4: print "ok 4\n"
+ new P1, .Iterator, P2
+ set P1, 0 # reset PIter
+ if P1, ok5 # if(iter) == true on non empty
+ print "not "
+ok5: print "ok 5\n"
+ # now iterate over P2
+ # while (P1) { element = shift(P1) }
+ unless P1, nok6
+ shift I3, P1
+ eq I3, 10, ok6
+nok6: print "not "
+ok6: print "ok 6\n"
+ unless P1, nok7
+ shift I3, P1
+ eq I3, 20, ok7
+nok7: print "not "
+ok7: print "ok 7\n"
+ unless P1, ok8 # if(iter) == false after last
+ print "not "
+ok8: print "ok 8\n"
+
+ # now iterate from end
+ set P1, 3 # reset PIter
+ if P1, ok9 # if(iter) == true on non empty
+ print "not "
+ok9: print "ok 9\n"
+ # while (P1) { element = pop(P1) }
+ unless P1, nok10
+ pop I3, P1
+ eq I3, 20, ok10
+nok10: print "not "
+ok10: print "ok 10\n"
+ unless P1, nok11
+ pop I3, P1
+ eq I3, 10, ok11
+nok11: print "not "
+ok11: print "ok 11\n"
+ unless P1, ok12 # if(iter) == false after last
+ print "not "
+ok12: print "ok 12\n"
+ end
+
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+ok 5
+ok 6
+ok 7
+ok 8
+ok 9
+ok 10
+ok 11
+ok 12
+OUTPUT
+