src/newgrf_storage.h
author rubidium
Thu, 19 Jun 2008 11:45:52 +0000
changeset 11023 583f32658248
parent 8626 440dfcd14c4a
permissions -rw-r--r--
(svn r13579) -Fix [FS#2088]: process the order coming after a conditional order, otherwise the vehicle would already leaving the station before it knows where the next destination is, making it leave in the wrong way. However, after processing as many conditional orders as there are in the order list it will stop processing them in order to not create an infinite loop.
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 */