diff --git a/crates/fidc-core/src/data.rs b/crates/fidc-core/src/data.rs index 9878022..4fe5fcf 100644 --- a/crates/fidc-core/src/data.rs +++ b/crates/fidc-core/src/data.rs @@ -561,23 +561,29 @@ pub fn decision_free_float_cap_bn(factor: &DailyFactorSnapshot) -> f64 { #[derive(Debug, Clone)] struct SymbolPriceSeries { + base: Arc, + timestamps: Vec>, + last_prices: Vec, + bid1s: Vec, + ask1s: Vec, + minute_volumes: Vec, + bid1_volumes: Vec, + ask1_volumes: Vec, + trading_phases: Vec>, + last_prefix: Vec, +} + +#[derive(Debug)] +struct SymbolDailySeriesBase { symbol: String, dates: Vec, - timestamps: Vec>, day_opens: Vec, opens: Vec, highs: Vec, lows: Vec, closes: Vec, prev_closes: Vec, - last_prices: Vec, - bid1s: Vec, - ask1s: Vec, volumes: Vec, - minute_volumes: Vec, - bid1_volumes: Vec, - ask1_volumes: Vec, - trading_phases: Vec>, paused: Vec, upper_limits: Vec, lower_limits: Vec, @@ -585,12 +591,19 @@ struct SymbolPriceSeries { open_prefix: Vec, close_prefix: Vec, prev_close_prefix: Vec, - last_prefix: Vec, valid_volume_sum_prefix: Vec, valid_volume_count_prefix: Vec, valid_volume_start_by_count: Vec, } +impl std::ops::Deref for SymbolPriceSeries { + type Target = SymbolDailySeriesBase; + + fn deref(&self) -> &Self::Target { + &self.base + } +} + type DenseRowPositionIndex = BTreeMap>; const MISSING_ROW_POSITION: u32 = u32::MAX; @@ -869,34 +882,36 @@ impl SymbolPriceSeries { } Self { - symbol, - dates, + base: Arc::new(SymbolDailySeriesBase { + symbol, + dates, + day_opens, + opens, + highs, + lows, + closes, + prev_closes, + volumes, + paused, + upper_limits, + lower_limits, + price_ticks, + open_prefix, + close_prefix, + prev_close_prefix, + valid_volume_sum_prefix, + valid_volume_count_prefix, + valid_volume_start_by_count, + }), timestamps, - day_opens, - opens, - highs, - lows, - closes, - prev_closes, last_prices, bid1s, ask1s, - volumes, minute_volumes, bid1_volumes, ask1_volumes, trading_phases, - paused, - upper_limits, - lower_limits, - price_ticks, - open_prefix, - close_prefix, - prev_close_prefix, last_prefix, - valid_volume_sum_prefix, - valid_volume_count_prefix, - valid_volume_start_by_count, } } @@ -5085,6 +5100,7 @@ mod tests { .as_ref() .unwrap(), ); + let daily_base_before = Arc::clone(&market_series_before.base); assert_eq!( data.apply_intraday_market_overlays(vec![IntradayMarketSnapshotOverlay { @@ -5120,6 +5136,7 @@ mod tests { &market_series_before, market_series_after )); + assert!(Arc::ptr_eq(&daily_base_before, &market_series_after.base)); assert_eq!( serde_json::to_value(market_series_after.snapshot_at(0)).unwrap(), serde_json::to_value(market).unwrap()