载入中...
搜索中...
未找到
StateAccessAdapter.cpp
浏览该文件的文档.
2
3#include <cmath>
4#include <string>
5#include <utility>
6
7namespace eve::attributes {
8namespace {
9
10eve::Result<eve::MutationReceipt> failure(eve::DiagnosticCode code, std::string message, std::string path = {}) {
13}
14
15bool numeric(const eve::Value& value, double& out) {
16 if (value.isInt64()) {
17 out = static_cast<double>(value.asInt());
18 return true;
19 }
20 if (value.isDouble()) {
21 out = value.asDouble();
22 return std::isfinite(out);
23 }
24 return false;
25}
26
27} // namespace
28
29bool AttributeSetStateAdapter::owns(std::string_view subject) const noexcept {
30 return !subject.empty() && !attributes_.subject().empty() && attributes_.subject() == subject;
31}
32
33std::optional<eve::Value> AttributeSetStateAdapter::value(std::string_view subject, std::string_view key) const {
34 if (!owns(subject) || key.empty() || !attributes_.has(std::string(key))) return std::nullopt;
35 return eve::Value(attributes_.getFinal(std::string(key)));
36}
37
38std::optional<eve::Value> AttributeSetStateAdapter::attribute(std::string_view subject, std::string_view key) const {
39 return value(subject, key);
40}
41
42std::optional<eve::Value> AttributeSetStateAdapter::state(std::string_view subject, std::string_view key) const {
43 return value(subject, key);
44}
45
46eve::Result<eve::MutationReceipt> AttributeSetStateAdapter::apply(std::span<const eve::StateMutation> mutations,
48 for (std::size_t index = 0; index < mutations.size(); ++index) {
49 const auto& mutation = mutations[index];
50 if (mutation.persistent)
52 "AttributeSet mutations are volatile; use StatePatch for persistence",
53 "mutations[" + std::to_string(index) + "]");
54 if (!owns(mutation.subject) || mutation.key.empty())
56 "attribute mutation requires this set's subject and a key",
57 "mutations[" + std::to_string(index) + "]");
58 if (mutation.kind != eve::MutationKind::Set && mutation.kind != eve::MutationKind::AddNumber)
59 return failure(eve::DiagnosticCode::Unsupported, "AttributeSet supports Set and AddNumber only",
60 "mutations[" + std::to_string(index) + "]");
61 double ignored = 0.0;
62 if (!numeric(mutation.value, ignored))
63 return failure(eve::DiagnosticCode::InvalidArgument, "attribute mutation value must be a finite number",
64 "mutations[" + std::to_string(index) + "].value");
65 }
66
67 AttributeSet candidate = attributes_;
68 std::size_t changed = 0;
69 for (const auto& mutation : mutations) {
70 const double amount =
71 mutation.value.isInt64() ? static_cast<double>(mutation.value.asInt()) : mutation.value.asDouble();
72 const double before = candidate.getFinal(mutation.key);
73 if (mutation.kind == eve::MutationKind::Set)
74 candidate.setBase(mutation.key, amount);
75 else
76 candidate.modifyBase(mutation.key, amount);
77 const double after = candidate.getFinal(mutation.key);
78 if (before != after || !attributes_.has(mutation.key)) ++changed;
79 }
80 attributes_ = std::move(candidate);
84}
85
86} // namespace eve::attributes
double value
int subject
Definition AnimSmr.cpp:163
std::string message
DiagnosticCode code
std::uint32_t key
std::string path
Definition PlayHost.cpp:110
uint32_t index
const VegetationPresetContext & context
AttributeSet implementation of the common world-state contracts.
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
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
std::optional< eve::Value > attribute(std::string_view subject, std::string_view key) const override
Query a numeric or structured attribute.
std::optional< eve::Value > state(std::string_view subject, std::string_view key) const override
Query a persistent/world state value.
std::optional< eve::Value > value(std::string_view subject, std::string_view key) const override
Query a generic world value.
eve::Result< eve::MutationReceipt > apply(std::span< const eve::StateMutation > mutations, const eve::MutationContext &context) override
Apply a complete mutation set atomically.
Generic owning collection of canonical attributes and modifiers.
double getFinal(const AttributeId &attribute, double fallback=0.0, const AttributeOperationRegistry *customOperations=nullptr) const
Return the deterministic final value after all modifiers.
void modifyBase(const AttributeId &attribute, double delta)
Add delta to a base value, creating it from zero when absent.
void setBase(const AttributeId &attribute, double value)
Set or replace a base value. Empty attribute ids are ignored for compatibility.
bool has(const AttributeId &attribute) const
Return whether a base value or modifier names the attribute.
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47
Correlation metadata shared by a mutation transaction.
Definition StateAccess.h:57
Observable result of an all-or-nothing mutation request.
Definition StateAccess.h:64