Bump version to 21.06.18.1
[LibreOffice.git] / include / o3tl / span.hxx
blob8af8ba846b6514310efede440a56ac278fa0ab18
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
10 #ifndef INCLUDED_O3TL_SPAN_HXX
11 #define INCLUDED_O3TL_SPAN_HXX
13 #include <sal/config.h>
15 #include <config_global.h>
17 #if HAVE_CPP_SPAN
19 #include <span>
21 namespace o3tl { using std::span; }
23 #else
25 #include <cassert>
26 #include <cstddef>
27 #include <iterator>
29 namespace o3tl {
31 /** A barebones approximation of C++20 <span>.
33 template<typename T>
34 class span {
35 public:
36 using value_type = T;
37 using pointer = value_type *;
38 using const_pointer = value_type const *;
39 using reference = value_type &;
40 using const_reference = value_type const &;
41 using const_iterator = const_pointer;
42 using iterator = pointer;
43 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
44 using reverse_iterator = std::reverse_iterator<iterator>;
45 using size_type = std::size_t;
46 using difference_type = std::ptrdiff_t;
48 constexpr span() noexcept : data_(nullptr), size_(0) {}
50 template<std::size_t N>
51 constexpr span (T (&a)[N]) noexcept : data_(a), size_(N) {}
53 constexpr span (T *a, size_type len) noexcept
54 : data_(a), size_(len)
56 // not terribly sure about this, might need to strengthen it
57 assert(a != nullptr || len == 0);
60 constexpr bool empty() const noexcept { return size_ == 0; }
62 constexpr iterator begin() const noexcept { return data_; }
63 constexpr iterator end() const noexcept { return begin() + size(); }
65 reverse_iterator rbegin() const noexcept
66 { return reverse_iterator(end()); }
67 reverse_iterator rend() const noexcept
68 { return reverse_iterator(begin()); }
70 constexpr size_type size() const noexcept { return size_; }
72 constexpr reference operator [](size_type pos) const {
73 assert(pos < size());
74 return data_[pos];
77 constexpr pointer data() const noexcept { return data_; }
79 private:
80 pointer data_;
81 size_type size_;
84 } // namespace o3tl
86 #endif
88 #endif
90 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */