C++ (17+) için thread-safe generic Event Hub kütüphanesi
Github Repository: https://github.com/leventkaragol/libcpp-event-hub
Amaç
C++ standart kütüphanesi, kullanıma hazır bir Event Handler mekanizması içermez. Bu kütüphane, farklı kod blokları arasında thread-safe şekilde iletişim kurmak üzere tasarlanmıştır.
Event Hub kütüphanesi ile diğer dillerde alışkın olduğunuz gibi, olaylara yeni dinleyiciler ekleyebilir, tek bir olayı veya tüm olayları tek bir yerden dinleyebilir ve bunları gerekli veri türüyle yayınlayabilirsiniz.
Projeye Nasıl Eklenir?
Bu header-only bir kütüphanedir. Yani aslında tek yapmanız gereken src klasöründeki libcpp-event-hub.hpp dosyasını projenize eklemek ve #include ile kullanmaya başlamaktır.
Kullanım örneklerini Github Repository'deki "examples" klasöründe bulabilirsiniz. Aşağıda örnek bir CMakeLists.txt dosyası içeriği de bulabilirsiniz.
cmake_minimum_required(VERSION 3.14)
project(myProject)
add_executable(myProject main.cpp libcpp-event-hub.hpp)
Nasıl Kullanılır?
Aşağıda Event Handler ekleme ve farklı türdeki olayları işlemek için olay yayımlama konusunda basit bir örnek bulabilirsiniz.
#include "libcpp-event-hub.hpp"
#include <string>
#include <iostream>
using namespace lklibs;
int main()
{
// EventHub için singleton instance alıyoruz
auto& eventHub = EventHub::getInstance();
// testEvent1 için string tipinde parametre alan bir listener ekliyoruz
auto listener1Id = eventHub.addListener<std::string>("testEvent1", [](const std::string& eventName, const std::string& sender, const std::string& data)
{
std::cout << "1. listener received, Event name: " << eventName << ", sender: " << sender << ", data: " << data << std::endl;
});
// testEvent2 için int tipinde parametre alan bir listener ekliyoruz
auto listener2Id = eventHub.addListener<int>("testEvent2", [](const std::string& eventName, const std::string& sender, const int& data)
{
std::cout << "2 listener received, Event name: " << eventName << ", sender: " << sender << ", data: " << data << std::endl;
});
// Tüm olaylar için string tipinde parametre alan bir listener ekliyoruz
auto listener3Id = eventHub.addListener<std::string>("*", [](const std::string& eventName, const std::string& sender, const std::string& data)
{
std::cout << "General listener received: " << eventName << ", sender: " << sender << ", data: " << data << std::endl;
});
// testEvent1 olayını yayınlıyoruz. Bu olayı iki listener yakalacak (listener1 ve listener3)
eventHub.emit("testEvent1", "main", std::string("Value 1"));
// testEvent2 olayını yayınlıyoruz. Bu olayı sadece listener2 yakalayacak çünkü int tipinde parametre bekleyen genel bir listener yok
eventHub.emit("testEvent2", "main", 7);
// testEvent1'ı bekleyen listener'ı siliyoruz
eventHub.removeListener("testEvent1", listener1Id);
// testEvent1 olayını tekrar yayınlıyoruz, bu sefer sadece listener3 yakalayacak
eventHub.emit("testEvent1", "main", std::string("Value 2"));
return 0;
}
Semantik Versiyonlama
Kütüphanenin sürümlemesi, geleneksel semantik versiyonlama kullanılarak yapılır. Buna göre, MAJOR.MINOR.PATCH biçiminde yapılan sürümlemede;
PATCH: Olası hata düzeltmeleri ve iyileştirmeleri içerir. Bunu mutlaka edinmek istersiniz.
MINOR: Geriye dönük uyumluluk sayesinde eklenen ek işlevler. Muhtemelen bunu edinmek istersiniz, zararı olmaz.
MAJOR: Geriye dönük uyumluluğu bozan ek işlevler. Nelerin değiştiğini anlamanız ve muhtemelen kendi kodunuzda değişiklik yapmanız gerekecek. Böyle bir şey yayınlarsam, geçiş için gereken değişiklikleri kesinlikle dokümana eklerim.
Lisans
Proje MIT lisansı ile lisanslanmıştır. Ticari kullanıma uygundur. Tam metni aşağıda bulabilirsiniz.
MIT License
Copyright (c) 2024 Levent KARAGÖL
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies
or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
İletişim
Kütüphaneyle ilgili sorun yaşıyorsanız, lütfen GitHub'da bir konu açın. Lütfen isteğinizi, sorununuzu veya sorunuzu olabildiğince ayrıntılı bir şekilde açıklayın ve derleyicinizin, işletim sisteminizin ve kullandığınız kütüphanenin sürümünü de belirtin. Yeni bir konu açmadan önce, lütfen konunun daha önce kapatılmış konularda bulunmadığından emin olun.
Yazar: Levent KARAGÖL