porting cel/range/algoritm.hpp

This commit is contained in:
bolero-MURAKAMI 2012-04-04 17:48:02 +09:00
commit ba6482d1ec
51 changed files with 1908 additions and 116 deletions

View file

@ -9,16 +9,16 @@ namespace sprout {
namespace detail {
// Copyright (C) 2011 RiSK (sscrisk)
template<typename Iterator>
SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type
distance(Iterator first, Iterator last) {
template<typename InputIterator>
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last) {
return first == last ? 0
: 1 + sprout::detail::distance(sprout::next(first), last)
;
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type
distance_impl(Iterator first, Iterator last) {
template<typename InputIterator>
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
distance_impl(InputIterator first, InputIterator last) {
using sprout::detail::distance;
return distance(first, last);
}
@ -26,9 +26,9 @@ namespace sprout {
//
// distance
//
template<typename Iterator>
SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type
distance(Iterator first, Iterator last) {
template<typename InputIterator>
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last) {
return sprout::detail::distance_impl(first, last);
}
} // namespace sprout

View file

@ -8,70 +8,70 @@
namespace sprout {
namespace detail {
template<typename Iterator>
template<typename RandomAccessIterator>
SPROUT_CONSTEXPR typename std::enable_if<
std::is_literal_type<typename std::decay<Iterator>::type>::value,
typename std::decay<Iterator>::type
std::is_literal_type<typename std::decay<RandomAccessIterator>::type>::value,
typename std::decay<RandomAccessIterator>::type
>::type next_impl(
Iterator&& it,
RandomAccessIterator&& it,
std::random_access_iterator_tag*
)
{
return sprout::forward<Iterator>(it) + 1;
return sprout::forward<RandomAccessIterator>(it) + 1;
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type next_impl(
Iterator&& it,
template<typename ForwardIterator>
SPROUT_CONSTEXPR typename std::decay<ForwardIterator>::type next_impl(
ForwardIterator&& it,
void*
)
{
using std::next;
return next(sprout::forward<Iterator>(it));
return next(sprout::forward<ForwardIterator>(it));
}
template<typename Iterator>
template<typename RandomAccessIterator>
SPROUT_CONSTEXPR typename std::enable_if<
std::is_literal_type<typename std::decay<Iterator>::type>::value,
typename std::decay<Iterator>::type
std::is_literal_type<typename std::decay<RandomAccessIterator>::type>::value,
typename std::decay<RandomAccessIterator>::type
>::type next_impl(
Iterator&& it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n,
RandomAccessIterator&& it,
typename std::iterator_traits<typename std::decay<RandomAccessIterator>::type>::difference_type n,
std::random_access_iterator_tag*
)
{
return sprout::forward<Iterator>(it) + n;
return sprout::forward<RandomAccessIterator>(it) + n;
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type next_impl(
Iterator it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n,
template<typename ForwardIterator>
SPROUT_CONSTEXPR typename std::decay<ForwardIterator>::type next_impl(
ForwardIterator it,
typename std::iterator_traits<typename std::decay<ForwardIterator>::type>::difference_type n,
void*
)
{
using std::next;
return next(sprout::forward<Iterator>(it), n);
return next(sprout::forward<ForwardIterator>(it), n);
}
} // namespace detail
//
// next
//
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type next(Iterator&& it) {
typedef typename std::iterator_traits<typename std::decay<Iterator>::type>::iterator_category* category;
template<typename ForwardIterator>
SPROUT_CONSTEXPR typename std::decay<ForwardIterator>::type next(ForwardIterator&& it) {
typedef typename std::iterator_traits<typename std::decay<ForwardIterator>::type>::iterator_category* category;
return sprout::detail::next_impl(
sprout::forward<Iterator>(it),
sprout::forward<ForwardIterator>(it),
category()
);
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type next(
Iterator&& it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n
template<typename ForwardIterator>
SPROUT_CONSTEXPR typename std::decay<ForwardIterator>::type next(
ForwardIterator&& it,
typename std::iterator_traits<typename std::decay<ForwardIterator>::type>::difference_type n
)
{
typedef typename std::iterator_traits<typename std::decay<Iterator>::type>::iterator_category* category;
typedef typename std::iterator_traits<typename std::decay<ForwardIterator>::type>::iterator_category* category;
return sprout::detail::next_impl(
sprout::forward<Iterator>(it),
sprout::forward<ForwardIterator>(it),
n,
category()
);

View file

@ -8,70 +8,70 @@
namespace sprout {
namespace detail {
template<typename Iterator>
template<typename RandomAccessIterator>
SPROUT_CONSTEXPR typename std::enable_if<
std::is_literal_type<typename std::decay<Iterator>::type>::value,
typename std::decay<Iterator>::type
std::is_literal_type<typename std::decay<RandomAccessIterator>::type>::value,
typename std::decay<RandomAccessIterator>::type
>::type prev_impl(
Iterator&& it,
RandomAccessIterator&& it,
std::random_access_iterator_tag*
)
{
return sprout::forward<Iterator>(it) - 1;
return sprout::forward<RandomAccessIterator>(it) - 1;
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type prev_impl(
Iterator&& it,
template<typename BidirectionalIterator>
SPROUT_CONSTEXPR typename std::decay<BidirectionalIterator>::type prev_impl(
BidirectionalIterator&& it,
void*
)
{
using std::prev;
return prev(sprout::forward<Iterator>(it));
return prev(sprout::forward<BidirectionalIterator>(it));
}
template<typename Iterator>
template<typename RandomAccessIterator>
SPROUT_CONSTEXPR typename std::enable_if<
std::is_literal_type<typename std::decay<Iterator>::type>::value,
typename std::decay<Iterator>::type
std::is_literal_type<typename std::decay<RandomAccessIterator>::type>::value,
typename std::decay<RandomAccessIterator>::type
>::type prev_impl(
Iterator&& it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n,
RandomAccessIterator&& it,
typename std::iterator_traits<typename std::decay<RandomAccessIterator>::type>::difference_type n,
std::random_access_iterator_tag*
)
{
return sprout::forward<Iterator>(it) - n;
return sprout::forward<RandomAccessIterator>(it) - n;
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type prev_impl(
Iterator it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n,
template<typename BidirectionalIterator>
SPROUT_CONSTEXPR typename std::decay<BidirectionalIterator>::type prev_impl(
BidirectionalIterator it,
typename std::iterator_traits<typename std::decay<BidirectionalIterator>::type>::difference_type n,
void*
)
{
using std::prev;
return prev(sprout::forward<Iterator>(it), n);
return prev(sprout::forward<BidirectionalIterator>(it), n);
}
} // namespace detail
//
// prev
//
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type prev(Iterator&& it) {
typedef typename std::iterator_traits<typename std::decay<Iterator>::type>::iterator_category* category;
template<typename BidirectionalIterator>
SPROUT_CONSTEXPR typename std::decay<BidirectionalIterator>::type prev(BidirectionalIterator&& it) {
typedef typename std::iterator_traits<typename std::decay<BidirectionalIterator>::type>::iterator_category* category;
return sprout::detail::prev_impl(
sprout::forward<Iterator>(it),
sprout::forward<BidirectionalIterator>(it),
category()
);
}
template<typename Iterator>
SPROUT_CONSTEXPR typename std::decay<Iterator>::type prev(
Iterator&& it,
typename std::iterator_traits<typename std::decay<Iterator>::type>::difference_type n
template<typename BidirectionalIterator>
SPROUT_CONSTEXPR typename std::decay<BidirectionalIterator>::type prev(
BidirectionalIterator&& it,
typename std::iterator_traits<typename std::decay<BidirectionalIterator>::type>::difference_type n
)
{
typedef typename std::iterator_traits<typename std::decay<Iterator>::type>::iterator_category* category;
typedef typename std::iterator_traits<typename std::decay<BidirectionalIterator>::type>::iterator_category* category;
return sprout::detail::prev_impl(
sprout::forward<Iterator>(it),
sprout::forward<BidirectionalIterator>(it),
n,
category()
);