]>
git.proxmox.com Git - ceph.git/blob - ceph/src/zstd/contrib/pzstd/utils/Range.h
2 * Copyright (c) 2016-present, Facebook, Inc.
5 * This source code is licensed under both the BSD-style license (found in the
6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7 * in the COPYING file in the root directory of this source tree).
11 * A subset of `folly/Range.h`.
12 * All code copied verbatim modulo formatting
16 #include "utils/Likely.h"
22 #include <type_traits>
28 *Use IsCharPointer<T>::type to enable const char* or char*.
29 *Use IsCharPointer<T>::const_type to enable only const char*.
32 struct IsCharPointer
{};
35 struct IsCharPointer
<char*> {
40 struct IsCharPointer
<const char*> {
41 typedef int const_type
;
47 template <typename Iter
>
53 using size_type
= std::size_t;
54 using iterator
= Iter
;
55 using const_iterator
= Iter
;
56 using value_type
= typename
std::remove_reference
<
57 typename
std::iterator_traits
<Iter
>::reference
>::type
;
58 using reference
= typename
std::iterator_traits
<Iter
>::reference
;
60 constexpr Range() : b_(), e_() {}
61 constexpr Range(Iter begin
, Iter end
) : b_(begin
), e_(end
) {}
63 constexpr Range(Iter begin
, size_type size
) : b_(begin
), e_(begin
+ size
) {}
65 template <class T
= Iter
, typename
detail::IsCharPointer
<T
>::type
= 0>
66 /* implicit */ Range(Iter str
) : b_(str
), e_(str
+ std::strlen(str
)) {}
68 template <class T
= Iter
, typename
detail::IsCharPointer
<T
>::const_type
= 0>
69 /* implicit */ Range(const std::string
& str
)
70 : b_(str
.data()), e_(b_
+ str
.size()) {}
72 // Allow implicit conversion from Range<From> to Range<To> if From is
73 // implicitly convertible to To.
76 typename
std::enable_if
<
77 (!std::is_same
<Iter
, OtherIter
>::value
&&
78 std::is_convertible
<OtherIter
, Iter
>::value
),
80 constexpr /* implicit */ Range(const Range
<OtherIter
>& other
)
81 : b_(other
.begin()), e_(other
.end()) {}
83 Range(const Range
&) = default;
84 Range(Range
&&) = default;
86 Range
& operator=(const Range
&) & = default;
87 Range
& operator=(Range
&&) & = default;
89 constexpr size_type
size() const {
105 void advance(size_type n
) {
106 if (UNLIKELY(n
> size())) {
107 throw std::out_of_range("index out of range");
112 void subtract(size_type n
) {
113 if (UNLIKELY(n
> size())) {
114 throw std::out_of_range("index out of range");
119 Range
subpiece(size_type first
, size_type length
= std::string::npos
) const {
120 if (UNLIKELY(first
> size())) {
121 throw std::out_of_range("index out of range");
124 return Range(b_
+ first
, std::min(length
, size() - first
));
128 using ByteRange
= Range
<const unsigned char*>;
129 using MutableByteRange
= Range
<unsigned char*>;
130 using StringPiece
= Range
<const char*>;