@@ -20,23 +20,70 @@ struct ArrayToBuffer
2020 halp_meta (author, " ossia score" )
2121 halp_meta (uuid, " 3127c11b-61d3-4d5e-a896-8b56e628dfbc" )
2222
23+ enum Type
24+ {
25+ Float32,
26+ Float64,
27+ SInt32,
28+ UInt32,
29+ SInt16,
30+ UInt16,
31+ SInt8,
32+ UInt8,
33+ };
34+
2335 struct
2436 {
2537 halp::val_port<" Input" , std::vector<float >> main;
38+ halp::enum_t <Type, " Type" > type;
2639 } inputs;
2740
2841 struct
2942 {
3043 halp::cpu_buffer_output<" Output" > main;
3144 } outputs;
3245
46+ template <typename T>
47+ void process ()
48+ {
49+ if constexpr (std::is_same_v<T, decltype (inputs.main .value )::value_type>)
50+ {
51+ // Direct reuse of the buffer
52+ outputs.main .buffer .raw_data = (unsigned char *)inputs.main .value .data ();
53+ outputs.main .buffer .byte_size = inputs.main .value .size () * sizeof (float );
54+ outputs.main .buffer .byte_offset = 0 ;
55+ outputs.main .buffer .changed = true ;
56+ }
57+ else
58+ {
59+ // Allocation and copy :'(
60+ auto span = outputs.main .create <T>(inputs.main .value .size ());
61+ std::copy_n (inputs.main .value .data (), inputs.main .value .size (), span.data ());
62+ outputs.main .buffer .changed = true ;
63+ }
64+ }
65+
3366 void operator ()() noexcept
3467 {
35- const int num_elements = inputs.main .value .size ();
36- outputs.main .buffer .raw_data = (unsigned char *)inputs.main .value .data ();
37- outputs.main .buffer .byte_size = inputs.main .value .size () * sizeof (float );
38- outputs.main .buffer .byte_offset = 0 ;
39- outputs.main .buffer .changed = true ;
68+ switch (inputs.type )
69+ {
70+ case Type::Float32:
71+ return process<float >();
72+ case Type::Float64:
73+ return process<double >();
74+ case Type::SInt32:
75+ return process<int32_t >();
76+ case Type::UInt32:
77+ return process<uint32_t >();
78+ case Type::SInt16:
79+ return process<int16_t >();
80+ case Type::UInt16:
81+ return process<uint16_t >();
82+ case Type::SInt8:
83+ return process<int8_t >();
84+ case Type::UInt8:
85+ return process<uint8_t >();
86+ }
4087 }
4188};
4289}
0 commit comments