comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Case Insensitive Hash but still preserve cases of original keys
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Case Insensitive Hash but still preserve cases of original keys [message #89000] Sun, 13 July 2014 23:24 Go to previous message
SonicKenking is currently offline  SonicKenking
Messages: 51
Registered: October 2010
Member
Hello Community,

I tried to implement a special Hash object with following features
1. Keys are of String type
2. Keys should be case insensitive
3. The original cases of keys should be preserved and reported when the keys() method is called.

Let's say it is called SpeicalHash. It should support following operations:

h = SpecialHash()
h['X'] = 42
print, h.keys() ; output 'X'
print, h['x'], h['X'] ; output 42, 42
print, h.haskey('x'), h.haskey('X') ; output 1, 1

h['x'] = 1337
print, h['x'], h['X'] ; output 1337, 1337

I came up with an implementation (attached at the end of this post) and it meets all of the above requirements. However, when I tried to print the variable h, it reports error of "Key does not exist"

print, h ; Output % Key does not exist: "X"

I found out the PRINT command calls Hash::_overloadPrint to do the job and it in turn calls Keys() method to get the keys. I guess that is where the key "X" comes in. However, I don't understand how PRINT gets the value of a key because none of the overload Bracket methods are called (the cases of keys are taken care of in SpecialHash's bracket methods). I can only think of two possibilities:

1. The Hash::_overloadPrint method calls Hash's own bracket methods to get the value of a key. Therefore the SpecialHash's bracket methods did not get called. If this is true, it seems to be a bug in IDL's Hash implementation and should be fixed.

2. The Hash::_overloadPrint method calls some other hidden method to get the value of a key. If this is the case, can someone show me how it is done?

Thanks!

Yang

; =============== SpecialHash Implementation Starts Here ==============


function SpecialHash::keys
return, list(self.keylist, /extract)
end

function SpecialHash::hasKey, _keys
keys = strlowcase(_keys)
return, self->Hash::hasKey(keys)
end

function SpecialHash::_overloadBracketsRightSide, isRange, $
sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8

sub1 = strlowcase(sub1)
return, self->hash::_overloadBracketsRightSide(isRange, sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8)

end

pro SpecialHash::_overloadBracketsLeftSide, objref, value, isrange, $
_sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8

sub1 = strlowcase(_sub1)
self->Hash::_overloadBracketsLeftSide, objref, value, isrange, sub1, sub2, sub3, sub4, sub5, sub6, sub7, sub8
if (self->Hash::keys()).count() eq self.keylist.count() + 1 then self.keylist.add, _sub1

end

function SpecialHash::init
if ~self->Hash::init() then return, 0
self.keylist = list()
return, 1
end

pro SpecialHash__define
class = {SpecialHash, inherits hash, $
keylist: list() }
end


; =============== End of Code ==============
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: CONTOUR: Data coordinate system not established error
Next Topic: Normalize image after running FLAASH

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Wed Oct 08 15:08:14 PDT 2025

Total time taken to generate the page: 0.00450 seconds