src/newgrf_storage.h
author convert-repo
Mon, 07 Apr 2008 16:21:55 +0000
changeset 10076 dfd70e42c4ae
parent 8626 440dfcd14c4a
permissions -rw-r--r--
update tags
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     1
/* $Id$ */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     2
8f7fcf4d2b7e (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. */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     4
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     5
#ifndef NEWGRF_STORAGE_H
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     6
#define NEWGRF_STORAGE_H
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     7
8626
440dfcd14c4a (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 8106
diff changeset
     8
#include "core/alloc_func.hpp"
440dfcd14c4a (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 8106
diff changeset
     9
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    10
/**
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    12
 * so we have a generalised class to use.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    13
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    14
struct BaseStorageArray
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    15
{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    16
	/** The needed destructor */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    17
	virtual ~BaseStorageArray() {}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    18
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    19
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    20
	 * Clear the changes made since the last ClearChanges.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    21
	 * This can be done in two ways:
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    22
	 *  - saving the changes permanently
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    23
	 *  - reverting to the previous version
8f7fcf4d2b7e (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?
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    25
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    26
	virtual void ClearChanges(bool keep_changes) = 0;
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    27
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    28
	/**
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    29
	 * Stores some value at a given position.
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    30
	 * @param pos   the position to write at
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    31
	 * @param value the value to write
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    32
	 */
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    33
	virtual void Store(uint pos, uint32 value) = 0;
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    34
};
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    35
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    36
/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    37
 * Class for persistent storage of data.
8f7fcf4d2b7e (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.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    39
 * @param TYPE the type of variable to store.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    40
 * @param SIZE the size of the array.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    41
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    42
template <typename TYPE, uint SIZE>
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    43
struct PersistentStorageArray : BaseStorageArray {
8f7fcf4d2b7e (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
8f7fcf4d2b7e (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.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    46
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    47
	/** Simply construct the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    48
	PersistentStorageArray() : prev_storage(NULL)
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    49
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    50
		memset(this->storage, 0, sizeof(this->storage));
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    51
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    52
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    53
	/** And free all data related to it */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    54
	~PersistentStorageArray()
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    55
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    56
		free(this->prev_storage);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    57
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    58
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    59
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    60
	 * Stores some value at a given position.
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    62
	 * we write the data.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    63
	 * @param pos   the position to write at
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    64
	 * @param value the value to write
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    65
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    66
	void Store(uint pos, uint32 value)
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    67
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    68
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    69
		if (pos >= SIZE) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    70
8f7fcf4d2b7e (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.
8f7fcf4d2b7e (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. */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    73
		if (this->storage[pos] == value) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    74
8f7fcf4d2b7e (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 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    76
		if (this->prev_storage != NULL) {
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    77
			this->prev_storage = MallocT<TYPE>(SIZE);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    78
			if (this->prev_storage == NULL) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    79
8f7fcf4d2b7e (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));
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    81
8f7fcf4d2b7e (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
8f7fcf4d2b7e (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 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    84
			AddChangedStorage(this);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    85
		}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    86
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    87
		this->storage[pos] = value;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    88
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    89
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    90
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    91
	 * Gets the value from a given position.
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    93
	 * @return the data from that position
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    94
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    95
	TYPE Get(uint pos) const
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    96
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    97
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    98
		if (pos >= SIZE) return 0;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    99
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   100
		return this->storage[pos];
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   101
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   102
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   103
	void ClearChanges(bool keep_changes)
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   104
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   105
		assert(this->prev_storage != NULL);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   106
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   107
		if (!keep_changes) {
8f7fcf4d2b7e (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));
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   109
		}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   110
		free(this->prev_storage);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   111
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   112
};
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   113
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   114
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   115
/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   116
 * Class for temporary storage of data.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   117
 * On ClearChanges that data is always zero-ed.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   118
 * @param TYPE the type of variable to store.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   119
 * @param SIZE the size of the array.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   120
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   121
template <typename TYPE, uint SIZE>
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   122
struct TemporaryStorageArray : BaseStorageArray {
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   124
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   125
	/** Simply construct the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   126
	TemporaryStorageArray()
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   127
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   128
		memset(this->storage, 0, sizeof(this->storage));
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   129
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   130
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   131
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   132
	 * Stores some value at a given position.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   133
	 * @param pos   the position to write at
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   134
	 * @param value the value to write
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   135
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
   136
	void Store(uint pos, uint32 value)
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   137
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   138
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   139
		if (pos >= SIZE) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   140
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   141
		this->storage[pos] = value;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   142
		AddChangedStorage(this);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   143
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   144
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   145
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   146
	 * Gets the value from a given position.
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   148
	 * @return the data from that position
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   149
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
   150
	TYPE Get(uint pos) const
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   151
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   152
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   153
		if (pos >= SIZE) return 0;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   154
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   155
		return this->storage[pos];
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   156
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   157
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   158
	void ClearChanges(bool keep_changes)
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   159
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   160
		memset(this->storage, 0, sizeof(this->storage));
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   161
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   162
};
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   163
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   164
/**
8f7fcf4d2b7e (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.
8f7fcf4d2b7e (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
8f7fcf4d2b7e (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.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   168
 * @param storage the array that has changed
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   169
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   170
void AddChangedStorage(BaseStorageArray *storage);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   171
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   172
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   173
/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   174
 * Clear the changes made since the last ClearStorageChanges.
8f7fcf4d2b7e (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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   176
 * AddChangedStorage since the previous ClearStorageChanges.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   177
 *
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   178
 * This can be done in two ways:
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   179
 *  - saving the changes permanently
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   180
 *  - reverting to the previous version
8f7fcf4d2b7e (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?
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   182
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   183
void ClearStorageChanges(bool keep_changes);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   184
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   185
#endif /* NEWGRF_STORAGE_H */