Add into_rc_any and push_value to Object
This commit introduces the `into_rc_any` and `push_value` methods to the `Object` trait. The `into_rc_any` method allows for efficient, zero-cost downcasting of `Rc<Self>` to `Rc<dyn Any>`. This is a crucial step for enabling more flexible dynamic dispatch and type manipulation within the VM. The `push_value` method is implemented for series types (`ScalarSeries`, `ValueSeries`, `RecordSeries`) to allow pushing values directly onto them. This simplifies the `push` intrinsic function, removing the need for manual downcasting within its implementation. The default implementation for non-series objects panics, enforcing that only mutable series support this operation. Additionally, `ScalarValue` now includes a `from_value` method to facilitate converting `Value` back into concrete scalar types. This improves type safety and reduces boilerplate code when handling scalar conversions.
This commit is contained in:
@@ -180,6 +180,16 @@ pub trait Object: fmt::Debug {
|
||||
fn type_name(&self) -> &'static str;
|
||||
fn as_any(&self) -> &dyn Any;
|
||||
|
||||
/// Converts `Rc<Self>` into `Rc<dyn Any>`, enabling zero-copy downcasting to a concrete
|
||||
/// `Rc<T>` via `Rc::downcast::<T>()`. Requires `arbitrary_self_types` (stable since 1.81).
|
||||
fn into_rc_any(self: Rc<Self>) -> Rc<dyn Any>;
|
||||
|
||||
/// Pushes a value into this object if it is a mutable series.
|
||||
/// The default implementation panics — only series types override this.
|
||||
fn push_value(&self, _val: Value) {
|
||||
panic!("{} does not support push_value", self.type_name());
|
||||
}
|
||||
|
||||
/// Optional optimization: If this object behaves like a time series (indexable lookbacks),
|
||||
/// it can return a reference to its Series trait implementation.
|
||||
fn as_series(&self) -> Option<&dyn Series> {
|
||||
|
||||
Reference in New Issue
Block a user