src/newgrf_storage.h
author peter1138
Tue, 22 Jan 2008 07:27:06 +0000
changeset 8374 7a1b6c89cb89
parent 8130 d2eb7d04f6e1
permissions -rw-r--r--
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
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 */