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;
			}
		}
	}
}
