[Tdg] compile time string length

Alex Norman alex at neisis.net
Thu Feb 22 13:00:10 PST 2007


getters could easily be replaced by the enum via compiler optimization.
I still think that events should have a getEventType and getEventGroup.

the point in the enum is so that we can use it in a switch statement.. so I
guess in that case you wouldn't want to use a class method, you'd just want to
do something like

switch(e->getEventType){
	case mint::Midi::NoteOn::eventType:
	...
}

you can use whatever you want to hash, the whole point in having a registration
process was to take a descriptive, human readable string and turn it into an id
for more efficient lookup.

even if variable is static and const, it has to be set to a specific value at
compile time to be used in a switch statement.. so we cannot do
static const int A::eventID = hash("test")
switch(blah){
	case A::eventID:
}

-Alex

On  0, Rama Hoetzlein <rch at umail.ucsb.edu> wrote:
> I tend to agree about moc'ing, i'm not in favor of it.
> 
> But this goes back to the question, what is the return type on the base 
> class Event::GetEventType () function? As I understand it you are 
> proposing there is no Event::GetEventType function, right.. That each 
> group has its own seperate enum space and we provide a function that 
> hashes the group and enum type for a derived event class. If you're 
> still thinking of an enum GetEventType function in the base Event class, 
> I don't see how this could work. Also, doesn't having a getter fuction 
> defeat the point of having static enums - efficieny. The getter hash 
> function would need to be called on every event on every callback to 
> hash a string with an enum.
> 
> Isn't there a way to hash the value with templates if you use a static 
> const char*, rather than std::string?
> 
> template < const char* C >
> struct Hash {
>    static const int value = (int) (C[0] + C[1] + C[2] + C[3]);  // 
> something like this, i think (maybe recursive template)
> }
> template < const char* C, int N >
> struct Hash {
>    static const int value = (Hash < C >::value << 3) + N;
> }
> 
> class MouseDownEvent {
>    static const int eventID = Hash < "mouse", (int) MouseDownEnum 
> >::value;  
> }
> 
> Or we just say, event groups names must be at least 4 chars.
> 
> R
> 
> Alex Norman wrote:
> 
> >honestly, I think we're getting ahead of ourselves.  I think we should 
> >simply
> >use strings for groups and enums for event types, use getters to grab the 
> >data,
> >and pass the whole event to hashing functions so that we can easily change 
> >our
> >approach later if it becomes an issue.  We should also have class/static 
> >getters
> >or at least const, public variables for this data so that we can do 
> >comparisons
> >without actually caring what the actual representation is.
> >I'm with you on the separate preprocessor thing (ie moc), I don't like 
> >that.
> >Having another application generate a header file to create compile time 
> >ids
> >seems like it is getting ahead of ourselves, it, while simpler than the 
> >separate
> >preproc, is still lame.
> >
> >-Alex
> >
> >On  0, Wesley Smith <wesley.hoke at gmail.com> wrote:
> > 
> >
> >>Ok,
> >>Here's what I currently think about this.  I don't think the C++
> >>preprocessor can look at individual characters of a string at all.
> >>Strings aren't inherent types in C++ because they're arrays and
> >>std::string is an object.  I haven't been able to locate the technical
> >>documentation on this, but I have a pretty good hunch that this means
> >>the preprocessor won't touch 'em.  So, it's time to re-evaluate.
> >>
> >>Some properties we seem to have agreed upon w/r/t enums and strings:
> >>
> >>1) We want calculations that generate the enums-string pairs to be 
> >>compile time
> >>2) We wan't to avoid being arbitrary
> >>3) We want to avoid typing alot when there is a pattern that should
> >>clearly be handled by the compiler somehow
> >>4) We don't want this to be overly complex
> >>
> >>Given the requirements above, I don't think we can meet all of them.
> >>I think we can only meet 3, so we need to weigh the tradeoffs of what
> >>we can do
> >>
> >>A) Arbitrarily partition the integers according to
> >>subsytem/group/event.  This option is straightforward but error prone
> >>and not very extensible.  The biggest problems with this system will
> >>be user created events and how they get assigned a numeric value
> >>
> >>B) Have some kind of preprocessor that runs over the code before
> >>compilation like QT.  I personally don't like this option as it adds
> >>an extra step every single time you reompile and generates alot of
> >>extra files and just feels very messy and awkward.  I would rather try
> >>and find a solution within the confines of C++.
> >>
> >>C) Name events this way: unsigned long long ll ='abcdefgh'; with 64
> >>bits per subsystem per group and per event.  This will restrict names
> >>to a fixed size which might be awkward though and generating the
> >>string will require compile-time bit munging.
> >>
> >>D) Have a separate, tiny application that does the run-time
> >>enum-string hashing and generates a header file for compiling with the
> >>rest of the app.  This seems like a pretty good compromise to me since
> >>everything will be automatic and you only have to recompile when a new
> >>event is added.  For core mint events, we could have a fixed file that
> >>is generated and distributed with a particular version of the library
> >>and for the user and for user events, they would add to their own
> >>"userEventEnum.h"  When they add an event they would just recompile
> >>EventGenerate which would take the list of event stirngs and build a
> >>header file with a table of enums and strings.
> >>
> >>what do ya'll think?
> >>
> >>wes
> >>_______________________________________________
> >>Tdg mailing list
> >>Tdg at mat.ucsb.edu
> >>http://zydeco.mat.ucsb.edu/mailman/listinfo/tdg
> >>   
> >>
> >_______________________________________________
> >Tdg mailing list
> >Tdg at mat.ucsb.edu
> >http://zydeco.mat.ucsb.edu/mailman/listinfo/tdg
> > 
> >
> 
> _______________________________________________
> Tdg mailing list
> Tdg at mat.ucsb.edu
> http://zydeco.mat.ucsb.edu/mailman/listinfo/tdg



More information about the Tdg mailing list