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{
20{
21public:
23 std::vector<std::size_t> const& exclude_positions) const = 0;
24 virtual ~PropertyVectorBase() = default;
25
27 std::string const& getPropertyName() const { return _property_name; }
29 bool is_for_output = true;
30
31protected:
32 PropertyVectorBase(std::string property_name,
33 MeshItemType mesh_item_type,
34 std::size_t n_components)
35 : _n_components(n_components),
36 _mesh_item_type(mesh_item_type),
37 _property_name(std::move(property_name))
38 {
39 }
40
41 int const _n_components;
43 std::string const _property_name;
44};
45
50template <typename PROP_VAL_TYPE>
52{
53 friend class Properties;
54
55public:
56 using value_type = PROP_VAL_TYPE;
57
58public:
59 constexpr std::size_t getNumberOfTuples() const
60 {
61 return size() / _n_components;
62 }
63
65 PROP_VAL_TYPE& getComponent(std::size_t tuple_index, int component)
66 {
67 assert(component < _n_components);
68 assert(tuple_index < getNumberOfTuples());
69 return data_[tuple_index * getNumberOfGlobalComponents() + component];
70 }
71
73 PROP_VAL_TYPE const& getComponent(std::size_t tuple_index,
74 int component) const
75 {
76 assert(component < _n_components);
77 assert(tuple_index < getNumberOfTuples());
78 return data_[tuple_index * getNumberOfGlobalComponents() + component];
79 }
80
82 std::vector<std::size_t> const& exclude_positions) const override
83 {
84 auto* cloned_pv = new PropertyVector<PROP_VAL_TYPE>(
86 cloned_pv->data_ = BaseLib::excludeObjectCopy(data_, exclude_positions);
87 return cloned_pv;
88 }
89
92 constexpr std::size_t size() const { return data_.size(); }
93
94 constexpr std::ptrdiff_t ssize() const { return std::ssize(data_); }
95
96 // Same as begin, but semantically different; begin, end are pairs of
97 // iterators, data returns raw pointer.
98 constexpr const PROP_VAL_TYPE* data() const { return data_.data(); }
99 constexpr PROP_VAL_TYPE* data() { return data_.data(); }
100
101 constexpr PROP_VAL_TYPE* begin() { return data_.data(); }
102 constexpr PROP_VAL_TYPE* end() { return data_.data() + data_.size(); }
103
104 constexpr const PROP_VAL_TYPE* cbegin() const { return data_.data(); }
105 constexpr const PROP_VAL_TYPE* cend() const
106 {
107 return data_.data() + data_.size();
108 }
109 constexpr const PROP_VAL_TYPE* begin() const { return cbegin(); }
110 constexpr const PROP_VAL_TYPE* end() const { return cend(); }
111
112 constexpr PROP_VAL_TYPE& operator[](std::size_t const pos)
113 {
114 if constexpr (std::is_same_v<PROP_VAL_TYPE, bool>)
115 {
116 static_assert(!std::is_same_v<PROP_VAL_TYPE, bool>,
117 "PropertyVector<bool>::operator[] cannot be "
118 "instantiated for booleans.");
119 }
120 else
121 {
122 return data_[pos];
123 }
124 }
125 constexpr PROP_VAL_TYPE const& operator[](std::size_t const pos) const
126 {
127 return data_[pos];
128 }
129
130 constexpr void resize(std::size_t const size) { data_.resize(size); }
131 constexpr void resize(std::size_t const size, const PROP_VAL_TYPE& value)
132 {
133 data_.resize(size, value);
134 }
135
136 template <typename R>
137 requires std::ranges::input_range<R> &&
138 std::convertible_to<std::ranges::range_value_t<R>,
139 PROP_VAL_TYPE>
140 constexpr void assign(R&& r)
141 {
142#if __cpp_lib_containers_ranges >= 202202L
143 data_.assign_range(r);
144#else
145 if constexpr (ranges::common_range<R>)
146 {
147 data_.assign(r.begin(), r.end());
148 }
149 else
150 {
151 data_.assign(ranges::views::common(r).begin(),
152 ranges::views::common(r).end());
153 }
154#endif
155 }
156
157 constexpr void push_back(const PROP_VAL_TYPE& value)
158 {
159 data_.push_back(value);
160 }
161
162 constexpr void clear() { data_.clear(); }
163 constexpr bool empty() const { return data_.empty(); }
164
165protected:
171 explicit PropertyVector(std::string const& property_name,
172 MeshItemType mesh_item_type,
173 std::size_t n_components)
174 : PropertyVectorBase(property_name, mesh_item_type, n_components)
175 {
176 }
177
185 PropertyVector(std::size_t n_property_values,
186 std::string const& property_name,
187 MeshItemType mesh_item_type,
188 std::size_t n_components)
189 : PropertyVectorBase(property_name, mesh_item_type, n_components),
190 data_(n_property_values * n_components)
191 {
192 }
193
194private:
195 std::vector<PROP_VAL_TYPE> data_;
196};
197
207template <typename T>
209{
210 friend class Properties;
211
212public:
215 {
216 for (auto v : _values)
217 {
218 delete[] v;
219 }
220 }
221
224 T* const& operator[](std::size_t id) const
225 {
226 return _values[_item2group_mapping[id]];
227 }
228
229 T*& operator[](std::size_t id) { return _values[_item2group_mapping[id]]; }
230
231 void initPropertyValue(std::size_t group_id, T const& value)
232 {
233 if (_n_components != 1)
234 {
235 OGS_FATAL(
236 "Single-component version of initPropertyValue() is called "
237 "for a multi-components PropertyVector<T*>");
238 }
239 auto* p = new T[1];
240 p[0] = value;
241 _values[group_id] = p;
242 }
243
244 void initPropertyValue(std::size_t group_id, std::vector<T> const& values)
245 {
246 if (_n_components != static_cast<int>(values.size()))
247 {
248 OGS_FATAL(
249 "The size of provided values in initPropertyValue() is "
250 "not same as the number of components in PropertyVector<T*>");
251 }
252
253 auto* p = new T[values.size()];
254 for (unsigned i = 0; i < values.size(); i++)
255 {
256 p[i] = values[i];
257 }
258 _values[group_id] = p;
259 }
260
261 std::size_t getNumberOfTuples() const { return _item2group_mapping.size(); }
262
265 std::size_t size() const { return _n_components * getNumberOfTuples(); }
266
268 std::vector<std::size_t> const& exclude_positions) const override
269 {
270 // create new PropertyVector with modified mapping
272 _values.size() / _n_components,
275 // copy pointers to property values
276 for (std::size_t j(0); j < _values.size(); j++)
277 {
278 std::vector<T> values(_values[j], _values[j] + _n_components);
279 t->initPropertyValue(j, values);
280 }
281 return t;
282 }
283
285 T const& getComponent(std::size_t tuple_index, int component) const
286 {
287 assert(component < _n_components);
288 assert(tuple_index < getNumberOfTuples());
289
290 const double* p = this->operator[](tuple_index);
291 if (p == nullptr)
292 {
293 OGS_FATAL(
294 "No data found in the property vector {:s} "
295 "for the tuple index {:d} and component {:d}",
296 getPropertyName(), tuple_index, component);
297 }
298 return p[component];
299 }
300
301protected:
313 PropertyVector(std::size_t n_prop_groups,
314 std::vector<std::size_t>
315 item2group_mapping,
316 std::string const& property_name,
317 MeshItemType mesh_item_type,
318 std::size_t n_components)
319 : PropertyVectorBase(property_name, mesh_item_type, n_components),
320 _item2group_mapping(std::move(item2group_mapping)),
321 _values(n_prop_groups * n_components)
322 {
323 }
324
325private:
326 std::vector<std::size_t> _item2group_mapping;
327 std::vector<T*> _values;
328 // hide method
329 T* at(std::size_t);
330};
331
332static_assert(ranges::contiguous_range<PropertyVector<double>>);
333static_assert(ranges::sized_range<PropertyVector<double>>);
334} // 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