По сути, это еще одна реализация бинарного поиска (кстати, про std::array: std:: что_угодно в микроконтроллерах чаще всего применить не получится, контейнеры точно). Да, с числовыми ключами проще было бы определить массив и искать в нём.
В этом плане не могу не согласиться, что такая опасность есть. Жаль, мой уровень квалификации не позволяет нормально оценить влияние раздутого кода на выполнение программы. Наверно, если когда-то вздумается тащить всё в продакшн, следует провести качественные эксперименты.
Вы правы, с числовыми ключами это бессмысленно, но глобальная идея в использовании префиксного дерева, а там сравнение ключей сильно отличается, Patricia, на которое я нацелился, подразумевает сравнение одного лишь бита в каждом узле.
Также к своему стыду признаюсь, что так и не понял, можно ли статический массив разместить во Flash, а доступ к нему получать в runtime? Или придется все равно городить список типов?
Бегло посмотрел справку на std::lower_bound/upper_bound, они принимают конкретные runtime-параметры, тогда вопрос: в какой памяти окажется этот массив? Да, он статический и constexpr, то есть проинициализирован целиком в compile-time, однако какую память будет в итоге занимать?
Не знал про такой проект, пролистал описание, выглядит очень интересно, спасибо! Более чем возможно, что получится его применить в своем проекте, а не изобретать велосипед, как обычно бывает :(
С массивами тоже приходилось иметь дело, однако ситуация такова, что задать данные надо статическими, а иметь к ним доступ в runtime. Или я не так понял про массивы.
Да, по сути, это switch-case, но именно бинарный, то есть поиск все же за O(logn).
Динамическое добавление узлов здесь никак, к сожалению (это уже реальные объекты, а их у меня нет вовсе).
Кстати интересная мысль! Насколько я помню, несовпадение хешей означает 100% отличия ключей, но совпадение (что очевидно) не гарантирует их равенство. В случае с МК строковых констант будет очень и очень немного, что позволяет надеяться на отсутствие коллизий (+ их на этапе компиляции можно обнаружить) и тогда действительно строковые ключи с большой вероятностью можно превратить в числовые.
Вы правы, ничем, если речь идет про числовые ключи: в таком случае можно задать упорядоченный массив, по нему бинарный поиск и всё будет хорошо и быстро работать. Первоначальная идея подразумевает ключи строковые и тогда, как я предположил, постоянное сравнение строк при поиске в массиве будет накладным, поэтому обратил внимание на префиксные деревья.
Последня цифра номера может быть контрольным числом
Тогда придется делать статью с попыткой объяснить, почему порядковые номера прирастают вдвое медленнее, чем число заболевших. А таким объяснить будет непросто, потому что первым напрашивается предположение, что привитые таки меньше болеют.
А можно предложить и оптимистичный сценарий: никому не нужные запчасти, которые рискуют превратится в мусор — это убытки производителя, а один из очевидных способов их минимизировать — максимально долго использовать одни и те же детали.
Мне кажется, странно предъявлять претензий к PlatformIO по поводу разрастания проекта и тут же использовать HAL, который тоже тащит кучу всего, причем прямиком в прошивку.
Конечно, буду более чем рад. Можно зайти в любую из моих статей, везде внизу есть ссылка на github (здесь не буду оставлять, думаю, это не очень красиво будет, как реклама).
My bad, не сразу понял, что Goron_Dekar имел ввиду. Перечитал и осознал, что идея именно для списка пинов применять настройки. Мой пример делает это для списка портов, но и для пинов есть соответствующий функционал, который заключается в получении для списка пинов списка портов (причем уникального).
Получаю список портов так:
using UsedPorts = typename Unique<TypeList<typename _Pins::Port...>>::type;
Ну, собственно, этот список портов уже применим для предложенного выше кода.
Это есть у Чижова, список типов, инстанцированный нужным набором портов. При разработке форка его mcucpp я тоже такое добавил, чтобы при настройке PinList-а одной строкой все используемые порты настроить (+ добавил уникальность). Вот так примерно выглядит:
Также к своему стыду признаюсь, что так и не понял, можно ли статический массив разместить во Flash, а доступ к нему получать в runtime? Или придется все равно городить список типов?
Динамическое добавление узлов здесь никак, к сожалению (это уже реальные объекты, а их у меня нет вовсе).
Получаю список портов так:
Ну, собственно, этот список портов уже применим для предложенного выше кода.