22#if defined(SCAFACOS) or defined(SCAFACOS_DIPOLES)
33#include <boost/algorithm/string.hpp>
34#include <boost/optional.hpp>
54 :
public boost::static_visitor<std::vector<std::string>> {
56 return std::vector<std::string>{value};
59 template <
typename T,
typename = std::enable_if_t<!std::is_arithmetic_v<T>>>
61 throw std::runtime_error(
"Cannot convert " + Utils::demangle<T>());
64 template <
typename T,
typename = std::enable_if_t<std::is_same_v<T,
int>>>
73 auto operator()(std::vector<std::string>
const &values)
const {
77 auto operator()(std::vector<Variant>
const &values)
const {
78 std::vector<std::string> values_str;
79 for (
auto const &v : values) {
80 values_str.emplace_back(boost::apply_visitor(*
this, v).front());
85 template <
typename T,
typename = std::enable_if_t<std::is_arithmetic_v<T>>>
87 std::vector<std::string> values_str;
88 for (
auto const &v : values) {
89 values_str.emplace_back(to_str(v));
95 std::string to_str(
int const value)
const {
return std::to_string(value); }
97 std::string to_str(
double const value)
const {
98 std::ostringstream serializer;
99 serializer << std::scientific << std::setprecision(17);
101 return serializer.str();
106 :
public boost::static_visitor<std::unordered_map<std::string, Variant>> {
107 auto operator()(std::unordered_map<std::string, Variant>
const &obj)
const {
111 template <
typename T>
112 auto operator()(std::unordered_map<T, Variant>
const &obj)
const {
114 return (obj.empty()) ? result_type{} : invalid(obj);
122 template <
typename T>
auto invalid(T
const &obj)
const {
123 return get_value<result_type>(obj);
129 if (parameters.empty()) {
130 throw std::invalid_argument(
131 "ScaFaCoS methods require at least 1 parameter");
134 std::string method_params =
"";
135 for (
auto const &kv : parameters) {
136 method_params +=
"," + kv.first;
137 for (
auto const &value : boost::apply_visitor(visitor, kv.second)) {
138 method_params +=
"," + value;
141 return method_params.substr(1);
146 auto deserializer = std::istringstream(s);
148 deserializer >> result;
149 if (deserializer.fail() or not deserializer.eof()) {
155std::unordered_map<std::string, Variant>
165 auto const numbers = std::string(
"-0123456789");
166 std::unordered_map<std::string, Variant> method_params{};
167 std::vector<std::string> flat_array;
170 boost::split(flat_array, parameters, boost::is_any_of(
","));
171 for (
auto it = flat_array.begin(); it != flat_array.end();) {
172 auto const parameter_name = *it;
173 auto parameter_list = std::vector<Variant>{};
174 for (++it; it != flat_array.end(); ++it) {
175 if ((numbers.find(it->front()) == std::string::npos) and
176 not parameter_list.empty()) {
180 if (
auto converted = string_to_number<int>(*it)) {
182 }
else if (
auto converted = string_to_number<double>(*it)) {
185 parameter_list.emplace_back(result);
187 assert(not parameter_list.empty());
188 if (parameter_list.size() == 1ul) {
189 method_params[parameter_name] = parameter_list.front();
191 method_params[parameter_name] =
Variant{std::move(parameter_list)};
194 return method_params;
ScafacosContextBase provides the public interface of the ScaFaCoS bridge.
This file contains the defaults for ESPResSo.
std::unordered_map< std::string, Variant > deserialize_parameters(std::string const ¶meters)
Convert flattened parameters to a map.
std::string serialize_parameters(Variant const &pack)
Flatten a parameter map.
boost::optional< Variant > string_to_number(std::string const &s)
std::vector< std::string > available_methods()
Fetch list of methods compiled in ScaFaCoS.
PackedVariant pack(const Variant &v)
Transform a Variant to a PackedVariant.
boost::make_recursive_variant< None, bool, int, std::size_t, double, std::string, ObjectRef, Utils::Vector3b, Utils::Vector3i, Utils::Vector2d, Utils::Vector3d, Utils::Vector4d, std::vector< int >, std::vector< double >, std::vector< boost::recursive_variant_ >, std::unordered_map< int, boost::recursive_variant_ >, std::unordered_map< std::string, boost::recursive_variant_ > >::type Variant
Possible types for parameters.
static std::vector< std::string > available_methods()
auto operator()(T const &value) const
auto operator()(std::vector< T > const &values) const
auto operator()(std::vector< Variant > const &values) const
auto operator()(double const &value) const
auto operator()(std::string const &value) const
auto operator()(std::vector< std::string > const &values) const
std::vector< std::string > operator()(T const &) const
auto operator()(std::unordered_map< std::string, Variant > const &obj) const
auto operator()(std::unordered_map< T, Variant > const &obj) const
auto operator()(T const &obj) const