---
name: auto_detect_type
kind: function
lang: cpp
domain: core
version: "1.0.0"
purity: pure
signature: "ColumnType auto_detect_type(const char* const* cells, int rows, int cols, int col, int sample_n = 64)"
description: "Infiere el ColumnType de una columna escaneando hasta sample_n celdas no-vacias. Detecta Int, Float, Bool, Date (ISO YYYY-MM-DD), Json ({/[) y String."
tags: [tables, stats, inference, type-detection, tql, cpp-tables]

uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["core/auto_detect_type.h"]
tested: true
tests:
  - "auto_detect_type: columna numerica entera"
  - "auto_detect_type: columna de texto libre"
  - "auto_detect_type: columna de fechas ISO"
  - "auto_detect_type: columna booleana"
  - "auto_detect_type: columna float"
  - "auto_detect_type: mezcla numerica y texto retorna String"
  - "auto_detect_type: columna vacia retorna String"
  - "auto_detect_type: sample_n=2 evalua solo las primeras 2 celdas no-vacias"
test_file_path: "cpp/tests/test_auto_detect_type.cpp"
file_path: "cpp/functions/core/auto_detect_type.cpp"
params:
  - name: cells
    desc: "Matriz row-major de punteros a C-strings (rows x cols). Puede contener nullptr para celdas nulas."
  - name: rows
    desc: "Numero de filas de la matriz."
  - name: cols
    desc: "Numero de columnas de la matriz."
  - name: col
    desc: "Indice de la columna a analizar (0-based)."
  - name: sample_n
    desc: "Maximo de celdas no-vacias a escanear. Default 64. Usar valor menor para columnas muy largas."
output: "ColumnType inferido: Int si todos son enteros, Float si hay decimales, Bool si 'true'/'false', Date si YYYY-MM-DD, Json si '{' o '[', String en cualquier otro caso o mezcla."
---

## Ejemplo

```cpp
#include "core/auto_detect_type.h"

// Columna de fechas: ["2024-01-01", "2024-06-15", "2023-12-31"]
const char* dates[] = {"2024-01-01", "2024-06-15", "2023-12-31"};
data_table::ColumnType t = data_table::auto_detect_type(dates, 3, 1, 0);
// t == ColumnType::Date

// Columna de enteros
const char* nums[] = {"1", "42", "100"};
t = data_table::auto_detect_type(nums, 3, 1, 0);
// t == ColumnType::Int
```

## Cuando usarla

Cuando recibas datos tabulares sin tipo declarado y necesites inferirlo antes de aplicar filtros numericos, formateo de celdas o estadisticas. Tipicamente se llama una vez al cargar o refrescar la fuente de datos.

## Gotchas

- Requiere que ALL las celdas no-vacias sean del mismo tipo para retornar ese tipo. Una sola celda texto en una columna de enteros devuelve `ColumnType::String`.
- Bool se evalua antes que Date y Number, por eso "true"/"false" no se confunde con texto.
- La deteccion de Date solo reconoce ISO 8601 (`YYYY-MM-DD`). Formatos locales (DD/MM/YYYY) caen en String.
- `sample_n` no considera el orden aleatorio: evalua las primeras N celdas no-vacias del principio. Si los datos estan ordenados por tipo, ajustar `sample_n`.
