[gameprogrammer] Re: Any C++ macro champions out there?

  • From: Alan Wolfe <alan.wolfe@xxxxxxxxx>
  • To: gameprogrammer@xxxxxxxxxxxxx
  • Date: Thu, 3 Jan 2013 19:15:09 -0800

I've been thinking about it a while but I cant see how making it into a
begin and end would help, but might be missing what you are getting at :P


On Thu, Jan 3, 2013 at 5:41 PM, Stéphane Marchesin <
stephane.marchesin@xxxxxxxxx> wrote:

> On Thu, Jan 3, 2013 at 5:33 PM, Alan Wolfe <alan.wolfe@xxxxxxxxx> wrote:
> > Normally that would work great Stephane, but if you look at my macro
> list,
> > it's a list of lists.
> >
> > I agree, if it was a single list i could do multiple passes and do:
> >
> > // 1 - define class header and member vars and getters / setters
> > // 2 - define constructor parameters
> > // 3 - define constructor body and then end class declaration
> >
> > But the problem is that i have multiple classes represented in my list,
> > which means i can only do a single pass since i can't do the header for
> each
> > class, then the constructor header for each class, and then end each
> class.
> >
>
> Yeah you can't make that work... Couldn't you turn the
> TRIGGEREVENTLIST into TRIGGEREVENTLIST_BEGIN and TRIGGEREVENTLIST_END?
> Intuitively that would work.
>
> Stéphane
>
>
> > In the below, 3 classes need to be generated from the single macro list:
> >
> > #define TRIGGEREVENTLIST \
> > \
> > TRIGGEREVENT_BEGIN(PokeEvent, Base) \
> >     TRIGGEREVENT_ITEM(int, PokeCount, true, 0) \
> >     TRIGGEREVENT_ITEM(bool, PokeHard, false, false) \
> > TRIGGEREVENT_END() \
> > \
> > TRIGGEREVENT_BEGIN(AnotherEvent, Base) \
> >     TRIGGEREVENT_ITEM(float, Something, true, 0.5f) \
> > TRIGGEREVENT_END() \
> > \
> > TRIGGEREVENT_BEGIN(UberPokeEvent, PokeEvent) \
> >
> >     TRIGGEREVENT_ITEM(float, UberPokeMultiplier, true, 2.0f) \
> > TRIGGEREVENT_END()
> >
>
> But why not make it:
>
>
> >
> >
> >
> >
> > On Thu, Jan 3, 2013 at 5:26 PM, Stéphane Marchesin
> > <stephane.marchesin@xxxxxxxxx> wrote:
> >>
> >> On Wed, Jan 2, 2013 at 10:29 PM, Alan Wolfe <alan.wolfe@xxxxxxxxx>
> wrote:
> >> > Any C++ macro champions out there? I'm Trying to figure out how to do
> >> > something and hoping i don't have to fall back on code generation or
> >> > manual
> >> > maintenance :P
> >> >
> >> > I have a macro list defined like this:
> >> >
> >> > #define TRIGGEREVENTLIST \
> >> > \
> >> > TRIGGEREVENT_BEGIN(PokeEvent, Base) \
> >> > TRIGGEREVENT_ITEM(int, PokeCount, true, 0) \
> >> > TRIGGEREVENT_ITEM(bool, PokeHard, false, false) \
> >> > TRIGGEREVENT_END() \
> >> > \
> >> > TRIGGEREVENT_BEGIN(AnotherEvent, Base) \
> >> > TRIGGEREVENT_ITEM(float, Something, true, 0.5f) \
> >> > TRIGGEREVENT_END() \
> >> > \
> >> > TRIGGEREVENT_BEGIN(UberPokeEvent, Base) \
> >> > TRIGGEREVENT_ITEM(float, UberPokeMultiplier, true, 2.0f) \
> >> > TRIGGEREVENT_END()
> >> >
> >> > And I want to create a class per trigger event that contains each item
> >> > as a
> >> > member and also a const & getter and setter for each item within it. I
> >> > have
> >> > that part working, but I'm stuck on the next part...
> >> >
> >> > What i need to do next is make a constructor or some kind of
> >> > construction
> >> > mechanism which contains all the items as parameters to the function,
> >> > and
> >> > then sets the members to the passed in values.
> >> >
> >> > The problem I'm hitting is that to do that, I essentially need to loop
> >> > through an events item list twice (once for params, once for setting
> the
> >> > members to the param values) before moving onto the next event, but
> not
> >> > sure
> >> > how to do that (or even if there is a way).
> >>
> >> You put all your things in one header, let's call that header
> >> listofthings.h:
> >>
> >> DO_SOMETHING(0, "A")
> >> DO_SOMETHING(2, "B")
> >> ...
> >>
> >> then you can include that header multiple times, redefining
> >> DO_SOMETHING differently every time:
> >>
> >> #define DO_SOMETHING(A,B) printf("%d %s\n", A, B);
> >> #include "listofthings.h"
> >> #undef DO_SOMETHING
> >>
> >> #define DO_SOMETHING(A,B) table[A] = B;
> >> #include "listofthings.h"
> >> #undef DO_SOMETHING
> >>
> >> Stéphane
> >>
> >> >
> >> > Unfortunately, a potential added nail to the coffin is that the
> >> > constructor
> >> > (or construction mechanism) also needs to include as parameters all of
> >> > the
> >> > inherited items.
> >> >
> >> > I really want compile time assurance that when these are constructed,
> >> > that
> >> > they have all the necessary data supplied to them (so when you add or
> >> > remove
> >> > items, you get compile time errors about the places in the code you
> need
> >> > to
> >> > update).
> >> >
> >> > Thanks for any insight anyone can provide!
> >> >
> >> > PS if anyone is interested, I can share the code i have right now to
> >> > generate classes with private members and getters and setters, as well
> >> > as a
> >> > COMPILE TIME calculation of the size of the largest class (so you
> could
> >> > use
> >> > it as a parameter to an object pool allocator or something).
> >>
> >> ---------------------
> >> To unsubscribe go to http://gameprogrammer.com/mailinglist.html
> >>
> >>
> >
>
> ---------------------
> To unsubscribe go to http://gameprogrammer.com/mailinglist.html
>
>
>

Other related posts: