up

A priority search queue and LRU cache.
git clone git://git.jtobin.io/up.git
Log | Files | Refs

up_qor_put.c (3133B)


      1 #include "all.h"
      2 
      3 u3_noun
      4 u3qdu_qor_put(u3_noun a, u3_noun k, u3_noun p, u3_noun v)
      5 {
      6   if (u3_nul == a) {
      7     return u3nt(u3nt(u3k(k), u3k(p), u3k(v)), u3_nul, u3k(k));
      8   }
      9 
     10   u3_noun n_a, t_a, m_a;
     11   u3_noun k_n_a, p_n_a, v_n_a;
     12   u3x_trel(a, &n_a, &t_a, &m_a);
     13   u3x_trel(n_a, &k_n_a, &p_n_a, &v_n_a);
     14 
     15   if (u3_nul == t_a) {
     16     if (c3y == u3r_sing(k, m_a)) {
     17       return u3nt(u3nt(u3k(k), u3k(p), u3k(v)), u3_nul, u3k(k));
     18     }
     19     else if (c3y == u3qc_gor(k, m_a)) {
     20       u3_noun fel = u3nt(u3nt(u3k(k), u3k(p), u3k(v)), u3_nul, u3k(k));
     21       u3_noun fer = u3nt(u3k(n_a), u3_nul, u3k(k_n_a));
     22 
     23       u3_noun pro = u3qdu_qor_toy(fel, fer);
     24 
     25       u3z(fel);
     26       u3z(fer);
     27 
     28       return pro;
     29     }
     30     else {
     31       u3_noun fel = u3nt(u3nt(u3k(k_n_a), u3k(p_n_a), u3k(v_n_a)),
     32                          u3_nul,
     33                          u3k(k_n_a));
     34       u3_noun fer = u3nt(u3nt(u3k(k), u3k(p), u3k(v)), u3_nul, u3k(k));
     35       u3_noun pro = u3qdu_qor_toy(fel, fer);
     36 
     37       u3z(fel);
     38       u3z(fer);
     39 
     40       return pro;
     41     }
     42   }
     43 
     44   u3_noun hot = u3h(t_a);
     45 
     46   if (c3n == u3ud(hot)) {
     47     return u3m_bail(c3__exit);
     48   }
     49   else switch ( hot ) {
     50     default:
     51       return u3m_bail(c3__exit);
     52 
     53     case c3__rlos: {
     54       u3_noun b = u3t(u3t(t_a));
     55 
     56       u3_noun n_b, l_b, m_b, r_b;
     57       u3x_qual(b, &n_b, &l_b, &m_b, &r_b);
     58 
     59       if ( (c3y == u3r_sing(k, m_b)) || (c3y == u3qc_gor(k, m_b)) ) {
     60         u3_noun fel = u3nt(u3k(n_a), u3k(l_b), u3k(m_b));
     61         u3_noun fer = u3nt(u3k(n_b), u3k(r_b), u3k(m_a));
     62         u3_noun pre = u3qdu_qor_put(fel, k, p, v);
     63         u3_noun pro = u3qdu_qor_toy(pre, fer);
     64 
     65         u3z(pre);
     66         u3z(fel);
     67         u3z(fer);
     68 
     69         return pro;
     70       } else {
     71         u3_noun fel = u3nt(u3k(n_b), u3k(r_b), u3k(m_a));
     72         u3_noun fer = u3nt(u3k(n_a), u3k(l_b), u3k(m_b));
     73         u3_noun pre = u3qdu_qor_put(fel, k, p, v);
     74         u3_noun pro = u3qdu_qor_toy(fer, pre);
     75 
     76         u3z(pre);
     77         u3z(fel);
     78         u3z(fer);
     79 
     80         return pro;
     81       }
     82     }
     83 
     84     case c3__llos: {
     85       u3_noun b = u3t(u3t(t_a));
     86 
     87       u3_noun n_b, l_b, m_b, r_b;
     88       u3x_qual(b, &n_b, &l_b, &m_b, &r_b);
     89 
     90       if ( (c3y == u3r_sing(k, m_b)) || (c3y == u3qc_gor(k, m_b)) ) {
     91         u3_noun fel = u3nt(u3k(n_b), u3k(l_b), u3k(m_b));
     92         u3_noun fer = u3nt(u3k(n_a), u3k(r_b), u3k(m_a));
     93         u3_noun pre = u3qdu_qor_put(fel, k, p, v);
     94 
     95         u3_noun pro = u3qdu_qor_toy(pre, fer);
     96 
     97         u3z(pre);
     98         u3z(fel);
     99         u3z(fer);
    100 
    101         return pro;
    102       } else {
    103         u3_noun fel = u3nt(u3k(n_a), u3k(r_b), u3k(m_a));
    104         u3_noun fer = u3nt(u3k(n_b), u3k(l_b), u3k(m_b));
    105         u3_noun pre = u3qdu_qor_put(fel, k, p, v);
    106         u3_noun pro = u3qdu_qor_toy(fer, pre);
    107 
    108         u3z(pre);
    109         u3z(fel);
    110         u3z(fer);
    111 
    112         return pro;
    113       }
    114     }
    115   }
    116 }
    117 
    118 u3_noun
    119 u3wdu_qor_put(u3_noun cor)
    120 {
    121   u3_noun a, k, p, v;
    122 
    123   if ( (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_6, &k,
    124                              u3x_sam_14, &p, u3x_sam_15, &v, 0)) ||
    125        (c3n == u3ud(p)) )
    126   {
    127     return u3m_bail(c3__exit);
    128   } else {
    129     return u3qdu_qor_put(a, k, p, v);
    130   }
    131 }
    132 
    133