Complete.Org: Mailing Lists: Archives: freeciv-dev: February 2002:
[Freeciv-Dev] Re: cartesian_adjacent_iterate in map.h
Home

[Freeciv-Dev] Re: cartesian_adjacent_iterate in map.h

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: jdorje@xxxxxxxxxxxxxxxxxxxxx
Cc: Freeciv-Dev <freeciv-dev@xxxxxxxxxxx>
Subject: [Freeciv-Dev] Re: cartesian_adjacent_iterate in map.h
From: Raimar Falke <hawk@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 6 Feb 2002 12:33:53 +0100
Reply-to: rf13@xxxxxxxxxxxxxxxxxxxxxx

On Wed, Feb 06, 2002 at 05:22:27AM -0500, Jason Short wrote:
> Raimar Falke wrote:
> 
> > On Tue, Feb 05, 2002 at 10:20:53PM +0000, Vasco Alexandre Da Silva Costa 
> > wrote:
> > 
> >>Anyone objects if i change that to:
> >>
> >>#define cartesian_adjacent_iterate(x, y, IAC_x, IAC_y) \
> >>{                                                      \
> >>  int IAC_i;                                           \
> >>  int IAC_x, IAC_y;                                    \
> >>  CHECK_MAP_POS(x, y);                                 \
> >>  for (IAC_i = 0; IAC_i < 4; IAC_i++) {                \
> >>    IAC_x = CAR_DIR_DX[IAC_i];                             \
> >>    IAC_y = CAR_DIR_DY[IAC_i];                             \
> >>                                                           \
> >>    if (!normalize_map_pos(&IAC_x, &IAC_y))            \
> >>      continue;
> >>
> >>#define cartesian_adjacent_iterate_end                 \
> >>  }                                                    \
> >>}
> >>
> > 
> > No. But splint has an option where it warns about constructs like
> > this:
> >  for(...)
> >  {
> >    for(...)
> >    {
> >      continue or break
> >    }
> >  }
> > 
> > with "are you sure that you didn't mean to continue/break the outer
> > loop"? I don't think it is a good idea to change freeciv to get no
> > such warning at all but in the above case in can be avoided without
> > cost.
> 
> In this case, there is more danger in using an if() statement than there 
> is in the continue.  If you just have
> 
>    if (normalize_map_pos(&IAC_X, &IAC_y)) {
> 
> in the macro, then a foolish/careless/clever user can insert an } else { 
> into the code that uses the macro, giving (probably) bad results.

This may also be a feature.

> This isn't really much of a concern, but it's there nonetheless...
> 
> 
> As to the macro, I'm all in favor of simplifying it.  I'd do it as
> 
> #define cartesian_adjacent_iterate(x, y, itr_x, itr_y)
> {
>    adjc_dir_iterate(x, y, itr_x, itr_y, _IAC_dir) {
>      if (!DIR_IS_CARDINAL(_IAC_dir))
>        continue;
> 
> but I think macro wrapping like this is frowned upon :-).

But this has a clear performance penalty. And the CPU can't also
predict the branches.

        Raimar

-- 
 email: rf13@xxxxxxxxxxxxxxxxx
 "Sit, disk, sit. Good boy. Now spin up. Very good. Here's a netscape
  cookie for you. Fetch me some data. Come on, you can do it. No, not that
  data. Bad disk. Bad." 
    -- Calle Dybedahl, alt.sysadmin.recovery


[Prev in Thread] Current Thread [Next in Thread]