From 42fdf0d4f0ced19a098fb632cf91c475cf9ff68e Mon Sep 17 00:00:00 2001 From: vdhoeven Date: Sun, 13 Dec 2009 14:42:16 +0000 Subject: [PATCH] Save/load/encode/decode for environment changes in DRDs git-svn-id: svn://svn.savannah.gnu.org/texmacs/trunk@2880 64cb5145-927a-446d-8aed-2fb7b4773692 --- src/src/Data/Drd/drd_info.cpp | 6 +-- src/src/Data/Drd/tag_info.cpp | 90 +++++++++++++++++++++++++++---------------- src/src/Data/Drd/tag_info.hpp | 28 +++++++------- 3 files changed, 75 insertions(+), 49 deletions(-) diff --git a/src/src/Data/Drd/drd_info.cpp b/src/src/Data/Drd/drd_info.cpp index 0d4f6e2a..62279702 100644 --- a/src/src/Data/Drd/drd_info.cpp +++ b/src/src/Data/Drd/drd_info.cpp @@ -363,12 +363,12 @@ drd_info_rep::set_env (tree_label l, int nr, tree env) { if (nr >= N(ti->ci)) return; child_info& ci= ti->ci[nr]; if (ci.freeze_env) return; - ci.env= env; + ci.env= drd_encode (env); } tree drd_info_rep::get_env (tree_label l, int nr) { - return info[l]->ci[nr].env; + return drd_decode (info[l]->ci[nr].env); } void @@ -387,7 +387,7 @@ drd_info_rep::get_env_child (tree t, int i, tree env) { tag_info ti= info[L(t)]; int index= ti->get_index (i, N(t)); if ((index<0) || (index>=N(ti->ci))) return ""; - tree cenv= ti->ci[index].env; + tree cenv= drd_decode (ti->ci[index].env); //cout << t << ", " << i << " -> " << env_merge (env, cenv) << "\n"; return env_merge (env, cenv); } diff --git a/src/src/Data/Drd/tag_info.cpp b/src/src/Data/Drd/tag_info.cpp index b04259bb..adaeb6cd 100644 --- a/src/src/Data/Drd/tag_info.cpp +++ b/src/src/Data/Drd/tag_info.cpp @@ -10,11 +10,36 @@ ******************************************************************************/ #include "tag_info.hpp" +#include "hashmap.hpp" #define get_bits(which,nr) which=i&((1<>nr #define set_bits(which,nr) i+=((int)which)< encode_table (-1); +static array decode_table; + +int +drd_encode (tree t) { + if (encode_table->contains (t)) + return encode_table[t]; + int n= N(decode_table); + ASSERT (n < (1 << 16), "drd_encode overflow"); + encode_table (t) = n; + decode_table << t; + return n; +} + +tree +drd_decode (int i) { + ASSERT (i >= 0 && i < N (decode_table), "out of range"); + return decode_table[i]; +} + +/****************************************************************************** * Properties of the tag ******************************************************************************/ @@ -30,8 +55,8 @@ parent_info::parent_info (int a, int x, int am, int cm, bool frozen) { freeze_block = frozen; } -parent_info::parent_info (string s) { - int i= as_int (s); +parent_info::parent_info (tree t) { + int i= as_int (t); get_bits (arity_mode , 2); get_bits (arity_base , 6); get_bits (arity_extra , 4); @@ -43,7 +68,7 @@ parent_info::parent_info (string s) { get_bits (freeze_block , 1); } -parent_info::operator string () { +parent_info::operator tree () { int i=0, offset=0; set_bits (arity_mode , 2); set_bits (arity_base , 6); @@ -78,7 +103,7 @@ parent_info::operator != (const parent_info& pi) { ostream& operator << (ostream& out, parent_info pi) { - return out << ((string) pi); + return out << ((tree) pi); } /****************************************************************************** @@ -89,38 +114,37 @@ child_info::child_info (bool frozen) { accessible = ACCESSIBLE_NEVER; writability = WRITABILITY_NORMAL; block = 0; - env2 = 0; + env = drd_encode (tree (WITH)); freeze_accessible = frozen; freeze_writability = frozen; freeze_block = frozen; freeze_env = frozen; - env= tree (WITH); } -child_info::child_info (string s) { - int i= as_int (s); - get_bits (accessible , 2); - get_bits (writability , 2); - get_bits (block , 2); - get_bits (env2 , 3); - get_bits (freeze_accessible , 1); - get_bits (freeze_writability, 1); - get_bits (freeze_block , 1); - get_bits (freeze_env , 1); - env= tree (WITH); +child_info::child_info (tree t) { + int i= as_int (is_atomic (t)? t: t[N(t)-1]); + get_bits (accessible , 2); + get_bits (writability , 2); + get_bits (block , 2); + get_bits (freeze_accessible , 1); + get_bits (freeze_writability, 1); + get_bits (freeze_block , 1); + get_bits (freeze_env , 1); + if (is_atomic (t)) env= drd_encode (tree (WITH)); + else env= drd_encode (t (0, N(t)-1)); } -child_info::operator string () { +child_info::operator tree () { int i=0, offset=0; - set_bits (accessible , 2); - set_bits (writability , 2); - set_bits (block , 2); - set_bits (env2 , 3); - set_bits (freeze_accessible , 1); - set_bits (freeze_writability, 1); - set_bits (freeze_block , 1); - set_bits (freeze_env , 1); - return as_string (i); + set_bits (accessible , 2); + set_bits (writability , 2); + set_bits (block , 2); + set_bits (freeze_accessible , 1); + set_bits (freeze_writability, 1); + set_bits (freeze_block , 1); + set_bits (freeze_env , 1); + if (drd_decode (env) == tree (WITH)) return as_string (i); + else return drd_decode (env) * tree (WITH, as_string (i)); } bool @@ -129,7 +153,7 @@ child_info::operator == (const child_info& ci) { (accessible == ci.accessible ) && (writability == ci.writability ) && (block == ci.block ) && - (env2 == ci.env2 ) && + (env == ci.env ) && (freeze_accessible == ci.freeze_accessible ) && (freeze_writability == ci.freeze_writability) && (freeze_block == ci.freeze_block ) && @@ -143,7 +167,7 @@ child_info::operator != (const child_info& ci) { ostream& operator << (ostream& out, child_info ci) { - return out << ((string) ci); + return out << ((tree) ci); } /****************************************************************************** @@ -177,17 +201,17 @@ tag_info::tag_info (tree t) { cerr << "\nt= " << t << "\n"; FAILED ("bad tag_info"); } - parent_info pi (as_string (t[0])); + parent_info pi (t[0]); int i, n= N(t[1]); array ci (n); for (i=0; i (pi, ci, N(t)==3? t[2]: tree ("")); } tag_info::operator tree () { - if (rep->extra == "") return tree (TUPLE, (string) rep->pi, (tree) rep->ci); - else return tree (TUPLE, (string) rep->pi, (tree) rep->ci, rep->extra); + if (rep->extra == "") return tree (TUPLE, (tree) rep->pi, (tree) rep->ci); + else return tree (TUPLE, (tree) rep->pi, (tree) rep->ci, rep->extra); } /****************************************************************************** diff --git a/src/src/Data/Drd/tag_info.hpp b/src/src/Data/Drd/tag_info.hpp index a2df6a8e..5b6bc77d 100644 --- a/src/src/Data/Drd/tag_info.hpp +++ b/src/src/Data/Drd/tag_info.hpp @@ -13,6 +13,9 @@ #define TAG_INFO_H #include "tree.hpp" +int drd_encode (tree t); +tree drd_decode (int i); + /****************************************************************************** * The parent_info class contains outer information about tags * @@ -67,9 +70,9 @@ struct parent_info { unsigned freeze_block : 1; parent_info (int arity, int extra, int amode, int cmode, bool frozen= false); - parent_info (string s); + parent_info (tree t); inline ~parent_info () {} - operator string (); + operator tree (); bool operator == (const parent_info& pi); bool operator != (const parent_info& pi); friend ostream& operator << (ostream& out, parent_info pi); @@ -112,20 +115,19 @@ struct parent_info { #define BLOCK_REQUIRE_NONE 2 struct child_info { - tree env; - unsigned accessible : 2; // child is accessible? - unsigned writability : 2; // writability of child - unsigned block : 2; // require children to be blocks? - unsigned env2 : 3; // in which mode is the child? - unsigned freeze_accessible : 1; // true => disable heuristic determination - unsigned freeze_writability: 1; - unsigned freeze_block : 1; - unsigned freeze_env : 1; + unsigned accessible : 2; // child is accessible? + unsigned writability : 2; // writability of child + unsigned block : 2; // require children to be blocks? + unsigned env : 16; // environment of the child? + unsigned freeze_accessible : 1; // true => disable heuristic determination + unsigned freeze_writability: 1; + unsigned freeze_block : 1; + unsigned freeze_env : 1; child_info (bool frozen= false); - child_info (string s); + child_info (tree t); inline ~child_info () {} - operator string (); + operator tree (); bool operator == (const child_info& pi); bool operator != (const child_info& pi); friend ostream& operator << (ostream& out, child_info ci); -- 2.11.4.GIT