Add whether the vehicle is non-front to the vehicle pool pointer tag

Add iteration filters which check this
This commit is contained in:
Jonathan G Rennison
2024-02-25 14:49:31 +00:00
parent 05e237f8d1
commit 93bf033107
23 changed files with 145 additions and 81 deletions

View File

@@ -255,6 +255,9 @@ struct VehiclePoolOps {
static constexpr VehicleType DefaultItemParam() { return VEH_INVALID; }
static constexpr VehicleType GetVehicleType(uintptr_t ptr) { return static_cast<VehicleType>(GB(ptr, 60, 3)); }
static constexpr bool IsNonFrontVehiclePtr(uintptr_t ptr) { return HasBit(ptr, 63); }
static constexpr void SetIsNonFrontVehiclePtr(uintptr_t &ptr, bool non_front) { SB(ptr, 63, 1, non_front ? 1 : 0); }
};
typedef Pool<Vehicle, VehicleID, 512, 0xFF000, PT_NORMAL, false, true, VehiclePoolOps> VehiclePool;
@@ -1303,6 +1306,32 @@ public:
}
};
struct VehicleFrontOnlyFilter {
bool operator() (size_t index)
{
#if OTTD_UPPER_TAGGED_PTR
return !VehiclePoolOps::IsNonFrontVehiclePtr(_vehicle_pool.GetRaw(index));
#else
return Vehicle::Get(index)->Previous() == nullptr;
#endif
}
};
struct VehicleFrontOnlyTypeFilter {
VehicleType vt;
bool operator() (size_t index)
{
#if OTTD_UPPER_TAGGED_PTR
uintptr_t vptr = _vehicle_pool.GetRaw(index);
return !VehiclePoolOps::IsNonFrontVehiclePtr(vptr) && VehiclePoolOps::GetVehicleType(vptr) == this->vt;
#else
const Vehicle *v = Vehicle::Get(index);
return v->type == this->vt && v->Previous() == nullptr;
#endif
}
};
/**
* Returns an iterable ensemble of all valid vehicles of the given type
* @param vt the VehicleType to filter
@@ -1313,6 +1342,27 @@ public:
{
return Pool::IterateWrapperFiltered<Vehicle, VehicleTypeFilter>(from, VehicleTypeFilter{ vt });
}
/**
* Returns an iterable ensemble of all valid front vehicles (i.e. Previous() == nullptr)
* @param from index of the first vehicle to consider
* @return an iterable ensemble of all valid front vehicles
*/
static Pool::IterateWrapperFiltered<Vehicle, VehicleFrontOnlyFilter> IterateFrontOnly(size_t from = 0)
{
return Pool::IterateWrapperFiltered<Vehicle, VehicleFrontOnlyFilter>(from, VehicleFrontOnlyFilter{});
}
/**
* Returns an iterable ensemble of all valid front vehicles of the given type
* @param vt the VehicleType to filter
* @param from index of the first vehicle to consider
* @return an iterable ensemble of all valid front vehicles of the given type
*/
static Pool::IterateWrapperFiltered<Vehicle, VehicleFrontOnlyTypeFilter> IterateTypeFrontOnly(VehicleType vt, size_t from = 0)
{
return Pool::IterateWrapperFiltered<Vehicle, VehicleFrontOnlyTypeFilter>(from, VehicleFrontOnlyTypeFilter{ vt });
}
};
inline bool IsPointInViewportVehicleRedrawArea(const std::vector<Rect> &viewport_redraw_rects, const Point &pt)
@@ -1608,6 +1658,16 @@ public:
* @return an iterable ensemble of all valid vehicles of type T
*/
static Pool::IterateWrapper<T> Iterate(size_t from = 0) { return Pool::IterateWrapper<T>(from); }
/**
* Returns an iterable ensemble of all valid front vehicles (i.e. Previous() == nullptr) of type T
* @param from index of the first vehicle to consider
* @return an iterable ensemble of all valid front vehicles of type T
*/
static Pool::IterateWrapperFiltered<T, VehicleFrontOnlyFilter> IterateFrontOnly(size_t from = 0)
{
return Pool::IterateWrapperFiltered<T, VehicleFrontOnlyFilter>(from, VehicleFrontOnlyFilter{});
}
};
/** Generates sequence of free UnitID numbers */