Архив за год: 2024

Лаконичный макрос defer для C++

Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное дельце. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.

Макрос defer, вдохновленный Go, как никогда кстати! Использовать его просто:

void* p = malloc(0x1000);
defer [&] { free(p); };

Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение (если разрешено), или даже выполнен goto наружу.

Реализация макроса лаконична и полагается на базовые возможности C++17 (Clang 5+, GCC 7+, MSVC 2017+):

#ifndef defer

template <typename T>
struct Deferrer
{
	T f;
	Deferrer(T f) : f(f) { };
	Deferrer(const Deferrer&) = delete;
	~Deferrer() { f(); }
};

#define TOKEN_CONCAT_NX(a, b) a ## b
#define TOKEN_CONCAT(a, b) TOKEN_CONCAT_NX(a, b)
#define defer Deferrer TOKEN_CONCAT(__deferred, __COUNTER__) =

#endif

Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.

Читать далее

Unchained Nostalgia v1.5

Демка на основе легендарного многоигрового картриджа 9999-in-1 для Dendy с чайками и Unchained Melody в меню.

В 2023 году я готовил юбилейное обновление Unchained Nostalgia: 10 лет демке, 30 лет первым многоигровкам с Unchained Melody и самой Dendy, а также 40 лет оригинальному Famicom. Но на что-то под конец года отвлёкся, поэтому оно так и осталось без релиза. Выпускаю сейчас задним числом в том состоянии, в котором проект был в ноябре 2023.

  • Эффект падающих звёзд на ночных слайдах. Можно загадывать желания =)
  • При включении режима автоматической демонстрации, сразу же отображается самый подходящий слайд.
  • Режим автоматической демонстрации включается автоматически после долгого простоя на подходящем слайде.
  • Более точная синхронизация автопролистывания слайдов с ударниками в мелодии (из-за ошибки, был сдвиг на 6 кадров).
  • Более отзывчивая реакция на быстрое переключение слайдов.
  • Используется стандартный вертикальный мирроринг NROM (вместо нестандартного 4-screen) для лучшей совместимости.
  • Облегчённая версия звукового движка в NSF.
  • Размер NSF-файла: 1632 байт.

Скачать: unchained_nostalgia.zip (20КБ). Страница проекта →