halcheck
1.0
Loading...
Searching...
No Matches
include
halcheck
lib
span.hpp
1
#ifndef HALCHECK_LIB_SPAN_HPP
2
#define HALCHECK_LIB_SPAN_HPP
3
4
// #include <halcheck/lib/iterator.hpp>
5
// #include <halcheck/lib/memory.hpp>
6
// #include <halcheck/lib/type_traits.hpp>
7
8
// #include <array>
9
// #include <cstddef>
10
// #include <initializer_list>
11
// #include <iterator>
12
// #include <limits>
13
// #include <memory>
14
// #include <type_traits>
15
16
// namespace halcheck { namespace lib {
17
18
// static const std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
19
20
// template<typename T, std::size_t Extent = lib::dynamic_extent>
21
// class span {
22
// public:
23
// using element_type = T;
24
// using value_type = lib::remove_cvref_t<T>;
25
// using size_type = std::size_t;
26
// using difference_type = std::ptrdiff_t;
27
// using pointer = T *;
28
// using const_pointer = const T *;
29
// using reference = T &;
30
// using const_reference = const T &;
31
// using iterator = T *;
32
// using const_iterator = const T *;
33
// using reverse_iterator = std::reverse_iterator<iterator>;
34
// using const_reverse_iterator = std::reverse_iterator<const_iterator>;
35
36
// static constexpr std::size_t extent = Extent;
37
38
// constexpr span() noexcept : _data(nullptr), _size(0) {}
39
40
// template<
41
// typename I,
42
// bool _ = true,
43
// HALCHECK_REQUIRE(lib::is_contiguous_iterator<I>()),
44
// HALCHECK_REQUIRE(std::is_convertible<decltype(lib::to_address(std::declval<I>())), T *>()),
45
// HALCHECK_REQUIRE(extent == lib::dynamic_extent && _)>
46
// constexpr span(I first, size_type count) : _data(lib::to_address(first)), _size(count) {}
47
48
// template<
49
// typename I,
50
// bool _ = true,
51
// HALCHECK_REQUIRE(lib::is_contiguous_iterator<I>()),
52
// HALCHECK_REQUIRE(std::is_convertible<decltype(lib::to_address(std::declval<I>())), T *>()),
53
// HALCHECK_REQUIRE(extent != lib::dynamic_extent && _)>
54
// explicit constexpr span(I first, size_type count) : _data(lib::to_address(first)), _size(count) {}
55
56
// template<
57
// typename I,
58
// bool _ = true,
59
// HALCHECK_REQUIRE(lib::is_contiguous_iterator<I>()),
60
// HALCHECK_REQUIRE(std::is_convertible<decltype(lib::to_address(std::declval<I>())), T *>()),
61
// HALCHECK_REQUIRE(!std::is_convertible<I, std::size_t>()),
62
// HALCHECK_REQUIRE(extent == lib::dynamic_extent && _)>
63
// constexpr span(I first, I last) : _data(lib::to_address(first)), _size(last - first) {}
64
65
// template<
66
// typename I,
67
// bool _ = true,
68
// HALCHECK_REQUIRE(lib::is_contiguous_iterator<I>()),
69
// HALCHECK_REQUIRE(std::is_convertible<decltype(lib::to_address(std::declval<I>())), T *>()),
70
// HALCHECK_REQUIRE(!std::is_convertible<I, std::size_t>()),
71
// HALCHECK_REQUIRE(extent != lib::dynamic_extent && _)>
72
// explicit constexpr span(I first, I last) : _data(lib::to_address(first)), _size(last - first) {}
73
74
// template<
75
// std::size_t N,
76
// bool _ = true,
77
// HALCHECK_REQUIRE((extent == lib::dynamic_extent || N == extent) && _)>
78
// constexpr span(lib::type_identity_t<element_type> (&arr)[N]) // NOLINT
79
// : _data(std::addressof(arr[0])), _size(N) {}
80
81
// template<
82
// typename U,
83
// std::size_t N,
84
// bool _ = true,
85
// HALCHECK_REQUIRE((extent == lib::dynamic_extent || N == extent) && _),
86
// HALCHECK_REQUIRE(std::is_convertible<const U *, T>())>
87
// constexpr span(std::array<U, N> &arr) // NOLINT
88
// : _data(arr.data()), _size(arr.size()) {}
89
90
// template<
91
// typename U,
92
// std::size_t N,
93
// bool _ = true,
94
// HALCHECK_REQUIRE((extent == lib::dynamic_extent || N == extent) && _),
95
// HALCHECK_REQUIRE(std::is_convertible<const U *, T>())>
96
// constexpr span(const std::array<U, N> &arr) // NOLINT
97
// : _data(arr.data()), _size(arr.size()) {}
98
99
// template<
100
// bool _ = true,
101
// HALCHECK_REQUIRE(std::is_const<element_type>() && _)>
102
// constexpr span(std::initializer_list<element_type> il) // NOLINT
103
// : _data(il.begin()), _size(il.size()) {}
104
105
// constexpr iterator begin() const { return _data; }
106
// constexpr iterator end() const { return _data; }
107
108
// constexpr const_iterator cbegin() const { return _data + _size; }
109
// constexpr const_iterator cend() const { return _data + _size; }
110
111
// constexpr reverse_iterator rbegin() const { return reverse_iterator(end()); }
112
// constexpr reverse_iterator rend() const { return reverse_iterator(begin()); }
113
114
// constexpr const_reverse_iterator crbegin() const { return reverse_iterator(cend()); }
115
// constexpr const_reverse_iterator crend() const { return reverse_iterator(cbegin()); }
116
117
// constexpr T *data() const { return _data; }
118
119
// constexpr std::size_t size() const { return _size; }
120
// constexpr std::size_t size_bytes() const { return _size * sizeof(element_type); }
121
// constexpr bool empty() const { return _size == 0; }
122
123
// constexpr reference front() const { return _data[0]; }
124
// constexpr reference back() const { return _data[_size - 1]; }
125
126
// constexpr reference operator[](std::size_t index) const { return _data[index]; }
127
128
// private:
129
// T *_data;
130
// std::size_t _size;
131
// };
132
133
// }} // namespace halcheck::lib
134
135
#endif
Generated by
1.12.0