From 108b7f1fee34bcc23febd37b66c2ce770eccc35d Mon Sep 17 00:00:00 2001 From: Robert Bendun Date: Sat, 7 May 2022 18:39:29 +0200 Subject: [PATCH] Moved implementation from header --- src/lexer.cc | 28 ++++++++++++++++++++++++++++ src/musique.hh | 37 +++++++++++-------------------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/lexer.cc b/src/lexer.cc index 9553d15..aef8ce4 100644 --- a/src/lexer.cc +++ b/src/lexer.cc @@ -189,6 +189,34 @@ auto Lexer::consume() -> u32 return 0; } +auto Lexer::consume_if(auto test) -> bool +{ + bool condition; + if constexpr (requires { test(peek()) && true; }) { + condition = test(peek()); + } else if constexpr (std::is_integral_v) { + condition = (u32(test) == peek()); + } else if constexpr (std::is_convertible_v) { + auto const end = test + std::strlen(test); + condition = std::find(test, end, peek()) != end; + } else { + condition = std::find(std::begin(test), std::end(test), peek()) != std::end(test); + } + return condition && (consume(), true); +} + +auto Lexer::consume_if(auto first, auto second) -> bool +{ + if (consume_if(first)) { + if (consume_if(second)) { + return true; + } else { + rewind(); + } + } + return false; +} + void Lexer::rewind() { assert(last_rune_length != 0); diff --git a/src/musique.hh b/src/musique.hh index ea59765..4723359 100644 --- a/src/musique.hh +++ b/src/musique.hh @@ -208,33 +208,18 @@ struct Lexer // Finds next rune in source and returns it, advancing the string auto consume() -> u32; - inline auto consume_if(auto test) -> bool - { - bool condition; - if constexpr (requires { test(peek()) && true; }) { - condition = test(peek()); - } else if constexpr (std::is_integral_v) { - condition = (u32(test) == peek()); - } else if constexpr (std::is_convertible_v) { - auto const end = test + std::strlen(test); - condition = std::find(test, end, peek()) != end; - } else { - condition = std::find(std::begin(test), std::end(test), peek()) != std::end(test); - } - return condition && (consume(), true); - } + // For test beeing + // callable, current rune is passed to test + // integral, current rune is tested for equality with test + // string, current rune is tested for beeing in it + // otherwise, current rune is tested for beeing in test + // + // When testing above yields truth, current rune is consumed. + // Returns if rune was consumed + auto consume_if(auto test) -> bool; - inline auto consume_if(auto first, auto second) -> bool - { - if (consume_if(first)) { - if (consume_if(second)) { - return true; - } else { - rewind(); - } - } - return false; - } + // Consume two runes with given tests otherwise backtrack + auto consume_if(auto first, auto second) -> bool; // Goes back last rune void rewind();