2 * Copyright (c) Meta Platforms, Inc. and affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <type_traits>
27 namespace ast_detail
{
29 template <typename Derived
, typename T
>
32 using element_type
= T
;
33 using value_type
= std::remove_cv_t
<T
>;
35 constexpr auto rbegin() const noexcept
{
36 return std::make_reverse_iterator(derived().end());
38 constexpr auto rend() const noexcept
{
39 return std::make_reverse_iterator(derived().begin());
41 constexpr bool empty() const noexcept
{ return derived().size() == 0; }
44 Derived
& derived() { return *static_cast<Derived
*>(this); }
45 const Derived
& derived() const { return *static_cast<const Derived
*>(this); }
48 template <typename Derived
, typename T
>
49 class base_span
: public base_view
<Derived
, T
> {
50 using base
= base_view
<Derived
, T
>;
53 using size_type
= std::size_t;
54 using difference_type
= std::ptrdiff_t;
57 using iterator
= pointer
;
58 using reverse_iterator
= std::reverse_iterator
<iterator
>;
59 using const_iterator
= iterator
;
61 constexpr base_span(pointer data
, std::size_t size
) noexcept
62 : data_(data
), size_(size
) {}
64 constexpr iterator
begin() const noexcept
{ return data_
; }
65 constexpr iterator
end() const noexcept
{ return data_
+ size_
; }
66 constexpr size_type
size() const noexcept
{ return size_
; }
67 constexpr reference
operator[](size_type pos
) const {
69 return *(data_
+ pos
);
71 constexpr reference
front() const { return operator[](0); }
72 constexpr reference
back() const {
74 return operator[](size_
- 1);
82 } // namespace ast_detail
83 } // namespace compiler