From 728c5dad66a0a82271b26e936b147ae8b920e3d8 Mon Sep 17 00:00:00 2001 From: "exercism-solutions-syncer[bot]" <211797793+exercism-solutions-syncer[bot]@users.noreply.github.com> Date: Sun, 21 Jun 2026 21:42:10 +0000 Subject: [PATCH] [Sync Iteration] cpp/circular-buffer/1 --- .../cpp/circular-buffer/1/circular_buffer.cpp | 7 ++ .../cpp/circular-buffer/1/circular_buffer.h | 68 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 solutions/cpp/circular-buffer/1/circular_buffer.cpp create mode 100644 solutions/cpp/circular-buffer/1/circular_buffer.h diff --git a/solutions/cpp/circular-buffer/1/circular_buffer.cpp b/solutions/cpp/circular-buffer/1/circular_buffer.cpp new file mode 100644 index 0000000..b33112f --- /dev/null +++ b/solutions/cpp/circular-buffer/1/circular_buffer.cpp @@ -0,0 +1,7 @@ +#include "circular_buffer.h" + +namespace circular_buffer { + +// No hay cpp // Toda logica esta en el .h + +} diff --git a/solutions/cpp/circular-buffer/1/circular_buffer.h b/solutions/cpp/circular-buffer/1/circular_buffer.h new file mode 100644 index 0000000..4c293e2 --- /dev/null +++ b/solutions/cpp/circular-buffer/1/circular_buffer.h @@ -0,0 +1,68 @@ +#pragma once +#include +#include + +namespace circular_buffer { + +template +class circular_buffer { +private: + std::vector m_buffer; + size_t m_capacity; + size_t m_head; + size_t m_tail; + size_t m_size; + +public: + // Constructor con tamaño fijo predefinido + explicit circular_buffer(size_t capacity) + : m_buffer(capacity), m_capacity(capacity), m_head(0), m_tail(0), m_size(0) {} + + // Lee y extrae el elemento más antiguo (Aduana de lectura) + T read() { + if (m_size == 0) { + throw std::domain_error("Intento de leer un búfer vacío."); + } + + T item = m_buffer[m_head]; + m_head = (m_head + 1) % m_capacity; // Avanza cíclicamente + m_size--; + return item; + } + + // Escribe un elemento nuevo si hay espacio libre + void write(const T& item) { + if (m_size == m_capacity) { + throw std::domain_error("Intento de escribir en un búfer lleno."); + } + + m_buffer[m_tail] = item; + m_tail = (m_tail + 1) % m_capacity; // Avanza cíclicamente + m_size++; + } + + // Sobrescribe el elemento más antiguo si el búfer está lleno + void overwrite(const T& item) { + if (m_size < m_capacity) { + // Si no está lleno, se comporta exactamente como una escritura normal + write(item); + } else { + // Si está lleno, el nuevo dato ocupa la posición de m_tail (que coincide con m_head) + m_buffer[m_tail] = item; + m_tail = (m_tail + 1) % m_capacity; + + // Como destruimos el dato más viejo sin leerlo, obligamos a m_head a avanzar + m_head = (m_head + 1) % m_capacity; + // El tamaño (m_size) se mantiene igual a m_capacity + } + } + + // Limpia o vacía la estructura restableciendo el estado + void clear() { + m_head = 0; + m_tail = 0; + m_size = 0; + } +}; + +}