About ProgressReport and msn-pecan

Felipe Contreras felipe.contreras at gmail.com
Sun Jun 15 07:24:15 EDT 2008


Hi Tim,

On Sun, Jun 15, 2008 at 1:58 AM, Tim Ringenbach
<tim.ringenbach at gmail.com> wrote:
> On Fri, Jun 13, 2008 at 8:18 PM, Felipe Contreras
> <felipe.contreras at gmail.com> wrote:
>> account.h:
>> typedef struct PurpleAccount PurpleAccount;
>>
>> account_private.h:
>> struct PurpleAccount
>> {
>>        char *username;
>>        char *alias;
>>        char *password;
>>        char *user_info;
>>        ...
>>        PurplePresence *presence;
>>        ...
>> }
>>
>> That means that if you include account.h you can't do
>> account->username, because "account" is an incomplete type, just like
>> a void *. Note also that PurplePresence doesn't need to be defined in
>> account.h, hence you remove a header dependency for all the files that
>> include account.h, and you remove all the headers that presence.h
>> include, and so on.
>
> Couldn't you do the same thing by just not including the extra files,
> and adding struct _PurpleBlah; for each missing type, and changing the
> prototypes to use the struct _PurpleBlah instead of PurpleBlah? (IIRC,
> if you try to do the typedef more than once you get an error, which is
> why I said use the struct version of the name)

I don't understand what you are saying.

> What's the end goal here? Just to speed up compiling and make the
> graph shorter, if technically misleading? (By misleading I mean the
> account module really does use the presence module even though it
> wouldn't show on the graph anymore because the header isn't including
> it)

No. The public and the private fields are two completely different things.

Try to use "hash->size" with GHashTable; you can't. Why? Because you
shouldn't need to know what is being used internally, actually ->size
is not what you would want, you need "hash->nnodes", but you don't
need to care, you just use g_hash_table_size.

Similarly, you don't need to know about GHashNode; it's something
*internal*. if they choose to define that in "ghashnode.h" or
"ghash_private.h" shouldn't matter, because you shouldn't use that
directly. You might find surprising that GHashNode is not available in
any header file, ever. That's a clean modularization.

Why burden the user, the compiler, and the documentation generation
tools with things that should be transparent?

What is _misleading_ is that you need to know all the internal details
of Presence; you don't, you just need the public API. Actually, I just
checked and Presence is properly hiding the internal details, but not
Account, nor Proxy which is used by Account.

>> Great! I propose an API version field, then.
> Maybe I'm dumb, or just haven't been following along. But what does an
> API version field do us in a struct?

struct foo
{
int version;
gchar *name; /* version 0 */
}

Oh crap, we need a nickname!

struct foo
{
int version;
gchar *name; /* version 0 */
gchar *nickname; /* version 1 */
}

if (foo->version >= 1)
/* do nickname stuff */

Actually, that would be ABI, so, even better :)

-- 
Felipe Contreras




More information about the Devel mailing list