opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
coordinate_axis.h
Go to the documentation of this file.
1#pragma once
2
3#include <compare>
4#include <cstdint>
5#include <iosfwd>
6#include <optional>
7#include <stdexcept>
8#include <string_view>
9
10namespace osc
11{
12 // Provides convenient manipulation of the three coordinate axes (X, Y, Z).
14 public:
15 // returns a `CoordinateAxis` parsed from a `std::string_view`, the format can only be one of:
16 //
17 // "x", "X", "y", "Y", "z", "Z"
18 //
19 // returns `std::nullopt` if the input string is incorrect
20 static std::optional<CoordinateAxis> try_parse(std::string_view);
21
22 // returns a `CoordinateAxis` that represents the X axis
23 static constexpr CoordinateAxis x()
24 {
25 return CoordinateAxis{0};
26 }
27
28 // returns a `CoordinateAxis` that represents the Y axis
29 static constexpr CoordinateAxis y()
30 {
31 return CoordinateAxis{1};
32 }
33
34 // returns a `CoordinateAxis` that represents the Z axis
35 static constexpr CoordinateAxis z()
36 {
37 return CoordinateAxis{2};
38 }
39
40 // default-constructs a `CoordinateAxis` that represents the X axis
41 constexpr CoordinateAxis() = default;
42
43 // constructs a `CoordinateAxis` from a runtime integer that must be `0`, `1`, or `2`, representing X, Y, or Z axis
44 explicit constexpr CoordinateAxis(int axis_index) :
45 axis_index_{static_cast<uint8_t>(axis_index)}
46 {
47 if (not (0 <= axis_index && axis_index <= 2)) {
48 throw std::runtime_error{"out-of-range index given to a CoordinateAxis"};
49 }
50 }
51
52 // `CoordinateAxis`es are equality-comparable and totally ordered as X < Y < Z
53 friend constexpr auto operator<=>(const CoordinateAxis&, const CoordinateAxis&) = default;
54
55 // returns the index of the axis (i.e. X == 0, Y == 1, Z == 2)
56 constexpr size_t index() const
57 {
58 return static_cast<size_t>(axis_index_);
59 }
60
61 // returns the previous axis in the ring sequence X -> Y -> Z -> X...
62 constexpr CoordinateAxis previous() const
63 {
64 return CoordinateAxis{static_cast<uint8_t>((axis_index_ + 2) % 3), SkipRangeCheck{}};
65 }
66
67 // returns the next axis in the ring sequence X -> Y -> Z -> X...
68 constexpr CoordinateAxis next() const
69 {
70 return CoordinateAxis{static_cast<uint8_t>((axis_index_ + 1) % 3), SkipRangeCheck{}};
71 }
72 private:
73 struct SkipRangeCheck {};
74 explicit constexpr CoordinateAxis(uint8_t v, SkipRangeCheck) :
75 axis_index_{v}
76 {}
77
78 uint8_t axis_index_ = 0;
79 };
80
81 std::ostream& operator<<(std::ostream&, CoordinateAxis);
82}
Definition coordinate_axis.h:13
static constexpr CoordinateAxis z()
Definition coordinate_axis.h:35
constexpr CoordinateAxis next() const
Definition coordinate_axis.h:68
constexpr CoordinateAxis(int axis_index)
Definition coordinate_axis.h:44
static constexpr CoordinateAxis x()
Definition coordinate_axis.h:23
friend constexpr auto operator<=>(const CoordinateAxis &, const CoordinateAxis &)=default
constexpr size_t index() const
Definition coordinate_axis.h:56
static constexpr CoordinateAxis y()
Definition coordinate_axis.h:29
constexpr CoordinateAxis()=default
static std::optional< CoordinateAxis > try_parse(std::string_view)
constexpr CoordinateAxis previous() const
Definition coordinate_axis.h:62
Definition custom_decoration_generator.h:5
std::ostream & operator<<(std::ostream &, const Object &)
constexpr U to(T &&value)
Definition conversion.h:56