On 2009-08-05 23:04, Hezekiah M. Carty wrote:
> On Wed, Aug 5, 2009 at 4:22 PM, Hazen Babcock<[email protected]> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel