9 #define SEQUENCER_DEVICE_CC_VALUES \ 10 X( std::int16_t, min, false ) \ 11 X( std::int16_t, max, false ) \ 12 X( std::int16_t, value, false ) \ 13 X( std::uint8_t, cc_msb, false ) \ 14 X( std::uint8_t, cc_lsb, true ) \ 15 X( std::uint8_t, decimals, true ) 17 #define SEQUENCER_DEVICE_CC_ENTRIES \ 18 X( std::string, name, false ) \ 19 SEQUENCER_DEVICE_CC_VALUES \ 20 X( std::vector< std::string >, str_map, true ) \ 21 X( std::vector< int >, map, true ) 25 #define X( type, name, is_optional ) type name{}; 32 #define X( type, name, is_optional ) \ 33 os << ( ( is_optional ) ? sub_sep : sep ) << " " << #name ": " << int( entry.name ); 36 constexpr
auto sep =
";";
37 constexpr
auto sub_sep =
",";
38 os <<
"name: " << entry.name;
40 if ( !entry.str_map.empty() )
42 os << sep <<
"str_map: " << entry.str_map.front();
43 for ( decltype( entry.str_map.size() ) i = 1; i < entry.str_map.size(); ++i )
45 os << sub_sep <<
" " << entry.str_map[ i ];
48 if ( !entry.map.empty() )
50 os << sep <<
"map: " << int( entry.map.front() );
51 for ( decltype( entry.map.size() ) i = 1; i < entry.map.size(); ++i )
53 os << sub_sep <<
" " << int( entry.map[ i ] );
62 explicit section_t(
const std::string& name ) : name( name )
66 explicit section_t( std::string&& name ) : name(
std::move( name ) )
71 std::vector< device_entry_t > entries{};
76 os <<
"section: " << section.
name <<
"\n";
77 for (
const auto& entry : section.
entries )
Definition: device_spec.hpp:26
section_t(std::string &&name)
Definition: device_spec.hpp:66
Definition: beat_duration.hpp:106
std::ostream & operator<<(std::ostream &os, const device_entry_t &entry)
Definition: device_spec.hpp:34
#define SEQUENCER_DEVICE_CC_VALUES
Definition: device_spec.hpp:9
Definition: device_spec.hpp:60
section_t(const std::string &name)
Definition: device_spec.hpp:62
std::vector< device_entry_t > entries
Definition: device_spec.hpp:71
#define SEQUENCER_DEVICE_CC_ENTRIES
Definition: device_spec.hpp:17
std::string name
Definition: device_spec.hpp:70