载入中...
搜索中...
未找到
PcgTerrainWatcher.cpp
浏览该文件的文档.
2
3#include <algorithm>
4
5namespace eve::procgen {
6namespace {} // namespace
7
9 candidate_.clear();
10 scanning_ = true;
11}
12
13Result<int> PcgTerrainWatcher::addTerrain(const std::string& terrainId) {
14 if (!scanning_)
16 DiagnosticCode::InvalidArgument, "beginScan must precede addTerrain", "procgen.pcgTerrainWatcher"));
17 if (terrainId.empty())
18 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain id must not be empty",
19 "procgen.pcgTerrainWatcher"));
20 if (std::find(candidate_.begin(), candidate_.end(), terrainId) != candidate_.end())
22 DiagnosticCode::InvalidArgument, "terrain ids in one scan must be unique", "procgen.pcgTerrainWatcher"));
23 candidate_.push_back(terrainId);
24 return Result<int>::success(static_cast<int>(candidate_.size()));
25}
26
28 if (!scanning_)
30 DiagnosticCode::InvalidArgument, "beginScan must precede commitScan", "procgen.pcgTerrainWatcher"));
31 std::vector<PcgTerrainChange> nextChanges;
32 if (initialized_) {
33 for (const auto& id : candidate_)
34 if (std::find(terrains_.begin(), terrains_.end(), id) == terrains_.end())
35 nextChanges.push_back({id, PcgTerrainChangeType::Created});
36 for (const auto& id : terrains_)
37 if (std::find(candidate_.begin(), candidate_.end(), id) == candidate_.end())
38 nextChanges.push_back({id, PcgTerrainChangeType::Removed});
39 }
40 terrains_.swap(candidate_);
41 changes_.swap(nextChanges);
42 candidate_.clear();
43 scanning_ = false;
44 initialized_ = true;
45 return Result<int>::success(static_cast<int>(changes_.size()));
46}
47
48void PcgTerrainWatcher::cancelScan() {
49 candidate_.clear();
50 scanning_ = false;
51}
52int PcgTerrainWatcher::getTerrainCount() const noexcept { return static_cast<int>(terrains_.size()); }
53int PcgTerrainWatcher::getChangeCount() const noexcept { return static_cast<int>(changes_.size()); }
54Result<std::string> PcgTerrainWatcher::getChangeTerrainId(int index) const {
55 if (index < 0 || index >= static_cast<int>(changes_.size()))
57 DiagnosticCode::InvalidArgument, "change index is out of range", "procgen.pcgTerrainWatcher"));
58 return Result<std::string>::success(changes_[static_cast<std::size_t>(index)].terrainId);
59}
60Result<int> PcgTerrainWatcher::getChangeType(int index) const {
61 if (index < 0 || index >= static_cast<int>(changes_.size()))
62 return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "change index is out of range",
63 "procgen.pcgTerrainWatcher"));
64 return Result<int>::success(static_cast<int>(changes_[static_cast<std::size_t>(index)].type));
65}
66} // namespace eve::procgen
uint32_t index
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
void beginScan()
Begin a candidate hierarchy scan without changing the published cache.
Result< int > addTerrain(const std::string &terrainId)
Add one non-empty, unique stable terrain id to the candidate scan.
Result< int > commitScan()
Atomically publish the candidate and return the number of emitted changes.