noexcept-ify utf8::iterator methods
This commit is contained in:
parent
cb6ef4afb6
commit
5a5d2ad7cb
|
@ -22,45 +22,46 @@ class iterator : public std::iterator<std::bidirectional_iterator_tag,
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
iterator() = default;
|
iterator() = default;
|
||||||
|
constexpr static bool noexcept_policy = noexcept(InvalidPolicy{}(0));
|
||||||
|
|
||||||
iterator(BaseIt it, BaseIt begin, BaseIt end)
|
iterator(BaseIt it, BaseIt begin, BaseIt end) noexcept
|
||||||
: m_it{std::move(it)}, m_begin{std::move(begin)}, m_end{std::move(end)}
|
: m_it{std::move(it)}, m_begin{std::move(begin)}, m_end{std::move(end)}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
iterator(BaseIt it, const Container& c)
|
iterator(BaseIt it, const Container& c) noexcept
|
||||||
: m_it{std::move(it)}, m_begin{std::begin(c)}, m_end{std::end(c)}
|
: m_it{std::move(it)}, m_begin{std::begin(c)}, m_end{std::end(c)}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
iterator& operator++()
|
iterator& operator++() noexcept
|
||||||
{
|
{
|
||||||
utf8::to_next(m_it, m_end);
|
utf8::to_next(m_it, m_end);
|
||||||
invalidate_value();
|
invalidate_value();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator operator++(int)
|
iterator operator++(int) noexcept
|
||||||
{
|
{
|
||||||
iterator save = *this;
|
iterator save = *this;
|
||||||
++*this;
|
++*this;
|
||||||
return save;
|
return save;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator& operator--()
|
iterator& operator--() noexcept
|
||||||
{
|
{
|
||||||
utf8::to_previous(m_it, m_begin);
|
utf8::to_previous(m_it, m_begin);
|
||||||
invalidate_value();
|
invalidate_value();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator operator--(int)
|
iterator operator--(int) noexcept
|
||||||
{
|
{
|
||||||
iterator save = *this;
|
iterator save = *this;
|
||||||
--*this;
|
--*this;
|
||||||
return save;
|
return save;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator operator+(DifferenceType count) const
|
iterator operator+(DifferenceType count) const noexcept
|
||||||
{
|
{
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return operator-(-count);
|
return operator-(-count);
|
||||||
|
@ -71,7 +72,7 @@ public:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator operator-(DifferenceType count) const
|
iterator operator-(DifferenceType count) const noexcept
|
||||||
{
|
{
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return operator+(-count);
|
return operator+(-count);
|
||||||
|
@ -82,39 +83,39 @@ public:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const iterator& other) const { return m_it == other.m_it; }
|
bool operator==(const iterator& other) const noexcept { return m_it == other.m_it; }
|
||||||
bool operator!=(const iterator& other) const { return m_it != other.m_it; }
|
bool operator!=(const iterator& other) const noexcept { return m_it != other.m_it; }
|
||||||
|
|
||||||
bool operator< (const iterator& other) const { return m_it < other.m_it; }
|
bool operator< (const iterator& other) const noexcept { return m_it < other.m_it; }
|
||||||
bool operator<= (const iterator& other) const { return m_it <= other.m_it; }
|
bool operator<= (const iterator& other) const noexcept { return m_it <= other.m_it; }
|
||||||
|
|
||||||
bool operator> (const iterator& other) const { return m_it > other.m_it; }
|
bool operator> (const iterator& other) const noexcept { return m_it > other.m_it; }
|
||||||
bool operator>= (const iterator& other) const { return m_it >= other.m_it; }
|
bool operator>= (const iterator& other) const noexcept { return m_it >= other.m_it; }
|
||||||
|
|
||||||
bool operator==(const BaseIt& other) { return m_it == other; }
|
bool operator==(const BaseIt& other) noexcept { return m_it == other; }
|
||||||
bool operator!=(const BaseIt& other) { return m_it != other; }
|
bool operator!=(const BaseIt& other) noexcept { return m_it != other; }
|
||||||
|
|
||||||
bool operator< (const BaseIt& other) const { return m_it < other; }
|
bool operator< (const BaseIt& other) const noexcept { return m_it < other; }
|
||||||
bool operator<= (const BaseIt& other) const { return m_it <= other; }
|
bool operator<= (const BaseIt& other) const noexcept { return m_it <= other; }
|
||||||
|
|
||||||
bool operator> (const BaseIt& other) const { return m_it > other; }
|
bool operator> (const BaseIt& other) const noexcept { return m_it > other; }
|
||||||
bool operator>= (const BaseIt& other) const { return m_it >= other; }
|
bool operator>= (const BaseIt& other) const noexcept { return m_it >= other; }
|
||||||
|
|
||||||
DifferenceType operator-(const iterator& other) const
|
DifferenceType operator-(const iterator& other) const noexcept(noexcept_policy)
|
||||||
{
|
{
|
||||||
return (DifferenceType)utf8::distance(other.m_it, m_it);
|
return (DifferenceType)utf8::distance<InvalidPolicy>(other.m_it, m_it);
|
||||||
}
|
}
|
||||||
|
|
||||||
CodepointType operator*() const
|
CodepointType operator*() const noexcept(noexcept_policy)
|
||||||
{
|
{
|
||||||
return get_value();
|
return get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
const BaseIt& base() const { return m_it; }
|
const BaseIt& base() const noexcept(noexcept_policy) { return m_it; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void invalidate_value() { m_value = -1; }
|
void invalidate_value() noexcept { m_value = -1; }
|
||||||
CodepointType get_value() const
|
CodepointType get_value() const noexcept(noexcept_policy)
|
||||||
{
|
{
|
||||||
if (m_value == (CodepointType)-1)
|
if (m_value == (CodepointType)-1)
|
||||||
m_value = (CodepointType)utf8::codepoint<InvalidPolicy>(m_it, m_end);
|
m_value = (CodepointType)utf8::codepoint<InvalidPolicy>(m_it, m_end);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user