From d695c29cc70bd2870e298587abf6de4b322a9979 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 25 Feb 2021 09:07:28 +0300 Subject: [PATCH] Add util::span --- libs/util/include/psemek/util/span.hpp | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 libs/util/include/psemek/util/span.hpp diff --git a/libs/util/include/psemek/util/span.hpp b/libs/util/include/psemek/util/span.hpp new file mode 100644 index 00000000..1b7a7933 --- /dev/null +++ b/libs/util/include/psemek/util/span.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include +#include + +namespace psemek::util +{ + + template + struct span + { + using value_type = std::remove_cv_t; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using pointer = T *; + using const_pointer = const T *; + using reference = T &; + using const_reference = const T &; + using iterator = pointer; + using reverse_iterator = std::reverse_iterator; + + T * p_begin = nullptr; + T * p_end = nullptr; + + span() = default; + span(span const &) = default; + span(span &&) = default; + + span(T * begin, T * end) + : p_begin{begin} + , p_end{end} + {} + + template + span(T (&a)[N]) + : p_begin{a} + , p_end{a + N} + {} + + template + span(std::array & a) + : p_begin{a.data()} + , p_end{a.data() + N} + {} + + T * begin() const { return p_begin; } + T * end() const { return p_end; } + + difference_type size() const { return p_end - p_begin; } + + reverse_iterator rbegin() const { return reverse_iterator(p_end); } + reverse_iterator rend() const { return reverse_iterator(p_begin); } + + T & operator[] (size_type i) const { return p_begin[i]; } + }; + +}