/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Hooks.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "Hooks.hpp" namespace Aurora::Console::Hooks { static auto gMutex = Threading::Primitives::MutexUnique(); static AuList gLineCallbacks; void AddHook(LineHook_cb hook) { Aurora::Threading::WaitableLockGuard guard(gMutex.get()); gLineCallbacks.push_back(hook); } void WriteLine(const ConsoleMessage &msg) { gMutex->Lock(); auto callbacks = gLineCallbacks; gMutex->Unlock(); if (msg.line.find('\n') == std::string::npos) [[likely]] { for (const auto &callback : callbacks) { callback(msg); } } else [[unlikely]] { Aurora::Parse::SplitNewlines(msg.line, [&](const AuString &line) { ConsoleMessage dup = msg; dup.line = line; for (const auto &callback : callbacks) { callback(dup); } }); } } }