mirror of
https://github.com/YACReader/yacreader
synced 2025-06-04 01:28:55 -04:00
136 lines
3.2 KiB
C++
136 lines
3.2 KiB
C++
// iterator.hpp
|
|
// Copyright (c) 2015-2018 Ben Hanson (http://www.benhanson.net/)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#ifndef LEXERTL_ITERATOR_HPP
|
|
#define LEXERTL_ITERATOR_HPP
|
|
|
|
#include <iterator>
|
|
#include "lookup.hpp"
|
|
#include "state_machine.hpp"
|
|
|
|
namespace lexertl
|
|
{
|
|
template<typename iter, typename sm_type, typename results>
|
|
class iterator
|
|
{
|
|
public:
|
|
using value_type = results;
|
|
using difference_type = ptrdiff_t;
|
|
using pointer = const value_type *;
|
|
using reference = const value_type &;
|
|
using iterator_category = std::forward_iterator_tag;
|
|
|
|
iterator() :
|
|
_results(iter(), iter()),
|
|
_sm(nullptr)
|
|
{
|
|
}
|
|
|
|
iterator(const iter &start_, const iter &end_, const sm_type &sm) :
|
|
_results(start_, end_),
|
|
_sm(&sm)
|
|
{
|
|
lookup();
|
|
}
|
|
|
|
// Only need this because of warnings with gcc with -Weffc++
|
|
iterator(const iterator &rhs_)
|
|
{
|
|
_results = rhs_._results;
|
|
_sm = rhs_._sm;
|
|
}
|
|
|
|
// Only need this because of warnings with gcc with -Weffc++
|
|
iterator &operator =(const iterator &rhs_)
|
|
{
|
|
if (&rhs_ != this)
|
|
{
|
|
_results = rhs_._results;
|
|
_sm = rhs_._sm;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
iterator &operator ++()
|
|
{
|
|
lookup();
|
|
return *this;
|
|
}
|
|
|
|
iterator operator ++(int)
|
|
{
|
|
iterator iter_ = *this;
|
|
|
|
lookup();
|
|
return iter_;
|
|
}
|
|
|
|
const value_type &operator *() const
|
|
{
|
|
return _results;
|
|
}
|
|
|
|
const value_type *operator ->() const
|
|
{
|
|
return &_results;
|
|
}
|
|
|
|
bool operator ==(const iterator &rhs_) const
|
|
{
|
|
return _sm == rhs_._sm && (_sm == nullptr ? true :
|
|
_results == rhs_._results);
|
|
}
|
|
|
|
bool operator !=(const iterator &rhs_) const
|
|
{
|
|
return !(*this == rhs_);
|
|
}
|
|
|
|
const sm_type &sm() const
|
|
{
|
|
return *_sm;
|
|
}
|
|
|
|
private:
|
|
value_type _results;
|
|
const sm_type *_sm;
|
|
|
|
void lookup()
|
|
{
|
|
lexertl::lookup(*_sm, _results);
|
|
|
|
if (_results.first == _results.eoi)
|
|
{
|
|
_sm = nullptr;
|
|
}
|
|
}
|
|
};
|
|
|
|
using siterator =
|
|
iterator<std::string::const_iterator, state_machine, smatch>;
|
|
using citerator = iterator<const char *, state_machine, cmatch>;
|
|
using wsiterator =
|
|
iterator<std::wstring::const_iterator, wstate_machine, wsmatch>;
|
|
using wciterator = iterator<const wchar_t *, wstate_machine, wcmatch>;
|
|
using u32siterator = iterator<std::u32string::const_iterator,
|
|
u32state_machine, u32smatch>;
|
|
using u32citerator = iterator<const char32_t *, u32state_machine, u32cmatch>;
|
|
|
|
using sriterator =
|
|
iterator<std::string::const_iterator, state_machine, srmatch>;
|
|
using criterator = iterator<const char *, state_machine, crmatch>;
|
|
using wsriterator =
|
|
iterator<std::wstring::const_iterator, wstate_machine, wsrmatch>;
|
|
using wcriterator =
|
|
iterator<const wchar_t *, wstate_machine, wcrmatch>;
|
|
using u32sriterator = iterator<std::u32string::const_iterator,
|
|
u32state_machine, u32srmatch>;
|
|
using u32criterator = iterator<const char32_t *, u32state_machine, u32crmatch>;
|
|
}
|
|
|
|
#endif
|