author | rubidium |
Wed, 26 Sep 2007 16:12:43 +0000 | |
changeset 8137 | 67a9579abd74 |
parent 8106 | 9f527cc360cf |
child 8626 | 440dfcd14c4a |
permissions | -rw-r--r-- |
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 */ |