Пример #1
0
 RANGES_CXX14_CONSTEXPR
 void set_offset(range_difference_type_t<Rng> const delta) noexcept
 {
     RANGES_EXPECT(0 <= delta && delta < stride_);
     if(0 > offset_) offset_ = delta;
     else RANGES_EXPECT(offset_ == delta);
 }
Пример #2
0
        std::pair<T *, std::ptrdiff_t> get_temporary_buffer_impl(
            std::size_t count) noexcept
        {
            RANGES_EXPECT(count >= 0);
            std::size_t n = static_cast<std::size_t>(count);
            if(n > PTRDIFF_MAX / sizeof(T))
                n = PTRDIFF_MAX / sizeof(T);

            void * ptr = nullptr;
            for(; ptr == nullptr && n > 0; n /= 2)
            {
#if RANGES_CXX_ALIGNED_NEW < RANGES_CXX_ALIGNED_NEW_17
                static_assert(alignof(T) <= alignof(std::max_align_t),
                              "Sorry: over-aligned types are supported only with C++17.");
#else  // RANGES_CXX_ALIGNED_NEW
                if(RANGES_CONSTEXPR_IF(alignof(T) > __STDCPP_DEFAULT_NEW_ALIGNMENT__))
                    ptr = ::operator new(
                        sizeof(T) * n, std::align_val_t{alignof(T)}, std::nothrow);
                else
#endif // RANGES_CXX_ALIGNED_NEW
                ptr = ::operator new(sizeof(T) * n, std::nothrow);
            }

            return {static_cast<T *>(ptr), static_cast<std::ptrdiff_t>(n)};
        }
Пример #3
0
 iterator_t<Rng> pos_at_(Rng && rng, Int i, input_range_tag, std::false_type)
 {
     RANGES_EXPECT(i >= 0 || (bool)SizedRange<Rng> || (bool)ForwardRange<Rng>);
     if(0 > i)
         return next(ranges::begin(rng), distance(rng) + i);
     return next(ranges::begin(rng), i);
 }
            safe_iterator_t<Rng>
            operator()(Rng &&rng, range_difference_type_t<Rng> n, F fun, P proj = P{}) const
            {
                if (SizedRange<Rng>())
                    RANGES_EXPECT(n <= distance(rng));

                return (*this)(begin(rng), n, detail::move(fun), detail::move(proj));
            }
Пример #5
0
 RANGES_CXX14_CONSTEXPR
 stride_view_base(Rng &&rng, range_difference_type_t<Rng> const stride)
     noexcept(std::is_nothrow_constructible<stride_view_adaptor<Rng>, Rng>::value &&
         noexcept(std::declval<stride_view_base &>().calc_offset(SizedRange<Rng>())))
   : stride_view_adaptor<Rng>{std::move(rng)},
     stride_{(RANGES_EXPECT(0 < stride), stride)},
     offset_{calc_offset(SizedRange<Rng>())}
 {}
Пример #6
0
 slice_view_(Rng rng, range_difference_t<Rng> from,
             range_difference_t<Rng> count)
   : rng_(std::move(rng))
   , from_(from)
   , count_(count)
 {
     RANGES_EXPECT(0 <= count_);
 }
Пример #7
0
 T &construct_from(Args &&... args)
     noexcept(std::is_nothrow_constructible<T, Args...>::value)
 {
     RANGES_EXPECT(!engaged_);
     auto const address = static_cast<void *>(std::addressof(data_));
     ::new (address) T(static_cast<Args &&>(args)...);
     engaged_ = true;
     return data_;
 }
 I operator()(I begin, difference_type_t<I> n, F fun, P proj = P{}) const
 {
     RANGES_EXPECT(0 <= n);
     auto norig = n;
     auto b = uncounted(begin);
     for(; 0 < n; ++b, --n)
         invoke(fun, invoke(proj, *b));
     return recounted(begin, b, norig);
 }
Пример #9
0
 tagged_pair<tag::out(O), tag::fun(F)>
 operator()(O begin, difference_type_t<O> n, F fun) const
 {
     RANGES_EXPECT(n >= 0);
     auto norig = n;
     auto b = uncounted(begin);
     for(; 0 != n; ++b, --n)
         *b = invoke(fun);
     return {recounted(begin, b, norig), detail::move(fun)};
 }
Пример #10
0
 RANGES_CXX14_CONSTEXPR void next() noexcept
 {
     RANGES_EXPECT(n_ > 0);
     --n_;
     if(n_ == 0)
     {
         from_ = to_;
     }
     else
     {
         from_ += (to_ - from_) / T(n_);
     }
 }
