StringParsingBuffer.h [plain text]
#pragma once
#include <wtf/text/StringView.h>
namespace WTF {
template<typename T>
class StringParsingBuffer final {
WTF_MAKE_FAST_ALLOCATED;
public:
using CharacterType = T;
constexpr StringParsingBuffer() = default;
constexpr StringParsingBuffer(const CharacterType* characters, unsigned length)
: m_position { characters }
, m_end { characters + length }
{
ASSERT(characters || !length);
}
constexpr StringParsingBuffer(const CharacterType* characters, const CharacterType* end)
: m_position { characters }
, m_end { end }
{
ASSERT(characters <= end);
ASSERT(!characters == !end);
ASSERT(static_cast<size_t>(end - characters) <= std::numeric_limits<unsigned>::max());
}
constexpr auto position() const { return m_position; }
constexpr auto end() const { return m_end; }
constexpr bool hasCharactersRemaining() const { return m_position < m_end; }
constexpr bool atEnd() const { return m_position == m_end; }
constexpr unsigned lengthRemaining() const { return m_end - m_position; }
StringView stringViewOfCharactersRemaining() { return { m_position, lengthRemaining() }; }
CharacterType operator[](unsigned i)
{
ASSERT(i < lengthRemaining());
return m_position[i];
}
constexpr CharacterType operator*() const
{
ASSERT(hasCharactersRemaining());
return *m_position;
}
constexpr void advance()
{
ASSERT(hasCharactersRemaining());
++m_position;
}
constexpr void advanceBy(unsigned places)
{
ASSERT(places <= lengthRemaining());
m_position += places;
}
constexpr StringParsingBuffer& operator++()
{
advance();
return *this;
}
constexpr StringParsingBuffer operator++(int)
{
auto result = *this;
++*this;
return result;
}
constexpr StringParsingBuffer& operator+=(int places)
{
advanceBy(places);
return *this;
}
private:
const CharacterType* m_position { nullptr };
const CharacterType* m_end { nullptr };
};
template<typename StringType, typename Function> decltype(auto) readCharactersForParsing(StringType&& string, Function&& functor)
{
if (string.is8Bit())
return functor(StringParsingBuffer { string.characters8(), string.length() });
return functor(StringParsingBuffer { string.characters16(), string.length() });
}
}
using WTF::StringParsingBuffer;
using WTF::readCharactersForParsing;