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;
    protected final static 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;
            }
        }
    }
}
