|
@@ -78,7 +78,7 @@ namespace sophiar {
|
|
|
std::mutex mu;
|
|
std::mutex mu;
|
|
|
std::condition_variable cv;
|
|
std::condition_variable cv;
|
|
|
command_type cmd;
|
|
command_type cmd;
|
|
|
- std::any cmd_param, cmd_result;
|
|
|
|
|
|
|
+ boost::any cmd_param, cmd_result;
|
|
|
bool cmd_finish = true;
|
|
bool cmd_finish = true;
|
|
|
|
|
|
|
|
// for variable
|
|
// for variable
|
|
@@ -86,7 +86,7 @@ namespace sophiar {
|
|
|
struct variable_store_info {
|
|
struct variable_store_info {
|
|
|
using variable_info = sophiar_pool::variable_info;
|
|
using variable_info = sophiar_pool::variable_info;
|
|
|
|
|
|
|
|
- std::any value;
|
|
|
|
|
|
|
+ boost::any value;
|
|
|
variable_info var_info;
|
|
variable_info var_info;
|
|
|
spin_lock mu;
|
|
spin_lock mu;
|
|
|
callback_token_type cb_token;
|
|
callback_token_type cb_token;
|
|
@@ -102,31 +102,31 @@ namespace sophiar {
|
|
|
auto lock = std::lock_guard{mu};
|
|
auto lock = std::lock_guard{mu};
|
|
|
assert(!cmd_finish);
|
|
assert(!cmd_finish);
|
|
|
if (cmd < INIT_CONF) {
|
|
if (cmd < INIT_CONF) {
|
|
|
- auto obj_name = std::any_cast<std::string>(cmd_param);
|
|
|
|
|
|
|
+ auto obj_name = boost::any_cast<std::string>(cmd_param);
|
|
|
switch (cmd) {
|
|
switch (cmd) {
|
|
|
case INIT: {
|
|
case INIT: {
|
|
|
cmd_result = co_await global_sophiar_manager->init_object(
|
|
cmd_result = co_await global_sophiar_manager->init_object(
|
|
|
- std::any_cast<std::string>(cmd_param));
|
|
|
|
|
|
|
+ boost::any_cast<std::string>(cmd_param));
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case START: {
|
|
case START: {
|
|
|
cmd_result = co_await global_sophiar_manager->start_object(
|
|
cmd_result = co_await global_sophiar_manager->start_object(
|
|
|
- std::any_cast<std::string>(cmd_param));
|
|
|
|
|
|
|
+ boost::any_cast<std::string>(cmd_param));
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case STOP: {
|
|
case STOP: {
|
|
|
cmd_result = co_await global_sophiar_manager->stop_object(
|
|
cmd_result = co_await global_sophiar_manager->stop_object(
|
|
|
- std::any_cast<std::string>(cmd_param));
|
|
|
|
|
|
|
+ boost::any_cast<std::string>(cmd_param));
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case RESET: {
|
|
case RESET: {
|
|
|
cmd_result = co_await global_sophiar_manager->reset_object(
|
|
cmd_result = co_await global_sophiar_manager->reset_object(
|
|
|
- std::any_cast<std::string>(cmd_param));
|
|
|
|
|
|
|
+ boost::any_cast<std::string>(cmd_param));
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case QUERY: {
|
|
case QUERY: {
|
|
|
cmd_result = global_sophiar_manager->query_object_state(
|
|
cmd_result = global_sophiar_manager->query_object_state(
|
|
|
- std::any_cast<std::string>(cmd_param));
|
|
|
|
|
|
|
+ boost::any_cast<std::string>(cmd_param));
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
default: {
|
|
default: {
|
|
@@ -134,7 +134,7 @@ namespace sophiar {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else if (cmd < QUERY_VARIABLE) {
|
|
} else if (cmd < QUERY_VARIABLE) {
|
|
|
- auto patch = std::any_cast<config_patch_type>(cmd_param);
|
|
|
|
|
|
|
+ auto patch = boost::any_cast<config_patch_type>(cmd_param);
|
|
|
switch (cmd) {
|
|
switch (cmd) {
|
|
|
case INIT_CONF: {
|
|
case INIT_CONF: {
|
|
|
cmd_result = global_sophiar_manager->patch_init_config(
|
|
cmd_result = global_sophiar_manager->patch_init_config(
|
|
@@ -151,13 +151,13 @@ namespace sophiar {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else if (cmd == QUERY_VARIABLE) {
|
|
} else if (cmd == QUERY_VARIABLE) {
|
|
|
- auto var_name = std::any_cast<std::string>(cmd_param);
|
|
|
|
|
|
|
+ auto var_name = boost::any_cast<std::string>(cmd_param);
|
|
|
cmd_result = global_sophiar_pool->query_variable_information(var_name);
|
|
cmd_result = global_sophiar_pool->query_variable_information(var_name);
|
|
|
} else if (cmd == REGISTER_CALLBACK) {
|
|
} else if (cmd == REGISTER_CALLBACK) {
|
|
|
- auto func = std::any_cast<std::function<void()>>(cmd_param);
|
|
|
|
|
|
|
+ auto func = boost::any_cast<std::function<void()>>(cmd_param);
|
|
|
cmd_result = REGISTER_CALLBACK(std::move(func));
|
|
cmd_result = REGISTER_CALLBACK(std::move(func));
|
|
|
} else if (cmd == ATTACH_CALLBACK) {
|
|
} else if (cmd == ATTACH_CALLBACK) {
|
|
|
- auto info = std::any_cast<attach_info>(cmd_param);
|
|
|
|
|
|
|
+ auto info = boost::any_cast<attach_info>(cmd_param);
|
|
|
cmd_result = ATTACH_CALLBACK(info.index, info.cb_token);
|
|
cmd_result = ATTACH_CALLBACK(info.index, info.cb_token);
|
|
|
}
|
|
}
|
|
|
cmd_finish = true;
|
|
cmd_finish = true;
|
|
@@ -166,7 +166,7 @@ namespace sophiar {
|
|
|
co_return;
|
|
co_return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void send_and_wait_command(command_type _cmd, const std::any &_param) {
|
|
|
|
|
|
|
+ void send_and_wait_command(command_type _cmd, const boost::any &_param) {
|
|
|
// copy command information
|
|
// copy command information
|
|
|
{
|
|
{
|
|
|
auto lock = std::lock_guard{mu};
|
|
auto lock = std::lock_guard{mu};
|
|
@@ -180,13 +180,13 @@ namespace sophiar {
|
|
|
cv.wait(lock, [this] { return cmd_finish; });
|
|
cv.wait(lock, [this] { return cmd_finish; });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- std::any command_helper(command_type _cmd, const std::any &_param) {
|
|
|
|
|
|
|
+ boost::any command_helper(command_type _cmd, const boost::any &_param) {
|
|
|
send_and_wait_command(_cmd, _param);
|
|
send_and_wait_command(_cmd, _param);
|
|
|
return cmd_result;
|
|
return cmd_result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void register_variable(const std::string &name) {
|
|
void register_variable(const std::string &name) {
|
|
|
- auto var_info = std::any_cast<sophiar_pool::variable_info>(
|
|
|
|
|
|
|
+ auto var_info = boost::any_cast<sophiar_pool::variable_info>(
|
|
|
command_helper(QUERY_VARIABLE, name));
|
|
command_helper(QUERY_VARIABLE, name));
|
|
|
auto [iter, ok] = variable_pool.emplace(std::piecewise_construct,
|
|
auto [iter, ok] = variable_pool.emplace(std::piecewise_construct,
|
|
|
std::forward_as_tuple(name),
|
|
std::forward_as_tuple(name),
|
|
@@ -208,9 +208,9 @@ namespace sophiar {
|
|
|
return;
|
|
return;
|
|
|
})
|
|
})
|
|
|
};
|
|
};
|
|
|
- store_ptr->cb_token = std::any_cast<callback_token_type>(
|
|
|
|
|
|
|
+ store_ptr->cb_token = boost::any_cast<callback_token_type>(
|
|
|
command_helper(REGISTER_CALLBACK, cb_func));
|
|
command_helper(REGISTER_CALLBACK, cb_func));
|
|
|
- store_ptr->bind_token = std::any_cast<attach_token_type>(
|
|
|
|
|
|
|
+ store_ptr->bind_token = boost::any_cast<attach_token_type>(
|
|
|
command_helper(ATTACH_CALLBACK, attach_info{var_info.index, store_ptr->cb_token}));
|
|
command_helper(ATTACH_CALLBACK, attach_info{var_info.index, store_ptr->cb_token}));
|
|
|
post(*global_context, cb_func); // query current value
|
|
post(*global_context, cb_func); // query current value
|
|
|
}
|
|
}
|
|
@@ -224,9 +224,9 @@ namespace sophiar {
|
|
|
return &iter->second;
|
|
return &iter->second;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- std::any query_variable(const std::string &name) {
|
|
|
|
|
|
|
+ boost::any query_variable(const std::string &name) {
|
|
|
auto store = get_variable_store(name);
|
|
auto store = get_variable_store(name);
|
|
|
- std::any ret;
|
|
|
|
|
|
|
+ boost::any ret;
|
|
|
{
|
|
{
|
|
|
auto lock = std::lock_guard{store->mu};
|
|
auto lock = std::lock_guard{store->mu};
|
|
|
ret = store->value;
|
|
ret = store->value;
|
|
@@ -237,7 +237,7 @@ namespace sophiar {
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void update_variable(const std::string &name, const std::any &value) {
|
|
|
|
|
|
|
+ void update_variable(const std::string &name, const boost::any &value) {
|
|
|
auto store = get_variable_store(name);
|
|
auto store = get_variable_store(name);
|
|
|
auto var_type_index = store->var_info.type_index;
|
|
auto var_type_index = store->var_info.type_index;
|
|
|
auto raw_ptr = store->var_info.placeholder;
|
|
auto raw_ptr = store->var_info.placeholder;
|
|
@@ -246,14 +246,14 @@ namespace sophiar {
|
|
|
{
|
|
{
|
|
|
using ValueType = decltype(real_ptr->value);
|
|
using ValueType = decltype(real_ptr->value);
|
|
|
using ObjType = std::remove_cvref_t<decltype(*real_ptr)>;
|
|
using ObjType = std::remove_cvref_t<decltype(*real_ptr)>;
|
|
|
- if (!value.has_value()) [[unlikely]] {
|
|
|
|
|
|
|
+ if (value.empty()) [[unlikely]] {
|
|
|
real_ptr = nullptr;
|
|
real_ptr = nullptr;
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
if (real_ptr == nullptr) [[unlikely]] {
|
|
if (real_ptr == nullptr) [[unlikely]] {
|
|
|
real_ptr = ObjType::new_instance();
|
|
real_ptr = ObjType::new_instance();
|
|
|
}
|
|
}
|
|
|
- real_ptr->value = std::any_cast<ValueType>(value);
|
|
|
|
|
|
|
+ real_ptr->value = boost::any_cast<ValueType>(value);
|
|
|
return;
|
|
return;
|
|
|
})
|
|
})
|
|
|
});
|
|
});
|
|
@@ -272,38 +272,38 @@ namespace sophiar {
|
|
|
local_connection::~local_connection() = default;
|
|
local_connection::~local_connection() = default;
|
|
|
|
|
|
|
|
bool local_connection::init_object(const std::string &name) {
|
|
bool local_connection::init_object(const std::string &name) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(INIT, name));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(INIT, name));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool local_connection::start_object(const std::string &name) {
|
|
bool local_connection::start_object(const std::string &name) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(START, name));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(START, name));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool local_connection::stop_object(const std::string &name) {
|
|
bool local_connection::stop_object(const std::string &name) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(STOP, name));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(STOP, name));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool local_connection::reset_object(const std::string &name) {
|
|
bool local_connection::reset_object(const std::string &name) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(RESET, name));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(RESET, name));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
tristate_obj::state_type local_connection::query_object(const std::string &name) {
|
|
tristate_obj::state_type local_connection::query_object(const std::string &name) {
|
|
|
- return std::any_cast<tristate_obj::state_type>(pimpl->command_helper(QUERY, name));
|
|
|
|
|
|
|
+ return boost::any_cast<tristate_obj::state_type>(pimpl->command_helper(QUERY, name));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool local_connection::patch_init_config(const config_patch_type &patch) {
|
|
bool local_connection::patch_init_config(const config_patch_type &patch) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(INIT_CONF, patch));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(INIT_CONF, patch));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool local_connection::patch_start_config(const config_patch_type &patch) {
|
|
bool local_connection::patch_start_config(const config_patch_type &patch) {
|
|
|
- return std::any_cast<bool>(pimpl->command_helper(START_CONF, patch));
|
|
|
|
|
|
|
+ return boost::any_cast<bool>(pimpl->command_helper(START_CONF, patch));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- std::any local_connection::query_variable_impl(const std::string &name) {
|
|
|
|
|
|
|
+ boost::any local_connection::query_variable_impl(const std::string &name) {
|
|
|
return pimpl->query_variable(name);
|
|
return pimpl->query_variable(name);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void local_connection::update_variable_impl(const std::string &name, const std::any &value) {
|
|
|
|
|
|
|
+ void local_connection::update_variable_impl(const std::string &name, const boost::any &value) {
|
|
|
pimpl->update_variable(name, value);
|
|
pimpl->update_variable(name, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -314,7 +314,7 @@ namespace sophiar {
|
|
|
void run_sophiar(const std::string &config_path) {
|
|
void run_sophiar(const std::string &config_path) {
|
|
|
auto config_file = std::ifstream{config_path};
|
|
auto config_file = std::ifstream{config_path};
|
|
|
assert(config_file.is_open());
|
|
assert(config_file.is_open());
|
|
|
- auto config = nlohmann::json::parse(config_file);
|
|
|
|
|
|
|
+ auto config = nlohmann::json::parse(config_file, nullptr, true, true); // ignore comments
|
|
|
auto ok = initialize(config);
|
|
auto ok = initialize(config);
|
|
|
assert(ok);
|
|
assert(ok);
|
|
|
global_context->run();
|
|
global_context->run();
|