On 13 December 2012 03:08, Igor Stasenko <[email protected]> wrote: > On 11 December 2012 20:33, Ciprian Teodorov <[email protected]> > wrote: >> Hi guys, >> >> today I have commited to the NativeBoost repository a new core class, the >> NBExternalEnumerationType, >> which reifies the enum declarations in C and offers a nice interface >> (especially in terms of debug/inspect). >> >> To use it just subclass the NBExternalEnumeration and add an #enumDecl >> method to the class side such as: >> >> NBExternalEnumeration subclass: #NBTestEnumeration >> instanceVariableNames: '' >> classVariableNames: '' >> poolDictionaries: '' >> category: 'NativeBoost-Tests' >> >> NBTestEnumeration class>>enumDecl >> ^ {(#AAA -> 1). >> (#BBB -> 2). >> (#CCC -> 3). >> (#DDD -> 2400)} asDictionary >> > just one comment: imo, it would be better to not force users to > remember that they should use > complicated syntax in this method. > > i propose following syntax: > > NBTestEnumeration class>>enumDecl > ^ #( > #AAA 1 > #BBB -> 2 > #CCC -> 3 > #DDD -> 2400 > ) > oops, of course it should be just pairs, e.g.: #( A 1 B 2 C 3)
> then you can have > > NBTestEnumeration class>>initializeEnum > > dict := Dictionary newFromPairs: self enumDecl > ..... > > then #initialize should just do 'self initializeEnum' > > > >> DO NOT FORGET to call the #initialize method on your class. The rest is >> automatically done ;) >> >> You can use your new enum in two ways: >> >> add it to a client class poolDictionaries list (see #NBExternalEnumTests >> for an example), and then just write CCC in your code -- CCC here is an item >> of your enum >> or you can send the name of an item to your class --- NBTestEnumeration DDD >> >> The NBExternalEnumeration implements (instance and class) some more API >> methods like: >> >> #itemAt: retrieves the item having a specific value --- NBTestEnumeration >> itemAt: 2 >> #includes: checks the existence of a specific item in the enum --- >> NBTestEnumeration includes: #AAA >> >> Having this already gives us a nice interface to working with enums. Now I >> plan to improve a little bit on performance and usage scenarios: >> >> the possibility to accept smalltalk integers as valid input/output for >> functions(or callbacks) that use enums as arguments/return. >> support the different representation types for the enum values (int/uint) >> > > to my thinking, it not worth implementing separate type converter for enums.. > just put a note that if people would like to deal nicely with enums > returned by function(s), > they should use a converter , something like that: > > enumValue := MyEnumeration fromInteger: (self callSomeFunctionReturningInt) > > then this method can implement converting from int->enum object, > as well as do a range checking etc. > in same way, if people want to use 'enumValue' for passing it as > parameter to external function, > they should not pass it directly , but use 'enumValue value' > > In general, it would be cool to have good 'enum type' converter.. > (despite that i will never use it, > because to my taste its not really worth it, and i can live with > integers and in most cases you hide such low-level details from > end-user anyways ;)) > but for those, who want more clarity and better structure in their > code, of course, they can use it . > > >> So that will be for now. Feel free to try it out and send me any comments >> and/or improvement ideas, It will be my pleasure to improve it. >> Cheers, >> -- >> Dr. Ciprian TEODOROV >> Ingénieur Développement CAO >> >> tél : 06 08 54 73 48 >> mail : [email protected] >> www.teodorov.ro > > > > -- > Best regards, > Igor Stasenko. -- Best regards, Igor Stasenko.
