On 2009-08-05 23:04, Hezekiah M. Carty wrote:
> On Wed, Aug 5, 2009 at 4:22 PM, Hazen Babcock<hbabc...@mac.com> wrote:

>> I like this idea/approach. Is there a reason not to reduce it even further?
>>
>> plget(const char *, void *)
>> plset(const char *, void *)
>>
>> It seems that either way the user would have to call the function as
>> intended to avoid memory corruption.
>>
>> Any objections to my implementing this & attempting to make it fairly
>> comprehensively cover most of what can gotten and set in PLplot core?
>> Likely the bulk of the work would be done post 5.10.
> 
> While I like the API simplification this could provide, I have two
> primary concerns:
> 
> First, could the first argument - the field to get/set - be an
> enumerated type of some sort?  This should help catch typos at compile
> time rather than run time. (PL_LINE_WIDTH rather than "line width").
> Additional fields would then require adding elements to the
> enumeration which, as I understand, should not break existing code.
> 
> Second, the void* approach may not translate well to other languages.
> I'm not sure if there is a way to do this in C that would translate
> well to the other PLplot-supported languages though.
> 

I agree that a void * argument would be very bad for most languages,
if not all, and it leaves the interpretation of the value up to the
programmer. What about filling a structure instead?

Something like:

type struct _plAttribute {
     PLINT attributeType;  /* enumerated: integer, float, boolean, ... */
     PLINT intValue;       /* value reserved for attributes that can be
                              represented as integers - at least in C */
     PLFLT floatValue;     /* ditto: floating point attributes */
     char *stringValue;    /* ditto: character string attributes */
} plAttribute;

void plget( char *attribute, plAttribute *attValue );
void plset( char *attribute, plAttribute *attValue );

The various language bindings could then easily distinguish the
proper type of the attribute (overloading the functions) or
fill a similar structure and pass that.

In C you could use the idiom:

plget( "myattribute", &attValue );
if ( attValue.attributeType == PL_ATT_INT ) {
     attValue.intValue = newValue;
     plset( "myattribute, &attValue );
}

so that you can be certain only a value of the proper type is passed.

An alternative is:

void plget( char *attribute, int *type, PLINT *intValue,
      PLFLT *floatValue, char **stringValue );
void plset( char *attribute, int type, PLINT intValue,
      PLFLT floatValue, char *stringValue );

with a similar associated idiom.

Regards,

Arjen

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to