Starting to add messages to SCWrapper

nix
Owen Green 7 years ago
parent a160a86c76
commit 53b9d7dc0f

@ -361,28 +361,35 @@ class FluidSCWrapper : public impl::FluidSCWrapperBase<C>
{ {
using FloatControlsIter = impl::FloatControlsIter; using FloatControlsIter = impl::FloatControlsIter;
// Iterate over arguments via callbacks from params object template <typename ArgType>
template <typename ArgType, size_t N, typename T> struct ParamReader
struct Setter
{ {
static constexpr size_t argSize = C::getParameterDescriptors().template get<N>().fixedSize;
static auto fromArgs(World *, FloatControlsIter& args, LongT::type, int) { return args.next(); }
auto fromArgs(World *, FloatControlsIter& args, LongT::type, int) { return args.next(); } static auto fromArgs(World *, FloatControlsIter& args, FloatT::type, int) { return args.next(); }
auto fromArgs(World *, FloatControlsIter& args, FloatT::type, int) { return args.next(); } static auto fromArgs(World *, sc_msg_iter* args, LongT::type, int defVal) { return args->geti(defVal); }
auto fromArgs(World *, sc_msg_iter* args, LongT::type, int defVal) { return args->geti(defVal); } static auto fromArgs(World *, sc_msg_iter* args, FloatT::type, int) { return args->getf(); }
auto fromArgs(World *, sc_msg_iter* args, FloatT::type, int) { return args->getf(); }
auto fromArgs(World *w, ArgType args, BufferT::type, int) static auto fromArgs(World *w, ArgType args, BufferT::type, int)
{ {
typename LongT::type bufnum = static_cast<LongT::type>(fromArgs(w, args, LongT::type(), -1)); typename LongT::type bufnum = static_cast<LongT::type>(fromArgs(w, args, LongT::type(), -1));
return BufferT::type(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr); return BufferT::type(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr);
} }
auto fromArgs(World *w, ArgType args, InputBufferT::type, int) static auto fromArgs(World *w, ArgType args, InputBufferT::type, int)
{ {
typename LongT::type bufnum = static_cast<LongT::type>(fromArgs(w, args, LongT::type(), -1)); typename LongT::type bufnum = static_cast<LongT::type>(fromArgs(w, args, LongT::type(), -1));
return InputBufferT::type(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr); return InputBufferT::type(bufnum >= 0 ? new SCBufferAdaptor(bufnum, w) : nullptr);
} }
};
// Iterate over arguments via callbacks from params object
template <typename ArgType, size_t N, typename T>
struct Setter
{
static constexpr size_t argSize = C::getParameterDescriptors().template get<N>().fixedSize;
typename T::type operator()(World *w, ArgType args) typename T::type operator()(World *w, ArgType args)
{ {
@ -390,17 +397,49 @@ class FluidSCWrapper : public impl::FluidSCWrapperBase<C>
using LiteralType = typename ParamLiteralConvertor<T, argSize>::LiteralType; using LiteralType = typename ParamLiteralConvertor<T, argSize>::LiteralType;
for (size_t i = 0; i < argSize; i++) for (size_t i = 0; i < argSize; i++)
a[i] = static_cast<LiteralType>(fromArgs(w, args, a[0], 0)); a[i] = static_cast<LiteralType>(ParamReader<ArgType>::fromArgs(w, args, a[0], 0));
return a.value(); return a.value();
} }
}; };
template <size_t N, typename T> template <size_t N, typename T>
using ArgumentSetter = Setter<sc_msg_iter*, N, T>; using ArgumentSetter = Setter<sc_msg_iter*, N, T>;
template <size_t N, typename T> template <size_t N, typename T>
using ControlSetter = Setter<FloatControlsIter&, N, T>; using ControlSetter = Setter<FloatControlsIter&, N, T>;
//Sets up a single /u_cmd
template<size_t N, typename T>
struct SetupMessage
{
void operator()(const T& message)
{
// class_addmethod(getClass(), (method)invokeMessage<N>, message.name,A_GIMME, 0);
auto ft = getInterfaceTable();
ft->fDefineUnitCmd(message.name, invokeMessage<N>);
}
};
template<size_t N>
static void invokeMessage(FluidSCWrapper* x,sc_msg_iter* args)
{
using IndexList = typename Client::MessageSetType::template MessageDescriptorAt<Client,N>::IndexList;
invokeMessageImpl<N>(x,s,ac,av,IndexList());
}
template<size_t N, size_t...Is>
static void invokeMessageImp(FluidSCWrapper* x,sc_msg_iter* inArgs,std::index_sequence<Is...>)
{
using ArgTuple = typename Client::MessageSetType::template MessageDescriptorAt<Client,N>::ArgumentTypes;
ArgTuple args;
(void)std::initializer_list<int>{(std::get<Is>(args) = (ParamReader<sc_msg_iter>::fromArgs(x->mWorld,inArgs,std::get<Is>(args)),0))...};
}
public: public:
using Client = C; using Client = C;
using ParameterSetType = typename C::ParamSetType; using ParameterSetType = typename C::ParamSetType;

Loading…
Cancel
Save