| [Freeciv-Dev] Re: [Patch] Cleanup regarding {city,unit}_owner[Top] [All Lists][Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
 
 On Thu, Aug 23, 2001 at 03:36:07PM -0700, Trent Piepho wrote:
> On Thu, 23 Aug 2001, Raimar Falke wrote:
> > The first patch changes constructs like "get_player(punit->owner)" to
> > "unit_owner(punit)". The second patch changes constructs like
> > "&game.players[punit->owner]" also to "unit_owner(punit)".
> 
> It looks like you changed city owner in the same way as unit owner, which
> makes sense.
> 
> But, why not just make the owner field a player pointer?  Then you could
> change:
This is the next step. First we increase the encapsulation.
> &game.players[punit->owner]
> or
> get_player(punit->owner)
> 
> to
> 
> punit->owner
> 
> More efficient, less code, less typing.  And if you want to remove IDs where
> they aren't needed, you're going to want to change the owner field to a
> pointer anyway.
Maybe.
> Now, I'm guessing you might say that unit_owner() can just be changed to
> #define UNIT_OWNER(punit) (punit->owner)
> 
> But, it is generally considered neither necessary, nor desirable, in C
> programming to create accessor functions for members of structures.  Accessor
> functions like:
> 
> struct player *get_player(int playerid);
> struct unit *get_unit_by_id(int id);
> 
> Are ok, because you don't know underlying data structure that player or unit
> structs are contained in.  So while get_player() may just be a one-expression
> array index, that could change.  get_unit in fact has changed, it used to be
> that it searched an array of lists for the unit, but that was changed to a
> hash table for speed.  I think it was Syela who first did that back when he
> wrote the AI.  But once you have the structure in hand, it is ok to just
> access its fields with ->.
You see with a function like {unit,city}_owner() we can
experiment. These functions doesn't harm.
> It would be bad to get into a situation where 95% of structure
> members are accessed with ->, and 5% have acessor functions for no
> apparent reason.
May plan is something like this:
 1) finish the cleanup
 2) profile (there are now a lot more calls to {unit,city}_owner()
 3) if {unit,city}_owner() is called too often and take too much time
 think about reducing the number of calls
 4) after this if {unit,city}_owner() still takes to much time make a
 macro/inline function out of it
 5) if somebody sends me a patch for making owner field a pointer and
 this is considerable faster than 4) I will apply it. In this patch
 {unit,city}_owner() would probably end up as macros/inline functions
 (but are still lower cased)
What do you think?
        Raimar
-- 
 email: rf13@xxxxxxxxxxxxxxxxx
 "It is not yet possible to change operating system by writing
  to /proc/sys/kernel/ostype."              sysctl(2) man page
 
 |  |