18class AssumptionContext;
54 "diagnostic budget exhausted",
57 bool inserted =
false;
62 }
catch (
const std::bad_alloc&) {
65 "diagnostic allocation failed");
69 "diagnostic consumer failed");
92 return cancelled_->load(std::memory_order_acquire);
113 const std::string& operation = {}) {
115 if (!access)
return access;
119 "computation step budget exhausted", operation);
127 if (!step)
return step;
130 "recursion depth limit exceeded", operation);
141 const std::string& operation = {})
const {
143 if (!access)
return access;
146 "AST node budget exhausted", operation);
152 std::size_t amount,
const std::string& operation = {})
const {
154 if (!access)
return access;
158 "integer bit budget exceeded", operation);
164 std::size_t amount,
const std::string& operation = {})
const {
166 if (!access)
return access;
170 "expansion term budget exceeded", operation);
176 std::size_t amount,
const std::string& operation = {})
const {
178 if (!access)
return access;
182 "input byte budget exceeded", operation);
189 if (!access)
return access;
204 const std::string& operation = {}) {
206 if (!access)
return access;
215 std::shared_ptr<const AssumptionContext>
assumptions,
216 const std::string& operation = {}) {
218 if (!access)
return access;
222 const std::shared_ptr<const AssumptionContext>&
assumptions() const noexcept {
231 "ComputationContext cannot be shared across threads",
236 "computation was cancelled", operation);
bool is_cancelled() const noexcept
void cancel() const noexcept
std::shared_ptr< std::atomic< bool > > cancelled_
void leave_recursion() noexcept
const std::shared_ptr< const AssumptionContext > & assumptions() const noexcept
std::shared_ptr< const AssumptionContext > assumptions_
UnitSystem & units() noexcept
ComputationContext(ComputationContext &&)=delete
Result< void > require_input_bytes(std::size_t amount, const std::string &operation={}) const
Result< void > set_assumptions(std::shared_ptr< const AssumptionContext > assumptions, const std::string &operation={})
ComputationContext(ResourceLimits limits={}, CancellationToken cancellation={})
Result< void > check_access(const std::string &operation) const
CancellationToken cancellation_
Result< void > add_diagnostic(Diagnostic diagnostic)
DiagnosticEngine diagnostic_engine_
const std::vector< Diagnostic > & diagnostics() const noexcept
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
const std::thread::id owner_thread_
ComputationContext & operator=(const ComputationContext &)=delete
Result< void > enter_recursion(const std::string &operation={})
const CancellationToken & cancellation() const noexcept
Result< void > require_ast_nodes(std::size_t amount, const std::string &operation={}) const
std::size_t recursion_depth() const noexcept
Result< void > require_integer_bits(std::size_t amount, const std::string &operation={}) const
std::size_t recursion_depth_
const UnitSystem & units() const noexcept
const ResourceLimits & limits() const noexcept
Result< void > require_expansion_terms(std::size_t amount, const std::string &operation={}) const
Result< void > set_diagnostic_consumer(DiagnosticEngine::Consumer consumer, const std::string &operation={})
ComputationContext(const ComputationContext &)=delete
ComputationContext & operator=(ComputationContext &&)=delete
std::size_t steps_used() const noexcept
const DiagnosticEngine & diagnostic_engine() const noexcept
Result< void > emit(Diagnostic diagnostic)
DiagnosticEngine(std::size_t limit, Consumer consumer={})
std::function< void(const Diagnostic &)> Consumer
const std::vector< Diagnostic > & diagnostics() const noexcept
std::vector< Diagnostic > diagnostics_
void set_consumer(Consumer consumer)
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::size_t max_diagnostics
Stored diagnostics.
std::size_t max_steps
Cumulative checked steps.
std::size_t max_input_bytes
One checked input buffer.
std::size_t max_integer_bits
One checked integer result.
std::size_t max_recursion_depth
Simultaneous checked depth.
DiagnosticSeverity severity
std::size_t max_ast_nodes
Reference-expanded nodes per AST or output forest.
std::size_t max_expansion_terms
One checked expansion.
Per-operation limits for APIs that accept a ComputationContext.