📄 transform_iterator.hpp
字号:
/// \name Bidirectional Iterator methods
/// @{
public:
class_type& operator --()
{
++m_it;
return *this;
}
class_type operator --(int)
{
class_type ret(*this);
operator --();
return ret;
}
/// @}
#ifndef STLSOFT_ITER_TXFM_ITER_OLD_DW
/// \name Random Access Iterator methods
/// @{
public:
class_type& operator +=(difference_type d)
{
m_it += d;
return *this;
}
class_type& operator -=(difference_type d)
{
m_it -= d;
return *this;
}
// NOTE: Can't be reference, since what would it reference??
effective_reference operator [](difference_type index)
{
return m_transformer(m_it[index]);
}
// NOTE: Can't be reference, since what would it reference??
effective_const_reference operator [](difference_type index) const
{
return m_transformer(m_it[index]);
}
/// @}
#endif /* !STLSOFT_ITER_TXFM_ITER_OLD_DW */
/// \name Comparison
/// @{
public:
/// Evaluates whether \c this and \c rhs are equivalent
ss_bool_t equal(class_type const& rhs) const
{
return m_it == rhs.m_it;
}
#if 0
ss_bool_t equal(iterator_type rhs) const
{
return m_it == rhs;
}
#endif /* 0 */
/// Compares \c this with the given string
ss_sint_t compare(class_type const& rhs) const
{
return (m_it < rhs.m_it) ? -1 : (rhs.m_it < m_it) ? +1 : 0;
}
#ifndef STLSOFT_ITER_TXFM_ITER_OLD_DW
/// Calculate the distance between \c this and \c rhs
difference_type distance(class_type const& rhs) const
{
return m_it - rhs.m_it;
}
#endif /* !STLSOFT_ITER_TXFM_ITER_OLD_DW */
/// @}
/// \name Members
/// @{
private:
#if 0
public:
#endif /* 0 */
iterator_type m_it;
private:
transform_function_type m_transformer;
value_type m_current;
/// @}
/// \name Not to be implemented
/// @{
private:
struct transform_iterator_is_BVT_so_no_member_selection_operators
{};
transform_iterator_is_BVT_so_no_member_selection_operators *operator ->() const;
/// @}
};
/* /////////////////////////////////////////////////////////////////////////
* Creator functions
*/
/** \brief Creator function for transform_iterator
*
* \ingroup group__library__iterators
*
* \param it The iterator to transform
* \param fn The function object used to effect the transformation
*
* \return An instance of the specialisation transform_iterator<T, F>
*/
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline transform_iterator<I, F> make_transform_iterator(I it, F fn)
{
return transform_iterator<I, F>(it, fn);
}
/** \brief Creator function for transform_iterator
*
* \ingroup group__library__iterators
*
* \param it The iterator to transform
* \param fn The function object used to effect the transformation
*
* \return An instance of the specialisation transform_iterator<T, F>
*
* \note Short-hand for make_transform_iterator()
*/
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline transform_iterator<I, F> transformer(I it, F fn)
{
return make_transform_iterator(it, fn);
}
#if 0
template< ss_typename_param_k I
>
inline transform_iterator<I, null_function> transformer(I it)
{
return transform_iterator<I, null_function>(it, null_function());
}
#endif
#if 0
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline transform_iterator<I, F> transform(I it, F fn)
{
return transform_iterator<I, F>(it, fn);
}
#endif /* 0 */
/* /////////////////////////////////////////////////////////////////////////
* Operators
*/
// operator ==
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator ==(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.equal(rhs);
}
// operator !=
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator !=(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return !lhs.equal(rhs);
}
#if 0
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator !=(transform_iterator<I, F> const& lhs, I rhs)
{
return !lhs.equal(rhs);
}
#endif /* 0 */
#ifndef STLSOFT_ITER_TXFM_ITER_OLD_DW
// operator +
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline transform_iterator<I, F> operator +(transform_iterator<I, F> const& lhs, ss_typename_type_k transform_iterator<I, F>::difference_type rhs)
{
return transform_iterator<I, F>(lhs) += rhs;
}
// operator -
template< ss_typename_param_k I
, ss_typename_param_k F
>
#if 0
inline transform_iterator<I, F> operator -(transform_iterator<I, F> const& lhs, ss_typename_type_k transform_iterator<I, F>::difference_type rhs)
#else /* ? 0 */
inline transform_iterator<I, F> operator -(transform_iterator<I, F> const& lhs, ss_ptrdiff_t rhs)
#endif /* 0 */
{
return transform_iterator<I, F>(lhs) -= rhs;
}
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_typename_type_k transform_iterator<I, F>::difference_type operator -(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.distance(rhs);
}
// operator <
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator <(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.compare(rhs) < 0;
}
// operator <=
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator <=(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.compare(rhs) <= 0;
}
// operator >
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator >(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.compare(rhs) > 0;
}
// operator >=
template< ss_typename_param_k I
, ss_typename_param_k F
>
inline ss_bool_t operator >=(transform_iterator<I, F> const& lhs, transform_iterator<I, F> const& rhs)
{
return lhs.compare(rhs) >= 0;
}
#endif /* !STLSOFT_ITER_TXFM_ITER_OLD_DW */
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/transform_iterator_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* ////////////////////////////////////////////////////////////////////// */
#ifndef _STLSOFT_NO_NAMESPACE
} // namespace stlsoft
#endif /* _STLSOFT_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* !STLSOFT_INCL_STLSOFT_ITERATORS_HPP_TRANSFORM_ITERATOR */
/* ////////////////////////////////////////////////////////////////////// */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -