MillicastSDK 2.5.0
Loading...
Searching...
No Matches
span.h
Go to the documentation of this file.
1#ifndef MILLICAST_API_SPAN_H
2#define MILLICAST_API_SPAN_H
3
4#ifdef __cplusplus
5
6#include <cstddef>
7#include <iterator>
8
9#include "exports.h"
10
11namespace millicast {
12
13namespace detail {
14
15template <typename T, typename E, typename = void>
16// NOLINTNEXTLINE(readability-identifier-naming)
17struct is_container_element_type_compatible : std::false_type {};
18
19template <typename T, typename E>
20struct is_container_element_type_compatible<
21 T,
22 E,
23 typename std::enable_if<
24 !std::is_same<typename std::remove_cv<decltype(std::data(
25 std::declval<T>()))>::type,
26 void>::value &&
27 std::is_convertible<
28 std::remove_pointer_t<decltype(std::declval<T>().data())> (*)[],
29 E (*)[]>::value>::type> : std::true_type {};
30} // namespace detail
31
32template <typename T>
33class MILLICAST_TEMPLATE_API Span {
34 public:
35 using element_type = T;
36 using pointer = element_type*;
37 using reference = element_type&;
38
39 constexpr Span() noexcept = default;
40 constexpr Span(pointer ptr, size_t size) noexcept : _ptr(ptr), _size(size) {}
41
42 template <size_t N>
43 constexpr Span(T (&arr)[N]) noexcept : Span(arr, N) {}
44 constexpr Span(const Span&) noexcept = default;
45
46 template <
47 typename C,
48 typename std::enable_if<
49 std::is_same_v<typename C::value_type, T> ||
50 detail::is_container_element_type_compatible<const C&, T>::value,
51 int>::type = 0>
52 constexpr Span(const C& container) noexcept
53 : _ptr(std::data(container)), _size(std::size(container)) {}
54
55 template <typename C,
56 typename std::enable_if<
57 std::is_same_v<typename C::value_type, T> ||
58 detail::is_container_element_type_compatible<C&, T>::value,
59 int>::type = 0>
60 constexpr Span(C& container) noexcept
61 : _ptr(std::data(container)), _size(std::size(container)) {}
62
63 template <
64 typename OtherElementType,
65 typename std::enable_if<!std::is_same_v<OtherElementType, T> &&
66 detail::is_container_element_type_compatible<
67 const Span<OtherElementType>&,
68 T>::value,
69 int>::type = 0>
70 constexpr Span(const Span<OtherElementType>& other) noexcept
71 : _ptr(other._ptr), _size(other._size) {}
72
73 constexpr T* data() const { return _ptr; }
74 constexpr T* begin() const { return data(); }
75 constexpr T* end() const { return data() + size(); }
76
77 [[nodiscard]] constexpr size_t size() const { return _size; }
78 [[nodiscard]] constexpr size_t size_bytes() const {
79 return size() * sizeof(T);
80 }
81 [[nodiscard]] constexpr bool empty() const { return size() == 0; }
82
83 private:
84 T* _ptr{nullptr};
85 size_t _size{};
86};
87} // namespace millicast
88
89#endif // __cplusplus
90#endif // MILLICAST_API_SPAN_H
#define MILLICAST_TEMPLATE_API
Definition exports.h:46