Skip to content

Commit f3d32ea

Browse files
committed
Add basic span utility
1 parent 00215ee commit f3d32ea

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

src/utils/span.hpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#ifndef SPAN_HPP
2+
#define SPAN_HPP
3+
4+
#include <cstddef>
5+
#include <iterator>
6+
#include <memory>
7+
#include <type_traits>
8+
#include <utility>
9+
10+
namespace cpptrace {
11+
namespace detail {
12+
// basic span implementation
13+
// I haven't implemented most members because I don't need them, more will be added as needed
14+
15+
template<typename T>
16+
class span {
17+
T* ptr;
18+
std::size_t count;
19+
20+
public:
21+
using element_type = T;
22+
using value_type = typename std::remove_cv<T>::type;
23+
using size_type = std::size_t;
24+
using difference_type = std::ptrdiff_t;
25+
using pointer = T*;
26+
using const_pointer = const T*;
27+
using reference = T&;
28+
using const_reference = const T&;
29+
using iterator = T*;
30+
using const_iterator = const T*;
31+
using reverse_iterator = std::reverse_iterator<iterator>;
32+
using const_reverse_iterator = std::reverse_iterator<reverse_iterator>;
33+
34+
span() : ptr(nullptr), count(0) {}
35+
span(T* ptr, std::size_t count) : ptr(ptr), count(count) {}
36+
template<typename It>
37+
span(It begin, It end) : ptr(std::addressof(*begin)), count(end - begin) {}
38+
39+
T* data() const noexcept {
40+
return ptr;
41+
}
42+
std::size_t size() const noexcept {
43+
return count;
44+
}
45+
bool empty() const noexcept {
46+
return count == 0;
47+
}
48+
49+
iterator begin() noexcept {
50+
return ptr;
51+
}
52+
iterator end() noexcept {
53+
return ptr + count;
54+
}
55+
const_iterator begin() const noexcept {
56+
return ptr;
57+
}
58+
const_iterator end() const noexcept {
59+
return ptr + count;
60+
}
61+
};
62+
63+
using bspan = span<char>;
64+
using cbspan = span<const char>;
65+
66+
template<typename It>
67+
auto make_span(It begin, It end) {
68+
return span<typename std::remove_reference<decltype(*begin)>::type>(begin, end);
69+
}
70+
71+
template<typename T, typename std::enable_if<std::is_trivial<T>::value, int>::type = 0>
72+
auto make_bspan(T object) {
73+
return span(reinterpret_cast<T*>(std::addressof(object)), sizeof(T));
74+
}
75+
}
76+
}
77+
78+
#endif

0 commit comments

Comments
 (0)