---
name: GraphData
lang: cpp
domain: viz
version: "2.0.0"
algebraic: product
definition: |
  struct GraphData {
      GraphNode*    nodes;       int node_count;     int node_capacity;
      GraphEdge*    edges;       int edge_count;     int edge_capacity;
      EntityType*   types;       int type_count;
      RelationType* rel_types;   int rel_type_count;
      float min_x, min_y, max_x, max_y;
      void update_bounds();
      int  find_node_by_user_data(uint64_t user_data) const;
  };
description: "Contenedor del grafo: nodos, aristas y tablas de tipos (EntityType / RelationType) que definen apariencia per-tipo, ademas de bounding box y busqueda por user_data. v2.0 incorpora capacities, tablas de tipos y find_node_by_user_data tras issue 0049e."
tags: [graph, container, viewport, gpu, types-table, entity-type, relation-type]
uses_types: ["GraphNode_cpp_viz", "GraphEdge_cpp_viz", "EntityType_cpp_viz", "RelationType_cpp_viz"]
file_path: "cpp/functions/viz/graph_types.h"
---

## Estructura

| Campo | Descripcion |
|---|---|
| `nodes` / `node_count` / `node_capacity` | Array de nodos. `node_capacity >= node_count` y la app gestiona la memoria |
| `edges` / `edge_count` / `edge_capacity` | Array de aristas |
| `types` / `type_count` | Tabla de `EntityType`. Indexada por `GraphNode::type_id` |
| `rel_types` / `rel_type_count` | Tabla de `RelationType`. Indexada por `GraphEdge::type_id` |
| `min_x, min_y, max_x, max_y` | AABB de las posiciones de nodos. Se recalcula con `update_bounds()` |
| `update_bounds()` | O(n) — usar tras cada step del layout |
| `find_node_by_user_data(uid)` | Busqueda lineal O(n). -1 si no existe. Para indices ad-hoc el caller puede mantener un `unordered_map` propio |

## Notas de version

- **v2.0** (2026-04-29, issue 0049e): Modelo extendido. `GraphData` gana
  `node_capacity`, `edge_capacity`, las tablas `types[]` / `rel_types[]` y
  el helper `find_node_by_user_data` (sustituye a `find_node(id)` — ahora
  los nodos no tienen `id` propio, el mapeo a la entidad real va en
  `user_data`). Apparencia per-nodo se resuelve combinando overrides con la
  tabla de tipos: ver `resolve_node_*` / `resolve_edge_*` en el .h.

- **v1.0**: modelo inicial con id, color directo, community.
