src/newgrf_storage.h
author rubidium
Sat, 22 Sep 2007 13:56:38 +0000
changeset 8106 9f527cc360cf
parent 8105 8f7fcf4d2b7e
child 8626 440dfcd14c4a
permissions -rw-r--r--
(svn r11139) -Codechange: add support for persistent storage for NewGRFs.
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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     8
/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
     9
 * 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
    10
 * so we have a generalised class to use.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    11
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    12
struct BaseStorageArray
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
	/** The needed destructor */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    15
	virtual ~BaseStorageArray() {}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    16
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    17
	/**
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    18
	 * Clear the changes made since the last ClearChanges.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    19
	 * This can be done in two ways:
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    20
	 *  - saving the changes permanently
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    21
	 *  - reverting to the previous version
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    22
	 * @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
    23
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    24
	virtual void ClearChanges(bool keep_changes) = 0;
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    25
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    26
	/**
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    27
	 * Stores some value at a given position.
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    28
	 * @param pos   the position to write at
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    29
	 * @param value the value to write
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    30
	 */
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    31
	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
    32
};
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    33
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
 * Class for persistent storage of data.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    36
 * 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
    37
 * @param TYPE the type of variable to store.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    38
 * @param SIZE the size of the array.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    39
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    40
template <typename TYPE, uint SIZE>
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    41
struct PersistentStorageArray : BaseStorageArray {
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    42
	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
    43
	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
    44
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    45
	/** Simply construct the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    46
	PersistentStorageArray() : prev_storage(NULL)
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    47
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    48
		memset(this->storage, 0, sizeof(this->storage));
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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    51
	/** And free all data related to it */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    52
	~PersistentStorageArray()
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    53
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    54
		free(this->prev_storage);
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
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
	 * Stores some value at a given position.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    59
	 * 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
    60
	 * we write the data.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    61
	 * @param pos   the position to write at
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    62
	 * @param value the value to write
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    63
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    64
	void Store(uint pos, uint32 value)
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    65
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    66
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    67
		if (pos >= SIZE) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    68
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    69
		/* 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
    70
		 * 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
    71
		if (this->storage[pos] == value) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    72
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    73
		/* 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
    74
		if (this->prev_storage != NULL) {
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    75
			this->prev_storage = MallocT<TYPE>(SIZE);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    76
			if (this->prev_storage == NULL) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    77
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    78
			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
    79
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    80
			/* 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
    81
			 * 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
    82
			AddChangedStorage(this);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    83
		}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    84
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    85
		this->storage[pos] = value;
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
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
	 * Gets the value from a given position.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    90
	 * @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
    91
	 * @return the data from that position
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    92
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
    93
	TYPE Get(uint pos) const
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    94
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    95
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    96
		if (pos >= SIZE) return 0;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    97
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
    98
		return this->storage[pos];
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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   101
	void ClearChanges(bool keep_changes)
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
		assert(this->prev_storage != NULL);
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
		if (!keep_changes) {
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   106
			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
   107
		}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   108
		free(this->prev_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
};
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
 * Class for temporary storage of data.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   115
 * On ClearChanges that data is always zero-ed.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   116
 * @param TYPE the type of variable to store.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   117
 * @param SIZE the size of the array.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   118
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   119
template <typename TYPE, uint SIZE>
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   120
struct TemporaryStorageArray : BaseStorageArray {
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   121
	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
   122
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   123
	/** Simply construct the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   124
	TemporaryStorageArray()
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   125
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   126
		memset(this->storage, 0, sizeof(this->storage));
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
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
	 * Stores some value at a given position.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   131
	 * @param pos   the position to write at
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   132
	 * @param value the value to write
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   133
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
   134
	void Store(uint pos, uint32 value)
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   135
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   136
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   137
		if (pos >= SIZE) return;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   138
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   139
		this->storage[pos] = value;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   140
		AddChangedStorage(this);
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   141
	}
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   142
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
	 * Gets the value from a given position.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   145
	 * @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
   146
	 * @return the data from that position
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   147
	 */
8106
9f527cc360cf (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 8105
diff changeset
   148
	TYPE Get(uint pos) const
8105
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   149
	{
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   150
		/* Out of the scope of the array */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   151
		if (pos >= SIZE) return 0;
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   152
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   153
		return this->storage[pos];
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
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   156
	void ClearChanges(bool keep_changes)
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
		memset(this->storage, 0, sizeof(this->storage));
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
};
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
 * 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
   164
 * 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
   165
 * 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
   166
 * @param storage the array that has changed
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   167
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   168
void AddChangedStorage(BaseStorageArray *storage);
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
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
 * Clear the changes made since the last ClearStorageChanges.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   173
 * 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
   174
 * AddChangedStorage since the previous ClearStorageChanges.
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   175
 *
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   176
 * This can be done in two ways:
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   177
 *  - saving the changes permanently
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   178
 *  - reverting to the previous version
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   179
 * @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
   180
 */
8f7fcf4d2b7e (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents:
diff changeset
   181
void ClearStorageChanges(bool keep_changes);
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
#endif /* NEWGRF_STORAGE_H */