28 #ifndef YB_INC_ystdex_iterator_hpp_
29 #define YB_INC_ystdex_iterator_hpp_ 1
57 template<
typename _tParam,
typename =
yimpl(std::pair<
58 decltype(*std::declval<_tParam&>()), decltype(++std::declval<_tParam&>())>)>
60 is_same<decltype(++std::declval<_tParam&>()), _tParam&>::value,
int>;
77 template<
typename _tIterator>
83 template<
typename _type>
97 template<
typename _tIn,
typename _fPred>
100 typename std::iterator_traits<_tIn>::difference_type n = 1)
103 return f(*i) ? std::next(i, n) : i;
105 template<
typename _tIn,
typename _type>
108 typename std::iterator_traits<_tIn>::difference_type n = 1)
111 return *i == val ? std::next(i, n) : i;
120 template<
typename _tBi,
typename _fPred>
123 typename std::iterator_traits<_tBi>::difference_type n = 1)
125 return f(*i) ? std::prev(i, n) : i;
127 template<
typename _tBi,
typename _type>
130 typename std::iterator_traits<_tBi>::difference_type n = 1)
132 return *i == val ? std::prev(i, n) : i;
144 template<
typename _tIterator1,
typename _tIterator2>
147 std::make_pair(std::make_move_iterator(it1), std::make_move_iterator(it2)))
149 return std::make_pair(std::make_move_iterator(it1),
150 std::make_move_iterator(it2));
158 template<
typename _tRange>
177 template<
typename _type>
183 =
typename std::iterator_traits<iterator_type>::iterator_category;
184 using value_type =
typename std::iterator_traits<iterator_type>::value_type;
186 =
typename std::iterator_traits<iterator_type>::difference_type;
187 using pointer =
typename std::iterator_traits<iterator_type>::pointer;
188 using reference =
typename std::iterator_traits<iterator_type>::reference;
200 template<
typename _tPo
inter>
302 template<
typename _type>
311 template<
typename _type>
328 template<
typename _type>
334 template<
typename _type>
349 template<
typename _type,
typename _tIterator = _type*,
350 typename _tTraits = std::iterator_traits<_tIterator>>
360 using pointer =
typename traits_type::pointer;
392 value = std::move(i.value);
484 template<
typename _type,
typename _tIterator,
typename _tTraits>
492 template<
typename _type,
typename _tIterator,
typename _tTraits>
513 template<
typename _tIterator,
typename _fTransformer>
530 using reference = decltype(std::declval<transformed_type>());
540 template<
typename _tIter,
typename _tTran,
560 template<
typename _tDiff>
629 template<
typename _type,
typename _fTransformer>
634 return x.
get() == y.
get();
637 template<
typename _type,
typename _fTransformer>
652 template<
typename _type,
typename _fTransformer>
653 inline transformed_iterator<_type, _fTransformer>&
661 template<
typename _type,
typename _fTransformer>
670 template<
typename _type,
typename _fTransformer>
671 transformed_iterator<_type, _fTransformer>
672 operator+(
const transformed_iterator<_type, _fTransformer>& i,
673 typename transformed_iterator<_type, _fTransformer>::difference_type n)
681 template<
typename _type,
typename _fTransformer>
682 transformed_iterator<_type, _fTransformer>
683 operator-(
const transformed_iterator<_type, _fTransformer>& i,
684 typename transformed_iterator<_type, _fTransformer>::difference_type n)
691 template<
typename _type,
typename _fTransformer>
692 typename transformed_iterator<_type, _fTransformer>::difference_type
693 operator-(
const transformed_iterator<_type, _fTransformer>& x,
694 const transformed_iterator<_type, _fTransformer>& y)
696 return x.get() - y.get();
699 template<
typename _type,
typename _fTransformer>
701 operator<(const transformed_iterator<_type, _fTransformer>& x,
702 const transformed_iterator<_type, _fTransformer>& y)
704 return bool(x.get() < y.get());
707 template<
typename _type,
typename _fTransformer>
709 operator<=(const transformed_iterator<_type, _fTransformer>& x,
710 const transformed_iterator<_type, _fTransformer>& y)
715 template<
typename _type,
typename _fTransformer>
717 operator>(
const transformed_iterator<_type, _fTransformer>& x,
718 const transformed_iterator<_type, _fTransformer>& y)
723 template<
typename _type,
typename _fTransformer>
725 operator>=(
const transformed_iterator<_type, _fTransformer>& x,
726 const transformed_iterator<_type, _fTransformer>& y)
739 template<
typename _tIterator,
typename _fTransformer>
740 inline transformed_iterator<typename array_ref_decay<_tIterator>::type,
753 namespace iterator_transformation
757 template<
typename _tIterator>
759 first(
const _tIterator& i) -> decltype((i->first))
763 template<
typename _tIterator>
765 second(
const _tIterator& i) -> decltype((i->second))
769 template<
typename _tIterator>
795 template<
typename _tIterator>
804 template<
typename _tIterator>
814 template<
typename _tIterator>
833 template<
typename _tMaster,
typename _tSlave,
834 class _tTraits = std::iterator_traits<_tMaster>>
845 using pointer =
typename traits_type::pointer;
850 : std::pair<_tMaster, _tSlave>(_tMaster(), _tSlave())
854 : std::pair<_tMaster, _tSlave>(_i, _tSlave())
858 : std::pair<_tMaster, _tSlave>(_i, _s)
864 : std::pair<_tMaster, _tSlave>(std::move(_r))
874 static_cast<std::pair<_tMaster, _tSlave>&
>(*this)
875 =
static_cast<std::pair<_tMaster, _tSlave>&&
>(i);
954 return this->
first[n];
962 yunseq(i.first += n, i.second += n);
971 yunseq(i.first -= n, i.second -= n);
977 template<
typename _tFirst,
typename _tSecond,
979 && is_convertible<_tSlave, _tSecond>::value,
int>>
980 operator std::pair<_tFirst, _tSecond>()
982 return std::pair<_tFirst, _tSecond>(this->
first, this->
second);
997 template<
typename _tMaster,
typename _tSlave>
1002 return x.
base().first == y.
base().first
1003 && x.
base().second == y.
base().second();
1006 template<
typename _tMaster,
typename _tSlave>
1022 template<
typename _tIterator>
1028 using value_type =
typename std::iterator_traits<iterator_type>::value_type;
1030 =
typename std::iterator_traits<iterator_type>::difference_type;
1031 using pointer =
typename std::iterator_traits<iterator_type>::pointer;
1032 using reference =
typename std::iterator_traits<iterator_type>::reference;
1063 iter = std::move(i.iter);
1073 return (*iter).operator->();
1077 template<
typename =
enable_if_t<is_constructible<bool,
1078 decltype(*std::declval<iterator_type&>())>::value,
int>>
1080 operator bool() const
1113 const auto i(*
this);
1122 return (!
bool(x) && !
bool(y)) || x.
iter == y.
iter;
1141 template<
typename _tIterator>
1161 #if YB_IMPL_MSCPP || YB_IMPL_CLANGPP
1163 template<
unsigned char _vN,
bool _bEndian = false>
1165 template<
unsigned char _vN,
bool _bEndian = {}>
1168 byte, ptrdiff_t, byte*, byte&>
1170 static_assert(_vN != 0,
"A bit segment should contain at least one bit.");
1171 static_assert(_vN != CHAR_BIT,
"A bit segment should not be a byte.");
1172 static_assert(CHAR_BIT % _vN == 0,
1173 "A byte should be divided by number of segments without padding.");
1209 const size_t new_shift(
shift + n);
1279 const auto i(*
this);
1282 return *i.operator->();
1316 template<
size_t _vN,
bool _bEndian>
1326 template<
size_t _vN,
bool _bEndian>
1334 template<
size_t _vN,
bool _bEndian>
1336 operator<(const bitseg_iterator<_vN, _bEndian>& x,
1337 const bitseg_iterator<_vN, _bEndian>& y)
1339 using pointer =
typename bitseg_iterator<_vN, _bEndian>::pointer;
1341 return pointer(x) < pointer(y)
1342 || (pointer(x) == pointer(y) && x.get_shift() < y.get_shift());
1345 template<
size_t _vN,
bool _bEndian>
1347 operator<=(const bitseg_iterator<_vN, _bEndian>& x,
1348 const bitseg_iterator<_vN, _bEndian>& y)
1353 template<
size_t _vN,
bool _bEndian>
1355 operator>(
const bitseg_iterator<_vN, _bEndian>& x,
1356 const bitseg_iterator<_vN, _bEndian>& y)
1361 template<
size_t _vN,
bool _bEndian>
1363 operator>=(
const bitseg_iterator<_vN, _bEndian>& x,
1364 const bitseg_iterator<_vN, _bEndian>& y)
1379 template<
class _tCon,
typename _type>
1427 return std::addressof(**
this);
1509 template<
class _tCon,
typename _type>
1519 template<
class _tCon,
typename _type>
const transformer_type & get_transformer() const
typename traits_type::value_type value_type
bool operator>=(const path< _tSeqCon, _tNorm > &x, const path< _tSeqCon, _tNorm > &y)
pair_iterator & operator=(const pair_iterator &)=default
typename traits_type::iterator_category iterator_category
bitseg_iterator & operator+=(difference_type n)
pseudo_iterator operator--(int) const
typename traits_type::pointer pointer
pointer_iterator(_tPointer &&ptr)
pointer operator->() const
reference operator[](difference_type n) const
bitseg_iterator operator+(difference_type n) const
pair_iterator & operator++()
pointer_iterator & operator+=(difference_type n)
#define ynothrowv
YSLib 无异常抛出保证验证:有条件地使用无异常抛出规范。
bool operator==(const bitseg_iterator< _vN, _bEndian > &x, const bitseg_iterator< _vN, _bEndian > &y)
static auto first(const _tIterator &i) -> decltype((i->first))
typename traits_type::reference reference
reference operator*() const
typename std::iterator_traits< iterator_type >::pointer pointer
bool operator!=(nullptr_t lhs, const _type &rhs)
decltype(std::declval< transformed_type >()) reference
pointer_iterator operator-(difference_type n) const
pseudo_iterator(value_type v)
bitseg_iterator(byte *p={}, unsigned char n=0)
构造:使用基指针和偏移位。
auto make_move_iterator_pair(_tIterator1 it1, _tIterator2 it2) -> decltype(std::make_pair(std::make_move_iterator(it1), std::make_move_iterator(it2)))
取转移迭代器对。
typename result_of< _type >::type result_of_t
bitseg_iterator operator--(int)
pointer_iterator & operator--()
indirect_input_iterator & operator++()
迭代:向后遍历。
typename std::iterator_traits< iterator_type >::value_type value_type
pointer operator->() const
typename traits_type::pointer pointer
_tBi prev_if_eq(_tBi i, const _type &val, typename std::iterator_traits< _tBi >::difference_type n=1)
pointer operator->() const
transformed_iterator()=default
pair_iterator operator++(int)
typename std::iterator_traits< iterator_type >::value_type value_type
std::pair< _tMaster, _tSlave > pair_type
bool operator==(const pointer_iterator< _type > &x, const pointer_iterator< _type > &y)
subscriptive_iterator operator+(difference_type n) const
indirect_input_iterator & operator=(const indirect_input_iterator &)=default
decay_t< _fTransformer > transformer_type
bool operator!=(const indirect_input_iterator< _tIterator > &x, const indirect_input_iterator< _tIterator > &y)
pointer operator->() const
indirect_input_iterator operator++(int)
typename decay< _type >::type decay_t
const first_tag get_first
操纵子。
pseudo_iterator & operator--() const
满足双向迭代器要求。
typename std::iterator_traits< iterator_type >::iterator_category iterator_category
bitseg_iterator & operator-=(difference_type n)
pointer_iterator operator--(int)
subscriptive_iterator & operator++()
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
reference operator[](difference_type n) const
满足随机访问迭代器要求。
pair_iterator & operator--()
满足双向迭代器要求。
bool operator==(const transformed_iterator< _type, _fTransformer > &x, const transformed_iterator< _type, _fTransformer > &y)
满足输入迭代器要求。
const struct ystdex::indirect_tag get_indirect
bitseg_iterator operator++(int)
subscriptive_iterator & operator-=(difference_type n)
subscriptive_iterator operator--(int)
bool operator>(const path< _tSeqCon, _tNorm > &x, const path< _tSeqCon, _tNorm > &y)
pair_iterator(const _tMaster &_i, const _tSlave &_s)
transformer_type transformer
ptrdiff_t difference_type
typename traits_type::difference_type difference_type
bool operator==(const pair_iterator< _tMaster, _tSlave > &x, const pair_iterator< _tMaster, _tSlave > &y)
pointer_iterator & operator++()
typename pointer_classify< _tIterator >::type::difference_type difference_type
void swap(any &x, any &y)
交换对象。
pseudo_iterator & operator=(const pseudo_iterator &)=default
indirect_input_iterator(indirect_input_iterator &&i)
const second_tag get_value
bitseg_iterator operator-(difference_type n) const
pseudo_iterator & operator+=(difference_type)
pseudo_iterator operator-(difference_type) const
subscriptive_iterator operator-(difference_type n) const
pointer_iterator operator+(difference_type n) const
#define yunseq
无序列依赖表达式组求值。
pair_iterator & operator+=(difference_type n)
pair_iterator operator-(difference_type n) const
pseudo_iterator operator+(difference_type) const
typename std::iterator_traits< iterator_type >::pointer pointer
iterator_type & get()
取原迭代器引用。
pair_iterator & operator-=(difference_type n)
static const unsigned char seg_size
pair_iterator operator+(difference_type n) const
static auto indirect(const _tIterator &i) -> decltype((**i))
static const unsigned char seg_n
#define ynothrow
YSLib 无异常抛出保证:若支持 noexcept 关键字, 指定特定的 noexcept 异常规范。
typename traits_type::difference_type difference_type
pointer operator->() const
pseudo_iterator & operator-=(difference_type)
yconstfn GBinaryGroup< _type > operator+(const GBinaryGroup< _type > &a, const GBinaryGroup< _type > &b) ynothrow
加法:屏幕二元组。
reference operator*() const
std::random_access_iterator_tag iterator_category
reference operator*() const
间接操作。
#define yconstraint
约束:接口语义。
typename array_decay< _type >::type type
typename traits_type::reference reference
bool operator==(const pseudo_iterator< _type, _tIterator, _tTraits > &x, const pseudo_iterator< _type, _tIterator, _tTraits > &y)
满足输入迭代器要求。
pointer_iterator(nullptr_t={})
reference operator[](difference_type n) const
typename std::iterator_traits< iterator_type >::reference reference
subscriptive_iterator & operator+=(difference_type n)
typename traits_type::value_type value_type
#define yconstfn
指定编译时常量函数。
subscriptive_iterator operator--()
enable_if_t<!is_same< _tClass &, remove_rcv_t< _tParam > & >::value, _type > exclude_self_ctor_t
移除选择类类型的特定重载避免构造模板和复制/转移构造函数冲突。
typename std::iterator_traits< iterator_type >::difference_type difference_type
reference operator*() const
pair_iterator(const _tMaster &_i)
static const unsigned char seg_width
reference operator[](difference_type n) const
满足随机访问迭代器要求。
pointer operator->() const
enable_if_t< is_convertible< decltype(std::declval< iterator_type & >)[_tDiff()]), reference >::value, reference > operator[](_tDiff n)
bool operator!=(const subscriptive_iterator< _tCon, _type > &x, const subscriptive_iterator< _tCon, _type > &y)
比较成员下标迭代器的不等性。
transformed_iterator(_tIter &&i, _tTran f={})
const pair_type & base() const
subscriptive_iterator operator++(int)
pointer_iterator & operator-=(difference_type n)
reference operator[](difference_type n) const
typename std::iterator_traits< iterator_type >::reference reference
#define yconstexpr
指定编译时常量表达式。
bool is_undereferenceable(const any_input_iterator< _type, _tDifference, _tPointer, _tReference > &i)
enable_if_t< is_same< decltype(++std::declval< _tParam & >()), _tParam & >::value, int > enable_for_iterator_t
选择迭代器类型的特定重载避免和其它类型冲突。
pseudo_iterator & operator++()
reference operator*() const
满足前向迭代器要求。
typename traits_type::iterator_category iterator_category
pseudo_iterator operator++(int)
ptrdiff_t difference_type
bitseg_iterator & operator--()
typename pointer_classify< remove_reference_t< _tIterator >>::type iterator_type
原迭代器类型。
result_of_t< _fTransformer &(_tIterator &)> transformed_type
friend bool operator==(const indirect_input_iterator &x, const indirect_input_iterator &y)
indirect_input_iterator(iterator_type i)
pair_iterator(pair_iterator &&_r)
pair_iterator operator--(int)
auto operator|(_tIterator &&i, first_tag) -> decltype(make_transform(std::forward< decltype(i)>(i), iterator_transformation::first< typename array_ref_decay< _tIterator >::type >))
管道匹配操作符。
std::input_iterator_tag iterator_category
transformed_iterator< _type, _fTransformer > & operator+=(transformed_iterator< _type, _fTransformer > &i, typename transformed_iterator< _type, _fTransformer >::difference_type n)
满足随机迭代器要求。
transformed_iterator< typename array_ref_decay< _tIterator >::type, _fTransformer > make_transform(_tIterator &&i, _fTransformer f)
创建转换迭代器。
_tIn next_if(_tIn i, _fPred f, typename std::iterator_traits< _tIn >::difference_type n=1)
迭代器指向的值满足条件时取邻接迭代器,否则取原值。
bitseg_iterator & operator++()
bool equals(const subscriptive_iterator< _tCon, _type > &i) const
static auto second(const _tIterator &i) -> decltype((i->second))
bool operator==(const subscriptive_iterator< _tCon, _type > &x, const subscriptive_iterator< _tCon, _type > &y)
比较成员下标迭代器的相等性。
reference operator*() const
_tIn next_if_eq(_tIn i, const _type &val, typename std::iterator_traits< _tIn >::difference_type n=1)
transformer_type & get_transformer()
yconstfn GBinaryGroup< _type > operator-(const GBinaryGroup< _type > &a, const GBinaryGroup< _type > &b) ynothrow
减法:屏幕二元组。
reference operator*() const
满足前向迭代器要求。
typename enable_if< _bCond, _type >::type enable_if_t
pointer_iterator operator++(int)
indirect_input_iterator()
_tCon * container() const
subscriptive_iterator(_tCon &c, size_t i)
_tBi prev_if(_tBi i, _fPred f, typename std::iterator_traits< _tBi >::difference_type n=1)
迭代器指向的值满足条件时取反向邻接迭代器,否则取原值。
const second_tag get_second
typename std::iterator_traits< iterator_type >::difference_type difference_type