package net.onrc.onos.apps.bgproute;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PtreeNode {
    public PtreeNode parent;
    public PtreeNode left;
    public PtreeNode right;

    public byte[] key;
    public int keyBits;

    public int refCount;

    public RibEntry rib;
    private static final Logger log = LoggerFactory.getLogger(BgpRoute.class);

    PtreeNode(byte[] key, int key_bits, int max_key_octet) {
        parent = null;
        left = null;
        right = null;
        refCount = 0;
        rib = null;
        this.key = new byte[max_key_octet];
        this.keyBits = key_bits;
        log.debug("inside Ptreenode constructor key {} bits {}", key, key_bits);

        int octet = Ptree.bit_to_octet(key_bits);
        for (int i = 0; i < max_key_octet; i++) {
            if (i < octet) {
                if (key != null) {
                    log.debug(octet + ": filling key[{}] {}", i, key[i]);
                    this.key[i] = key[i];
                } else {
                    log.debug("no filling, null key", i);
                }
            } else {
                log.debug("filling key {} as 0", i);
                this.key[i] = 0;
            }
        }
    }
}
