halcheck 1.0
Loading...
Searching...
No Matches
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