Merge pull request #911 from keyboardio/f/cpplint

Make compilation warning-free, and the source cpplint-clean
pull/912/head
Jesse Vincent 4 years ago committed by GitHub
commit 3024fa461c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -19,6 +19,7 @@ install:
- ln -s $(pwd) ../hardware/keyboardio/avr/libraries/Kaleidoscope - ln -s $(pwd) ../hardware/keyboardio/avr/libraries/Kaleidoscope
script: script:
- unset CC - unset CC
- make cpplint BOARD_HARDWARE_PATH=$(pwd)/../hardware
- make travis-install-arduino BOARD_HARDWARE_PATH=$(pwd)/../hardware - make travis-install-arduino BOARD_HARDWARE_PATH=$(pwd)/../hardware
- (cd ../hardware/keyboardio && make prepare-virtual) - (cd ../hardware/keyboardio && make prepare-virtual)
- make -C tests all BOARD_HARDWARE_PATH=$(pwd)/../hardware ARDUINO_PATH="$(pwd)/arduino-1.8.13" - make -C tests all BOARD_HARDWARE_PATH=$(pwd)/../hardware ARDUINO_PATH="$(pwd)/arduino-1.8.13"

@ -44,7 +44,7 @@ KEYMAPS(
) )
/* *INDENT-ON* */ /* *INDENT-ON* */
using namespace kaleidoscope::sketch_exploration; using namespace kaleidoscope::sketch_exploration; // NOLINT(build/namespaces)
class BPlugin : public kaleidoscope::Plugin {}; class BPlugin : public kaleidoscope::Plugin {};
class CPlugin : public kaleidoscope::Plugin {}; class CPlugin : public kaleidoscope::Plugin {};

