1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
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/.
10 #ifndef INCLUDED_O3TL_SPAN_HXX
11 #define INCLUDED_O3TL_SPAN_HXX
13 #include <sal/config.h>
15 #include <config_global.h>
21 namespace o3tl
{ using std::span
; }
31 /** A barebones approximation of C++20 <span>.
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 {
77 constexpr pointer
data() const noexcept
{ return data_
; }
90 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */