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 return std::nullopt;
99 if(!is.read(reinterpret_cast<char*>(&pvmd.is_data_type_signed), sizeof(bool)))
100 return std::nullopt;
101 if(!is.read(reinterpret_cast<char*>(&pvmd.data_type_size_in_bytes),
102 sizeof(unsigned long)))
103 return std::nullopt;
104 if(!is.read(reinterpret_cast<char*>(&pvmd.number_of_components),
105 sizeof(unsigned long)))
106 return std::nullopt;
107 if(!is.read(reinterpret_cast<char*>(&pvmd.number_of_tuples),
108 sizeof(unsigned long)))
109 return std::nullopt;
110 return std::optional<PropertyVectorMetaData>(pvmd);
111}
112
114{
115 unsigned long offset;
116 unsigned long number_of_tuples;
117};
118
120 std::ostream& os, PropertyVectorPartitionMetaData const& pvpmd)
121{
122 os.write(reinterpret_cast<char*>(
123 &const_cast<PropertyVectorPartitionMetaData&>(pvpmd)
124 .offset),
125 sizeof(unsigned long));
126 os.write(reinterpret_cast<char*>(
127 &const_cast<PropertyVectorPartitionMetaData&>(pvpmd)
128 .number_of_tuples),
129 sizeof(unsigned long));
130}
131
132inline std::optional<PropertyVectorPartitionMetaData>
134{
136 if (!is.read(reinterpret_cast<char*>(&pvpmd.offset), sizeof(unsigned long)))
137 {
138 return std::optional<PropertyVectorPartitionMetaData>();
139 }
140 if (!is.read(reinterpret_cast<char*>(&pvpmd.number_of_tuples),
141 sizeof(unsigned long)))
142 {
143 return std::optional<PropertyVectorPartitionMetaData>();
144 }
145 return std::optional<PropertyVectorPartitionMetaData>(pvpmd);
146}
147} // namespace IO
148} // 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)