@ -47,7 +47,7 @@ class MatrixAddr {
constexpr MatrixAddr(uint8_t row, uint8_t col) constexpr MatrixAddr(uint8_t row, uint8_t col)
: offset_(row * cols + col) {} : offset_(row * cols + col) {}
constexpr MatrixAddr(uint8_t offset) explicit constexpr MatrixAddr(uint8_t offset)
: offset_(offset) {} : offset_(offset) {}
// Rely on the default copy and move constructor. // Rely on the default copy and move constructor.
@ -57,8 +57,8 @@ class MatrixAddr {
// ridiculously bad assembler code for each copy construction, // ridiculously bad assembler code for each copy construction,
// that would bloat the default firmware by 1K of PROGMEM! // that would bloat the default firmware by 1K of PROGMEM!
// //
constexpr MatrixAddr(const ThisType &other) = default; constexpr MatrixAddr(const ThisType &other) = default; // NOLINT(runtime/explicit)
constexpr MatrixAddr(ThisType &&other) = default; constexpr MatrixAddr(ThisType &&other) = default; // NOLINT(runtime/explicit)
//constexpr MatrixAddr(const ThisType &other) : offset_(other.offset_) {} //constexpr MatrixAddr(const ThisType &other) : offset_(other.offset_) {}
//constexpr MatrixAddr(ThisType &&other) : offset_(other.offset_) {} //constexpr MatrixAddr(ThisType &&other) : offset_(other.offset_) {}
@ -66,8 +66,7 @@ class MatrixAddr {
ThisType &operator=(ThisType &&) = default; ThisType &operator=(ThisType &&) = default;
template<typename MatrixAddr__> template<typename MatrixAddr__>
explicit explicit constexpr MatrixAddr(const MatrixAddr__ &other)
constexpr MatrixAddr(const MatrixAddr__ &other)
: MatrixAddr(other.row(), other.col()) { : MatrixAddr(other.row(), other.col()) {
static_assert(MatrixAddr__::rows <= ThisType::rows, static_assert(MatrixAddr__::rows <= ThisType::rows,
"Matrix type conversion failed. Source type must not have greater row size than target type"); "Matrix type conversion failed. Source type must not have greater row size than target type");

@ -113,7 +113,7 @@ class Bitfield : public internal::_BaseBitfield {
static constexpr size_t n_bytes_ = nBytesForBits(BitCount__); static constexpr size_t n_bytes_ = nBytesForBits(BitCount__);
template<typename ... Bits__> template<typename ... Bits__>
constexpr Bitfield(Bits__...bits) : bits_(bits...) { explicit constexpr Bitfield(Bits__...bits) : bits_(bits...) {
static_assert(sizeof...(Bits__) == n_bits_, static_assert(sizeof...(Bits__) == n_bits_,
"Invalid number of bits supplied to Bitfield<BitCount__> constructor. \n" "Invalid number of bits supplied to Bitfield<BitCount__> constructor. \n"
"Compare the number of bits supplied with the provided template \n" "Compare the number of bits supplied with the provided template \n"

@ -274,22 +274,24 @@ void RaiseKeyScanner::readMatrix() {
if (RaiseHands::leftHand.readKeys()) { if (RaiseHands::leftHand.readKeys()) {
leftHandState = RaiseHands::leftHand.getKeyData(); leftHandState = RaiseHands::leftHand.getKeyData();
// if ANSI, then swap r3c0 and r3c1 to match the PCB // if ANSI, then swap r3c0 and r3c1 to match the PCB
if (RaiseHands::layout == LAYOUT_ANSI) if (RaiseHands::layout == LAYOUT_ANSI) {
// only swap if bits are different // only swap if bits are different
if ((leftHandState.rows[3] & (1 << 0)) ^ leftHandState.rows[3] & (1 << 1)) { if ((leftHandState.rows[3] & (1 << 0)) ^ leftHandState.rows[3] & (1 << 1)) {
leftHandState.rows[3] ^= (1 << 0); // flip the bit leftHandState.rows[3] ^= (1 << 0); // flip the bit
leftHandState.rows[3] ^= (1 << 1); // flip the bit leftHandState.rows[3] ^= (1 << 1); // flip the bit
} }
}
} }
if (RaiseHands::rightHand.readKeys()) { if (RaiseHands::rightHand.readKeys()) {
rightHandState = RaiseHands::rightHand.getKeyData(); rightHandState = RaiseHands::rightHand.getKeyData();
// if ANSI, then swap r1c0 and r2c0 to match the PCB // if ANSI, then swap r1c0 and r2c0 to match the PCB
if (RaiseHands::layout == LAYOUT_ANSI) if (RaiseHands::layout == LAYOUT_ANSI) {
if ((rightHandState.rows[1] & (1 << 0)) ^ rightHandState.rows[2] & (1 << 0)) { if ((rightHandState.rows[1] & (1 << 0)) ^ rightHandState.rows[2] & (1 << 0)) {
rightHandState.rows[1] ^= (1 << 0); rightHandState.rows[1] ^= (1 << 0);
rightHandState.rows[2] ^= (1 << 0); rightHandState.rows[2] ^= (1 << 0);
} }
}
} }
// if a side has just been replugged, initialise it // if a side has just been replugged, initialise it

@ -48,7 +48,7 @@ EventHandlerResult Focus::onFocusEvent(const char *command) {
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
} }
if (strcmp_P(command + 9, PSTR("side_power")) == 0) if (strcmp_P(command + 9, PSTR("side_power")) == 0) {
if (::Focus.isEOL()) { if (::Focus.isEOL()) {
::Focus.send(Runtime.device().side.getPower()); ::Focus.send(Runtime.device().side.getPower());
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
@ -58,6 +58,7 @@ EventHandlerResult Focus::onFocusEvent(const char *command) {
Runtime.device().side.setPower(power); Runtime.device().side.setPower(power);
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
} }
}
if (strcmp_P(command + 9, PSTR("side_ver")) == 0) { if (strcmp_P(command + 9, PSTR("side_ver")) == 0) {
::Focus.send("left:"); ::Focus.send("left:");
@ -83,7 +84,7 @@ EventHandlerResult Focus::onFocusEvent(const char *command) {
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
} }
if (strcmp_P(command + 9, PSTR("sled_current")) == 0) if (strcmp_P(command + 9, PSTR("sled_current")) == 0) {
if (::Focus.isEOL()) { if (::Focus.isEOL()) {
::Focus.send("left:"); ::Focus.send("left:");
::Focus.send(Runtime.device().side.leftSLEDCurrent()); ::Focus.send(Runtime.device().side.leftSLEDCurrent());
@ -96,6 +97,7 @@ EventHandlerResult Focus::onFocusEvent(const char *command) {
Runtime.device().side.setSLEDCurrent(current); Runtime.device().side.setSLEDCurrent(current);
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
} }
}
if (strcmp_P(command + 9, PSTR("layout")) == 0) { if (strcmp_P(command + 9, PSTR("layout")) == 0) {
static const auto ANSI = Runtime.device().settings.Layout::ANSI; static const auto ANSI = Runtime.device().settings.Layout::ANSI;

@ -56,7 +56,7 @@ typedef union {
class Hand { class Hand {
public: public:
Hand(byte ad01) : ad01_(ad01), twi_(i2c_addr_base_ | ad01) {} explicit Hand(byte ad01) : ad01_(ad01), twi_(i2c_addr_base_ | ad01) {}
int readVersion(); int readVersion();
int readSLEDVersion(); int readSLEDVersion();

@ -16,6 +16,8 @@
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#pragma once
#ifdef ARDUINO_SAMD_RAISE #ifdef ARDUINO_SAMD_RAISE
#include <Arduino.h> #include <Arduino.h>
@ -27,7 +29,7 @@ namespace raise {
class TWI { class TWI {
public: public:
TWI(int addr) : addr_(addr), crc_errors_(0) {}; explicit TWI(int addr) : addr_(addr), crc_errors_(0) {}
uint8_t writeTo(uint8_t *data, size_t length); uint8_t writeTo(uint8_t *data, size_t length);
uint8_t readFrom(uint8_t* data, size_t length); uint8_t readFrom(uint8_t* data, size_t length);

@ -159,7 +159,7 @@ void ImagoLEDDriver::syncLeds() {
twi_writeTo(LED_DRIVER_ADDR, data, LED_REGISTER_DATA0_SIZE + 1, 1, 0); twi_writeTo(LED_DRIVER_ADDR, data, LED_REGISTER_DATA0_SIZE + 1, 1, 0);
// Don't reset "Last LED", because this is just us picking up from the last bank // Don't reset "Last LED", because this is just us picking up from the last bank
// TODO - we don't use all 117 LEDs on the Imago, so we can probably stop writing earlier // TODO(anyone) - we don't use all 117 LEDs on the Imago, so we can probably stop writing earlier
// Write the second LED bank // Write the second LED bank
// For space efficiency, we reuse the LED sending buffer // For space efficiency, we reuse the LED sending buffer

@ -48,9 +48,6 @@ KeyboardioScanner Model01Hands::leftHand(0);
KeyboardioScanner Model01Hands::rightHand(3); KeyboardioScanner Model01Hands::rightHand(3);
void Model01Hands::setup(void) { void Model01Hands::setup(void) {
// TODO: Consider not doing this until 30s after keyboard
// boot up, to make it easier to rescue things in case of power draw issues.
// This lets the keyboard pull up to 1.6 amps from the host. // This lets the keyboard pull up to 1.6 amps from the host.
// That violates the USB spec. But it sure is pretty looking // That violates the USB spec. But it sure is pretty looking
DDRE |= _BV(6); DDRE |= _BV(6);

@ -16,10 +16,9 @@
with this program. If not, see <http://www.gnu.org/licenses/>. with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifdef __AVR__ #pragma once
#ifndef twi_h #ifdef __AVR__
#define twi_h
#ifndef KALEIDOSCOPE_VIRTUAL_BUILD #ifndef KALEIDOSCOPE_VIRTUAL_BUILD
@ -56,4 +55,3 @@ void twi_releaseBus(void);
#endif // ifndef KALEIDOSCOPE_VIRTUAL_BUILD #endif // ifndef KALEIDOSCOPE_VIRTUAL_BUILD
#endif #endif
#endif

@ -29,7 +29,7 @@
namespace kaleidoscope { namespace kaleidoscope {
using namespace logging; using namespace logging; // NOLINT(build/namespaces)
// For each bit set in 'bitfield', output the corresponding string to 'stream' // For each bit set in 'bitfield', output the corresponding string to 'stream'
#define FOREACHBIT(bitfield, stream, str0, str1, str2, str3, str4, str5, str6, str7) \ #define FOREACHBIT(bitfield, stream, str0, str1, str2, str3, str4, str5, str6, str7) \

@ -53,7 +53,7 @@ namespace kaleidoscope {
namespace device { namespace device {
namespace virt { namespace virt {
using namespace kaleidoscope::logging; using namespace kaleidoscope::logging; // NOLINT(build/namespaces)
//############################################################################## //##############################################################################
// VirtualKeyScanner // VirtualKeyScanner
@ -167,9 +167,11 @@ void VirtualKeyScanner::readMatrix() {
std::string token; std::string token;
std::getline(sline, token, ' '); std::getline(sline, token, ' ');
if (token == "") break; // end of line if (token == "") {
else if (token == "#") break; // skip the rest of the line break; // end of line
else if ((token == "?" || token == "help") && isInteractive()) { } else if (token == "#") {
break; // skip the rest of the line
} else if ((token == "?" || token == "help") && isInteractive()) {
printHelp(); printHelp();
} else if (token == "Q") { } else if (token == "Q") {
exit(0); exit(0);
@ -204,7 +206,7 @@ void VirtualKeyScanner::readMatrix() {
} }
} }
} else { } else {
// TODO: Is there a device independent // TODO(anyone): Is there a device independent
// way to determine KeyAddr from key names? // way to determine KeyAddr from key names?
// key_addr = getRCfromPhysicalKey(token); // key_addr = getRCfromPhysicalKey(token);
// //
@ -358,7 +360,7 @@ void VirtualLEDDriver::syncLeds() {
} }
void VirtualLEDDriver::setCrgbAt(uint8_t i, cRGB color) { void VirtualLEDDriver::setCrgbAt(uint8_t i, cRGB color) {
if ((int)i >= (int)led_count) { if (static_cast<int>(i) >= static_cast<int>(led_count)) {
log_error("Virtual::setCrgbAt: Index %d out of bounds\n", i); log_error("Virtual::setCrgbAt: Index %d out of bounds\n", i);
return; return;
} }
@ -366,7 +368,7 @@ void VirtualLEDDriver::setCrgbAt(uint8_t i, cRGB color) {
} }
cRGB VirtualLEDDriver::getCrgbAt(uint8_t i) const { cRGB VirtualLEDDriver::getCrgbAt(uint8_t i) const {
if ((int)i >= (int)led_count) { if (static_cast<int>(i) >= static_cast<int>(led_count)) {
log_error("Virtual::getCrgbAt: Index %d out of bounds\n", i); log_error("Virtual::getCrgbAt: Index %d out of bounds\n", i);
return CRGB(0, 0, 0); return CRGB(0, 0, 0);
} }

@ -86,10 +86,10 @@ class VirtualKeyScanner
bool read_matrix_enabled_; bool read_matrix_enabled_;
KeyState keystates_[matrix_rows * matrix_columns]; KeyState keystates_[matrix_rows * matrix_columns]; // NOLINT(runtime/arrays)
KeyState keystates_prev_[matrix_rows * matrix_columns]; KeyState keystates_prev_[matrix_rows * matrix_columns]; // NOLINT(runtime/arrays)
bool mask_[matrix_rows * matrix_columns]; bool mask_[matrix_rows * matrix_columns]; // NOLINT(runtime/arrays)
}; };
class VirtualLEDDriver class VirtualLEDDriver
@ -108,7 +108,7 @@ class VirtualLEDDriver
private: private:
cRGB led_states_[led_count]; cRGB led_states_[led_count]; // NOLINT(runtime/arrays)
}; };
// This overrides only the drivers and keeps the driver props of // This overrides only the drivers and keeps the driver props of

@ -310,7 +310,7 @@ class Keyboard {
if (!isModifierKey(released_key)) { if (!isModifierKey(released_key)) {
// TODO: this code is incomplete, but is better than nothing // TODO(anyone): this code is incomplete, but is better than nothing
// If we're toggling off the most recently toggled on key, clear // If we're toggling off the most recently toggled on key, clear
// last_keycode_toggled_on // last_keycode_toggled_on
if (last_keycode_toggled_on == released_key.getKeyCode()) { if (last_keycode_toggled_on == released_key.getKeyCode()) {
@ -424,7 +424,7 @@ class Keyboard {
// isModifierKey takes a Key and returns true if the key is a // isModifierKey takes a Key and returns true if the key is a
// keyboard key corresponding to a modifier like Control, Alt or Shift // keyboard key corresponding to a modifier like Control, Alt or Shift
// TODO: This function should be lifted to the Kaleidoscope core, somewhere. // TODO(anyone): This function should be lifted to the Kaleidoscope core, somewhere.
bool isModifierKey(Key key) { bool isModifierKey(Key key) {
// If it's not a keyboard key, return false // If it's not a keyboard key, return false

@ -75,7 +75,7 @@ class Base {
uint8_t offset_; uint8_t offset_;
public: public:
LEDRangeIterator() : offset_(0) {} LEDRangeIterator() : offset_(0) {}
LEDRangeIterator(uint8_t offset) : offset_(offset) {} explicit LEDRangeIterator(uint8_t offset) : offset_(offset) {}
typedef LEDRangeIterator ThisType; typedef LEDRangeIterator ThisType;

@ -80,12 +80,12 @@ class WS2812 {
} }
private: private:
Color leds_[ledCount]; Color leds_[ledCount]; // NOLINT(runtime/arrays)
uint8_t pinmask_; uint8_t pinmask_;
bool modified_ = false; bool modified_ = false;
void sendArrayWithMask(uint8_t maskhi) { void sendArrayWithMask(uint8_t maskhi) {
uint8_t *data = (uint8_t *)leds_; uint8_t *data = reinterpret_cast<uint8_t *>(leds_);
uint16_t datalen = ledCount * sizeof(Color); uint16_t datalen = ledCount * sizeof(Color);
uint8_t curbyte, ctr, masklo; uint8_t curbyte, ctr, masklo;
uint8_t sreg_prev; uint8_t sreg_prev;

@ -59,6 +59,6 @@ __attribute__((weak))
EventHandlerResult Hooks::exploreSketch EventHandlerResult Hooks::exploreSketch
<sketch_exploration::Sketch>() { <sketch_exploration::Sketch>() {
return EventHandlerResult::OK; return EventHandlerResult::OK;
}; }
} // namespace kaleidoscope } // namespace kaleidoscope

@ -36,7 +36,7 @@ class Key {
Key() = default; Key() = default;
constexpr Key(uint16_t raw) constexpr Key(uint16_t raw) // NOLINT(runtime/explicit)
: Key{(uint8_t)(raw & 0x00FF), (uint8_t)(raw >> 8)} : Key{(uint8_t)(raw & 0x00FF), (uint8_t)(raw >> 8)}
{} {}
@ -140,7 +140,7 @@ class Key {
DataProxy() = default; DataProxy() = default;
constexpr DataProxy(uint8_t value) : value_{value} {} constexpr DataProxy(uint8_t value) : value_{value} {} // NOLINT(runtime/explicit)
DEPRECATED(DIRECT_KEY_MEMBER_ACCESS) DEPRECATED(DIRECT_KEY_MEMBER_ACCESS)
DataProxy &operator=(uint8_t value) { DataProxy &operator=(uint8_t value) {

@ -42,14 +42,14 @@ class ColormapEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const ColormapEffect *parent) : parent_(parent) {} explicit TransientLEDMode(const ColormapEffect *parent) : parent_(parent) {}
protected: protected:
friend class ColormapEffect; friend class ColormapEffect;
virtual void onActivate(void) final; void onActivate(void) final;
virtual void refreshAt(KeyAddr key_addr) final; void refreshAt(KeyAddr key_addr) final;
private: private:
const ColormapEffect *parent_; const ColormapEffect *parent_;

@ -19,8 +19,6 @@
#include "kaleidoscope/keyswitch_state.h" #include "kaleidoscope/keyswitch_state.h"
#include "kaleidoscope/key_events.h" #include "kaleidoscope/key_events.h"
using namespace kaleidoscope::ranges;
namespace kaleidoscope { namespace kaleidoscope {
namespace plugin { namespace plugin {
@ -200,11 +198,11 @@ void DynamicMacros::play(uint8_t macro_id) {
} }
EventHandlerResult DynamicMacros::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) { EventHandlerResult DynamicMacros::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) {
if (mappedKey.getRaw() < DYNAMIC_MACRO_FIRST || mappedKey.getRaw() > DYNAMIC_MACRO_LAST) if (mappedKey.getRaw() < ranges::DYNAMIC_MACRO_FIRST || mappedKey.getRaw() > ranges::DYNAMIC_MACRO_LAST)
return EventHandlerResult::OK; return EventHandlerResult::OK;
if (keyToggledOn(keyState)) { if (keyToggledOn(keyState)) {
play(mappedKey.getRaw() - DYNAMIC_MACRO_FIRST); play(mappedKey.getRaw() - ranges::DYNAMIC_MACRO_FIRST);
} }
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;

@ -57,7 +57,7 @@ EventHandlerResult FingerPainter::onKeyswitchEvent(Key &mapped_key, KeyAddr key_
if (!key_addr.isValid()) if (!key_addr.isValid())
return EventHandlerResult::EVENT_CONSUMED; return EventHandlerResult::EVENT_CONSUMED;
// TODO: The following works only for keyboards with LEDs for each key. // TODO(anyone): The following works only for keyboards with LEDs for each key.
uint8_t color_index = ::LEDPaletteTheme.lookupColorIndexAtPosition(color_base_, Runtime.device().getLedIndex(key_addr)); uint8_t color_index = ::LEDPaletteTheme.lookupColorIndexAtPosition(color_base_, Runtime.device().getLedIndex(key_addr));

@ -102,16 +102,13 @@ void HardwareTestMode::testMatrix() {
// If the key is held down // If the key is held down
if (Runtime.device().isKeyswitchPressed(key_addr) && Runtime.device().wasKeyswitchPressed(key_addr)) { if (Runtime.device().isKeyswitchPressed(key_addr) && Runtime.device().wasKeyswitchPressed(key_addr)) {
Runtime.device().setCrgbAt(key_addr, green); Runtime.device().setCrgbAt(key_addr, green);
} } else if (state[keynum].bad == 1) {
// If we triggered chatter detection ever on this key
// If we triggered chatter detection ever on this key
else if (state[keynum].bad == 1) {
Runtime.device().setCrgbAt(key_addr, red); Runtime.device().setCrgbAt(key_addr, red);
} else if (state[keynum].tested == 0) { } else if (state[keynum].tested == 0) {
Runtime.device().setCrgbAt(key_addr, yellow); Runtime.device().setCrgbAt(key_addr, yellow);
} } else if (! Runtime.device().isKeyswitchPressed(key_addr)) {
// If the key is not currently pressed and was not just released and is not marked bad // If the key is not currently pressed and was not just released and is not marked bad
else if (! Runtime.device().isKeyswitchPressed(key_addr)) {
Runtime.device().setCrgbAt(key_addr, blue); Runtime.device().setCrgbAt(key_addr, blue);
} }
} }

@ -45,7 +45,7 @@ class Heatmap : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const Heatmap *parent); explicit TransientLEDMode(const Heatmap *parent);
void resetMap(); void resetMap();
EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state);
@ -53,7 +53,7 @@ class Heatmap : public Plugin,
protected: protected:
virtual void update() final; void update() final;
private: private:

@ -39,12 +39,12 @@ class LEDActiveLayerColorEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDActiveLayerColorEffect *parent); explicit TransientLEDMode(const LEDActiveLayerColorEffect *parent);
protected: protected:
virtual void onActivate(void) final; void onActivate(void) final;
virtual void refreshAt(KeyAddr key_addr) final; void refreshAt(KeyAddr key_addr) final;
private: private:

@ -23,7 +23,7 @@ namespace plugin {
uint16_t AlphaSquareEffect::length = 1000; uint16_t AlphaSquareEffect::length = 1000;
AlphaSquareEffect::TransientLEDMode::TransientLEDMode(AlphaSquareEffect */*parent*/) AlphaSquareEffect::TransientLEDMode::TransientLEDMode(AlphaSquareEffect */*parent*/) // NOLINT(readability/casting)
: last_key_left_(Key_NoKey), : last_key_left_(Key_NoKey),
last_key_right_(Key_NoKey) last_key_right_(Key_NoKey)
{} {}

@ -36,7 +36,7 @@ class AlphaSquareEffect : public Plugin,
// //
class TransientLEDMode : public LEDMode { class TransientLEDMode : public LEDMode {
public: public:
TransientLEDMode(AlphaSquareEffect *parent); explicit TransientLEDMode(AlphaSquareEffect *parent);
protected: protected:
void update(void) final; void update(void) final;

@ -50,11 +50,11 @@ class StalkerEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const StalkerEffect *parent); explicit TransientLEDMode(const StalkerEffect *parent);
protected: protected:
virtual void update() final; void update() final;
private: private:

@ -51,13 +51,13 @@ class WavepoolEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const WavepoolEffect *parent); explicit TransientLEDMode(const WavepoolEffect *parent);
EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state);
protected: protected:
virtual void update() final; void update() final;
private: private:

@ -19,7 +19,7 @@
#include "kaleidoscope_internal/LEDModeManager.h" #include "kaleidoscope_internal/LEDModeManager.h"
#include "kaleidoscope/keyswitch_state.h" #include "kaleidoscope/keyswitch_state.h"
using namespace kaleidoscope::internal; using namespace kaleidoscope::internal; // NOLINT(build/namespaces)
namespace kaleidoscope { namespace kaleidoscope {
namespace plugin { namespace plugin {

@ -24,7 +24,7 @@ namespace plugin {
class BootGreetingEffect : public kaleidoscope::Plugin { class BootGreetingEffect : public kaleidoscope::Plugin {
public: public:
BootGreetingEffect(void) {} BootGreetingEffect(void) {}
BootGreetingEffect(KeyAddr key_addr); explicit BootGreetingEffect(KeyAddr key_addr);
static KeyAddr user_key_addr; static KeyAddr user_key_addr;
static Key search_key; static Key search_key;

@ -37,11 +37,11 @@ class LEDBreatheEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDBreatheEffect *parent) explicit TransientLEDMode(const LEDBreatheEffect *parent)
: parent_(parent) {} : parent_(parent) {}
protected: protected:
virtual void update(void) final; void update(void) final;
private: private:

@ -47,12 +47,12 @@ class LEDChaseEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDChaseEffect *parent) explicit TransientLEDMode(const LEDChaseEffect *parent)
: parent_(parent), last_update_(Runtime.millisAtCycleStart()) {} : parent_(parent), last_update_(Runtime.millisAtCycleStart()) {}
protected: protected:
virtual void update() final; void update() final;
private: private:

@ -43,10 +43,10 @@ class LEDRainbowEffect : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDRainbowEffect *parent) explicit TransientLEDMode(const LEDRainbowEffect *parent)
: parent_(parent) {} : parent_(parent) {}
virtual void update() final; void update() final;
private: private:
@ -88,10 +88,10 @@ class LEDRainbowWaveEffect : public Plugin, public LEDModeInterface {
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDRainbowWaveEffect *parent) explicit TransientLEDMode(const LEDRainbowWaveEffect *parent)
: parent_(parent) {} : parent_(parent) {}
virtual void update() final; void update() final;
private: private:

@ -37,12 +37,12 @@ class LEDSolidColor : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const LEDSolidColor *parent) explicit TransientLEDMode(const LEDSolidColor *parent)
: parent_(parent) {} : parent_(parent) {}
protected: protected:
virtual void onActivate(void) final; void onActivate(void) final;
virtual void refreshAt(KeyAddr key_addr) final; void refreshAt(KeyAddr key_addr) final;
private: private:

@ -35,7 +35,7 @@ namespace plugin {
class TestMode : public kaleidoscope::Plugin { class TestMode : public kaleidoscope::Plugin {
public: public:
DEPRECATED(MODEL01_TESTMODE) EventHandlerResult beforeReportingState() {}; DEPRECATED(MODEL01_TESTMODE) EventHandlerResult beforeReportingState() {}
}; };
} }
} }

@ -45,7 +45,7 @@ class KeyAddrEventQueue {
private: private:
uint8_t length_{0}; uint8_t length_{0};
KeyAddr addrs_[_capacity]; KeyAddr addrs_[_capacity];
_Timestamp timestamps_[_capacity]; _Timestamp timestamps_[_capacity]; // NOLINT(runtime/arrays)
_Bitfield release_event_bits_; _Bitfield release_event_bits_;
public: public:

@ -37,12 +37,12 @@ class TriColor : public Plugin,
// for those LED modes that require access to // for those LED modes that require access to
// members of their parent class. Most LED modes can do without. // members of their parent class. Most LED modes can do without.
// //
TransientLEDMode(const TriColor *parent) explicit TransientLEDMode(const TriColor *parent)
: parent_(parent) {} : parent_(parent) {}
protected: protected:
virtual void update(void) final; void update(void) final;
private: private:

@ -19,6 +19,8 @@
#include "kaleidoscope/Runtime.h" #include "kaleidoscope/Runtime.h"
#include <Kaleidoscope-Ranges.h> #include <Kaleidoscope-Ranges.h>
#pragma once
#define Key_Turbo Key{kaleidoscope::ranges::TURBO } #define Key_Turbo Key{kaleidoscope::ranges::TURBO }
namespace kaleidoscope { namespace kaleidoscope {

@ -31,8 +31,7 @@
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. */ POSSIBILITY OF SUCH DAMAGE. */
#ifndef _UTIL_CRC16_H_ #pragma once
#define _UTIL_CRC16_H_
#include <stdint.h> #include <stdint.h>
@ -89,6 +88,3 @@ static inline uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) {
} }
return crc; return crc;
} }
#endif

@ -338,9 +338,8 @@ class LEDModeManager {
0 /*dummy*/ 0 /*dummy*/
) )
); );
parent_plugin->registerLEDModeActivated(255 /* dymmy to disable access // dummy to disable access to transient LED modes through LEDControl
to transient LED modes through LEDControl */ parent_plugin->registerLEDModeActivated(255);
);
return led_mode; return led_mode;
} }
@ -406,9 +405,9 @@ class LEDModeManager {
LEDModeManager::setupLEDMode(&::PLUGIN); LEDModeManager::setupLEDMode(&::PLUGIN);
#define _INIT_LED_MODE_MANAGER(...) \ #define _INIT_LED_MODE_MANAGER(...) \
namespace kaleidoscope { __NL__ \ namespace kaleidoscope { /* NOLINT(build/namespaces) */ __NL__ \
namespace internal { __NL__ \ namespace internal { /* NOLINT(build/namespaces) */ __NL__ \
namespace led_mode_management { __NL__ \ namespace led_mode_management { /* NOLINT(build/namespaces) */ __NL__ \
__NL__ \ __NL__ \
/* Setup the array-like data structure that stores __NL__ \ /* Setup the array-like data structure that stores __NL__ \
* LEDModeFactories */ __NL__ \ * LEDModeFactories */ __NL__ \

@ -85,7 +85,7 @@ struct ArrayLikeStorage<StoredType__, true /* is of appropriate type */> {
public: public:
constexpr ArrayLikeStorage(StoredType__ entry) explicit constexpr ArrayLikeStorage(StoredType__ entry)
: entry_(entry) : entry_(entry)
{} {}
@ -103,7 +103,7 @@ struct ArrayLikeStorage<StoredType__, false /* not of appropriate type */> {
public: public:
template<typename AnyType__> template<typename AnyType__>
constexpr ArrayLikeStorage(AnyType__/* non-matching entity */) {} explicit constexpr ArrayLikeStorage(AnyType__/* non-matching entity */) {}
static constexpr uint8_t n_entries = 0; static constexpr uint8_t n_entries = 0;

@ -99,9 +99,9 @@
} __NL__ \ } __NL__ \
}; __NL__ \ }; __NL__ \
__NL__ \ __NL__ \
/* This specialization is used for those hooks that a plugin does not __NL__ \ /* This specialization is used for those hooks that a plugin does */ __NL__ \
* implement. __NL__ \ /* not implement. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename Plugin__ __NL__ \ template<typename Plugin__ __NL__ \
UNWRAP TMPL_PARAM_TYPE_LIST /* may evaluate empty */ __NL__ \ UNWRAP TMPL_PARAM_TYPE_LIST /* may evaluate empty */ __NL__ \
, typename... Args__> __NL__ \ , typename... Args__> __NL__ \
@ -131,10 +131,10 @@
= HookVersionImplemented_##HOOK_NAME< __NL__ \ = HookVersionImplemented_##HOOK_NAME< __NL__ \
Plugin__, HOOK_VERSION>::value; __NL__ \ Plugin__, HOOK_VERSION>::value; __NL__ \
__NL__ \ __NL__ \
/* The caller type adds another level of indirection that __NL__ \ /* The caller type adds another level of indirection that */ __NL__ \
* is required to enable some hooks not to be implemented __NL__ \ /* is required to enable some hooks not to be implemented */ __NL__ \
* by plugins. __NL__ \ /* by plugins. */ __NL__ \
*/ __NL__ \ __NL__ \
typedef _NAME5(EventHandler_, HOOK_NAME, _v, HOOK_VERSION, _caller) __NL__ \ typedef _NAME5(EventHandler_, HOOK_NAME, _v, HOOK_VERSION, _caller) __NL__ \
< __NL__ \ < __NL__ \
derived_implements_hook, __NL__ \ derived_implements_hook, __NL__ \
@ -147,7 +147,7 @@
} __NL__ \ } __NL__ \
}; __NL__ \ }; __NL__ \
__NL__ \ __NL__ \
} __NL__ \ } __NL__ \
__NL__ \ __NL__ \
namespace kaleidoscope { __NL__ \ namespace kaleidoscope { __NL__ \
__NL__ \ __NL__ \

@ -77,16 +77,16 @@ template<typename Plugin__> struct
#define _DEFINE_IMPLEMENTATION_CHECK_CLASSES(HOOK_NAME, ...) \ #define _DEFINE_IMPLEMENTATION_CHECK_CLASSES(HOOK_NAME, ...) \
__NL__ \ __NL__ \
/* Defines a traits class Plugin_HasMember_HOOK_NAME __NL__ \ /* Defines a traits class Plugin_HasMember_HOOK_NAME */ __NL__ \
* where HOOK_NAME is replaced with the actual hook name __NL__ \ /* where HOOK_NAME is replaced with the actual hook name */ __NL__ \
* that is passed in as a parameter to this macro. __NL__ \ /* that is passed in as a parameter to this macro. */ __NL__ \
*/ __NL__ \ __NL__ \
DEFINE_HAS_MEMBER_TRAITS(Plugin, HOOK_NAME) __NL__ \ DEFINE_HAS_MEMBER_TRAITS(Plugin, HOOK_NAME) __NL__ \
__NL__ \ __NL__ \
/* Specializations of this helper class check if a plugin __NL__ \ /* Specializations of this helper class check if a plugin */ __NL__ \
* implements a handler with the specific signature that is __NL__ \ /* implements a handler with the specific signature that is */ __NL__ \
* identified by a hook version. __NL__ \ /* identified by a hook version. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename Plugin__, int hook_version_id_> __NL__ \ template<typename Plugin__, int hook_version_id_> __NL__ \
struct HookVersionImplemented_##HOOK_NAME {}; struct HookVersionImplemented_##HOOK_NAME {};
@ -96,19 +96,19 @@ template<typename Plugin__> struct
TMPL_PARAM_TYPE_LIST, TMPL_PARAM_LIST, TMPL_DUMMY_ARGS_LIST, \ TMPL_PARAM_TYPE_LIST, TMPL_PARAM_LIST, TMPL_DUMMY_ARGS_LIST, \
SIGNATURE, ARGS_LIST) \ SIGNATURE, ARGS_LIST) \
\ \
/* We use the generalized traits class found in header has_method.h __NL__ \ /* We use the generalized traits class found in header has_method.h */ __NL__ \
* to do check if a plugin defines a hook method with a specific __NL__ \ /* to do check if a plugin defines a hook method with a specific */ __NL__ \
* signature. __NL__ \ /* signature. */ __NL__ \
*/ __NL__ \ __NL__ \
DEFINE_HAS_METHOD_TRAITS(GLUE2(Plugin, HOOK_VERSION), __NL__ \ DEFINE_HAS_METHOD_TRAITS(GLUE2(Plugin, HOOK_VERSION), __NL__ \
TMPL_PARAM_TYPE_LIST, TMPL_PARAM_LIST, __NL__ \ TMPL_PARAM_TYPE_LIST, TMPL_PARAM_LIST, __NL__ \
HOOK_NAME, __NL__ \ HOOK_NAME, __NL__ \
kaleidoscope::EventHandlerResult, __NL__ \ kaleidoscope::EventHandlerResult, __NL__ \
SIGNATURE) __NL__ \ SIGNATURE) __NL__ \
__NL__ \ __NL__ \
/* This specialization checks if a plugin of type Plugin__ __NL__ \ /* This specialization checks if a plugin of type Plugin__ */ __NL__ \
* implements a handler with given signature SIGNATURE. __NL__ \ /* implements a handler with given signature SIGNATURE. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename Plugin__> __NL__ \ template<typename Plugin__> __NL__ \
struct HookVersionImplemented_##HOOK_NAME<Plugin__, HOOK_VERSION> __NL__ \ struct HookVersionImplemented_##HOOK_NAME<Plugin__, HOOK_VERSION> __NL__ \
: public GLUE4(Plugin, HOOK_VERSION, _HasMethod_, HOOK_NAME) __NL__ \ : public GLUE4(Plugin, HOOK_VERSION, _HasMethod_, HOOK_NAME) __NL__ \
@ -117,20 +117,20 @@ template<typename Plugin__> struct
#define _PREPARE_EVENT_HANDLER_SIGNATURE_CHECK_START(HOOK_NAME, ...) \ #define _PREPARE_EVENT_HANDLER_SIGNATURE_CHECK_START(HOOK_NAME, ...) \
__NL__ \ __NL__ \
/* This struct enables checking if a handler of a specific type __NL__ \ /* This struct enables checking if a handler of a specific type */__NL__ \
* has been implemented. If so, there must be exactly one overload __NL__ \ /* has been implemented. If so, there must be exactly one overload */__NL__ \
* with correct signature. __NL__ \ /* with correct signature. */__NL__ \
*/ __NL__ \ __NL__ \
template <class Plugin__> __NL__ \ template <class Plugin__> __NL__ \
struct NumberOfImplementationsOf_##HOOK_NAME __NL__ \ struct NumberOfImplementationsOf_##HOOK_NAME __NL__ \
{ __NL__ \ { __NL__ \
static constexpr int value = __NL__ \ static constexpr int value = __NL__ \
0 __NL__ \ 0 __NL__ \
/* What follows is a list of handler implementation __NL__ \ /* What follows is a list of handler implementation */ __NL__ \
* checks for different versions of a handler __NL__ \ /* checks for different versions of a handler */ __NL__ \
* generated by several calls to __NL__ \ /* generated by several calls to */ __NL__ \
* _PREPARE_EVENT_HANDLER_SIGNATURE_CHECK_OP. __NL__ \ /* _PREPARE_EVENT_HANDLER_SIGNATURE_CHECK_OP. */
*/
// This is invoked for every version of a hook. // This is invoked for every version of a hook.
// //
@ -151,16 +151,16 @@ template<typename Plugin__> struct
static constexpr int n_implementations __NL__ \ static constexpr int n_implementations __NL__ \
= NumberOfImplementationsOf_##HOOK_NAME<PLUGIN_TYPE>::value; __NL__ \ = NumberOfImplementationsOf_##HOOK_NAME<PLUGIN_TYPE>::value; __NL__ \
__NL__ \ __NL__ \
/* A handler is acceptable if it is either not implemented __NL__ \ /* A handler is acceptable if it is either not implemented */ __NL__ \
* by the derived class or if there is only one implementation __NL__ \ /* by the derived class or if there is only one implementation */ __NL__ \
* with correct signature. __NL__ \ /* with correct signature. */ __NL__ \
* Please note that any other methods with different names __NL__ \ /* Please note that any other methods with different names */ __NL__ \
* but other, unrelated signatures are ignored as long __NL__ \ /* but other, unrelated signatures are ignored as long */ __NL__ \
* as there is one correct implementation. __NL__ \ /* as there is one correct implementation. */ __NL__ \
* Only if there are several versions supported at a time __NL__ \ /* Only if there are several versions supported at a time */ __NL__ \
* and more than one of them has been implemented, we __NL__ \ /* and more than one of them has been implemented, we */ __NL__ \
* treat this as an ambiguity and raise an error. __NL__ \ /* treat this as an ambiguity and raise an error. */ __NL__ \
*/ __NL__ \ __NL__ \
static constexpr bool handler_has_wrong_signature = __NL__ \ static constexpr bool handler_has_wrong_signature = __NL__ \
derived_implements_handler && (n_implementations == 0); __NL__ \ derived_implements_handler && (n_implementations == 0); __NL__ \
__NL__ \ __NL__ \
@ -187,11 +187,11 @@ template<typename Plugin__> struct
VERBOSE_STATIC_ASSERT_FOOTER __NL__ \ VERBOSE_STATIC_ASSERT_FOOTER __NL__ \
); __NL__ \ ); __NL__ \
__NL__ \ __NL__ \
/* The following construct is necessary enable reporting of the __NL__ \ /* The following construct is necessary enable reporting of the */ __NL__ \
* type of a plugin that implements an event handler with an __NL__ \ /* type of a plugin that implements an event handler with an */ __NL__ \
* incorrect signature, because it's not possible to include any __NL__ \ /* incorrect signature, because it's not possible to include any */ __NL__ \
* non-literal string constant in a static_assert error message. __NL__ \ /* non-literal string constant in a static_assert error message. */ __NL__ \
*/ __NL__ \ /* */ __NL__ \
__attribute__((unused)) constexpr bool dummy1 __NL__ \ __attribute__((unused)) constexpr bool dummy1 __NL__ \
= ___________Culprit_Plugin___________ __NL__ \ = ___________Culprit_Plugin___________ __NL__ \
<PLUGIN_TYPE, !handler_has_wrong_signature>::value; __NL__ \ <PLUGIN_TYPE, !handler_has_wrong_signature>::value; __NL__ \
@ -217,11 +217,11 @@ template<typename Plugin__> struct
VERBOSE_STATIC_ASSERT_FOOTER __NL__ \ VERBOSE_STATIC_ASSERT_FOOTER __NL__ \
); __NL__ \ ); __NL__ \
__NL__ \ __NL__ \
/* The following construct is necessary enable reporting of the __NL__ \ /* The following construct is necessary enable reporting of the */ __NL__ \
* type of a plugin that implements an event handler with an __NL__ \ /* type of a plugin that implements an event handler with an */ __NL__ \
* incorrect signature, because it's not possible to include any __NL__ \ /* incorrect signature, because it's not possible to include any */ __NL__ \
* non-literal string constant in a static_assert error message. __NL__ \ /* non-literal string constant in a static_assert error message. */ __NL__ \
*/ __NL__ \ __NL__ \
__attribute__((unused)) constexpr bool dummy2 __NL__ \ __attribute__((unused)) constexpr bool dummy2 __NL__ \
= ___________Culprit_Plugin___________ __NL__ \ = ___________Culprit_Plugin___________ __NL__ \
<PLUGIN_TYPE, !handler_ambiguously_implemented>::value; __NL__ \ <PLUGIN_TYPE, !handler_ambiguously_implemented>::value; __NL__ \

@ -18,8 +18,8 @@
#include "kaleidoscope/key_defs.h" #include "kaleidoscope/key_defs.h"
namespace kaleidoscope { namespace kaleidoscope { // NOLINT(build/namespaces)
namespace sketch_exploration { namespace sketch_exploration { // NOLINT(build/namespaces)
// A simple keymap adaptor class that makes the keymap conveniently accessible. // A simple keymap adaptor class that makes the keymap conveniently accessible.
// at compiletime. // at compiletime.
@ -35,7 +35,7 @@ class KeymapAdaptor {
static constexpr uint8_t n_layers = _n_layers; static constexpr uint8_t n_layers = _n_layers;
static constexpr uint8_t layer_size = _layer_size; static constexpr uint8_t layer_size = _layer_size;
constexpr KeymapAdaptor(const Key(&keymap)[_n_layers][_layer_size]) explicit constexpr KeymapAdaptor(const Key(&keymap)[_n_layers][_layer_size])
: keymap_{keymap} : keymap_{keymap}
{} {}
@ -119,7 +119,7 @@ class EmptyKeymapAccumulationHelper {
public: public:
constexpr EmptyKeymapAccumulationHelper(const _Accumulation &op) explicit constexpr EmptyKeymapAccumulationHelper(const _Accumulation &op)
: op_{op} : op_{op}
{} {}
@ -147,7 +147,7 @@ struct NumKeysEqual {
typedef uint8_t ResultType; typedef uint8_t ResultType;
static constexpr ResultType init_value = 0; static constexpr ResultType init_value = 0;
constexpr NumKeysEqual(Key k) : k_{k} {} explicit constexpr NumKeysEqual(Key k) : k_{k} {}
constexpr ResultType apply(Key test_key, ResultType r) const { constexpr ResultType apply(Key test_key, ResultType r) const {
return (test_key == k_) ? r + 1 : r; return (test_key == k_) ? r + 1 : r;
@ -163,7 +163,7 @@ struct HasKey {
typedef bool ResultType; typedef bool ResultType;
static constexpr ResultType init_value = false; static constexpr ResultType init_value = false;
constexpr HasKey(Key k) : k_{k} {} explicit constexpr HasKey(Key k) : k_{k} {}
constexpr ResultType apply(Key test_key, ResultType r) const { constexpr ResultType apply(Key test_key, ResultType r) const {
return (test_key == k_) ? true : r; return (test_key == k_) ? true : r;
@ -214,7 +214,7 @@ extern void pluginsExploreSketch();
// exploreSketch<_Sketch>(...)-hook. // exploreSketch<_Sketch>(...)-hook.
// //
#define _INIT_KEYMAP_EXPLORATION \ #define _INIT_KEYMAP_EXPLORATION \
namespace kaleidoscope { \ namespace kaleidoscope { /* NOLINT(build/namespaces) */ \
namespace sketch_exploration { \ namespace sketch_exploration { \
\ \
template<bool _keymap_is_empty> \ template<bool _keymap_is_empty> \

@ -1 +1,2 @@
// Any code that appears here is added to the bottom of the preprocessed sketch file. // Any code that appears here is added to the bottom of the preprocessed sketch file.
// NOLINT(build/header_guard)

@ -1,3 +1,3 @@
// Any code that appears here is added to the top of the preprocessed sketch file. // Any code that appears here is added to the top of the preprocessed sketch file.
// NOLINT(build/header_guard)
#define KALEIDOSCOPE_SKETCH #define KALEIDOSCOPE_SKETCH

@ -40,89 +40,89 @@
#define DEFINE_HAS_MEMBER_TRAITS(PREFIX, MEMBER_NAME) __NL__ \ #define DEFINE_HAS_MEMBER_TRAITS(PREFIX, MEMBER_NAME) __NL__ \
__NL__ \ __NL__ \
/* This defines a templated class PREFIX##_HasMember_##MEMBER_NAME. __NL__ \ /* This defines a templated class PREFIX##_HasMember_##MEMBER_NAME.*/__NL__ \
* The double hashes just glue together the value of macro __NL__ \ /* The double hashes just glue together the value of macro */ __NL__ \
* parameters like PREFIX or MEMBER_NAME and other __NL__ \ /* parameters like PREFIX or MEMBER_NAME and other */ __NL__ \
* string tokens to form new identifiers (here the struct name). __NL__ \ /* string tokens to form new identifiers (here the struct name). */ __NL__ \
*/ __NL__ \ /*/ */ __NL__ \
template<typename T> __NL__ \ template<typename T> __NL__ \
struct CAT3(PREFIX, _HasMember_, MEMBER_NAME) { __NL__ \ struct CAT3(PREFIX, _HasMember_, MEMBER_NAME) { __NL__ \
__NL__ \ __NL__ \
/* This code defines an inner class, Fallback, with one __NL__ \ /* This code defines an inner class, Fallback, with one */ __NL__ \
* member named MEMBER_NAME (remember that MEMBER_NAME is a __NL__ \ /* member named MEMBER_NAME (remember that MEMBER_NAME is a */ __NL__ \
* macro parameter, so it will be replaced with the name of the __NL__ \ /* macro parameter, so it will be replaced with the name of the*/ __NL__ \
* actual member. Using proper terminology, this class is __NL__ \ /* actual member. Using proper terminology, this class is */ __NL__ \
* essentially a Mixin. __NL__ \ /* essentially a Mixin. */ __NL__ \
*/ __NL__ \ __NL__ \
struct Fallback { __NL__ \ struct Fallback { __NL__ \
int MEMBER_NAME; __NL__ \ int MEMBER_NAME; __NL__ \
}; __NL__ \ }; __NL__ \
__NL__ \ __NL__ \
/* Next, we introduce a new class: Derived. It inherits both __NL__ \ /* Next, we introduce a new class: Derived. It inherits both */ __NL__ \
* from the class T were templated on, and the previous Fallback __NL__ \ /* from the class T were templated on, & the previous Fallback*/ __NL__ \
* class. Note that the Derived class inherits the MEMBER_NAME __NL__ \ /* class. Note that the Derived class inherits the MEMBER_NAME */ __NL__ \
* member from class Fallback and possibly another MEMBER_NAME __NL__ \ /* member from class Fallback and possibly another MEMBER_NAME */ __NL__ \
* from T. Keep this (possible) ambiguity in mind. __NL__ \ /* from T. Keep this (possible) ambiguity in mind. */ __NL__ \
*/ __NL__ \ __NL__ \
struct Derived : T, Fallback { }; __NL__ \ struct Derived : T, Fallback { }; __NL__ \
__NL__ \ __NL__ \
/* The ChT class is templated on a typename C, and an object __NL__ \ /* The ChT class is templated on a typename C, and an object */ __NL__ \
* of that type. As a side note, only compile time constant __NL__ \ /* of that type. As a side note, only compile time constant */ __NL__ \
* fixed types are possible here. We will use this class to __NL__ \ /* fixed types are possible here. We will use this class to */ __NL__ \
* generate the ambiguity mentioned above. __NL__ \ /* generate the ambiguity mentioned above. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename C, C> __NL__ \ template<typename C, C> __NL__ \
struct ChT; __NL__ \ struct ChT; __NL__ \
__NL__ \ __NL__ \
/* This is where the fun starts. These two lines form a __NL__ \ /* This is where the fun starts. These two lines form a */ __NL__ \
* declaration of a templated function f. That function __NL__ \ /* declaration of a templated function f. That function */ __NL__ \
* receives a pointer to the ChT class, instantiated with a __NL__ \ /* receives a pointer to the ChT class, instantiated with a */ __NL__ \
* pointer-to-member type whose parameter is the __NL__ \ /* pointer-to-member type whose parameter is the */ __NL__ \
* address-of-member MEMBER_NAME in class C. Note that __NL__ \ /* address-of-member MEMBER_NAME in class C. Note that */ __NL__ \
* if we attempt to instantiate this with __NL__ \ /* if we attempt to instantiate this with */ __NL__ \
* the Derived class, one of two things will happen: either we __NL__ \ /* the Derived class, one of two things will happen: either we */ __NL__ \
* will have a substitution failure due to the aforementioned __NL__ \ /* will have a substitution failure due to the aforementioned */ __NL__ \
* ambiguity (if T also has a member by that name), or it will __NL__ \ /* ambiguity (if T also has a member by that name), or it will */ __NL__ \
* be successful (if there is no member called MEMBER_NAME, in T). __NL__ \ /* be successful (if there is no member called MEMBER_NAME, in T).*/ __NL__ \
* This function returns a reference to a char array of size 1. __NL__ \ /* This function returns a reference to a char array of size 1.*/ __NL__ \
* __NL__ \ /* */ __NL__ \
* How returning arrays by reference works becomes a little __NL__ \ /* How returning arrays by reference works becomes a little */ __NL__ \
* clearer by means of a more simple example. The definition __NL__ \ /* clearer by means of a more simple example. The definition */ __NL__ \
* of a function that returns a reference to a char-array of __NL__ \ /* of a function that returns a reference to a char-array of */ __NL__ \
* size 1 e.g. reads __NL__ \ /* size 1 e.g. reads */ __NL__ \
* __NL__ \ /* */ __NL__ \
* char (&f())[1]; __NL__ \ /* char (&f())[1]; */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename C> __NL__ \ template<typename C> __NL__ \
static char (&f(ChT<int Fallback::*, &C::MEMBER_NAME>*))[1]; __NL__ \ static char (&f(ChT<int Fallback::*, &C::MEMBER_NAME>*))[1]; __NL__ \
__NL__ \ __NL__ \
/* This is what gets instantiated if the previous template __NL__ \ /* This is what gets instantiated if the previous template */ __NL__ \
* cant be instantiated and SFINAE kicks in (since variadic __NL__ \ /* cant be instantiated and SFINAE kicks in (since variadic */ __NL__ \
* functions have the lowest possible priority when selecting __NL__ \ /* functions have the lowest possible priority when selecting */ __NL__ \
* which overloaded function to call). This variadic function __NL__ \ /* which overloaded function to call). This variadic function */ __NL__ \
* returns a reference to a char array of size 2. Note that __NL__ \ /* returns a reference to a char array of size 2. Note that */ __NL__ \
* instantiation of this function means that the previous __NL__ \ /* instantiation of this function means that the previous */ __NL__ \
* one failed, implying that class T has a member __NL__ \ /* one failed, implying that class T has a member */ __NL__ \
* named MEMBER_NAME. __NL__ \ /* named MEMBER_NAME. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename C> __NL__ \ template<typename C> __NL__ \
static char (&f(...))[2]; __NL__ \ static char (&f(...))[2]; __NL__ \
__NL__ \ __NL__ \
/* As you could guess, we will try to check which f function __NL__ \ /* As you could guess, we will try to check which f function */ __NL__ \
* can be instantiated. We will do this by checking the sizeof __NL__ \ /* can be instantiated. We will do this by checking the sizeof */ __NL__ \
* of the return value of that f. If the first signature did __NL__ \ /* of the return value of that f. If the first signature did */ __NL__ \
* not fit (could not be instantiated), then according to __NL__ \ /* not fit (could not be instantiated), then according to */ __NL__ \
* SFINAE the second one will be the chosen one __NL__ \ /* SFINAE the second one will be the chosen one */ __NL__ \
* (since it cant fail) and we will take the sizeof of a __NL__ \ /* (since it cant fail) and we will take the sizeof of a */ __NL__ \
* char array of size 2, which is 2. Therefore, the value __NL__ \ /* char array of size 2, which is 2. Therefore, the value */ __NL__ \
* will be evaluated to true meaning that class T really __NL__ \ /* will be evaluated to true meaning that class T really */ __NL__ \
* has a member by the name MEMBER_NAME. Otherwise, the first __NL__ \ /* has a member by the name MEMBER_NAME. Otherwise, the first */ __NL__ \
* function can be successfully instantiated, and we will measure __NL__ \ /* function can be successfully instantiated, and we will */ __NL__ \
* the sizeof of a char array of size 1, which is 1. In that case __NL__ \ /* measure the sizeof of a char array of size 1, which is 1. */ __NL__ \
* the value is evaluated to false which is good for us, since __NL__ \ /* In that case, the value is evaluated to false which is */ __NL__ \
* that means there was no ambiguity when using __NL__ \ /* good for us sincethat means there was no ambiguity when */ __NL__ \
* Derived::MEMBER_NAME, and that means there was no other __NL__ \ /* using Derived::MEMBER_NAME, and that means there was no */ __NL__ \
* MEMBER_NAME but the one in Fallback. __NL__ \ /* other MEMBER_NAME but the one in Fallback. */ __NL__ \
*/ __NL__ \ __NL__ \
static bool const value = sizeof(f<Derived>(0)) == 2; __NL__ \ static bool const value = sizeof(f<Derived>(0)) == 2; __NL__ \
}; };

@ -23,46 +23,46 @@
METHOD_NAME, \ METHOD_NAME, \
RETURN_TYPE, ARGUMENTS) \ RETURN_TYPE, ARGUMENTS) \
__NL__ \ __NL__ \
/* This traits checks if a class of type Class__ __NL__ \ /* This traits checks if a class of type Class__ */ __NL__ \
* implements a method with given signature. __NL__ \ /* implements a method with given signature. */ __NL__ \
*/ __NL__ \ __NL__ \
template<typename Class__ UNWRAP TMPL_PARAM_TYPE_LIST> __NL__ \ template<typename Class__ UNWRAP TMPL_PARAM_TYPE_LIST> __NL__ \
struct GLUE3(PREFIX, _HasMethod_, METHOD_NAME) __NL__ \ struct GLUE3(PREFIX, _HasMethod_, METHOD_NAME) __NL__ \
{ __NL__ \ { __NL__ \
/* Define a pointer to member function with the correct __NL__ \ /* Define a pointer to member function with the correct */ __NL__ \
* argument signature. The newly defined type is named __NL__ \ /* argument signature. The newly defined type is named */ __NL__ \
* MethodType__. __NL__ \ /* MethodType__. */ __NL__ \
*/ __NL__ \ /* */ __NL__ \
typedef RETURN_TYPE (Class__::*MethodType__)ARGUMENTS; __NL__ \ typedef RETURN_TYPE (Class__::*MethodType__)ARGUMENTS; __NL__ \
__NL__ \ __NL__ \
/* This is an application of the SFINAE concept. __NL__ \ /* This is an application of the SFINAE concept. */ __NL__ \
* We check if Class__ defines a method with given name and __NL__ \ /* We check if Class__ defines a method with given name and */ __NL__ \
* signature. This is done by forcing the compiler __NL__ \ /* signature. This is done by forcing the compiler */ __NL__ \
* through a static cast to select the respective method __NL__ \ /* through a static cast to select the respective method */ __NL__ \
* if possible. If the method signature cannot be found, __NL__ \ /* if possible. If the method signature cannot be found, */ __NL__ \
* the substitution fails and the first version of method "test" __NL__ \ /* the substitution fails and the first version of method "test"*/ __NL__ \
* will not be defined. __NL__ \ /* will not be defined. */ __NL__ \
*/ __NL__ \ __NL__ \
template <typename ClassAux__> __NL__ \ template <typename ClassAux__> __NL__ \
static constexpr __NL__ \ static constexpr __NL__ \
/* The following decltype-clause defines the function return type __NL__ \ /* The following decltype-clause defines the function return type */ __NL__ \
*/ __NL__ \ __NL__ \
decltype( __NL__ \ decltype( __NL__ \
/* If &ClassAux__::METHOD_NAME exists and is of type __NL__ \ /* If &ClassAux__::METHOD_NAME exists and is of type */ __NL__ \
* MethodType__, the list below evaluates to bool{} whose __NL__ \ /* MethodType__, the list below evaluates to bool{} whose */ __NL__ \
* type can be determined. Otherwise the comma expression __NL__ \ /* type can be determined. Otherwise the comma expression */ __NL__ \
* cannot be evaluated and the content __NL__ \ /* cannot be evaluated and the content */ __NL__ \
* of decltype is undefined and this function overload __NL__ \ /* of decltype is undefined and this function overload */ __NL__ \
* is ignored by the compiler __NL__ \ /* is ignored by the compiler */ __NL__ \
* (SFINAE = substitution failure is not an error) __NL__ \ /* (SFINAE = substitution failure is not an error) */ __NL__ \
* and the test(...) overload is used instead. __NL__ \ /* and the test(...) overload is used instead. */ __NL__ \
*/ __NL__ \ __NL__ \
static_cast<MethodType__>( __NL__ \ static_cast<MethodType__>( __NL__ \
&ClassAux__::TEMPLATE_KEYWORD(UNWRAP TMPL_PARAM_LIST) __NL__ \ &ClassAux__::TEMPLATE_KEYWORD(UNWRAP TMPL_PARAM_LIST) __NL__ \
METHOD_NAME ADD_TEMPLATE_BRACES(UNWRAP TMPL_PARAM_LIST) __NL__ \ METHOD_NAME ADD_TEMPLATE_BRACES(UNWRAP TMPL_PARAM_LIST) __NL__ \
), bool{} __NL__ \ ), bool{} __NL__ \
) __NL__ \ ) __NL__ \
test(int /* unused */) __NL__ \ test(int /* unused */) /* NOLINT(readability/casting) */ __NL__ \
{ __NL__ \ { __NL__ \
return true; __NL__ \ return true; __NL__ \
} __NL__ \ } __NL__ \
@ -75,4 +75,3 @@
__NL__ \ __NL__ \
static constexpr bool value = test<Class__>(int{}); __NL__ \ static constexpr bool value = test<Class__>(int{}); __NL__ \
}; };

@ -36,5 +36,7 @@
/* Turn off virtual_io's input. */ \ /* Turn off virtual_io's input. */ \
Kaleidoscope.device().keyScanner().setEnableReadMatrix(false); \ Kaleidoscope.device().keyScanner().setEnableReadMatrix(false); \
testing::InitGoogleTest(); \ testing::InitGoogleTest(); \
RUN_ALL_TESTS(); \ /* We assign the return value of RUN_ALL_TESTS, to */ \
/* silence a compiler warning. */ \
int __ignore__ = RUN_ALL_TESTS(); \
} }

Loading…
Cancel
Save