| [Freeciv-Dev] Re: (PR#7279) Macro optimizations[Top] [All Lists][Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
 
 
<URL: http://rt.freeciv.org/Ticket/Display.html?id=7279 >
Arnstein Lindgard wrote:
> +#define normalize_map_pos(PX, PY)                            \
> +( map_to_native_pos(&_FC_NAT_X, &_FC_NAT_Y, *(PX), *(PY)),   \
> +  !(   (topo_has_flag(TF_WRAPX) ||                           \
> +       (_FC_NAT_X >= 0 && _FC_NAT_X < map.xsize))            \
> +    && (topo_has_flag(TF_WRAPY) ||                           \
> +       (_FC_NAT_Y >= 0 && _FC_NAT_Y < map.ysize)) )          \
> +  ? FALSE                                                    \
> +  : ((_FC_NAT_X = topo_has_flag(TF_WRAPX)                    \
> +                  ? FC_WRAP(_FC_NAT_X, map.xsize)            \
> +                  : _FC_NAT_X),                                      \
> +     (_FC_NAT_Y = topo_has_flag(TF_WRAPY)                    \
> +                  ? FC_WRAP(_FC_NAT_Y, map.ysize)            \
> +                  : _FC_NAT_Y),                                      \
> +    native_to_map_pos((PX), (PY), _FC_NAT_X, _FC_NAT_Y),     \
> +    TRUE) )
> +
> +/*
> + * Yields TRUE if the map position is normal. "Normal" here means
> + * that it is both a real/valid coordinate set and that the
> + * coordinates are in their canonical/proper form. In plain English:
> + * the coordinates must be on the map.
> + */
> +#define is_normal_map_pos(PX, PY)                            \
> +( _FC_MAP_X = (PX), _FC_MAP_Y = (PY),                                \
> +  normalize_map_pos(&_FC_MAP_X, &_FC_MAP_Y) &&                       \
> +  _FC_MAP_X == (PX) &&                                               \
> +  _FC_MAP_Y == (PY) )
> +
1.  I would rather see normalize_map_pos written as an inline function. 
  That allows you to use global and local variables without having to 
worry about shadowing.
2.  is_normal_map_pos can easily be rewritten without normalize_map_pos: 
and it will be much faster.
   {
     map_to_native_pos(&x, &y, x, y);
     return (x >= 0 && y >= 0 && x < map.xsize && y < map.ysize);
   }
The only reason it's done the way it is is that Raimar wanted the 
"logic" to be concentrated in normalize_map_pos only.
Note that unless you compile with DEBUG is_normal_map_pos is rarely 
called.  So this isn't a big issue IMO.
jason
 
[Freeciv-Dev] Re: (PR#7279) Macro optimizations,
Jason Short <=
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, rwetmore@xxxxxxxxxxxx, 2004/01/20
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, rwetmore@xxxxxxxxxxxx, 2004/01/20
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Jason Short, 2004/01/20
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Per I. Mathisen, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Raimar Falke, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Arnstein Lindgard, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, rwetmore@xxxxxxxxxxxx, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Arnstein Lindgard, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Arnstein Lindgard, 2004/01/21
[Freeciv-Dev] Re: (PR#7279) Macro optimizations, Raimar Falke, 2004/01/21
 
 |  |