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
  +
  
  
  

Reply via email to