OpenTTD Source 20260721-master-g25ec12c62d
newgrf_storage.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
11#include "newgrf_storage.h"
12#include "core/pool_func.hpp"
13#include "string_func.h"
14#include "debug.h"
15
16#include "safeguards.h"
17
18PersistentStoragePool _persistent_storage_pool("PersistentStorage");
20
21
23
24bool BasePersistentStorageArray::gameloop;
25bool BasePersistentStorageArray::command;
26bool BasePersistentStorageArray::testmode;
27
33
44
52/* static */ void BasePersistentStorageArray::SwitchMode(PersistentStorageMode mode, [[maybe_unused]] bool ignore_prev_mode)
53{
54 switch (mode) {
56 assert(ignore_prev_mode || !gameloop);
57 assert(!command && !testmode);
58 gameloop = true;
59 break;
60
62 assert(ignore_prev_mode || gameloop);
63 assert(!command && !testmode);
64 gameloop = false;
65 break;
66
68 assert((ignore_prev_mode || !command) && !testmode);
69 command = true;
70 break;
71
73 assert(ignore_prev_mode || command);
74 command = false;
75 break;
76
78 assert(!command && (ignore_prev_mode || !testmode));
79 testmode = true;
80 break;
81
83 assert(ignore_prev_mode || testmode);
84 testmode = false;
85 break;
86
87 default: NOT_REACHED();
88 }
89
90 /* Discard all temporary changes */
91 for (auto &it : *_changed_storage_arrays) {
92 Debug(desync, 2, "warning: discarding persistent storage changes: Feature {}, GrfID {}, Tile {}", it->feature, FormatArrayAsHex(it->grfid), it->tile);
93 it->ClearChanges();
94 }
96}
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
void AddChangedPersistentStorage(BasePersistentStorageArray *storage)
Add the changed storage array to the list of changed arrays.
static std::set< BasePersistentStorageArray * > * _changed_storage_arrays
The changed storage arrays.
Functionality related to the temporary and persistent storage arrays for NewGRFs.
PersistentStorageMode
Mode switches to the behaviour of persistent storage array.
@ PSM_ENTER_GAMELOOP
Enter the gameloop, changes will be permanent.
@ PSM_LEAVE_TESTMODE
Leave command test mode, revert to previous mode.
@ PSM_LEAVE_COMMAND
Leave command scope, revert to previous mode.
@ PSM_LEAVE_GAMELOOP
Leave the gameloop, changes will be temporary.
@ PSM_ENTER_COMMAND
Enter command scope, changes will be permanent.
@ PSM_ENTER_TESTMODE
Enter command test mode, changes will be temporary.
Some methods of Pool are placed here in order to reduce compilation time and binary size.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
A number of safeguards to prevent using unsafe methods.
Definition of base types and functions in a cross-platform compatible way.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
Definition string.cpp:77
Functions related to low-level strings.
Base class for all persistent NewGRF storage arrays.
static void SwitchMode(PersistentStorageMode mode, bool ignore_prev_mode=false)
Clear temporary changes made since the last call to SwitchMode, and set whether subsequent changes sh...
Class for pooled persistent storage of data.