octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Octave_value class hierachy


From: John W. Eaton
Subject: Re: Octave_value class hierachy
Date: Thu, 17 Nov 2005 01:03:00 -0500

On 16-Nov-2005, John W. Eaton wrote:

| We would need to make the following changes:
| 
|   * octave_value::rep becomes a pointer to octave_base_value instead of
|     octave_value
| 
|   * The octave_base_value class is no longer derived from octave_value.
| 
|   * All other value classes must be derived from octave_base_value (I
|     think this is already true, but it would become a requirement).
| 
|   * Functions in the octave_value class would not need to be declared
|     virtual, but the functions in octave_base_value would be virtual.
| 
|   * In addition to changing the type of octave_value::rep, we would
|     also have
| 
|       typedef octave_base_value * (*type_conv_fcn) (const octave_value&);
|       octave_value (octave_base_value *new_rep, int count = 1);
|       octave_base_value *clone (void) const;
|       octave_base_value *empty_clone (void) const;
|       octave_base_value *try_narrowing_conversion (void);
|       octave_base_value *internal_rep (void) const;
| 
|     in the octave_value class instead of
| 
|       typedef octave_value * (*type_conv_fcn) (const octave_value&);
|       octave_value (octave_value *new_rep, int count = 1);
|       virtual octave_value *clone (void) const;
|       virtual octave_value *empty_clone (void) const;
|       virtual octave_value *try_narrowing_conversion (void);
|       octave_value *internal_rep (void) const;
| 
|     and the nil_rep function could be moved to the octave_base_value
|     class.  These changes would affect all derived types, but should
|     only require a change in the declaration, with no change in the
|     way the functions actually work.
| 
|   * There would be no need for the octave_xvalue struct (which is just
|     confusing anyway).
| 
|   * The rep could be assumed to always be non-null.
| 
|   * As Jens suggested, we could move count to the octave_base_value
|     class.

OK, I spent some time making this change (not checked in yet; I may
put it on a separate branch).  It turned up some bugs (for example,
inappropriately casting an octave_value object to a derived type) and
some questionable design (the numeric_conversion_function method, for
one).

Changes needed in derived types are

  * The empty_clone, clone, try_narrowing_conversion functions return
    a pointer to octave_base_value instead of a pointer to octave_value.
    The body of the function will probably not need to change.

  * The type_conv_fcn typedef is now declared inside octave_base_value class,
    so numeric_conversion_function declaration must change.  This may
    change

  * The type_conv_fcn typedef changes from

      octave_value* (*) (const octave_value& a)

    to

      octave_base_value* (*) (const octave_base_value& a)

    (this may change so that the derived classes simply attempt the
    conversion and return 0 if they are unable to do anything).

  * The int argument has been removed from the

      octave_value (octave_value *, int)

    constructor.  You must increment the reference count (if needed) of
    the derived class, then construct the octave_value object.  For
    example, in a derived class method, you can return an octave_value
    object containing a copy of the current object using

      count++;
      return octave_value (this);

    (this may change because it seems complex and likely to cause
    confusion and trouble).

  * The get_rep function now returns a reference to an octave_base_value
    object instead of a reference to an octave_value object.  All uses
    must change.

Perhaps with a little more cleaning up, this will be a good change to
make.  It would also be a good time to fully document the octave_value
and octave_base_value classes and remove any unnecessary functions.

jwe



reply via email to

[Prev in Thread] Current Thread [Next in Thread]