Зашел. О, мои глаза!
Какое-то сборище наркоманов!!!
Я на гитхабе, в ЖЖ
а вот соглашусь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 писал(а):в передаче функций компилятору
Код: Выделить всё
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)
&& (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
{
/* configure all port bits as output (all LCD lines on same port) */
DDR(LCD_DATA0_PORT) |= 0x7F;
}
else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
{
/* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
DDR(LCD_DATA0_PORT) |= 0x0F;
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
}
else
{
/* configure all port bits as output (LCD data and control lines on different ports */
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
}Код: Выделить всё
PinList<Data, RS, RW, E>::template mode<PinMode::PushPull>();согласен. но вопрос в том, как две или не две строки воспринимаются: если алгоритм виден, можно понять любому, а если алгоритм скрыт в библиотеке ли, в стандарте ли, в шаблоне ли и т.п. - тобоооольшой вопрос, сможет ли любой профи разобраться. данная дискуссия тому подтверждение: несколько явных профессионалов не могут друг друга понять, чего там говорить о самоучках, вроде меня?! foreach где-то в недрах тоже является простым for, но вот запись с foreach многих вводит в ступор, в отличие от forReflector писал(а):Их как бы не всегда две получается.
нет, это из библиотеки Питера Флури (или как он произносится) поддержки ЖКИReflector писал(а):из твоей FlexMenu
да, могла бы... но если развернуть эту строку - вряд ли получится более понятно, чем в библиотечке Питера...Reflector писал(а):А могла быть одна строка с определением класса
вообще говоря, стандарт - это эквивалент догмы. если стандарт непрерывно меняется, то чем это отличается от отсутствия стандарта?! перфекционизм - это хорошо, но перфекционистов на работу лучше не брать - ни одно дело не будет завершено, любой пустяк будет непрерывно улучшаться...VladislavS писал(а):является и основным тормозом в развитии языка
походу дела проблема с версиейVladislavS писал(а):чем собираешь с какими ключами компиляции? Версию языка бы поднять для начала. Для GCC вот так "-std=gnu++1z".
Код: Выделить всё
gcc version 4.8.4 20140725 (release) [ARM/embedded-4_8-branch revision 213147]Код: Выделить всё
template <typename F, typename...Ts>
constexpr void foreach(TypeList<Ts...>, F f)
{
(f(Ts{}), ...);
}а зачем Reflector развернул функцию lcd_init()? если не разворачивать, то все лаконично-понятно, аж слеза накатываетVladislavS писал(а):Зачем его разворачивать?