• R/O
  • SSH

quipu: Commit

quipu mercurial repository


Commit MetaInfo

Revisiónae9ad2682d646ae89d3715b69bbf754edb3cbea3 (tree)
Tiempo2019-11-12 23:26:39
AutorAgustina Arzille <avarzille@rise...>
CommiterAgustina Arzille

Log Message

Rewrite table iterators to be more STL like

Cambiar Resumen

Diferencia incremental

diff -r e10a7f633937 -r ae9ad2682d64 compiler.cpp
--- a/compiler.cpp Mon Nov 11 15:01:11 2019 -0300
+++ b/compiler.cpp Tue Nov 12 11:26:39 2019 -0300
@@ -1487,10 +1487,10 @@
14871487 tmp[i++].car = NIL;
14881488
14891489 // Push the key/value pairs.
1490- for (table::iterator it (this->interp, expr); it.valid (); it.adv ())
1490+ for (table::iterator it (this->interp, expr); it.valid (); ++it)
14911491 {
1492- tmp[i++].car = *it.key;
1493- tmp[i++].car = *it.val;
1492+ tmp[i++].car = it.key ();
1493+ tmp[i++].car = it.val ();
14941494 }
14951495
14961496 memcpy (name, "table", namelen = 5);
diff -r e10a7f633937 -r ae9ad2682d64 cons.h
--- a/cons.h Mon Nov 11 15:01:11 2019 -0300
+++ b/cons.h Tue Nov 12 11:26:39 2019 -0300
@@ -85,6 +85,11 @@
8585 {
8686 }
8787
88+ safe_iter (interpreter *__interp, const safe_iter& __right) :
89+ fast (__interp, *__right.fast), slow (__interp, *__right.slow)
90+ {
91+ }
92+
8893 inline bool valid () const;
8994 inline object& operator* ();
9095 inline object operator* () const;
@@ -102,7 +107,7 @@
102107
103108 safe_iter operator++ (int)
104109 {
105- safe_iter __rv = *this;
110+ safe_iter __rv { interpreter::self (), *this };
106111 ++*this;
107112 return (__rv);
108113 }
diff -r e10a7f633937 -r ae9ad2682d64 eval.cpp
--- a/eval.cpp Mon Nov 11 15:01:11 2019 -0300
+++ b/eval.cpp Tue Nov 12 11:26:39 2019 -0300
@@ -162,8 +162,8 @@
162162 for (; ret < as_array(seq)->len; ++ret)
163163 interp->push (xaref (seq, ret));
164164 else if (table_p (seq))
165- for (table::iterator it (interp, seq); it.valid (); it.adv (), ++ret)
166- interp->push (*it.key);
165+ for (table::iterator it (interp, seq); it.valid (); ++it, ++ret)
166+ interp->push (it.key ());
167167 else if (tuple_p (seq))
168168 for (tuple::iterator it (interp, seq); it.valid (); ++it, ++ret)
169169 interp->push (*it);
diff -r e10a7f633937 -r ae9ad2682d64 io.cpp
--- a/io.cpp Mon Nov 11 15:01:11 2019 -0300
+++ b/io.cpp Tue Nov 12 11:26:39 2019 -0300
@@ -1295,8 +1295,8 @@
12951295 else if (table_p (seq))
12961296 {
12971297 valref tmp (interp, NIL);
1298- for (table::iterator it (interp, seq); it.valid (); it.adv ())
1299- *tmp = QP_CALL (interp, list_star, *it.val, *it.key, *tmp);
1298+ for (table::iterator it (interp, seq); it.valid (); ++it)
1299+ *tmp = QP_CALL (interp, list_star, it.val (), it.key (), *tmp);
13001300
13011301 return (nreverse_L (interp, *tmp));
13021302 }
diff -r e10a7f633937 -r ae9ad2682d64 table.cpp
--- a/table.cpp Mon Nov 11 15:01:11 2019 -0300
+++ b/table.cpp Tue Nov 12 11:26:39 2019 -0300
@@ -745,15 +745,10 @@
745745 }
746746
747747 table::iterator::iterator (interpreter *interp, object table) :
748- key (interp, UNBOUND), val (interp, UNBOUND),
748+ c_key (interp, UNBOUND), c_val (interp, UNBOUND),
749749 vec (interp, as_table(table)->vector), idx (0)
750750 {
751- this->adv ();
752-}
753-
754-bool table::iterator::valid ()
755-{
756- return (valid_key_p (*this->key));
751+ ++*this;
757752 }
758753
759754 static inline void
@@ -766,13 +761,23 @@
766761
767762 idx += 2;
768763 if (valid_key_p (key) && val != DELETED_VAL && val != FREE_HASH)
769- break;
764+ return;
770765 }
766+
767+ idx = -1;
771768 }
772769
773-void table::iterator::adv ()
770+table::iterator& table::iterator::operator++ ()
774771 {
775- iter_bump (as_array (*this->vec), *this->key, *this->val, this->idx);
772+ iter_bump (as_array (*this->vec), *this->c_key, *this->c_val, this->idx);
773+ return (*this);
774+}
775+
776+table::iterator table::iterator::operator++ (int)
777+{
778+ iterator ret { interpreter::self (), *this };
779+ ++*this;
780+ return (ret);
776781 }
777782
778783 object iter_u (interpreter *interp, object obj, object token, bool adv)
@@ -808,7 +813,7 @@
808813 object out_k, out_v;
809814
810815 iter_bump (as_array (vec), out_k, out_v, ix);
811- if (!valid_key_p (out_k))
816+ if (ix < 0)
812817 qp_return (NIL);
813818
814819 xaref(token, 0) = out_k;
@@ -828,10 +833,10 @@
828833 ret = mix_hash (ret, xhash (interp, as_table(obj)->cmpfct));
829834 ret = mix_hash (ret, xhash (interp, as_table(obj)->hashfct));
830835
831- for (table::iterator it (interp, obj); it.valid (); it.adv ())
836+ for (table::iterator it (interp, obj); it.valid (); ++it)
832837 {
833- ret = mix_hash (ret, xhash (interp, *it.key));
834- ret = mix_hash (ret, xhash (interp, *it.val));
838+ ret = mix_hash (ret, xhash (interp, it.key ()));
839+ ret = mix_hash (ret, xhash (interp, it.val ()));
835840 }
836841
837842 return (ret);
@@ -846,12 +851,11 @@
846851 if (it.valid ())
847852 while (true)
848853 {
849- ret += xwrite (interp, strm, *it.key, info);
854+ ret += xwrite (interp, strm, it.key (), info);
850855 ret += strm->putb (interp, ' ');
851- ret += xwrite (interp, strm, *it.val, info);
856+ ret += xwrite (interp, strm, it.val (), info);
852857
853- it.adv ();
854- if (!it.valid ())
858+ if (!(++it).valid ())
855859 break;
856860
857861 ret += strm->putb (interp, ' ');
@@ -871,16 +875,16 @@
871875
872876 if (deep)
873877 // We have to copy every key-value pair as well.
874- for (; it.valid (); it.adv ())
878+ for (; it.valid (); ++it)
875879 {
876- interp->push (copy (interp, *it.key, true));
877- interp->push (copy (interp, *it.val, true));
880+ interp->push (copy (interp, it.key (), true));
881+ interp->push (copy (interp, it.val (), true));
878882 }
879883 else
880- for (; it.valid (); it.adv ())
884+ for (; it.valid (); ++it)
881885 {
882- interp->push (*it.key);
883- interp->push (*it.val);
886+ interp->push (it.key ());
887+ interp->push (it.val ());
884888 }
885889
886890 return (table_fct (interp, interp->stack + sg.sp, interp->stklen () - sg.sp));
@@ -899,10 +903,10 @@
899903 xpack (interp, strm, tp->hashfct, info);
900904
901905 ret += strm->write (interp, &tp->mv_ratio);
902- for (table::iterator it (interp, obj); it.valid (); it.adv ())
906+ for (table::iterator it (interp, obj); it.valid (); ++it)
903907 {
904- ret += xpack (interp, strm, *it.key, info);
905- ret += xpack (interp, strm, *it.val, info);
908+ ret += xpack (interp, strm, it.key (), info);
909+ ret += xpack (interp, strm, it.val (), info);
906910 }
907911
908912 return (ret + strm->putb (interp, PACK_END));
diff -r e10a7f633937 -r ae9ad2682d64 table.h
--- a/table.h Mon Nov 11 15:01:11 2019 -0300
+++ b/table.h Tue Nov 12 11:26:39 2019 -0300
@@ -17,14 +17,36 @@
1717
1818 struct iterator
1919 {
20- valref key;
21- valref val;
20+ valref c_key;
21+ valref c_val;
2222 valref vec;
2323 int idx;
2424
2525 iterator (interpreter *__interp, object __table);
26- bool valid ();
27- void adv ();
26+
27+ iterator (interpreter *__interp, const iterator& __right) :
28+ c_key (__interp, *__right.c_key), c_val (__interp, *__right.c_val),
29+ vec (__interp, *__right.vec), idx (__right.idx)
30+ {
31+ }
32+
33+ bool valid () const
34+ {
35+ return (this->idx >= 0);
36+ }
37+
38+ iterator& operator++ ();
39+ iterator operator++ (int);
40+
41+ object key () const
42+ {
43+ return (*this->c_key);
44+ }
45+
46+ object val () const
47+ {
48+ return (*this->c_val);
49+ }
2850 };
2951 };
3052
diff -r e10a7f633937 -r ae9ad2682d64 tuple.cpp
--- a/tuple.cpp Mon Nov 11 15:01:11 2019 -0300
+++ b/tuple.cpp Tue Nov 12 11:26:39 2019 -0300
@@ -630,6 +630,13 @@
630630 return (*this);
631631 }
632632
633+tuple::iterator tuple::iterator::operator++ (int)
634+{
635+ iterator rv { interpreter::self (), *this };
636+ ++*this;
637+ return (rv);
638+}
639+
633640 object tuple::iterator::operator* () const
634641 {
635642 return (node_key (*this->node));
diff -r e10a7f633937 -r ae9ad2682d64 tuple.h
--- a/tuple.h Mon Nov 11 15:01:11 2019 -0300
+++ b/tuple.h Tue Nov 12 11:26:39 2019 -0300
@@ -19,23 +19,16 @@
1919 {
2020 }
2121
22- static iterator make (interpreter *__interp, object __node)
22+ iterator (interpreter *__interp, const iterator& __right) :
23+ iterator (__interp)
2324 {
24- iterator __it (__interp);
25- *__it.node = __node;
26- return (__it);
25+ this->reset (*__right.node);
2726 }
2827
2928 bool valid ();
3029
3130 iterator& operator++ ();
32-
33- iterator operator++ (int)
34- {
35- iterator __rv = *this;
36- ++*this;
37- return (__rv);
38- }
31+ iterator operator++ (int);
3932
4033 object operator* () const;
4134
@@ -44,6 +37,13 @@
4437 *this->node = __node;
4538 }
4639
40+ static iterator make (interpreter *__interp, object __node)
41+ {
42+ iterator __rv { __interp };
43+ __rv.reset (__node);
44+ return (__rv);
45+ }
46+
4747 valref node;
4848 };
4949 };
Show on old repository browser