src/newgrf_storage.h
author translators
Thu, 18 Dec 2008 18:47:39 +0000
changeset 10437 6d64230b9fb9
parent 8130 d2eb7d04f6e1
permissions -rw-r--r--
(svn r14691) -Update: WebTranslator2 update to 2008-12-18 18:47:25
arabic_egypt - 132 fixed, 1 changed by khaloofah (133)
czech - 10 fixed, 25 changed by Hadez (35)
esperanto - 15 fixed by Athaba (15)
greek - 7 fixed by ouranogrammi (7)
indonesian - 88 changed by fanioz (88)
latvian - 117 fixed, 16 changed by peerer (83), marismols (50)
lithuanian - 15 fixed by Zogg (15)
malay - 38 fixed by tombakemas (5), Syed (33)
serbian - 39 fixed, 1 changed by Jenraux (40)
thai - 105 fixed by vetbook (105)
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     1
/* $Id$ */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     2
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     3
/** @file newgrf_storage.h Functionality related to the temporary and persistent storage arrays for NewGRFs. */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     4
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     5
#ifndef NEWGRF_STORAGE_H
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     6
#define NEWGRF_STORAGE_H
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     7
8130
d2eb7d04f6e1 (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 7610
diff changeset
     8
#include "core/alloc_func.hpp"
d2eb7d04f6e1 (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 7610
diff changeset
     9
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    10
/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    11
 * Base class for all NewGRF storage arrays. Nothing fancy, only here
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    12
 * so we have a generalised class to use.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    13
 */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    14
struct BaseStorageArray
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    15
{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    16
	/** The needed destructor */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    17
	virtual ~BaseStorageArray() {}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    18
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    19
	/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    20
	 * Clear the changes made since the last ClearChanges.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    21
	 * This can be done in two ways:
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    22
	 *  - saving the changes permanently
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    23
	 *  - reverting to the previous version
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    24
	 * @param keep_changes do we save or revert the changes since the last ClearChanges?
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    25
	 */
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    26
	virtual void ClearChanges(bool keep_changes) = 0;
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    27
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    28
	/**
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    29
	 * Stores some value at a given position.
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    30
	 * @param pos   the position to write at
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    31
	 * @param value the value to write
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    32
	 */
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    33
	virtual void Store(uint pos, uint32 value) = 0;
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    34
};
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    35
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    36
/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    37
 * Class for persistent storage of data.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    38
 * On ClearChanges that data is either reverted or saved.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    39
 * @param TYPE the type of variable to store.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    40
 * @param SIZE the size of the array.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    41
 */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    42
template <typename TYPE, uint SIZE>
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    43
struct PersistentStorageArray : BaseStorageArray {
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    44
	TYPE storage[SIZE]; ///< Memory to for the storage array
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    45
	TYPE *prev_storage; ///< Memory to store "old" states so we can revert them on the performance of test cases for commands etc.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    46
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    47
	/** Simply construct the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    48
	PersistentStorageArray() : prev_storage(NULL)
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    49
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    50
		memset(this->storage, 0, sizeof(this->storage));
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    51
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    52
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    53
	/** And free all data related to it */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    54
	~PersistentStorageArray()
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    55
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    56
		free(this->prev_storage);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    57
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    58
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    59
	/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    60
	 * Stores some value at a given position.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    61
	 * If there is no backup of the data that backup is made and then
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    62
	 * we write the data.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    63
	 * @param pos   the position to write at
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    64
	 * @param value the value to write
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    65
	 */
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    66
	void Store(uint pos, uint32 value)
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    67
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    68
		/* Out of the scope of the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    69
		if (pos >= SIZE) return;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    70
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    71
		/* The value hasn't changed, so we pretend nothing happened.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    72
		 * Saves a few cycles and such and it's pretty easy to check. */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    73
		if (this->storage[pos] == value) return;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    74
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    75
		/* We do not have made a backup; lets do so */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    76
		if (this->prev_storage != NULL) {
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    77
			this->prev_storage = MallocT<TYPE>(SIZE);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    78
			if (this->prev_storage == NULL) return;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    79
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    80
			memcpy(this->prev_storage, this->storage, sizeof(this->storage));
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    81
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    82
			/* We only need to register ourselves when we made the backup
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    83
			 * as that is the only time something will have changed */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    84
			AddChangedStorage(this);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    85
		}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    86
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    87
		this->storage[pos] = value;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    88
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    89
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    90
	/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    91
	 * Gets the value from a given position.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    92
	 * @param pos the position to get the data from
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    93
	 * @return the data from that position
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    94
	 */
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
    95
	TYPE Get(uint pos) const
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    96
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    97
		/* Out of the scope of the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    98
		if (pos >= SIZE) return 0;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    99
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   100
		return this->storage[pos];
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   101
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   102
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   103
	void ClearChanges(bool keep_changes)
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   104
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   105
		assert(this->prev_storage != NULL);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   106
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   107
		if (!keep_changes) {
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   108
			memcpy(this->storage, this->prev_storage, sizeof(this->storage));
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   109
		}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   110
		free(this->prev_storage);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   111
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   112
};
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   113
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   114
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   115
/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   116
 * Class for temporary storage of data.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   117
 * On ClearChanges that data is always zero-ed.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   118
 * @param TYPE the type of variable to store.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   119
 * @param SIZE the size of the array.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   120
 */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   121
template <typename TYPE, uint SIZE>
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   122
struct TemporaryStorageArray : BaseStorageArray {
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   123
	TYPE storage[SIZE]; ///< Memory to for the storage array
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   124
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   125
	/** Simply construct the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   126
	TemporaryStorageArray()
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   127
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   128
		memset(this->storage, 0, sizeof(this->storage));
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   129
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   130
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   131
	/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   132
	 * Stores some value at a given position.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   133
	 * @param pos   the position to write at
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   134
	 * @param value the value to write
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   135
	 */
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   136
	void Store(uint pos, uint32 value)
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   137
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   138
		/* Out of the scope of the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   139
		if (pos >= SIZE) return;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   140
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   141
		this->storage[pos] = value;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   142
		AddChangedStorage(this);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   143
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   144
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   145
	/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   146
	 * Gets the value from a given position.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   147
	 * @param pos the position to get the data from
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   148
	 * @return the data from that position
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   149
	 */
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   150
	TYPE Get(uint pos) const
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   151
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   152
		/* Out of the scope of the array */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   153
		if (pos >= SIZE) return 0;
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   154
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   155
		return this->storage[pos];
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   156
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   157
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   158
	void ClearChanges(bool keep_changes)
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   159
	{
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   160
		memset(this->storage, 0, sizeof(this->storage));
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   161
	}
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   162
};
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   163
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   164
/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   165
 * Add the changed storage array to the list of changed arrays.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   166
 * This is done so we only have to revert/save the changed
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   167
 * arrays, which saves quite a few clears, etc. after callbacks.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   168
 * @param storage the array that has changed
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   169
 */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   170
void AddChangedStorage(BaseStorageArray *storage);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   171
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   172
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   173
/**
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   174
 * Clear the changes made since the last ClearStorageChanges.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   175
 * This is done for *all* storages that have been registered to with
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   176
 * AddChangedStorage since the previous ClearStorageChanges.
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   177
 *
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   178
 * This can be done in two ways:
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   179
 *  - saving the changes permanently
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   180
 *  - reverting to the previous version
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   181
 * @param keep_changes do we save or revert the changes since the last ClearChanges?
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   182
 */
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   183
void ClearStorageChanges(bool keep_changes);
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   184
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   185
#endif /* NEWGRF_STORAGE_H */