+ CNode(final Gen gen) {
+ this(gen, 0, EMPTY_ARRAY);
+ }
+
+ static <K, V> MainNode<K,V> dual(final SNode<K, V> x, final int xhc, final SNode<K, V> y, final int yhc,
+ final int lev, final Gen gen) {
+ if (lev >= 35) {
+ return new LNode<>(x.k, x.v, y.k, y.v);
+ }
+
+ final int xidx = (xhc >>> lev) & 0x1f;
+ final int yidx = (yhc >>> lev) & 0x1f;
+ final int bmp = (1 << xidx) | (1 << yidx);
+
+ if (xidx == yidx) {
+ INode<K, V> subinode = new INode<>(gen, dual(x, xhc, y, yhc, lev + 5, gen));
+ return new CNode<>(gen, bmp, subinode);
+ }
+
+ return xidx < yidx ? new CNode<>(gen, bmp, x, y) : new CNode<>(gen, bmp, y, x);
+ }
+