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/algorithm/copy.hpp>
9#include <range/v3/range/concepts.hpp>
10#include <range/v3/range/primitives.hpp>
11#include <range/v3/view/common.hpp>
12#include <string>
13#ifdef _MSC_VER
14#include <string_view> // for MSVC, we need to include <string_view> to use std::string_view
15#endif
16#include <type_traits>
17#include <utility>
18#include <vector>
19
20#include "BaseLib/Algorithm.h"
21#include "MeshEnums.h"
22
23namespace MeshLib
24{
25
26#ifdef _MSC_VER // MSVC does not support inline variables until C++17, so we
27 // use a constexpr string_view instead of an inline variable.
28inline constexpr std::string_view vtkGhostTypeString = "vtkGhostType";
29#else
30inline constexpr std::string vtkGhostTypeString = "vtkGhostType";
31#endif
32
34{
35public:
37 std::vector<std::size_t> const& exclude_positions) const = 0;
38 virtual ~PropertyVectorBase() = default;
39
41 std::string const& getPropertyName() const { return _property_name; }
43
44protected:
45 PropertyVectorBase(std::string property_name,
46 MeshItemType mesh_item_type,
47 std::size_t n_components)
48 : _n_components(n_components),
49 _mesh_item_type(mesh_item_type),
50 _property_name(std::move(property_name))
51 {
52 }
53
54 int const _n_components;
56 std::string const _property_name;
57};
58
64template <typename PROP_VAL_TYPE>
66{
67 friend class Properties;
68
69public:
70 using value_type = PROP_VAL_TYPE;
71
72public:
73 constexpr std::size_t getNumberOfTuples() const
74 {
75 return size() / _n_components;
76 }
77
79 PROP_VAL_TYPE& getComponent(std::size_t tuple_index, int component)
80 {
81 assert(component < _n_components);
82 assert(tuple_index < getNumberOfTuples());
83 return data_[tuple_index * getNumberOfGlobalComponents() + component];
84 }
85
87 PROP_VAL_TYPE const& getComponent(std::size_t tuple_index,
88 int component) const
89 {
90 assert(component < _n_components);
91 assert(tuple_index < getNumberOfTuples());
92 return data_[tuple_index * getNumberOfGlobalComponents() + component];
93 }
94
96 std::vector<std::size_t> const& exclude_positions) const override
97 {
98 auto* cloned_pv = new PropertyVector<PROP_VAL_TYPE>(
100 cloned_pv->data_ = BaseLib::excludeObjectCopy(data_, exclude_positions);
101 return cloned_pv;
102 }
103
106 constexpr std::size_t size() const { return data_.size(); }
107
108 constexpr std::ptrdiff_t ssize() const { return std::ssize(data_); }
109
110 // Same as begin, but semantically different; begin, end are pairs of
111 // iterators, data returns raw pointer.
112 constexpr const PROP_VAL_TYPE* data() const { return data_.data(); }
113 constexpr PROP_VAL_TYPE* data() { return data_.data(); }
114
115 constexpr PROP_VAL_TYPE* begin() { return data_.data(); }
116 constexpr PROP_VAL_TYPE* end() { return data_.data() + data_.size(); }
117
118 constexpr const PROP_VAL_TYPE* cbegin() const { return data_.data(); }
119 constexpr const PROP_VAL_TYPE* cend() const
120 {
121 return data_.data() + data_.size();
122 }
123 constexpr const PROP_VAL_TYPE* begin() const { return cbegin(); }
124 constexpr const PROP_VAL_TYPE* end() const { return cend(); }
125
126 constexpr PROP_VAL_TYPE& operator[](std::size_t const pos)
127 {
128 if constexpr (std::is_same_v<PROP_VAL_TYPE, bool>)
129 {
130 static_assert(false,
131 "PropertyVector<bool>::operator[] cannot be "
132 "instantiated for booleans.");
133 }
134 else
135 {
136 return data_[pos];
137 }
138 }
139 constexpr PROP_VAL_TYPE const& operator[](std::size_t const pos) const
140 {
141 if constexpr (std::is_same_v<PROP_VAL_TYPE, bool>)
142 {
143 static_assert(false,
144 "PropertyVector<bool>::operator[] cannot be "
145 "instantiated for booleans.");
146 }
147 else
148 {
149 return data_[pos];
150 }
151 }
152
153 constexpr void resize(std::size_t const size) { data_.resize(size); }
154 constexpr void resize(std::size_t const size, const PROP_VAL_TYPE& value)
155 {
156 data_.resize(size, value);
157 }
158
159 template <typename R>
160 requires std::ranges::input_range<R> &&
161 std::convertible_to<std::ranges::range_value_t<R>,
162 PROP_VAL_TYPE>
163 constexpr void assign(R&& r)
164 {
165#if __cpp_lib_containers_ranges >= 202202L
166 data_.assign_range(r);
167#else
168 if constexpr (ranges::common_range<R>)
169 {
170 data_.assign(r.begin(), r.end());
171 }
172 else
173 {
174 data_.assign(ranges::views::common(r).begin(),
175 ranges::views::common(r).end());
176 }
177#endif
178 }
179
180 constexpr void clear() { data_.clear(); }
181 constexpr bool empty() const { return data_.empty(); }
182
183protected:
189 explicit PropertyVector(std::string const& property_name,
190 MeshItemType mesh_item_type,
191 std::size_t n_components)
192 : PropertyVectorBase(property_name, mesh_item_type, n_components)
193 {
194 }
195
203 PropertyVector(std::size_t n_property_values,
204 std::string const& property_name,
205 MeshItemType mesh_item_type,
206 std::size_t n_components)
207 : PropertyVectorBase(property_name, mesh_item_type, n_components),
208 data_(n_property_values * n_components)
209 {
210 }
211
212private:
213 std::vector<PROP_VAL_TYPE> data_;
214};
215
216static_assert(ranges::contiguous_range<PropertyVector<double>>);
217static_assert(ranges::sized_range<PropertyVector<double>>);
218
226template <typename T>
227constexpr auto extend(PropertyVector<T>& property, std::size_t const count)
228{
229 std::size_t const offset = property.size();
230 property.resize(offset + count);
231 return property.begin() + offset;
232}
233
239template <typename T, typename R>
240 requires ranges::sized_range<R> &&
241 std::convertible_to<ranges::range_value_t<R>, T>
242constexpr void appendValues(PropertyVector<T>& property, R&& values)
243{
244 ranges::copy(values, extend(property, ranges::size(values)));
245}
246} // end namespace MeshLib
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
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 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:36
constexpr void appendValues(PropertyVector< T > &property, R &&values)
constexpr std::string vtkGhostTypeString
constexpr auto extend(PropertyVector< T > &property, std::size_t const count)