3#include <clingo/control.hh>
4#include <clingo/core.hh>
5#include <clingo/symbol.hh>
7#include <clingo/script.h>
43 return do_call(
lib,
name, arguments);
51 auto callable(std::string_view
name,
size_t arguments) ->
bool {
return do_callable(
name, arguments); }
62 auto name() -> std::string_view {
return do_name(); }
67 auto version() -> std::string_view {
return do_version(); }
70 virtual void do_execute(std::string_view
code) = 0;
72 virtual auto do_callable(std::string_view
name,
size_t arguments) ->
bool = 0;
74 virtual auto do_name() -> std::string_view = 0;
75 virtual auto do_version() -> std::string_view = 0;
83 [](
char const *code,
size_t size,
void *data) ->
bool {
85 static_cast<Script *
>(data)->execute(std::string_view{code, size});
91 void *symbol_callback_data,
void *data) ->
bool {
93 auto &self = *
static_cast<Script *
>(data);
94 auto args =
transform(arguments, std::next(arguments,
static_cast<std::ptrdiff_t
>(arguments_size)),
95 [](
auto sym) {
return Symbol{sym,
true}; });
96 auto cpp_lib = Library{lib,
true};
97 auto syms = self.call(cpp_lib, {name, name_size}, args);
98 auto const *c_syms = c_cast(syms.data());
99 return symbol_callback(c_syms, syms.size(), symbol_callback_data);
103 [](
char const *name,
size_t size,
size_t arguments,
bool *result,
void *data) ->
bool {
105 auto &self = *
static_cast<Script *
>(data);
106 *result = self.callable({name, size}, arguments);
110 [](
clingo_lib_t *lib, clingo_control_t *control,
void *data) ->
bool {
112 auto &self = *
static_cast<Script *
>(data);
113 auto cpp_lib = Library{lib,
true};
114 auto cpp_ctl = Control{control,
true};
115 self.main(cpp_lib, cpp_ctl);
120 auto &self = *
static_cast<Script *
>(data);
121 auto str = self.name();
122 name->data = str.data();
123 name->size = str.size();
126 auto &self = *
static_cast<Script *
>(data);
127 auto str = self.name();
131 [](
void *data) { std::ignore = std::unique_ptr<Script>(
static_cast<Script *
>(data)); },
136template <std::derived_from<Script> T>
auto register_script(Library
const &lib, std::unique_ptr<T> script) -> T & {
The main control class for grounding and solving logic programs.
Definition control.hh:228
The main library class for managing global information and logging.
Definition core.hh:471
Interface for custom scripts.
Definition script.hh:20
Script()=default
The default constructor.
auto version() -> std::string_view
Get the version of the script.
Definition script.hh:67
auto name() -> std::string_view
Get the name of the script.
Definition script.hh:62
virtual ~Script()=default
The default destructor.
auto callable(std::string_view name, size_t arguments) -> bool
Callback to check if the given signature is callable.
Definition script.hh:51
void execute(std::string_view code)
Callback to execute the given code.
Definition script.hh:34
auto call(Library &lib, std::string_view name, SymbolSpan arguments) -> SymbolVector
Callback to call the function with the given name and arguments.
Definition script.hh:42
Script(Script &&other)=delete
Disable copy and move operations.
auto operator=(Script &&other) -> Script &=delete
Disable copy and move operations.
void main(Library &lib, const Control &ctl)
Callback to customize the main function.
Definition script.hh:57
struct clingo_lib clingo_lib_t
A library object storing global information.
Definition core.h:171
struct clingo_location clingo_location_t
Represents a source code location marking its beginning and end.
Definition core.h:354
CLINGO_VISIBILITY_DEFAULT bool clingo_script_register(clingo_lib_t *lib, clingo_script_t const *script, void *data)
Add a custom scripting language to a control object.
bool(* clingo_symbol_callback_t)(clingo_symbol_t const *symbols, size_t symbols_size, void *data)
Callback function to inject symbols.
Definition symbol.h:60
uint64_t clingo_symbol_t
Type to represent a symbol.
Definition symbol.h:51
auto version() -> std::tuple< int, int, int >
Get the version of the Clingo library as a tuple.
Definition core.hh:730
std::vector< Symbol > SymbolVector
A vector of symbols.
Definition symbol.hh:42
std::span< Symbol const > SymbolSpan
A span of symbols, which is a view on a contiguous sequence of symbols.
Definition symbol.hh:38
constexpr auto transform(std::optional< T > &x, F &&f) -> Detail::transform_result< T &, F >
Implemenatation of std::optional<T>::transform.
Definition optional.hh:28
Custom scripting language to run functions during grounding.
Definition script.h:18
Struct to capture strings that are not null-terminated.
Definition core.h:86