function mgcohashtable::_getHistogram
compile_opt strictarr
on_error, 2
hist = lonarr(self.arraySize)
for i = 0L, self.arraySize - 1L do begin
hist[i] = obj_valid((*self.keyArray)[i]) $
? (*self.keyArray)[i]->count() $
: 0L
endfor
return, hist
end
pro mgcohashtable::print, lun
compile_opt strictarr
myLun = n_elements(lun) eq 0 ? -1L : lun
keys = self->keys(count=count)
values = self->values()
if (count gt 0) then begin
for i = 0L, count - 1L do begin
printf, myLun, keys[i] + ' -> ' + values[i]
endfor
endif
end
function mgcohashtable::keys, count=count
compile_opt strictarr
on_error, 2
count = self->count()
if (count le 0L) then return, -1L
keyArray = make_array(type=self.keyType, count, /nozero)
idx = 0L
for i = 0L, self.arraySize - 1L do begin
list = (*self.keyArray)[i]
if (obj_valid(list)) then begin
keyArray[idx] = list->get(/all)
idx += list->count()
endif
endfor
return, keyArray
end
function mgcohashtable::values, count=count
compile_opt strictarr
on_error, 2
count = self->count()
if (count le 0L) then return, -1L
valueArray = make_array(type=self.valueType, count, /nozero)
idx = 0L
for i = 0, self.arraySize - 1 do begin
list = (*self.valueArray)[i]
if (obj_valid(list)) then begin
valueArray[idx] = list->get(/all)
idx += list->count()
endif
endfor
return, valueArray
end
function mgcohashtable::_calcHashCode, key
compile_opt strictarr
on_error, 2
errorNumber = 0L
catch, errorNumber
if (errorNumber) then begin
catch, /cancel
return, 0UL
endif
type = size(key, /type)
case type of
0 : return, 0UL
1 : return, ulong(key)
2 : return, ulong(key)
3 : return, ulong(key)
4 : return, ulong(key)
5 : return, ulong(key)
6 : return, ulong(abs(key))
7 : begin
ascii = ulong(byte(key))
total = 0UL
for i = 0, n_elements(ascii) - 1 do begin
total = total * 37UL + ascii[i]
endfor
return, total
end
8 : begin
hashCode = 0UL
for tagIndex = 0, n_tags(key) - 1 do begin
hashCode +=self->_calcHashCode(key.(tagIndex))
endfor
return, hashCode
end
9 : return, ulong(abs(key))
10 : return, ptr_valid(key) ? self->_calcHashCode(*key) : 0UL
11 : return, obj_valid(key) ? key->hashCode() : 0UL
12 : return, ulong(key)
13 : return, ulong(key)
14 : return, ulong(key)
15 : return, ulong(key)
endcase
end
function mgcohashtable::get, key, found=found
compile_opt strictarr
on_error, 2
hcode = self->_calcHashCode(key) mod self.arraySize
found = 0B
keyIndex = 0L
if (~obj_valid((*self.keyArray)[hcode])) then begin
found = 0B
return, -1L
endif
iter = (*self.keyArray)[hcode]->iterator()
while (iter->hasNext()) do begin
element = iter->next()
if (element eq key) then begin
found = 1B
break
endif
keyIndex++
endwhile
obj_destroy, iter
return, found ? (*self.valueArray)[hcode]->get(position=keyIndex) : -1L
end
pro mgcohashtable::remove, key, found=found
compile_opt strictarr
on_error, 2
hcode = self->_calcHashCode(key) mod self.arraySize
found = 0B
keyIndex = 0L
if (~obj_valid((*self.keyArray)[hcode])) then begin
found = 0B
return
endif
iter = (*self.keyArray)[hcode]->iterator()
while (iter->hasNext()) do begin
element = iter->next()
if (element eq key) then begin
found = 1B
break
endif
keyIndex++
endwhile
obj_destroy, iter
if (found) then begin
(*self.valueArray)[hcode]->remove, position=keyIndex
endif
end
pro mgcohashtable::put, key, value, found=found
compile_opt strictarr
on_error, 2
hcode = self->_calcHashCode(key) mod self.arraySize
if (obj_valid((*self.keyArray)[hcode])) then begin
found = 0B
keyIndex = 0L
iter = (*self.keyArray)[hcode]->iterator()
while (iter->hasNext()) do begin
el = iter->next()
if (el eq key) then begin
found = 1
break
endif
keyIndex++
endwhile
obj_destroy, iter
if (found) then begin
(*self.valueArray)[hcode]->remove, position=keyIndex
(*self.valueArray)[hcode]->add, value, position=keyIndex
endif else begin
(*self.keyArray)[hcode]->add, key
(*self.valueArray)[hcode]->add, value
endelse
endif else begin
found = 0
if (self.keyType eq 8) then begin
if (~ptr_valid(self.keyExample)) then self.keyExample = ptr_new(key)
(*self.keyArray)[hcode] $
= obj_new('MGcoArrayList', example=*self.keyExample, block_size=5)
endif else begin
(*self.keyArray)[hcode] $
= obj_new('MGcoArrayList', type=self.keyType, block_size=5)
endelse
(*self.keyArray)[hcode]->add, key
if (self.valueType eq 8) then begin
if (~ptr_valid(self.valueExample)) then self.valueExample = ptr_new(value)
(*self.valueArray)[hcode] $
= obj_new('MGcoArrayList', example=*self.valueExample, block_size=5)
endif else begin
(*self.valueArray)[hcode] $
= obj_new('MGcoArrayList', type=self.valueType, block_size=5)
endelse
(*self.valueArray)[hcode]->add, value
endelse
end
function mgcohashtable::count
compile_opt strictarr
on_error, 2
size = 0L
for keyIndex = 0L, n_elements(*self.keyArray) - 1L do begin
size += obj_valid((*self.keyArray)[keyIndex]) $
? (*self.keyArray)[keyIndex]->count() $
: 0L
endfor
return, size
end
function mgcohashtable::isEmpty
compile_opt strictarr
on_error, 2
for keyIndex = 0L, n_elements(*self.keyArray) - 1L do begin
testList = (*self.keyArray)[keyIndex]
if (obj_valid(testList)) then begin
if (testList->count() gt 0) then return, 0
endif
endfor
return, 1B
end
pro mgcohashtable::cleanup
compile_opt strictarr
on_error, 2
obj_destroy, [*self.keyArray, *self.valueArray]
ptr_free, self.keyExample, self.valueExample, self.keyArray, self.valueArray
end
function mgcohashtable::init, array_size=arraySize, $
key_type=keyType, $
value_type=valueType, $
key_example=keyExample, $
value_example=valueExample
compile_opt strictarr
on_error, 2
self.arraySize = n_elements(arraySize) eq 0 ? 101L : arraySize
if (n_elements(keyType) eq 0) then begin
if (n_elements(keyExample) eq 0) then begin
message, 'type of key must be defined with KEY_TYPE or KEY_EXAMPLE'
endif else begin
self.keyType = size(keyExample, /type)
endelse
endif else begin
self.keyType = keyType
endelse
if (n_elements(valueType) eq 0) then begin
if (n_elements(valueExample) eq 0) then begin
message, 'type of value must be defined with VALUE_TYPE or VALUE_EXAMPLE'
endif else begin
self.valueType = size(valueExample, /type)
endelse
endif else begin
self.valueType = valueType
endelse
self.keyArray = ptr_new(objarr(self.arraySize))
self.valueArray = ptr_new(objarr(self.arraySize))
return, 1
end
pro mgcohashtable__define
compile_opt strictarr
define = { MGcoHashTable, $
keyArray: ptr_new(), $
valueArray: ptr_new(), $
arraySize: 0L, $
keyType: 0L, $
valueType: 0L, $
keyExample: ptr_new(), $
valueExample: ptr_new() $
}
end