OGS
PropertyVector.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 <cassert>
7#include <iterator>
8#include <range/v3/range/concepts.hpp>
9#include <range/v3/view/common.hpp>
10#include <string>
11#include <utility>
12#include <vector>
13
14#include "BaseLib/Algorithm.h"
15#include "MeshEnums.h"
16
17namespace MeshLib
18{
19
20inline constexpr std::string vtkGhostTypeString = "vtkGhostType";
21
23{
24public:
26 std::vector<std::size_t> const& exclude_positions) const = 0;
27 virtual ~PropertyVectorBase() = default;
28
30 std::string const& getPropertyName() const { return _property_name; }
32
33protected:
34 PropertyVectorBase(std::string property_name,
35 MeshItemType mesh_item_type,
36 std::size_t n_components)
37 : _n_components(n_components),
38 _mesh_item_type(mesh_item_type),
39 _property_name(std::move(property_name))
40 {
41 }
42
43 int const _n_components;
45 std::string const _property_name;
46};
47
52template <typename PROP_VAL_TYPE>
54{
55 friend class Properties;
56
57public:
58 using value_type = PROP_VAL_TYPE;
59
60public:
61 constexpr std::size_t getNumberOfTuples() const
62 {
63 return size() / _n_components;
64 }
65
67 PROP_VAL_TYPE& getComponent(std::size_t tuple_index, int component)
68 {
69 assert(component < _n_components);
70 assert(tuple_index < getNumberOfTuples());
71 return data_[tuple_index * getNumberOfGlobalComponents() + component];
72 }
73
75 PROP_VAL_TYPE const& getComponent(std::size_t tuple_index,
76 int component) const
77 {
78 assert(component < _n_components);
79 assert(tuple_index < getNumberOfTuples());
80 return data_[tuple_index * getNumberOfGlobalComponents() + component];
81 }
82
84 std::vector<std::size_t> const& exclude_positions) const override
85 {
86 auto* cloned_pv = new PropertyVector<PROP_VAL_TYPE>(
88 cloned_pv->data_ = BaseLib::excludeObjectCopy(data_, exclude_positions);
89 return cloned_pv;
90 }
91
94 constexpr std::size_t size() const { return data_.size(); }
95
96 constexpr std::ptrdiff_t ssize() const { return std::ssize(data_); }
97
98 // Same as begin, but semantically different; begin, end are pairs of
99 // iterators, data returns raw pointer.
100 constexpr const PROP_VAL_TYPE* data() const { return data_.data(); }
101 constexpr PROP_VAL_TYPE* data() { return data_.data(); }
102
103 constexpr PROP_VAL_TYPE* begin() { return data_.data(); }
104 constexpr PROP_VAL_TYPE* end() { return data_.data() + data_.size(); }
105
106 constexpr const PROP_VAL_TYPE* cbegin() const { return data_.data(); }
107 constexpr const PROP_VAL_TYPE* cend() const
108 {
109 return data_.data() + data_.size();
110 }
111 constexpr const PROP_VAL_TYPE* begin() const { return cbegin(); }
112 constexpr const PROP_VAL_TYPE* end() const { return cend(); }
113
114 constexpr PROP_VAL_TYPE& operator[](std::size_t const pos)
115 {
116 if constexpr (std::is_same_v<PROP_VAL_TYPE, bool>)
117 {
118 static_assert(!std::is_same_v<PROP_VAL_TYPE, bool>,
119 "PropertyVector<bool>::operator[] cannot be "
120 "instantiated for booleans.");
121 }
122 else
123 {
124 return data_[pos];
125 }
126 }
127 constexpr PROP_VAL_TYPE const& operator[](std::size_t const pos) const
128 {
129 return data_[pos];
130 }
131
132 constexpr void resize(std::size_t const size) { data_.resize(size); }
133 constexpr void resize(std::size_t const size, const PROP_VAL_TYPE& value)
134 {
135 data_.resize(size, value);
136 }
137
138 template <typename R>
139 requires std::ranges::input_range<R> &&
140 std::convertible_to<std::ranges::range_value_t<R>,
141 PROP_VAL_TYPE>
142 constexpr void assign(R&& r)
143 {
144#if __cpp_lib_containers_ranges >= 202202L
145 data_.assign_range(r);
146#else
147 if constexpr (ranges::common_range<R>)
148 {
149 data_.assign(r.begin(), r.end());
150 }
151 else
152 {
153 data_.assign(ranges::views::common(r).begin(),
154 ranges::views::common(r).end());
155 }
156#endif
157 }
158
159 constexpr void push_back(const PROP_VAL_TYPE& value)
160 {
161 data_.push_back(value);
162 }
163
164 constexpr void clear() { data_.clear(); }
165 constexpr bool empty() const { return data_.empty(); }
166
167protected:
173 explicit PropertyVector(std::string const& property_name,
174 MeshItemType mesh_item_type,
175 std::size_t n_components)
176 : PropertyVectorBase(property_name, mesh_item_type, n_components)
177 {
178 }
179
187 PropertyVector(std::size_t n_property_values,
188 std::string const& property_name,
189 MeshItemType mesh_item_type,
190 std::size_t n_components)
191 : PropertyVectorBase(property_name, mesh_item_type, n_components),
192 data_(n_property_values * n_components)
193 {
194 }
195
196private:
197 std::vector<PROP_VAL_TYPE> data_;
198};
199
209template <typename T>
211{
212 friend class Properties;
213
214public:
217 {
218 for (auto v : _values)
219 {
220 delete[] v;
221 }
222 }
223
226 T* const& operator[](std::size_t id) const
227 {
228 return _values[_item2group_mapping[id]];
229 }
230
231 T*& operator[](std::size_t id) { return _values[_item2group_mapping[id]]; }
232
233 void initPropertyValue(std::size_t group_id, T const& value)
234 {
235 if (_n_components != 1)
236 {
237 OGS_FATAL(
238 "Single-component version of initPropertyValue() is called "
239 "for a multi-components PropertyVector<T*>");
240 }
241 auto* p = new T[1];
242 p[0] = value;
243 _values[group_id] = p;
244 }
245
246 void initPropertyValue(std::size_t group_id, std::vector<T> const& values)
247 {
248 if (_n_components != static_cast<int>(values.size()))
249 {
250 OGS_FATAL(
251 "The size of provided values in initPropertyValue() is "
252 "not same as the number of components in PropertyVector<T*>");
253 }
254
255 auto* p = new T[values.size()];
256 for (unsigned i = 0; i < values.size(); i++)
257 {
258 p[i] = values[i];
259 }
260 _values[group_id] = p;
261 }
262
263 std::size_t getNumberOfTuples() const { return _item2group_mapping.size(); }
264
267 std::size_t size() const { return _n_components * getNumberOfTuples(); }
268
270 std::vector<std::size_t> const& exclude_positions) const override
271 {
272 // create new PropertyVector with modified mapping
274 _values.size() / _n_components,
277 // copy pointers to property values
278 for (std::size_t j(0); j < _values.size(); j++)
279 {
280 std::vector<T> values(_values[j], _values[j] + _n_components);
281 t->initPropertyValue(j, values);
282 }
283 return t;
284 }
285
287 T const& getComponent(std::size_t tuple_index, int component) const
288 {
289 assert(component < _n_components);
290 assert(tuple_index < getNumberOfTuples());
291
292 const double* p = this->operator[](tuple_index);
293 if (p == nullptr)
294 {
295 OGS_FATAL(
296 "No data found in the property vector {:s} "
297 "for the tuple index {:d} and component {:d}",
298 getPropertyName(), tuple_index, component);
299 }
300 return p[component];
301 }
302
303protected:
315 PropertyVector(std::size_t n_prop_groups,
316 std::vector<std::size_t>
317 item2group_mapping,
318 std::string const& property_name,
319 MeshItemType mesh_item_type,
320 std::size_t n_components)
321 : PropertyVectorBase(property_name, mesh_item_type, n_components),
322 _item2group_mapping(std::move(item2group_mapping)),
323 _values(n_prop_groups * n_components)
324 {
325 }
326
327private:
328 std::vector<std::size_t> _item2group_mapping;
329 std::vector<T*> _values;
330 // hide method
331 T* at(std::size_t);
332};
333
334static_assert(ranges::contiguous_range<PropertyVector<double>>);
335static_assert(ranges::sized_range<PropertyVector<double>>);
336} // end namespace MeshLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual PropertyVectorBase * clone(std::vector< std::size_t > const &exclude_positions) const =0
MeshItemType getMeshItemType() const
MeshItemType const _mesh_item_type
PropertyVectorBase(std::string property_name, MeshItemType mesh_item_type, std::size_t n_components)
virtual ~PropertyVectorBase()=default
std::string const _property_name
int getNumberOfGlobalComponents() const
std::string const & getPropertyName() const
T const & getComponent(std::size_t tuple_index, int component) const
Returns the value for the given component stored in the given tuple.
PropertyVectorBase * clone(std::vector< std::size_t > const &exclude_positions) const override
std::vector< std::size_t > _item2group_mapping
T *& operator[](std::size_t id)
void initPropertyValue(std::size_t group_id, std::vector< T > const &values)
PropertyVector(std::size_t n_prop_groups, std::vector< std::size_t > item2group_mapping, std::string const &property_name, MeshItemType mesh_item_type, std::size_t n_components)
The constructor taking meta information for the data.
T *const & operator[](std::size_t id) const
~PropertyVector() override
Destructor ensures the deletion of the heap-constructed objects.
void initPropertyValue(std::size_t group_id, T const &value)
std::size_t getNumberOfTuples() const
std::vector< PROP_VAL_TYPE > data_
constexpr PROP_VAL_TYPE const & operator[](std::size_t const pos) const
constexpr const PROP_VAL_TYPE * end() const
constexpr bool empty() const
constexpr std::ptrdiff_t ssize() const
constexpr std::size_t getNumberOfTuples() const
constexpr PROP_VAL_TYPE * begin()
PropertyVector(std::size_t n_property_values, std::string const &property_name, MeshItemType mesh_item_type, std::size_t n_components)
The constructor taking meta information for the data.
constexpr void assign(R &&r)
PROP_VAL_TYPE & getComponent(std::size_t tuple_index, int component)
Returns the value for the given component stored in the given tuple.
constexpr void resize(std::size_t const size)
constexpr PROP_VAL_TYPE * data()
constexpr PROP_VAL_TYPE & operator[](std::size_t const pos)
constexpr std::size_t size() const
PropertyVector(std::string const &property_name, MeshItemType mesh_item_type, std::size_t n_components)
The constructor taking meta information for the data.
constexpr void resize(std::size_t const size, const PROP_VAL_TYPE &value)
PropertyVectorBase * clone(std::vector< std::size_t > const &exclude_positions) const override
constexpr const PROP_VAL_TYPE * begin() const
constexpr const PROP_VAL_TYPE * data() const
PROP_VAL_TYPE const & getComponent(std::size_t tuple_index, int component) const
Returns the value for the given component stored in the given tuple.
constexpr void push_back(const PROP_VAL_TYPE &value)
constexpr const PROP_VAL_TYPE * cbegin() const
constexpr const PROP_VAL_TYPE * cend() const
constexpr PROP_VAL_TYPE * end()
std::vector< T > excludeObjectCopy(std::vector< T > const &src_vec, std::vector< std::size_t > const &exclude_positions)
Definition Algorithm.h:35
constexpr std::string vtkGhostTypeString