30class device_parameter_index :
public Nano::Observer
36 dev.on_parameter_created.connect<&device_parameter_index::on_parameter_created>(
38 dev.on_parameter_removing.connect<&device_parameter_index::on_parameter_removing>(
40 dev.on_node_removing.connect<&device_parameter_index::on_node_removing>(*this);
41 dev.on_node_renamed.connect<&device_parameter_index::on_node_renamed>(*this);
43 index_recursively(dev.get_root_node());
46 device_parameter_index(
const device_parameter_index&) =
delete;
47 device_parameter_index(device_parameter_index&&) =
delete;
48 device_parameter_index& operator=(
const device_parameter_index&) =
delete;
49 device_parameter_index& operator=(device_parameter_index&&) =
delete;
54 bool apply(std::string_view address, F&& f)
57 return m_index.visit(normalize(address, buf), [&](
const auto& e) { f(*e.second); })
63 void clear() { m_index.clear(); }
65 std::size_t size()
const {
return m_index.size(); }
70 static std::string_view normalize(std::string_view address, std::string& buf)
72 while(address.size() > 1 && address.back() ==
'/')
73 address.remove_suffix(1);
75 if(!address.empty() && address.front() ==
'/')
78 buf.reserve(address.size() + 1);
88 return ossia::net::osc_parameter_string(node);
91 void index_recursively(
const ossia::net::node_base& node)
93 if(
auto param = node.get_parameter())
94 m_index.insert_or_assign(address_of(node), param);
97 index_recursively(*cld);
100 void on_parameter_created(
const ossia::net::parameter_base& param)
102 m_index.insert_or_assign(
103 address_of(param.get_node()),
const_cast<ossia::net::parameter_base*
>(¶m));
106 void on_parameter_removing(
const ossia::net::parameter_base& param)
108 m_index.erase(address_of(param.get_node()));
111 void on_node_removing(ossia::net::node_base& node)
116 const auto prefix = address_of(node);
118 m_index.erase_if([&prefix](
const auto& e) {
119 const auto& key = e.first;
121 || (key.size() > prefix.size() && key.starts_with(prefix)
122 && key[prefix.size()] ==
'/');
126 void on_node_renamed(ossia::net::node_base& node,
const std::string& old_name)
131 index_recursively(m_device.get_root_node());
134 ossia::net::device_base& m_device;
135 boost::concurrent_flat_map<
136 std::string, ossia::net::parameter_base*, ossia::string_hash, std::equal_to<>>
bool apply(std::string_view address, F &&f)
Run f on the parameter at address, if there is one.
Definition device_parameter_index.hpp:54