From 00863566ec4601c65c435b74e575d49546a1c707 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sat, 7 Dec 2019 03:36:21 +0300 Subject: split server into multiple components In a vague attempt to make header files more readable, split server/ into a number of components. Also, refactor the unit tests to use the "Data-driven test cases" of Boost.Test. --- server/lexer/input.hpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 server/lexer/input.hpp (limited to 'server/lexer/input.hpp') diff --git a/server/lexer/input.hpp b/server/lexer/input.hpp new file mode 100644 index 0000000..1104a4b --- /dev/null +++ b/server/lexer/input.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "error.hpp" + +#include + +#include + +namespace math::server::lexer { + +class Input { +public: + explicit Input(const std::string_view& input) + : m_pos{0}, m_input{input} + { } + + const std::string_view& get_input() const { return m_input; } + + std::size_t get_pos() const { return m_pos; } + + std::size_t get_length() const { return m_input.length(); } + + bool empty() const { return m_input.empty(); } + + void consume(std::size_t len) { + if (m_input.length() < len) { + throw LexerError{"internal: not enough input to consume"}; + } + m_pos += len; + m_input.remove_prefix(len); + } + + void consume(const std::string_view& sub) { + consume(sub.length()); + } + +private: + std::size_t m_pos; + std::string_view m_input; +}; + +} -- cgit v1.2.3