1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
template<typename Container_t, typename UnaryPredicate>
IterateIfIterator<Container_t, UnaryPredicate>::IterateIfIterator(typename Container_t::iterator curIter, typename Container_t::iterator endIter, const UnaryPredicate &Func)
: m_Predecate(Func)
, m_CurIter(curIter)
, m_EndIter(endIter)
{ }
template<typename Container_t, typename UnaryPredicate>
IterateIfIterator<Container_t, UnaryPredicate> IterateIfIterator<Container_t, UnaryPredicate>::operator++()
{
++m_CurIter;
while (m_CurIter != m_EndIter && !m_Predecate(*m_CurIter))
++m_CurIter;
return IterateIfIterator(m_CurIter, m_EndIter, m_Predecate);
}
template<typename Container_t, typename UnaryPredicate>
typename Container_t::value_type& IterateIfIterator<Container_t, UnaryPredicate>::operator*()
{
return *m_CurIter;
}
template<typename Container_t, typename UnaryPredicate>
bool IterateIfIterator<Container_t, UnaryPredicate>::operator!=(const IterateIfIterator &Iter)
{
return ( m_CurIter != Iter.m_CurIter );
}
template<typename Container_t, typename UnaryPredicate>
bool IterateIfIterator<Container_t, UnaryPredicate>::operator==(const IterateIfIterator &Iter)
{
return ( m_CurIter == Iter.m_CurIter );
}
template<typename Container_t, typename UnaryPredicate>
IterateIf<Container_t, UnaryPredicate>::IterateIf(Container_t &container, const UnaryPredicate &Func)
: m_Predecate(Func), m_Container(container)
, m_End(container.end()), m_Begin(container.begin()), m_CurIter(container.begin())
{
size_t i = 0;
for (const auto & it : container) {
if (m_Predecate.operator()(it)) break;
i++;
}
if (i < container.size() - 1)
m_Begin = m_Container.begin() + i;
else
m_Begin = m_End;
m_CurIter = m_Begin;
}
template<typename Container_t, typename UnaryPredicate>
IterateIfIterator<Container_t, UnaryPredicate> IterateIf<Container_t, UnaryPredicate>::end() const
{
return IterateIfIterator<Container_t, UnaryPredicate>(m_Container.end(), m_End, m_Predecate);
}
template<typename Container_t, typename UnaryPredicate>
IterateIfIterator<Container_t, UnaryPredicate> IterateIf<Container_t, UnaryPredicate>::begin() const
{
return IterateIfIterator<Container_t, UnaryPredicate>(m_Begin, m_End, m_Predecate);
}
template<typename Container_t, typename UnaryPredicate>
IterateIf<Container_t, UnaryPredicate> FilterIfNot(Container_t &container, const UnaryPredicate &Func)
{
return IterateIf<Container_t, UnaryPredicate>(container, Func);
}
|