---
name: time_series_buffer
kind: function
lang: cpp
domain: core
version: "1.0.0"
purity: pure
signature: "TimeSeriesBuffer(size_t capacity)"
description: "Ring buffer circular para datos de series temporales, optimizado para streaming de metricas en dashboards en tiempo real"
tags: [buffer, timeseries, streaming, dashboard, data]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/time_series_buffer.cpp"
framework: imgui
params:
  - name: capacity
    desc: "Numero maximo de muestras que almacena el buffer"
output: "Buffer circular listo para push de datos y lectura ordenada"
---

# time_series_buffer

Ring buffer circular de floats para series temporales en tiempo real. Diseñado para alimentar plots de ImPlot con metricas de streaming (FPS, latencia, uso de CPU, etc.).

## Uso basico

```cpp
TimeSeriesBuffer fps_history(512);

// En el loop principal:
fps_history.push(ImGui::GetIO().Framerate);

// Para renderizar con ImPlot:
float ordered[512];
size_t n = fps_history.copy_ordered(ordered, 512);
ImPlot::PlotLines("FPS", ordered, (int)n);
```

## Semantica del ring buffer

- `push(v)` escribe en `data[offset % capacity]` y avanza el write head.
- `count` crece hasta `capacity` y se mantiene ahi — el buffer nunca desborda.
- `get(0)` retorna el elemento mas antiguo; `get(count-1)` el mas reciente.
- `latest()` es equivalente a `get(count-1)` pero mas explicito.
- `copy_ordered` extrae los datos en orden cronologico para pasarlos a ImPlot u otro consumidor que espere un array contiguo.

## Notas

- No depende de ImGui ni ImPlot directamente — es una estructura de datos pura.
- No es thread-safe. Para uso multihilo, proteger con mutex externo.
- Move semantics implementadas; copy queda eliminada (`= delete`) para evitar copias accidentales del heap.
- `min`, `max` y `average` iteran sobre `count` elementos — O(n). Para buffers grandes en hot paths, considerar mantener un acumulador incremental.
