25 template<
typename ARG,
size_t IDX>
requires is_arg_v<ARG>
26 inline decltype(
auto) py_args_to_bbm_arg(py::args& args, py::kwargs& kwargs)
28 using arg_t = std::decay_t<ARG>;
29 using type = std::decay_t<typename arg_t::type>;
32 if(kwargs.size() > 0 && kwargs.contains( arg_t::name.
value ))
38 else if(args.size() > IDX)
44 else if constexpr (std::is_constructible_v<arg_t>)
50 else throw std::runtime_error(std::string(
"BBM: value required for argument '") +
toString(arg_t::name) +
"'.'");
59 template<
typename ARGS,
size_t... IDX>
requires is_args_v<ARGS>
60 inline auto py_args_to_bbm_args(py::args& args, py::kwargs& kwargs, std::index_sequence<IDX...>)
62 return ARGS( py_args_to_bbm_arg<
decltype(std::declval<ARGS>().
template get<IDX>()), IDX >(args, kwargs)... );
69 template<
typename ARGS,
size_t... IDX>
requires is_args_v<ARGS>
70 inline bool is_valid_bbm_arg_name(
const std::string& name, std::index_sequence<IDX...>)
72 return ((std::decay_t<
typename ARGS::template type<IDX>>::name.
value == name) || ...);
85 template<
typename ARGS>
requires is_args_v<ARGS>
89 if(
args.
size() > ARGS::size)
throw std::runtime_error(std::string(
"BBM: too many arguments (") +
toString(
args.
size()) +
"given, expected maximum: " +
toString(ARGS::size) +
").");
92 for(
auto& kwarg : kwargs)
94 std::string name = py::cast<std::string>(kwarg.first);
95 if(!detail::is_valid_bbm_arg_name<ARGS>(name, std::make_index_sequence<ARGS::size>{}))
throw std::runtime_error(std::string(
"BBM: invalid argument name '") + name +
"'.");
99 return detail::py_args_to_bbm_args<ARGS>(
args, kwargs, std::make_index_sequence<ARGS::size>{});
118 return OBJ_TYPE( py_args_to_bbm_args<typename OBJ_TYPE::constructor_args_t>(
args, kwargs) );
constructor concept
Definition: constructor.h:23
OBJ_TYPE create_object(py::args &args, py::kwargs &kwargs)
Construct an object with a valid 'constructor_args_t' based on python args and kwargs.
Definition: py_arg.h:116
auto py_args_to_bbm_args(py::args &args, py::kwargs &kwargs)
Create a bbm::arg from py:args and py::kwargs.
Definition: py_arg.h:86
Definition: aggregatebsdf.h:29
std::string toString(const T &)
toString alias
Definition: stringconvert.h:594
decltype(auto) value(T &&t)
return the value of an attribute, or if not an attribute the object
Definition: attribute_value.h:20
Wrapper around py::cast for more robust casting to attributes and to aggregate types such as vec2d,...
Forward declaration.
Definition: args.h:248
static constexpr size_t size
Definition: args.h:282
static TARGET cast(T &&t)
Definition: py_cast.h:26