This commit is contained in:
Alex Alabuzhev 2018-02-24 18:26:09 +00:00 committed by GitHub
commit 1b656472df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 14 deletions

View File

@ -683,7 +683,8 @@ class basic_arg {
template <typename Char, typename ErrorHandler = internal::error_handler> template <typename Char, typename ErrorHandler = internal::error_handler>
class basic_parse_context : private ErrorHandler { class basic_parse_context : private ErrorHandler {
private: private:
basic_string_view<Char> format_str_; typename basic_string_view<Char>::iterator begin_;
typename basic_string_view<Char>::iterator end_;
int next_arg_id_; int next_arg_id_;
public: public:
@ -692,20 +693,21 @@ class basic_parse_context : private ErrorHandler {
explicit FMT_CONSTEXPR basic_parse_context( explicit FMT_CONSTEXPR basic_parse_context(
basic_string_view<Char> format_str, ErrorHandler eh = ErrorHandler()) basic_string_view<Char> format_str, ErrorHandler eh = ErrorHandler())
: ErrorHandler(eh), format_str_(format_str), next_arg_id_(0) {} : ErrorHandler(eh), begin_(format_str.begin()), end_(format_str.end()),
next_arg_id_(0) {}
// Returns an iterator to the beginning of the format string range being // Returns an iterator to the beginning of the format string range being
// parsed. // parsed.
FMT_CONSTEXPR iterator begin() const FMT_NOEXCEPT { FMT_CONSTEXPR iterator begin() const FMT_NOEXCEPT {
return format_str_.begin(); return begin_;
} }
// Returns an iterator past the end of the format string range being parsed. // Returns an iterator past the end of the format string range being parsed.
FMT_CONSTEXPR iterator end() const FMT_NOEXCEPT { return format_str_.end(); } FMT_CONSTEXPR iterator end() const FMT_NOEXCEPT { return end_; }
// Advances the begin iterator to ``it``. // Advances the begin iterator to ``it``.
FMT_CONSTEXPR void advance_to(iterator it) { FMT_CONSTEXPR void advance_to(iterator it) {
format_str_.remove_prefix(it - begin()); begin_ = it;
} }
// Returns the next argument index. // Returns the next argument index.

View File

@ -571,7 +571,7 @@ template <typename Char>
class null_terminating_iterator; class null_terminating_iterator;
template <typename Char> template <typename Char>
FMT_CONSTEXPR_DECL const Char *pointer_from(null_terminating_iterator<Char> it); FMT_CONSTEXPR_DECL typename null_terminating_iterator<Char>::pointer pointer_from(null_terminating_iterator<Char> it);
// An iterator that produces a null terminator on *end. This simplifies parsing // An iterator that produces a null terminator on *end. This simplifies parsing
// and allows comparing the performance of processing a null-terminated string // and allows comparing the performance of processing a null-terminated string
@ -581,20 +581,20 @@ class null_terminating_iterator {
public: public:
typedef std::ptrdiff_t difference_type; typedef std::ptrdiff_t difference_type;
typedef Char value_type; typedef Char value_type;
typedef const Char* pointer; typedef typename basic_string_view<Char>::iterator pointer;
typedef const Char& reference; typedef const Char& reference;
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
null_terminating_iterator() : ptr_(0), end_(0) {} null_terminating_iterator() : ptr_(0), end_(0) {}
FMT_CONSTEXPR null_terminating_iterator(const Char *ptr, const Char *end) FMT_CONSTEXPR null_terminating_iterator(pointer ptr, pointer end)
: ptr_(ptr), end_(end) {} : ptr_(ptr), end_(end) {}
template <typename Range> template <typename Range>
FMT_CONSTEXPR explicit null_terminating_iterator(const Range &r) FMT_CONSTEXPR explicit null_terminating_iterator(const Range &r)
: ptr_(r.begin()), end_(r.end()) {} : ptr_(r.begin()), end_(r.end()) {}
null_terminating_iterator &operator=(const Char *ptr) { null_terminating_iterator &operator=(pointer ptr) {
assert(ptr <= end_); assert(ptr <= end_);
ptr_ = ptr; ptr_ = ptr;
return *this; return *this;
@ -646,19 +646,19 @@ class null_terminating_iterator {
return ptr_ >= other.ptr_; return ptr_ >= other.ptr_;
} }
friend FMT_CONSTEXPR_DECL const Char *pointer_from<Char>( friend FMT_CONSTEXPR_DECL typename null_terminating_iterator<Char>::pointer pointer_from<Char>(
null_terminating_iterator it); null_terminating_iterator it);
private: private:
const Char *ptr_; pointer ptr_;
const Char *end_; pointer end_;
}; };
template <typename T> template <typename T>
FMT_CONSTEXPR const T *pointer_from(const T *p) { return p; } FMT_CONSTEXPR const T *pointer_from(const T *p) { return p; }
template <typename Char> template <typename Char>
FMT_CONSTEXPR const Char *pointer_from(null_terminating_iterator<Char> it) { FMT_CONSTEXPR typename null_terminating_iterator<Char>::pointer pointer_from(null_terminating_iterator<Char> it) {
return it.ptr_; return it.ptr_;
} }
@ -1787,7 +1787,7 @@ FMT_CONSTEXPR Iterator parse_arg_id(Iterator it, IDHandler &&handler) {
do { do {
c = *++it; c = *++it;
} while (is_name_start(c) || ('0' <= c && c <= '9')); } while (is_name_start(c) || ('0' <= c && c <= '9'));
handler(basic_string_view<char_type>(pointer_from(start), it - start)); handler(basic_string_view<char_type>(&*pointer_from(start), it - start));
return it; return it;
} }