summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ai/default/default.cpp16
-rw-r--r--src/core/bitmath_func.cpp2
-rw-r--r--src/macros.h18
-rw-r--r--src/roadveh_cmd.cpp23
-rw-r--r--src/station_gui.cpp5
-rw-r--r--src/town_gui.cpp5
6 files changed, 39 insertions, 30 deletions
diff --git a/src/ai/default/default.cpp b/src/ai/default/default.cpp
index e0aa1ae00..d1979ed82 100644
--- a/src/ai/default/default.cpp
+++ b/src/ai/default/default.cpp
@@ -1653,13 +1653,11 @@ clear_town_stuff:;
k = 0;
// Build the rail
- for (i = 0; i != 6; i++, j >>= 1) {
- if (j & 1) {
- k = i;
- ret = DoCommand(c, railtype, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
- if (CmdFailed(ret)) return CMD_ERROR;
- total_cost.AddCost(ret);
- }
+ FOR_EACH_SET_BIT(i, j) {
+ k = i;
+ ret = DoCommand(c, railtype, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
+ if (CmdFailed(ret)) return CMD_ERROR;
+ total_cost.AddCost(ret);
}
/* signals too? */
@@ -2854,7 +2852,6 @@ static bool AiCheckRoadFinished(Player *p)
TileIndex tile;
DiagDirection dir = p->ai.cur_dir_a;
uint32 bits;
- int i;
are.dest = p->ai.cur_tile_b;
tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(dir));
@@ -2865,7 +2862,8 @@ static bool AiCheckRoadFinished(Player *p)
are.best_dist = (uint)-1;
- for_each_bit(i, bits) {
+ uint i;
+ FOR_EACH_SET_BIT(i, bits) {
FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
}
diff --git a/src/core/bitmath_func.cpp b/src/core/bitmath_func.cpp
index 53139308a..bbfad72ff 100644
--- a/src/core/bitmath_func.cpp
+++ b/src/core/bitmath_func.cpp
@@ -48,7 +48,7 @@ uint8 FindFirstBit(uint32 x)
* Search the last set bit in a 32 bit variable.
*
* This algorithm is a static implementation of a log
- * conguence search algorithm. It checks the first half
+ * conguence search algorithm. It checks the second half
* if there is a bit set search there further. And this
* way further. If no bit is set return 0.
*
diff --git a/src/macros.h b/src/macros.h
index 51329ab19..5ec7b96e0 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -20,10 +20,20 @@
*/
#define IS_CUSTOM_SPRITE(sprite) ((sprite) >= SPR_SIGNALS_BASE)
-
-#define for_each_bit(_i, _b) \
- for (_i = 0; _b != 0; _i++, _b >>= 1) \
- if (_b & 1)
+/**
+ * Do an operation for each set set bit in a value.
+ *
+ * This macros is used to do an operation for each set
+ * bit in a variable. The first variable can be reused
+ * in the operation due to it's the bit position counter.
+ * The second variable will be cleared during the usage
+ *
+ * @param i The position counter
+ * @param b The value which we check for set bits
+ */
+#define FOR_EACH_SET_BIT(i, b) \
+ for (i = 0; b != 0; i++, b >>= 1) \
+ if (b & 1)
static inline uint16 ReadLE16Aligned(const void* x)
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 6e747460a..f19558a78 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -1273,18 +1273,17 @@ do_it:;
uint best_dist = (uint)-1;
uint best_maxlen = (uint)-1;
uint bitmask = (uint)trackdirs;
- for (int i = 0; bitmask != 0; bitmask >>= 1, i++) {
- if (HasBit(bitmask, 0)) {
- if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
- frd.maxtracklen = (uint)-1;
- frd.mindist = (uint)-1;
- FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
-
- if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
- best_dist = frd.mindist;
- best_maxlen = frd.maxtracklen;
- best_track = (Trackdir)i;
- }
+ uint i;
+ FOR_EACH_SET_BIT(i, bitmask) {
+ if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
+ frd.maxtracklen = (uint)-1;
+ frd.mindist = (uint)-1;
+ FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
+
+ if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
+ best_dist = frd.mindist;
+ best_maxlen = frd.maxtracklen;
+ best_track = (Trackdir)i;
}
}
}
diff --git a/src/station_gui.cpp b/src/station_gui.cpp
index 04438acd5..fe5f11fbf 100644
--- a/src/station_gui.cpp
+++ b/src/station_gui.cpp
@@ -403,8 +403,9 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
ToggleBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
w->ToggleWidgetLoweredState(e->we.click.widget);
} else {
- for (uint i = 0; facilities != 0; i++, facilities >>= 1) {
- if (HasBit(facilities, 0)) w->RaiseWidget(i + STATIONLIST_WIDGET_TRAIN);
+ uint i;
+ FOR_EACH_SET_BIT(i, facilities) {
+ w->RaiseWidget(i + STATIONLIST_WIDGET_TRAIN);
}
SetBit(facilities, e->we.click.widget - STATIONLIST_WIDGET_TRAIN);
w->LowerWidget(e->we.click.widget);
diff --git a/src/town_gui.cpp b/src/town_gui.cpp
index 452210e55..ccc723e41 100644
--- a/src/town_gui.cpp
+++ b/src/town_gui.cpp
@@ -121,8 +121,9 @@ uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
static int GetNthSetBit(uint32 bits, int n)
{
if (n >= 0) {
- for (uint i = 0; bits != 0; bits >>= 1, i++) {
- if (bits & 1) n--;
+ uint i;
+ FOR_EACH_SET_BIT(i, bits) {
+ n--;
if (n < 0) return i;
}
}