#ifndef TOML11_LOCATION_FWD_HPP #define TOML11_LOCATION_FWD_HPP #include "../result.hpp" #include #include #include namespace toml { namespace detail { class region; // fwd decl // // To represent where we are reading in the parse functions. // Since it "points" somewhere in the input stream, the length is always 1. // class location { public: using char_type = unsigned char; // must be unsigned using container_type = std::vector; using difference_type = typename container_type::difference_type; // to suppress sign-conversion warning using source_ptr = std::shared_ptr; public: location(source_ptr src, std::string src_name) : source_(std::move(src)), source_name_(std::move(src_name)), location_(0), line_number_(1) {} location(const location&) = default; location(location&&) = default; location& operator=(const location&) = default; location& operator=(location&&) = default; ~location() = default; void advance(std::size_t n = 1) noexcept; void retrace(std::size_t n = 1) noexcept; bool is_ok() const noexcept { return static_cast(this->source_); } bool eof() const noexcept; char_type current() const; char_type peek(); std::size_t get_location() const noexcept { return this->location_; } void set_location(const std::size_t loc) noexcept; std::size_t line_number() const noexcept { return this->line_number_; } std::string get_line() const; std::size_t column_number() const noexcept; source_ptr const& source() const noexcept {return this->source_;} std::string const& source_name() const noexcept {return this->source_name_;} private: void advance_line_number(const std::size_t n); void retrace_line_number(const std::size_t n); private: friend region; private: source_ptr source_; std::string source_name_; std::size_t location_; // std::vector<>::difference_type is signed std::size_t line_number_; }; bool operator==(const location& lhs, const location& rhs) noexcept; bool operator!=(const location& lhs, const location& rhs); location prev(const location& loc); location next(const location& loc); location make_temporary_location(const std::string& str) noexcept; template result find_if(const location& first, const location& last, const F& func) noexcept { if(first.source() != last.source()) { return err(); } if(first.get_location() >= last.get_location()) { return err(); } auto loc = first; while(loc.get_location() != last.get_location()) { if(func(loc.current())) { return ok(loc); } loc.advance(); } return err(); } template result rfind_if(location first, const location& last, const F& func) { if(first.source() != last.source()) { return err(); } if(first.get_location() >= last.get_location()) { return err(); } auto loc = last; while(loc.get_location() != first.get_location()) { if(func(loc.current())) { return ok(loc); } loc.retrace(); } if(func(first.current())) { return ok(first); } return err(); } result find(const location& first, const location& last, const location::char_type val); result rfind(const location& first, const location& last, const location::char_type val); std::size_t count(const location& first, const location& last, const location::char_type& c); } // detail } // toml #endif // TOML11_LOCATION_FWD_HPP