/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
*/
/** @file source_type.h Type for the source of cargo. */
#ifndef SOURCE_TYPE_H
#define SOURCE_TYPE_H
#include "company_type.h"
#include "industry_type.h"
#include "news_type.h"
#include "strings_type.h"
#include "town_type.h"
/** Types of cargo source and destination */
enum class SourceType : uint8_t {
Industry = 0, ///< Source/destination is an industry
Town = 1, ///< Source/destination is a town
Headquarters = 2, ///< Source/destination are company headquarters
};
using SourceID = uint16_t; ///< Contains either industry ID, town ID or company ID (or Source::Invalid)
static_assert(sizeof(SourceID) >= sizeof(CompanyID));
static_assert(sizeof(SourceID) >= sizeof(IndustryID));
static_assert(sizeof(SourceID) >= sizeof(TownID));
/** A location from where cargo can come from (or go to). Specifically industries, towns and headquarters. */
struct Source {
public:
static constexpr SourceID Invalid = 0xFFFF; ///< Invalid/unknown index of source
SourceID id; ///< Index of industry/town/HQ, Source::Invalid if unknown/invalid.
SourceType type; ///< Type of \c source_id.
Source() = default;
Source(ConvertibleThroughBase auto id, SourceType type) : id(id.base()), type(type) {}
Source(SourceID id, SourceType type) : id(id), type(type) {}
constexpr CompanyID ToCompanyID() const { assert(this->type == SourceType::Headquarters); return static_cast(this->id); }
constexpr IndustryID ToIndustryID() const { assert(this->type == SourceType::Industry); return static_cast(this->id); }
constexpr TownID ToTownID() const { assert(this->type == SourceType::Town); return static_cast(this->id); }
constexpr void MakeInvalid() { this->id = Source::Invalid; }
constexpr void SetIndex(SourceID index) { this->id = index; }
constexpr void SetIndex(ConvertibleThroughBase auto index) { this->id = index.base(); }
constexpr bool IsValid() const noexcept { return this->id != Source::Invalid; }
auto operator<=>(const Source &source) const = default;
NewsReference GetNewsReference() const;
StringID GetFormat() const;
};
#endif /* SOURCE_TYPE_H */