Пример #11
0
 constexpr void next() noexcept
 {
     RANGES_EXPECT(n_ > 0);
     --n_;
     if(n_ == 0)
     {
         from_ = to_;
     }
     else
     {
         from_ += (to_ - from_) / T(n_);
     }
 }
Пример #12
0
 RANGES_CXX14_CONSTEXPR V operator()(Rng &&rng, C pred = C{}, P proj = P{}) const
 {
     auto begin = ranges::begin(rng);
     auto end = ranges::end(rng);
     RANGES_EXPECT(begin != end);
     V result = *begin;
     while(++begin != end)
     {
         auto && tmp = *begin;
         if(invoke(pred, invoke(proj, result), invoke(proj, tmp)))
             result = (decltype(tmp) &&) tmp;
     }
     return result;
 }
Пример #13
0
 void next()
 {
     RANGES_EXPECT(cur_ != last_);
     // If the last match consumed zero elements, bump the position.
     advance(cur_, (int)zero_, last_);
     zero_ = false;
     for(; cur_ != last_; ++cur_)
     {
         auto p = invoke(fun_, cur_, last_);
         if(p.first)
         {
             zero_ = (cur_ == p.second);
             cur_ = p.second;
             return;
         }
     }
 }
Пример #14
0
 RANGES_CXX14_CONSTEXPR
 range_difference_type_t<Rng> get_offset(bool check = true) const noexcept
 {
     RANGES_EXPECT(!check || 0 <= offset_);
     return offset_;
 }
Пример #15
0
 take_exactly_view_(Rng rng, difference_type_ n)
   : rng_(std::move(rng)), n_(n)
 {
     RANGES_EXPECT(n >= 0);
     RANGES_EXPECT(!SizedRange<Rng>() || n <= ranges::distance(rng_));
 }
Пример #16
0
 take_exactly_view_(Rng rng, difference_type_ n)
   : rng_(std::move(rng)), n_(n)
 {
     RANGES_EXPECT(n >= 0);
 }
Пример #17
0
 constexpr stride_view_base(Rng &&rng, range_difference_type_t<Rng> const stride)
     noexcept(std::is_nothrow_constructible<stride_view_adaptor<Rng>, Rng>::value)
   : stride_view_adaptor<Rng>{std::move(rng)},
     stride_{(RANGES_EXPECT(0 < stride), stride)}
 {}
Пример #18
0
 T const & get() const
 {
     RANGES_EXPECT(t_);
     return *t_;
 }
Пример #19
0
 T const &operator*() const noexcept
 {
     RANGES_EXPECT(*this);
     return ranges::get<1>(data_);
 }
Пример #20
0
 constexpr repeat_n_view(Val value, std::ptrdiff_t n)
   : value_(detail::move(value)), n_((RANGES_EXPECT(0 <= n), n))
 {}
Пример #21
0
 std::pair<T *, std::ptrdiff_t> get_temporary_buffer(D count) noexcept
 {
     RANGES_EXPECT(count >= 0);
     return detail::get_temporary_buffer_impl<T>(static_cast<std::size_t>(count));
 }
Пример #22
0
 iterator_t<Rng> pos_at_(Rng && rng, Int i, input_range_tag, std::true_type)
 {
     RANGES_EXPECT(0 <= i);
     return next(ranges::begin(rng), i);
 }
Пример #23
0
 constexpr chunk_view(Rng rng, range_difference_type_t<Rng> n)
   : chunk_view::view_adaptor(detail::move(rng))
   , n_((RANGES_EXPECT(0 < n), n))
 {}
Пример #24
0
 Rng operator()(Rng && rng, range_difference_type_t<Rng> n) const
 {
     RANGES_EXPECT(n >= 0);
     ranges::action::erase(rng, begin(rng), ranges::next(begin(rng), n, end(rng)));
     return static_cast<Rng&&>(rng);
 }
Пример #25
0
 counted_view(I it, difference_type_t<I> n)
   : it_(it), n_(n)
 {
     RANGES_EXPECT(0 <= n_);
 }
Пример #26
0
 T & get()
 {
     RANGES_EXPECT(t_);
     return *t_;
 }
Пример #27
0
 [[noreturn]]
 common_type_t<decay_t<unwrap_reference_t<Val2 const &>>, value_type_t<I>> &
 operator()(copy_tag, I const &) const
 {
     RANGES_EXPECT(false);
 }
Пример #28
0
 void next()
 {
     RANGES_EXPECT(0 != n_);
     --n_;
 }