---
name: graph_types
kind: function
lang: cpp
domain: viz
version: "1.0.0"
purity: pure
signature: "void GraphData::update_bounds(); int GraphData::find_node_by_user_data(uint64_t user_data) const"
description: "Implementacion de los metodos miembro de GraphData declarados en graph_types.h: update_bounds recalcula el bounding box (min_x/min_y/max_x/max_y) en O(N) recorriendo todos los nodos; find_node_by_user_data busca linealmente el primer nodo cuyo user_data coincide y devuelve su indice (o -1)."
tags: [graph, types, bounds, lookup, pure]
uses_functions: []
uses_types: ["GraphData_cpp_viz", "GraphNode_cpp_viz"]
returns: []
returns_optional: false
error_type: ""
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/viz/graph_types.cpp"
framework: imgui
params:
  - name: user_data
    desc: "(find_node_by_user_data) Identificador opaco del nodo. La app suele usarlo como FK al backend (ej: rowid de operations.db). Devuelve -1 si no encuentra coincidencia."
output: "update_bounds: void (mutates min_x, min_y, max_x, max_y in place; con node_count==0 los pone todos a 0). find_node_by_user_data: indice del primer nodo coincidente, o -1."
notes: "TU de implementacion del tipo GraphData (declarado en cpp/functions/viz/graph_types.h, indexado como tipo en types/viz/graph_types.md). Toda app que use GraphData debe enlazar este .cpp ademas de los .cpp de las funciones que opera sobre el grafo. find_node_by_user_data es O(N): para hot paths (lookup repetido por user_data) la app deberia mantener su propio std::unordered_map<uint64_t,int> en paralelo."
---

# graph_types (impl)

Implementaciones de los metodos miembro de `GraphData` declarados en
`graph_types.h`. Pareja obligatoria del tipo — toda app que linkee con
funciones que aceptan `GraphData&` debe incluir este `.cpp` en su build.

## Por que existe como entrada del registry

El header `graph_types.h` se indexa como tipo (`GraphData_cpp_viz`,
`GraphNode_cpp_viz`, etc. en `types/viz/`). Pero las definiciones de los
metodos miembro viven en `.cpp` aparte para evitar inlinear la implementacion
en cada TU que incluye el header. Sin un `.md` que lo registre, una app nueva
que consultara el registry recibiria solo `graph_types.h` y al compilar fallaria
con "undefined reference to `GraphData::update_bounds()`".

## API

```cpp
struct GraphData {
    void update_bounds();                              // O(N) sobre todos los nodos
    int  find_node_by_user_data(uint64_t ud) const;    // O(N), -1 si no esta
    // ... resto de campos en graph_types.h
};
```

## Composabilidad

Toda funcion que muta nodos y necesita bounds frescas (force layouts, viewport
con auto-fit) llama `update_bounds()` despues. Toda app que mapea filas de DB
a nodos usa `find_node_by_user_data` para resolver IDs.
