Move Vectormath main
C++20 game and graphics mathematics
Loading...
Searching...
No Matches
StridedSpan.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cassert>
4#include <cstddef>
5#include <span>
6#include <type_traits>
7
8namespace mv::math
9{
10 template <typename T>
12 {
13 public:
14 using Element = T;
15 using Value = std::remove_const_t<T>;
16 using Pointer = T*;
17 using Reference = T&;
18
20
22 std::size_t count,
23 std::size_t strideBytes) noexcept :
24 First_(reinterpret_cast<BytePointer>(first)),
25 Count_(count),
26 StrideBytes_(strideBytes)
27 {
28 assert(count == 0U || first != nullptr);
29 assert(count == 0U || strideBytes >= sizeof(Value));
30 }
31
32 [[nodiscard]] constexpr std::size_t Size() const noexcept
33 {
34 return Count_;
35 }
36
37 [[nodiscard]] constexpr bool Empty() const noexcept
38 {
39 return Count_ == 0U;
40 }
41
42 [[nodiscard]] constexpr std::size_t StrideBytes() const noexcept
43 {
44 return StrideBytes_;
45 }
46
47 [[nodiscard]] Reference operator[](std::size_t index) const noexcept
48 {
49 assert(index < Count_);
50 return *reinterpret_cast<Pointer>(First_ + index * StrideBytes_);
51 }
52
53 private:
54 using Byte =
55 std::conditional_t<std::is_const_v<T>, const std::byte, std::byte>;
56 using BytePointer = Byte*;
57
58 BytePointer First_{};
59 std::size_t Count_{};
60 std::size_t StrideBytes_{};
61 };
62
63 template <typename Record, typename Field>
65 std::span<Record> records, Field Record::*member) noexcept
66 {
67 if (records.empty())
68 {
69 return {};
70 }
71
72 return StridedSpan<Field>(&(records.front().*member), records.size(),
73 sizeof(Record));
74 }
75
76 template <typename Record, typename Field>
78 std::span<const Record> records, Field Record::*member) noexcept
79 {
80 if (records.empty())
81 {
82 return {};
83 }
84
85 return StridedSpan<const Field>(&(records.front().*member),
86 records.size(), sizeof(Record));
87 }
88} // namespace mv::math
std::remove_const_t< T > Value
constexpr StridedSpan() noexcept=default
constexpr std::size_t StrideBytes() const noexcept
constexpr bool Empty() const noexcept
constexpr std::size_t Size() const noexcept
Reference operator[](std::size_t index) const noexcept
StridedSpan< Field > MakeFieldView(std::span< Record > records, Field Record::*member) noexcept