#include "fiko/orkestra/akis.hpp" namespace fiko::orkestra { bool AkisCozucu::besle(const char* veri, size_t n, std::vector& out) { if (bozuk_) return false; tampon_.append(veri, n); // Ofset tabanlı tüketim: çerçeve başına erase(0,…) O(N²) memmove'du (tek pakette // K çerçeve → K kaydırma). Yerel ofsetle ilerle, döngü sonunda TEK erase → O(N). size_t ofset = 0; const size_t boy = tampon_.size(); while (boy - ofset >= BASLIK) { const char* p = tampon_.data() + ofset; if (surecproto::okuU32(p) != surecproto::SIHIR) { bozuk_ = true; // hizasız/yabancı akış — resync DENENMEZ (güvenlik) return false; } const uint32_t govdeUzunluk = surecproto::okuU32(p + 24); if (govdeUzunluk > maksGovde_) { bozuk_ = true; // tavan aşımı — bellek şişirme saldırısı/bozulma return false; } const size_t toplam = BASLIK + govdeUzunluk; if (boy - ofset < toplam) break; // gövde henüz tamam değil — bekle SurecCerceve c; if (!surecproto::cerceveDeserialize(p, toplam, c)) { bozuk_ = true; return false; } out.push_back(std::move(c)); ofset += toplam; } if (ofset) tampon_.erase(0, ofset); // tüketilen tüm çerçeveler tek kaydırmada return true; } } // namespace fiko::orkestra