Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
singleton.cpp
Go to the documentation of this file.
1// singleton.cpp — SingletonFinalizer の実装(破棄の順番の管理)。使い方と元の実装からの変更点は singleton.h。
2#include "core/singleton.h"
3
4#include <algorithm>
5#include <ranges>
6
7#include "core/aliases.h"
8
9namespace bicameral {
10
11 namespace {
12 // 登録できるシングルトンの数の上限。これを超えるならグローバルな状態を使いすぎている
13 constexpr std::size_t MAX_FINALIZERS = 256;
14 } // namespace
15
17 std::vector<SingletonFinalizer::Entry> SingletonFinalizer::s_finalizers;
18
19 // Singleton からだけ呼ばれる(friend)。外からは使わない
20 void SingletonFinalizer::AddFinalizer(std::type_index type, FinalizerFunc finalize) {
21 std::scoped_lock lock(s_mutex);
22 assert(s_finalizers.size() < MAX_FINALIZERS);
23 s_finalizers.push_back({.type = type, .finalize = finalize});
24 }
25
27 // 一覧を取り出してから、鍵を持たずに破棄する。
28 // デストラクタが別のシングルトンを使っても(AddFinalizer が鍵を取っても)止まらないように
29 std::vector<Entry> entries;
30 {
31 std::scoped_lock lock(s_mutex);
32 entries.swap(s_finalizers);
33 }
34
35 for (const Entry& entry : entries | views::reverse)
36 entry.finalize();
37 }
38
39 void SingletonFinalizer::FinalizeType(std::type_index type) {
40 FinalizerFunc finalize = nullptr;
41 {
42 std::scoped_lock lock(s_mutex);
43 auto found = rng::find(s_finalizers, type, &Entry::type);
44 if (found == s_finalizers.end())
45 return;
46
47 finalize = found->finalize;
48 s_finalizers.erase(found);
49 }
50
51 finalize();
52 }
53
54} // namespace bicameral
static std::mutex s_mutex
Definition singleton.h:46
static std::vector< Entry > s_finalizers
Definition singleton.h:47
static void FinalizeType(std::type_index type)
Definition singleton.cpp:39
static void AddFinalizer(std::type_index type, FinalizerFunc finalize)
Definition singleton.cpp:20