mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-30 03:50:34 +00:00
rulegen:: cleaner push_unify and improved assertions
This commit is contained in:
parent
73edbfee90
commit
57dffb8af9
22
rulegen.cpp
22
rulegen.cpp
@ -88,6 +88,13 @@ using twalker = walker<tcell>;
|
|||||||
|
|
||||||
queue<reaction_t> fix_queue;
|
queue<reaction_t> fix_queue;
|
||||||
|
|
||||||
|
void push_unify(twalker a, twalker b) {
|
||||||
|
if(a.at->id != b.at->id) {
|
||||||
|
throw hr_exception("queued bad unify");
|
||||||
|
}
|
||||||
|
fix_queue.push([=] { unify(a, b); });
|
||||||
|
}
|
||||||
|
|
||||||
bool in_fixing = false;
|
bool in_fixing = false;
|
||||||
|
|
||||||
void unify_distances(tcell *c1, tcell *c2);
|
void unify_distances(tcell *c1, tcell *c2);
|
||||||
@ -138,6 +145,7 @@ tcell *gen_tcell(int id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tcell* tmove(tcell *c, int d) {
|
tcell* tmove(tcell *c, int d) {
|
||||||
|
if(d<0 || d >= c->type) throw hr_exception("wrong d");
|
||||||
if(c->move(d)) return c->move(d);
|
if(c->move(d)) return c->move(d);
|
||||||
auto& co = arb::current.shapes[c->id].connections[d];
|
auto& co = arb::current.shapes[c->id].connections[d];
|
||||||
auto cd = twalker(c, d);
|
auto cd = twalker(c, d);
|
||||||
@ -166,7 +174,7 @@ void check_loops(twalker pw) {
|
|||||||
else throw hr_exception("vertex valence too small");
|
else throw hr_exception("vertex valence too small");
|
||||||
}
|
}
|
||||||
if(steps == valence) {
|
if(steps == valence) {
|
||||||
fix_queue.push([=] { unify(pwf, pwb); });
|
push_unify(pwf, pwb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,7 +189,7 @@ void check_loops(twalker pw) {
|
|||||||
else throw hr_exception("vertex valence too small");
|
else throw hr_exception("vertex valence too small");
|
||||||
}
|
}
|
||||||
if(steps == valence) {
|
if(steps == valence) {
|
||||||
fix_queue.push([=] { unify(pwf, pwb); });
|
push_unify(pwf, pwb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,7 +206,7 @@ void connect_and_check(twalker p1, twalker p2) {
|
|||||||
process_fix_queue();
|
process_fix_queue();
|
||||||
}
|
}
|
||||||
|
|
||||||
void unify(twalker pw1, twalker pw2) {
|
EX void unify(twalker pw1, twalker pw2) {
|
||||||
ufind(pw1);
|
ufind(pw1);
|
||||||
ufind(pw2);
|
ufind(pw2);
|
||||||
if(pw1.at->unified_to.at != pw1.at)
|
if(pw1.at->unified_to.at != pw1.at)
|
||||||
@ -215,6 +223,10 @@ void unify(twalker pw1, twalker pw2) {
|
|||||||
throw hr_exception("unifying two cells of different id's");
|
throw hr_exception("unifying two cells of different id's");
|
||||||
|
|
||||||
auto& shs = arb::current.shapes;
|
auto& shs = arb::current.shapes;
|
||||||
|
|
||||||
|
if((pw1.spin - pw2.spin) % shs[pw1.at->id].cycle_length)
|
||||||
|
throw hr_exception("unification spin disagrees with cycle_length");
|
||||||
|
|
||||||
int id = pw1.at->id;
|
int id = pw1.at->id;
|
||||||
for(int i=0; i<shs[id].size(); i++) {
|
for(int i=0; i<shs[id].size(); i++) {
|
||||||
if(!pw2.peek()) {
|
if(!pw2.peek()) {
|
||||||
@ -224,7 +236,7 @@ void unify(twalker pw1, twalker pw2) {
|
|||||||
connect_and_check(pw1, pw2+wstep);
|
connect_and_check(pw1, pw2+wstep);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fix_queue.push([=] { unify(pw1+wstep, pw2+wstep); });
|
push_unify(pw1+wstep, pw2+wstep);
|
||||||
auto ss = pw1+wstep;
|
auto ss = pw1+wstep;
|
||||||
connect_and_check(pw1, pw2+wstep);
|
connect_and_check(pw1, pw2+wstep);
|
||||||
connect_and_check(pw1, ss);
|
connect_and_check(pw1, ss);
|
||||||
@ -502,7 +514,7 @@ EX void look_for_shortcuts(tcell *c, shortcut& sh) {
|
|||||||
npath.push_back(tw0.at);
|
npath.push_back(tw0.at);
|
||||||
int d = sh.delta;
|
int d = sh.delta;
|
||||||
auto tw1 = tw + d;
|
auto tw1 = tw + d;
|
||||||
fix_queue.push([=] { unify(tw1, tw0); });
|
push_unify(tw1, tw0);
|
||||||
process_fix_queue();
|
process_fix_queue();
|
||||||
for(auto t: npath) {
|
for(auto t: npath) {
|
||||||
ufindc(t);
|
ufindc(t);
|
||||||
|
Loading…
Reference in New Issue
Block a user