Source code for sts.headerspace.headerspace.wildcard_dictionary
'''
Created on Sep 13, 2011
@author: peymankazemian
'''
[docs]class wildcard_dictionary(object):
'''
classdocs
'''
[docs] def __init__(self,num_key_bits,threshold):
'''
TODOC: What does threshold do?
'''
self.num_key_bits = num_key_bits
self.threshold = threshold
self.table = {}
# Array of num_key_bits arrays
self.table["value"] = []
# Array of num_key_bits tuples
self.table["info"] = []
for i in range(4**num_key_bits):
self.table["value"].append([])
self.table["info"].append((True,[]))
[docs] def add_entry_to_table(self,table,key,value,next_keys):
indices = [0]
for i in range(self.num_key_bits):
next_bit = (key >> 2*i) & 0x3
tmp = []
for index in indices:
if next_bit == 0x1:
tmp.append(index + 2**(2*i))
tmp.append(index + 3*2**(2*i))
elif next_bit == 0x2:
tmp.append(index + 2*2**(2*i))
tmp.append(index + 3*2**(2*i))
else:
tmp.append(index + 1*2**(2*i))
tmp.append(index + 2*2**(2*i))
tmp.append(index + 3*2**(2*i))
indices = tmp
for index in indices:
if table["info"][index][0] == True and (len(table["value"][index]) < self.threshold or len(next_keys) == 0):
table["value"][index].append(value)
table["info"][index][1].append(next_keys)
elif table["info"][index][0] == True:
new_table = {}
new_table["value"] = []
new_table["info"] = []
for i in range(4**self.num_key_bits):
new_table["value"].append([])
new_table["info"].append((True,[]))
for i in range(len(table["value"][index])):
new_val = table["value"][index][i]
new_keys = table["info"][index][1][i]
self.add_entry_to_table(new_table, new_keys[0], new_val, new_keys[1:])
self.add_entry_to_table(new_table, next_keys[0], value, next_keys[1:])
table["value"][index] = new_table
table["info"][index] = (False,[])
else:
new_table = table["value"][index]
self.add_entry_to_table(new_table, next_keys[0], value, next_keys[1:])
[docs] def find_entry_in_table(self,table,keys):
if table["info"][keys[0]][0] == True:
return table["value"][keys[0]]
else:
return self.find_entry_in_table(table["value"][keys[0]], keys[1:])
[docs] def add_entry(self,keys,value):
self.add_entry_to_table(self.table,keys[0],value,keys[1:])
[docs] def find_entry(self,keys):
return self.find_entry_in_table(self.table, keys)
[docs] def self_print_table(self,table,indent):
idn = ""
for j in range(indent):
idn = "%s\t"%idn
for i in range(len(table["value"])):
if table["info"][i][0] == False:
print "%sIndex %x: Table is"%(idn,i)
self.self_print_table(table["value"][i], indent+1)
elif len(table["value"][i]) > 0:
print "%sIndex %x has value %s"%(idn,i,table["value"][i])
[docs] def self_print(self):
self.self_print_table(self.table, 0)