Re-sync with internal repository
[hiphop-php.git] / third-party / thrift / src / thrift / compiler / ast / detail / view.h
blobfb3a9e4d09038ce62841b9606a3062f56ca99be8
1 /*
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.
17 #pragma once
19 #include <cassert>
20 #include <cstddef>
21 #include <iterator>
22 #include <type_traits>
24 namespace apache {
25 namespace thrift {
26 namespace compiler {
27 namespace ast_detail {
29 template <typename Derived, typename T>
30 class base_view {
31 public:
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; }
43 private:
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>;
52 public:
53 using size_type = std::size_t;
54 using difference_type = std::ptrdiff_t;
55 using pointer = T*;
56 using reference = 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 {
68 assert(pos < size_);
69 return *(data_ + pos);
71 constexpr reference front() const { return operator[](0); }
72 constexpr reference back() const {
73 assert(size_ > 0);
74 return operator[](size_ - 1);
77 private:
78 pointer data_;
79 size_type size_;
82 } // namespace ast_detail
83 } // namespace compiler
84 } // namespace thrift
85 } // namespace apache