OGS
PropertyVectorMetaData.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 <istream>
7#include <optional>
8#include <ostream>
9#include <string>
10
11#include "BaseLib/Logging.h"
12
13namespace MeshLib
14{
15namespace IO
16{
17
19{
20 std::string property_name;
28 unsigned long number_of_components;
29 unsigned long number_of_tuples;
30
31 template <typename T>
33 {
34 is_int_type = std::numeric_limits<T>::is_integer;
35 is_data_type_signed = std::numeric_limits<T>::is_signed;
36 data_type_size_in_bytes = sizeof(T);
37 }
38};
39
41 std::ostream& os, PropertyVectorMetaData const& pvmd)
42{
43 std::string::size_type s(pvmd.property_name.length());
44 os.write(reinterpret_cast<char*>(&s), sizeof(std::string::size_type));
45
46 os.write(
47 const_cast<char*>(
48 const_cast<PropertyVectorMetaData&>(pvmd).property_name.data()),
49 s);
50 os.write(reinterpret_cast<char*>(
51 &const_cast<PropertyVectorMetaData&>(pvmd).is_int_type),
52 sizeof(bool));
53 os.write(reinterpret_cast<char*>(&const_cast<PropertyVectorMetaData&>(
54 pvmd).is_data_type_signed),
55 sizeof(bool));
56 os.write(reinterpret_cast<char*>(&const_cast<PropertyVectorMetaData&>(
57 pvmd).data_type_size_in_bytes),
58 sizeof(unsigned long));
59 os.write(reinterpret_cast<char*>(&const_cast<PropertyVectorMetaData&>(
60 pvmd).number_of_components),
61 sizeof(unsigned long));
62 os.write(reinterpret_cast<char*>(
63 &const_cast<PropertyVectorMetaData&>(pvmd).number_of_tuples),
64 sizeof(unsigned long));
65}
66
68{
69 DBUG(
70 "name: '{:s}':\t is_int_data_type: {:d}, is_data_type_signed: "
71 "{:d}, data_type_size_in_bytes: {:d}, number of components / "
72 "tuples: {:d} / {:d}",
75 pvmd.number_of_tuples);
76}
77
78inline std::optional<PropertyVectorMetaData> readPropertyVectorMetaData(
79 std::istream& is)
80{
81 // read the size of the name of the PropertyVector
82 std::string::size_type s = 0;
83 if (!is.read(reinterpret_cast<char*>(&s), sizeof(std::string::size_type)))
84 {
85 return std::optional<PropertyVectorMetaData>();
86 }
87
89 char *dummy = new char[s];
90 if (!is.read(dummy, s))
91 {
92 return std::nullopt;
93 }
94 pvmd.property_name = std::string(dummy, s);
95 delete [] dummy;
96
97 if (!is.read(reinterpret_cast<char*>(&pvmd.is_int_type), sizeof(bool)))
98 {
99 return std::nullopt;
100 }
101 if (!is.read(reinterpret_cast<char*>(&pvmd.is_data_type_signed),
102 sizeof(bool)))
103 {
104 return std::nullopt;
105 }
106 if (!is.read(reinterpret_cast<char*>(&pvmd.data_type_size_in_bytes),
107 sizeof(unsigned long)))
108 {
109 return std::nullopt;
110 }
111 if (!is.read(reinterpret_cast<char*>(&pvmd.number_of_components),
112 sizeof(unsigned long)))
113 {
114 return std::nullopt;
115 }
116 if (!is.read(reinterpret_cast<char*>(&pvmd.number_of_tuples),
117 sizeof(unsigned long)))
118 {
119 return std::nullopt;
120 }
121 return std::optional<PropertyVectorMetaData>(pvmd);
122}
123
125{
126 unsigned long offset;
127 unsigned long number_of_tuples;
128};
129
131 std::ostream& os, PropertyVectorPartitionMetaData const& pvpmd)
132{
133 os.write(reinterpret_cast<char*>(
134 &const_cast<PropertyVectorPartitionMetaData&>(pvpmd)
135 .offset),
136 sizeof(unsigned long));
137 os.write(reinterpret_cast<char*>(
138 &const_cast<PropertyVectorPartitionMetaData&>(pvpmd)
139 .number_of_tuples),
140 sizeof(unsigned long));
141}
142
143inline std::optional<PropertyVectorPartitionMetaData>
145{
147 if (!is.read(reinterpret_cast<char*>(&pvpmd.offset), sizeof(unsigned long)))
148 {
149 return std::optional<PropertyVectorPartitionMetaData>();
150 }
151 if (!is.read(reinterpret_cast<char*>(&pvpmd.number_of_tuples),
152 sizeof(unsigned long)))
153 {
154 return std::optional<PropertyVectorPartitionMetaData>();
155 }
156 return std::optional<PropertyVectorPartitionMetaData>(pvpmd);
157}
158} // namespace IO
159} // namespace MeshLib
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
void writePropertyVectorPartitionMetaData(std::ostream &os, PropertyVectorPartitionMetaData const &pvpmd)
void writePropertyVectorMetaData(std::ostream &os, PropertyVectorMetaData const &pvmd)
std::optional< PropertyVectorMetaData > readPropertyVectorMetaData(std::istream &is)
std::optional< PropertyVectorPartitionMetaData > readPropertyVectorPartitionMetaData(std::istream &is)