25#ifndef __JOIN_VIEW_HPP__
26#define __JOIN_VIEW_HPP__
50 for (
unsigned i = 0; i < 0x20; ++i) {
data[i] = 1; }
90 , _end (in ? in + count : in)
99 constexpr StringView (
const char * first,
const char * last)
113 , _end (in ? in +
std::char_traits <char>::length (in) : in)
152 inline int peek () const noexcept
156 return static_cast <unsigned char> (*_cur);
158 return std::char_traits <char>::eof ();
165 inline int get () noexcept
169 return static_cast <unsigned char> (*_cur++);
171 return std::char_traits <char>::eof ();
179 inline bool getIf (
char expected)
noexcept
181 if (
JOIN_LIKELY (_cur < _end) && (*_cur == expected))
198 const char c = *_cur;
199 if ((c | 32) == (expected | 32))
214 inline size_t read (
char* buf,
size_t count)
noexcept
216 const size_t available = _end - _cur;
217 const size_t nread = (count < available) ? count : available;
218 std::memcpy (buf, _cur, nread);
229 const char* beg = _cur;
230 const char* cur = _cur;
231 const char* end = _end;
238 out.append (beg,
static_cast <size_t> (cur - beg));
248 const char* cur = _cur;
249 const char* end = _end;
267 const char* cur = _cur;
268 const char* end = _end;
277 if (cur >= end || *cur !=
'/')
293 if (*cur ==
'*' && (cur + 1 < end) && *(cur + 1) ==
'/')
306 else if (*cur ==
'/')
309 const char* p =
static_cast <const char*
> (memchr (cur,
'\n', end - cur));
354 const char * _cur =
nullptr;
357 const char * _beg =
nullptr;
360 const char * _end =
nullptr;
366 template <
bool Seekable = true>
416 inline int peek () const noexcept
418 return _in->sgetc ();
425 inline int get () noexcept
427 return _in->sbumpc ();
435 inline bool getIf (
char expected)
noexcept
437 if (_in->sgetc () ==
static_cast <int> (
static_cast <unsigned char> (expected)))
452 const int c = _in->sgetc ();
453 if (
JOIN_LIKELY (c != std::char_traits <char>::eof ()))
455 if ((
static_cast <char> (c) | 32) == (expected | 32))
470 inline size_t read (
char* buf,
size_t count)
noexcept
472 return _in->sgetn (buf, count);
482 while ((c = _in->sgetc ()) != std::char_traits <char>::eof () && !
details::escapedLookup.
data[
static_cast <unsigned char> (c)])
484 out.push_back (
static_cast <char> (c));
512 while ((c = _in->sgetc ()) != std::char_traits <char>::eof ())
527 if (c == std::char_traits <char>::eof ())
537 while ((c = _in->sbumpc ()) != std::char_traits <char>::eof ())
539 if (c ==
'*' && _in->sgetc () ==
'/')
556 while ((c = _in->sbumpc ()) != std::char_traits <char>::eof () && c !=
'\n')
573 template <
bool S = Seekable>
574 inline typename std::enable_if <S, ViewPos>::type
tell () const noexcept
576 return _in->pubseekoff (0, std::ios::cur, std::ios::in);
583 template <
bool S = Seekable>
584 inline typename std::enable_if <S, void>::type
seek (
ViewPos pos)
noexcept
586 _in->pubseekpos (pos, std::ios::in);
613 template <
typename ViewType>
631 template <typename ViewType, bool Seekable = is_seekable <ViewType>::value>
637 template <
typename ViewType>
647 , _beg (view.tell ())
655 inline int peek () const noexcept
657 return _view.peek ();
664 inline int get () noexcept
674 inline bool getIf (
char expected)
noexcept
676 return _view.getIf (expected);
686 return _view.getIfNoCase (expected);
695 size_t len = _view.tell () - _beg;
699 _view.read (&out[0], len);
709 _beg = _view.tell ();
717 typename ViewType::ViewPos _beg;
723 template <
typename ViewType>
734 static thread_local std::vector <char> buffer;
744 inline int peek () const noexcept
746 return _view.peek ();
753 inline int get () noexcept
755 const int c = _view.get ();
756 if (
JOIN_LIKELY (c != std::char_traits <char>::eof ()))
758 _buf->push_back (
static_cast <char> (c));
768 inline bool getIf (
char expected)
noexcept
770 if (_view.peek () ==
static_cast <int> (
static_cast <unsigned char> (expected)))
772 _buf->push_back (
static_cast <char> (_view.get ()));
785 const int c = _view.peek ();
786 if (
JOIN_LIKELY (c != std::char_traits <char>::eof ()))
788 if ((
static_cast <char> (c) | 32) == (expected | 32))
790 _buf->push_back (
static_cast <char> (_view.get ()));
803 out.assign (_buf->data (), _buf->size ());
821 std::vector <char>* _buf =
nullptr;
basic stream view.
Definition view.hpp:368
int get() noexcept
extracts character.
Definition view.hpp:425
std::enable_if< S, void >::type seek(ViewPos pos) noexcept
seek to the specified position.
Definition view.hpp:584
BasicStreamView(const BasicStreamView &other)=delete
copy constructor.
BasicStreamView & operator=(BasicStreamView &&other)=delete
move assignment.
size_t read(char *buf, size_t count) noexcept
read characters.
Definition view.hpp:470
BasicStreamView(BasicStreamView &&other)=delete
move constructor.
void readUntilEscaped(std::string &out) noexcept
read characters until escaped.
Definition view.hpp:479
std::enable_if< S, ViewPos >::type tell() const noexcept
get input position indicator.
Definition view.hpp:574
std::streampos ViewPos
Definition view.hpp:370
~BasicStreamView()=default
destroy instance.
int skipWhitespaces() noexcept
skip whitespaces.
Definition view.hpp:493
int skipWhitespacesAndComments() noexcept
skip whitespaces and comments.
Definition view.hpp:508
int peek() const noexcept
get character without extracting it.
Definition view.hpp:416
bool getIf(char expected) noexcept
extracts expected character.
Definition view.hpp:435
BasicStreamView & operator=(const BasicStreamView &other)=delete
copy assignment.
BasicStreamView(std::istream &in)
default constructor.
Definition view.hpp:376
bool getIfNoCase(char expected) noexcept
extracts expected character (case insensitive, ASCII-only).
Definition view.hpp:450
BufferingView(ViewType &view)
default constructor.
Definition view.hpp:731
bool getIfNoCase(char expected) noexcept
extracts expected character (case insensitive, ASCII-only).
Definition view.hpp:783
void consume(std::string &out)
consume buffered data.
Definition view.hpp:810
void snapshot(std::string &out)
get snapshot.
Definition view.hpp:801
int peek() const noexcept
get character without extracting it.
Definition view.hpp:744
bool getIf(char expected) noexcept
extracts expected character.
Definition view.hpp:768
int get() noexcept
extracts character.
Definition view.hpp:753
int get() noexcept
extracts character.
Definition view.hpp:664
void consume(std::string &out)
consume buffered data.
Definition view.hpp:706
int peek() const noexcept
get character without extracting it.
Definition view.hpp:655
void snapshot(std::string &out)
get snapshot.
Definition view.hpp:693
bool getIfNoCase(char expected) noexcept
extracts expected character (case insensitive, ASCII-only).
Definition view.hpp:684
BufferingView(ViewType &view)
default constructor.
Definition view.hpp:645
bool getIf(char expected) noexcept
extracts expected character.
Definition view.hpp:674
buffering view adapter
Definition view.hpp:632
string view.
Definition view.hpp:78
bool getIfNoCase(char expected) noexcept
extracts expected character (case insensitive, ASCII-only).
Definition view.hpp:194
void readUntilEscaped(std::string &out) noexcept
read characters until escaped.
Definition view.hpp:227
StringView & operator=(const StringView &other)=default
copy assignment.
StringView(const StringView &other)=default
copy constructor.
StringView(const char *in)
default constructor.
Definition view.hpp:110
const char * ViewPos
Definition view.hpp:80
constexpr StringView(const char *in, size_t count)
default constructor.
Definition view.hpp:87
StringView(StringView &&other)=default
move constructor.
int peek() const noexcept
get character without extracting it.
Definition view.hpp:152
ViewPos tell() const noexcept
get input position indicator.
Definition view.hpp:327
~StringView()=default
destroy instance.
void seek(ViewPos pos) noexcept
seek to the specified position.
Definition view.hpp:336
size_t read(char *buf, size_t count) noexcept
read characters.
Definition view.hpp:214
int skipWhitespaces() noexcept
skip whitespaces.
Definition view.hpp:246
StringView & operator=(StringView &&other)=default
move assignment.
int skipWhitespacesAndComments() noexcept
skip whitespaces and comments.
Definition view.hpp:265
int get() noexcept
extracts character.
Definition view.hpp:165
bool getIf(char expected) noexcept
extracts expected character.
Definition view.hpp:179
constexpr StringView(const char *first, const char *last)
default constructor.
Definition view.hpp:99
constexpr WhitespaceTable whitespaceLookup
Definition view.hpp:71
constexpr EscapedTable escapedLookup
Definition view.hpp:56
Definition acceptor.hpp:32
uint8_t data[256]
Definition view.hpp:46
constexpr EscapedTable()
Definition view.hpp:48
constexpr WhitespaceTable()
Definition view.hpp:62
uint8_t data[256]
Definition view.hpp:60
trait to determine if a view type is seekable.
Definition view.hpp:614
#define JOIN_LIKELY(x)
Definition utils.hpp:46