Код: Выделить всё
if(((GPIO_TypeDef*)GpioID)->ODR & PM) ((GPIO_TypeDef*)GpioID)->BRR = PM; else ((GPIO_TypeDef*)GpioID)->BSRR = PM;Код: Выделить всё
if(((GPIO_TypeDef*)GpioID)->ODR & PM) ((GPIO_TypeDef*)GpioID)->BRR = PM; else ((GPIO_TypeDef*)GpioID)->BSRR = PM;а вот соглашусьEddy_Em писал(а):Там такой дичи, как лямбды, шаблоны и т.п., не было!
ожидал такого ответа.VladislavS писал(а):Извини, библиотека не для распространения.
Код: Выделить всё
error: body of constexpr function 'constexpr uint32_t countSetBits(uint32_t)' not a return-statementКод: Выделить всё
warning: 'base' function uses 'auto' type specifier without trailing return type [enabled by default]Код: Выделить всё
error: expected '(' before 'constexpr'Код: Выделить всё
#ifndef TIMER_H_
#define TIMER_H_
#include "cmsis_device.h"
// ----------------------------------------------------------------------------
class Timer
{
public:
typedef uint32_t ticks_t;
static constexpr ticks_t FREQUENCY_HZ = 1000u;
private:
static volatile ticks_t ms_delayCount;
public:
// Default constructor
Timer() = default;
inline void
start(void)
{
// Use SysTick as reference for the delay loops.
SysTick_Config(SystemCoreClock / FREQUENCY_HZ);
}
static void
sleep(ticks_t ticks);
inline static void
tick(void)
{
// Decrement to zero the counter used by the delay routine.
if (ms_delayCount != 0u)
{
--ms_delayCount;
}
}
};
// ----------------------------------------------------------------------------
#endif // TIMER_H_
не соглашусь, но спорить, в виду оффтопности, не стануVladislavS писал(а):Делается это всё чтобы и на огрызке, и на всём зоопарке роботов работало одинаково
Код: Выделить всё
static void _inline_ set() { foreach(ports_, [](auto port) _inline_ { GpioT<port.value, getPinsMask<port.value>(pins_)>::set(); }); }Код: Выделить всё
static void _inline_ set() { set_(ports_); }
template<typename... Ports>
static void _inline_ set_(TypeList<Ports...> ports)
{
(GpioT<Ports::gpio, getPinsMask<Ports::gpio>(pins_)>::set(), ...);
}
Код: Выделить всё
static void _inline_ set() { set_(ports_, pins_); }
template<typename... Ports, typename... Ps>
static void _inline_ set_(TypeList<Ports...> ports, TypeList<Ps...> pins)
{
if constexpr (!empty(ports))
{
static constexpr uint32_t gpio = decltype(head(ports))::type::gpio;
GpioT<gpio, getPinsMask<gpio>(pins)>::set();
set_(pop_front(ports), pins);
}
}
единственное, что я увидел в этих примерах, что был прав:Reflector писал(а):И раньше действительно было без них
Добавлено after 59 seconds:ARV писал(а):все это делается, имхо, исключительно ради того, чтобы программист писал каждый новый класс/метод ТОЛЬКО из трех строк,
считаем строкиReflector писал(а):Код: Выделить всё
template<typename... Ports> static void _inline_ set_(TypeList<Ports...> ports) { (GpioT<Ports::gpio, getPinsMask<Ports::gpio>(pins_)>::set(), ...); }
Код: Выделить всё
static void _inline_ set() { foreach(ports_, [](auto port) _inline_ { GpioT<port.value, getPinsMask<port.value>(pins_)>::set(); }); }Код: Выделить всё
static inline void set() { foreach(ports_, [](auto port) { port.set(); } ); }имхо, все хорошо в меру. мы уже имеем "универсальную" ОС Windows, каждое обновление которой ломает что-то из ранее стабильно работавшего. теперь тот же подход привносится и в язык: вместо того, чтобы реализовать АЛГОРИТМ (пусть и ручками), который понятен и подлежит анализу на предмет ошибок, вы/мы/они перекладывают эту работу на компилятор и стандарт языка. мало было в стандарте фич, которые стали устаревшими и нерекомендуемыми ныне? не мало. поэтому написав вот такую вашу свертку-лямбду-ксяу вы будете непрерывно трястись над своим кодом, чтобы не дай бог в новой инкарнации стандарта это не стало вести себя иначе...VladislavS писал(а):в передаче функций компилятору