OGS
SpatialPosition.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <spdlog/fmt/ostr.h>
7
8#include <bitset>
9#include <iosfwd>
10#include <optional>
11
12#include "MathLib/Point3d.h"
13
14namespace ParameterLib
15{
24{
25public:
26 SpatialPosition() = default;
27
28 SpatialPosition(std::optional<std::size_t> const& node_id,
29 std::optional<std::size_t> const& element_id,
30 std::optional<MathLib::Point3d> const& coordinates)
31 {
32 if (node_id)
33 {
34 _node_id = *node_id;
35 flags.set(node_bit);
36 }
37
38 if (element_id)
39 {
40 _element_id = *element_id;
41 flags.set(element_bit);
42 }
43 if (coordinates)
44 {
45 _coordinates = *coordinates;
47 }
48 }
49
50 std::optional<std::size_t> getNodeID() const
51 {
52 return flags[node_bit] ? std::make_optional(_node_id) : std::nullopt;
53 }
54 std::optional<std::size_t> getElementID() const
55 {
56 return flags[element_bit] ? std::make_optional(_element_id)
57 : std::nullopt;
58 }
59 std::optional<MathLib::Point3d> const getCoordinates() const
60 {
61 return flags[coordinates_bit] ? std::make_optional(_coordinates)
62 : std::nullopt;
63 }
64
65 void setNodeID(std::size_t node_id)
66 {
67 flags.reset();
68 flags.set(node_bit);
69 _node_id = node_id;
70 }
71
72 void setElementID(std::size_t element_id)
73 {
74 flags.reset();
75 flags.set(element_bit);
76 _element_id = element_id;
77 }
78
79 void setCoordinates(MathLib::Point3d const& coordinates)
80 {
81 _coordinates = coordinates;
83 }
84
85private:
86 std::size_t _node_id = 0;
87 std::size_t _element_id = 0;
89
90 std::bitset<3> flags;
91 static constexpr std::size_t node_bit = 0;
92 static constexpr std::size_t element_bit = 1;
93 static constexpr std::size_t coordinates_bit = 2;
94};
95
98std::ostream& operator<<(std::ostream& os, SpatialPosition const& pos);
99
100} // namespace ParameterLib
101
102namespace fmt
103{
104template <>
105struct formatter<::ParameterLib::SpatialPosition> : ostream_formatter
106{
107};
108} // namespace fmt
std::optional< std::size_t > getNodeID() const
SpatialPosition(std::optional< std::size_t > const &node_id, std::optional< std::size_t > const &element_id, std::optional< MathLib::Point3d > const &coordinates)
static constexpr std::size_t element_bit
void setNodeID(std::size_t node_id)
std::optional< std::size_t > getElementID() const
void setCoordinates(MathLib::Point3d const &coordinates)
static constexpr std::size_t coordinates_bit
void setElementID(std::size_t element_id)
static constexpr std::size_t node_bit
std::optional< MathLib::Point3d > const getCoordinates() const
std::ostream & operator<<(std::ostream &os, SpatialPosition const &pos)
Definition AABB.h:277