载入中...
搜索中...
未找到
ResourceAccount.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
15#include "common/Result.h"
16#include "common/StrongUint64.h"
17
18#include <compare>
19#include <cstddef>
20#include <cstdint>
21#include <functional>
22#include <initializer_list>
23#include <string>
24#include <string_view>
25#include <utility>
26#include <vector>
27
28namespace eve::detail {
29
34
35} // namespace eve::detail
36
37namespace eve::resource {
38
41public:
43 ResourceId() = default;
44
50 [[nodiscard]] static eve::Result<ResourceId> parse(std::string_view text);
51
53 [[nodiscard]] bool isValid() const noexcept { return !value_.empty(); }
54
56 [[nodiscard]] const std::string& value() const noexcept { return value_; }
57
58 friend bool operator==(const ResourceId&, const ResourceId&) noexcept = default;
60 friend auto operator<=>(const ResourceId&, const ResourceId&) noexcept = default;
61
62private:
63 explicit ResourceId(std::string value) : value_(std::move(value)) {}
64
65 std::string value_;
66};
67
75class Amount {
76public:
78 constexpr Amount() noexcept = default;
79
85 explicit constexpr Amount(std::int64_t value) noexcept : value_(value) {}
86
92 [[nodiscard]] static eve::Result<Amount> from(std::int64_t value);
93
95 [[nodiscard]] static constexpr Amount zero() noexcept { return Amount(0); }
96
98 [[nodiscard]] constexpr std::int64_t value() const noexcept { return value_; }
99
101 [[nodiscard]] constexpr bool isZero() const noexcept { return value_ == 0; }
102
107 [[nodiscard]] eve::Result<Amount> checkedAdd(Amount other) const;
108
109 friend constexpr bool operator==(const Amount&, const Amount&) noexcept = default;
111 friend constexpr auto operator<=>(const Amount&, const Amount&) noexcept = default;
112
113private:
114 std::int64_t value_ = 0;
115};
116
121
123 friend bool operator==(const ResourceCost&, const ResourceCost&) noexcept = default;
124
131 [[nodiscard]] static eve::Result<ResourceCost> create(std::string_view resourceId, std::int64_t amountValue);
132};
133
135struct CostInput {
136 std::string_view resource;
137 std::int64_t amount = 0;
138};
139
148public:
150 CostSpec() = default;
151
157 [[nodiscard]] static eve::Result<CostSpec> create(std::vector<ResourceCost> items);
158
164 [[nodiscard]] static eve::Result<CostSpec> from(std::initializer_list<CostInput> items);
165
172 [[nodiscard]] static eve::Result<CostSpec> single(std::string_view resource, std::int64_t amount);
173
175 [[nodiscard]] bool isValid() const noexcept { return !items_.empty(); }
176
178 [[nodiscard]] bool empty() const noexcept { return items_.empty(); }
179
185 [[nodiscard]] const std::vector<ResourceCost>& items() const noexcept { return items_; }
186
188 [[nodiscard]] std::size_t size() const noexcept { return items_.size(); }
189
190 friend bool operator==(const CostSpec&, const CostSpec&) noexcept = default;
191
192private:
193 explicit CostSpec(std::vector<ResourceCost> items) : items_(std::move(items)) {}
194
195 std::vector<ResourceCost> items_;
196};
197
204
213 bool affordable = false;
214 std::vector<ResourceShortfall> shortfalls;
215
217 [[nodiscard]] bool isAffordable() const noexcept { return affordable; }
218};
219
221enum class ReceiptOperation : std::uint8_t {
222 Debit,
223 Credit,
224};
225
228
238public:
240 constexpr AccountNonce() noexcept = default;
241
243 [[nodiscard]] constexpr std::uint64_t value() const noexcept { return value_; }
244
246 [[nodiscard]] constexpr bool isZero() const noexcept { return value_ == 0; }
247
248 friend constexpr bool operator==(const AccountNonce&, const AccountNonce&) noexcept = default;
250 friend constexpr auto operator<=>(const AccountNonce&, const AccountNonce&) noexcept = default;
251
252private:
253 explicit constexpr AccountNonce(std::uint64_t value) noexcept : value_(value) {}
254
256
257 std::uint64_t value_ = 0;
258};
259
262
270
283
285 [[nodiscard]] bool isValid() const noexcept { return account.value() != 0 && id.value() != 0 && cost.isValid(); }
286};
287
294struct Receipt {
300
302 [[nodiscard]] bool isValid() const noexcept { return account.value() != 0 && id.value() != 0 && cost.isValid(); }
303};
304
317public:
319 virtual ~IResourceAccount() = default;
320
326 [[nodiscard]] virtual eve::Result<Affordability> canAfford(const CostSpec& cost) const = 0;
327
333 [[nodiscard]] virtual eve::Result<Reservation> reserve(const CostSpec& cost) = 0;
334
340 [[nodiscard]] virtual eve::Result<Receipt> debit(const CostSpec& cost) = 0;
341
347 [[nodiscard]] virtual eve::Result<Receipt> credit(const CostSpec& cost) = 0;
348
354 [[nodiscard]] virtual eve::Result<Receipt> commit(const Reservation& reservation) = 0;
355
361 [[nodiscard]] virtual eve::Result<void> rollback(const Reservation& reservation) = 0;
362};
363
364} // namespace eve::resource
365
366namespace std {
367
368template <>
370struct hash<eve::resource::ResourceId> {
372 std::size_t operator()(const eve::resource::ResourceId& value) const noexcept {
373 return std::hash<std::string>{}(value.value());
374 }
375};
376
377} // namespace std
double value
std::string from
eve::resource::CostSpec cost
std::array< std::uint8_t, 32 > hash
Definition Evpack.cpp:172
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
std::string text
Move-only, checked operation results for the common layer.
std::string resource
Internal storage primitive for domain-owned unsigned values.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Opaque process-local identity of the account that issued a credential.
constexpr std::uint64_t value() const noexcept
Return the opaque numeric value for diagnostics and comparisons.
friend EVENGINE_API_FOUNDATION eve::Result< AccountNonce > allocateAccountNonce()
Allocate a process-local account identity for a credential issuer.
constexpr bool isZero() const noexcept
Whether this nonce is invalid/zero.
constexpr AccountNonce() noexcept=default
Construct the invalid zero nonce.
friend constexpr auto operator<=>(const AccountNonce &, const AccountNonce &) noexcept=default
Operator <=>.
friend constexpr bool operator==(const AccountNonce &, const AccountNonce &) noexcept=default
Non-negative integral quantity used by resource accounts.
constexpr std::int64_t value() const noexcept
Return the native quantity at an explicit adapter boundary.
eve::Result< Amount > checkedAdd(Amount other) const
Add two quantities with overflow checking.
constexpr Amount() noexcept=default
Construct zero.
friend constexpr auto operator<=>(const Amount &, const Amount &) noexcept=default
Operator <=>.
friend constexpr bool operator==(const Amount &, const Amount &) noexcept=default
static constexpr Amount zero() noexcept
Return zero.
constexpr bool isZero() const noexcept
Whether the quantity is zero.
Immutable canonical multi-resource cost.
CostSpec()=default
Construct an invalid empty cost; use create/from/single for input.
bool empty() const noexcept
Whether this cost has no items.
friend bool operator==(const CostSpec &, const CostSpec &) noexcept=default
const std::vector< ResourceCost > & items() const noexcept
Return canonical items as a read-only borrowed view.
bool isValid() const noexcept
Whether this value contains a validated non-empty cost.
std::size_t size() const noexcept
Return the number of canonical resource entries.
Provider-neutral resource account contract.
virtual eve::Result< Receipt > credit(const CostSpec &cost)=0
Atomically credit all items immediately.
virtual eve::Result< Receipt > commit(const Reservation &reservation)=0
Commit one active reservation as an atomic debit.
virtual ~IResourceAccount()=default
Releases IResourceAccount resources.
virtual eve::Result< Reservation > reserve(const CostSpec &cost)=0
Reserve all items of a cost without changing visible balances.
virtual eve::Result< Receipt > debit(const CostSpec &cost)=0
Atomically debit all items immediately.
virtual eve::Result< Affordability > canAfford(const CostSpec &cost) const =0
Query whether a cost can be paid from currently available funds.
virtual eve::Result< void > rollback(const Reservation &reservation)=0
Release one active reservation without changing balances.
Strong identity of a resource kind, such as mana or gold.
ResourceId()=default
Construct an invalid resource id.
friend bool operator==(const ResourceId &, const ResourceId &) noexcept=default
const std::string & value() const noexcept
Return the canonical owned spelling.
static eve::Result< ResourceId > parse(std::string_view text)
Parse a resource id at a public input boundary.
friend auto operator<=>(const ResourceId &, const ResourceId &) noexcept=default
Operator <=>.
bool isValid() const noexcept
Whether this id passed the resource-name validation.
eve::Result< AccountNonce > allocateAccountNonce()
Allocate a process-local account identity for a credential issuer.
ReceiptOperation
Operation represented by a receipt returned from an account.
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
ResourceReceiptIdTag public API.
ResourceReservationIdTag public API.
Structured answer to a canAfford query.
std::vector< ResourceShortfall > shortfalls
bool isAffordable() const noexcept
Return whether every item in the queried cost is available.
Convenient unvalidated input used by CostSpec::from().
Receipt proving one atomic debit or credit was applied.
ReceiptOperation operation
bool isValid() const noexcept
Whether this receipt contains a valid operation identity.
Reservation credential returned by a successful reserve operation.
bool isValid() const noexcept
Whether this credential has valid account/id identity and cost.
One positive resource and quantity pair in a canonical cost.
friend bool operator==(const ResourceCost &, const ResourceCost &) noexcept=default
Operator ==.
A resource missing from an affordability query.
std::size_t operator()(const eve::resource::ResourceId &value) const noexcept
Hash a canonical resource id for account reservation maps.