diff --git a/src/subsidy_base.h b/src/subsidy_base.h new file mode 100644 --- /dev/null +++ b/src/subsidy_base.h @@ -0,0 +1,77 @@ +/* $Id$ */ + +/** @file subsidy_base.h Subsidy base class. */ + +#ifndef SUBSIDY_BASE_H +#define SUBSIDY_BASE_H + +#include "cargo_type.h" +#include "company_type.h" + +/** Struct about subsidies, offered and awarded */ +struct Subsidy { + CargoID cargo_type; ///< Cargo type involved in this subsidy, CT_INVALID for invalid subsidy + byte age; ///< Subsidy age; < 12 is unawarded, >= 12 is awarded + uint16 from; ///< Index of source. Either TownID, IndustryID or StationID, when awarded + uint16 to; ///< Index of destination. Either TownID, IndustryID or StationID, when awarded + + /** + * Determines index of this subsidy + * @return index (in the Subsidy::array array) + */ + FORCEINLINE size_t Index() const + { + return this - Subsidy::array; + } + + /** + * Tests for validity of this subsidy + * @return is this subsidy valid? + */ + FORCEINLINE bool IsValid() const + { + return this->cargo_type != CT_INVALID; + } + + + static Subsidy array[MAX_COMPANIES]; ///< Array holding all subsidies + + /** + * Total number of subsidies, both valid and invalid + * @return length of Subsidy::array + */ + static FORCEINLINE size_t GetArraySize() + { + return lengthof(Subsidy::array); + } + + /** + * Tests whether given index is an index of valid subsidy + * @param index index to check + * @return can this index be used to access a valid subsidy? + */ + static FORCEINLINE bool IsValidID(size_t index) + { + return index < Subsidy::GetArraySize() && Subsidy::Get(index)->IsValid(); + } + + /** + * Returns pointer to subsidy with given index + * @param index index of subsidy + * @return pointer to subsidy with given index + */ + static FORCEINLINE Subsidy *Get(size_t index) + { + assert(index < Subsidy::GetArraySize()); + return &Subsidy::array[index]; + } + + static Subsidy *AllocateItem(); + static void Clean(); +}; + +#define FOR_ALL_SUBSIDIES_FROM(var, start) for (size_t subsidy_index = start; var = NULL, subsidy_index < Subsidy::GetArraySize(); subsidy_index++) \ + if ((var = Subsidy::Get(subsidy_index))->IsValid()) +#define FOR_ALL_SUBSIDIES(var) FOR_ALL_SUBSIDIES_FROM(var, 0) + +#endif /* SUBSIDY_BASE_H */