cisst-saw
Loading...
Searching...
No Matches
cmnDataFunctionsSet.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3
4/*
5 Author(s): Anton Deguet
6 Created on: 2026-02-13
7
8 (C) Copyright 2026 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19#pragma once
20#ifndef _cmnDataFunctionsSet_h
21#define _cmnDataFunctionsSet_h
22
24#include <set>
27
28// always include last
30
31template <class _elementType>
32class cmnData<std::set<_elementType> >
33{
34public:
35 enum {IS_SPECIALIZED = 1};
36
37 typedef std::set<_elementType> DataType;
38
39 static void Copy(DataType & data, const DataType & source)
40 {
41 data = source;
42 }
43
44 static std::string HumanReadable(const DataType & data)
45 {
46 return cmnDataVectorHumanReadable(data);
47 }
48
49 static void SerializeText(const DataType & data,
50 std::ostream & outputStream,
51 const char delimiter) CISST_THROW(std::runtime_error)
52 {
53 const size_t size = data.size();
54 cmnData<size_t>::SerializeText(size, outputStream, delimiter);
55 if (size > 0) {
56 outputStream << delimiter;
57 cmnDataVectorSerializeText(data, outputStream, delimiter);
58 }
59 }
60
61 static void DeSerializeText(DataType & data,
62 std::istream & inputStream,
63 const char delimiter) CISST_THROW(std::runtime_error)
64 {
65 data.clear();
66 size_t size;
67 cmnData<size_t>::DeSerializeText(size, inputStream, delimiter);
68 for (size_t i = 0; i < size; ++i) {
69 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "std::set");
70 _elementType element;
71 cmnData<_elementType>::DeSerializeText(element, inputStream, delimiter);
72 data.insert(element);
73 }
74 }
75
76 static std::string SerializeDescription(const DataType & data,
77 const char delimiter,
78 const std::string & userDescription = "v")
79 {
80 std::string prefix = (userDescription == "") ? "v[" : (userDescription + "[");
81 std::stringstream indexSuffix;
82 std::stringstream description;
83 const size_t size = data.size();
84 description << cmnData<size_t>::SerializeDescription(size, delimiter, (userDescription == "") ? "v.size" : (userDescription + ".size"));
85 size_t index = 0;
86 typename DataType::const_iterator iter = data.begin();
87 typename DataType::const_iterator end = data.end();
88 for (; iter != end; ++iter, ++index) {
89 description << delimiter;
90 indexSuffix.clear();
91 indexSuffix.str(std::string());
92 indexSuffix << index << "]";
93 description << cmnData<_elementType>::SerializeDescription(*iter, delimiter, prefix + indexSuffix.str());
94 }
95 return description.str();
96 }
97
98 static void SerializeBinary(const DataType & data, std::ostream & outputStream)
99 CISST_THROW(std::runtime_error)
100 {
101 cmnData<size_t>::SerializeBinary(data.size(), outputStream);
102 cmnDataVectorSerializeBinary(data, outputStream);
103 }
104
105 static void DeSerializeBinary(DataType & data,
106 std::istream & inputStream,
107 const cmnDataFormat & localFormat,
108 const cmnDataFormat & remoteFormat)
109 CISST_THROW(std::runtime_error)
110 {
111 data.clear();
112 size_t size;
113 cmnDataDeSerializeBinary_size_t(size, inputStream, localFormat, remoteFormat);
114 for (size_t i = 0; i < size; ++i) {
115 _elementType element;
116 cmnData<_elementType>::DeSerializeBinary(element, inputStream, localFormat, remoteFormat);
117 data.insert(element);
118 }
119 }
120
121 static bool ScalarNumberIsFixed(const DataType & CMN_UNUSED(data))
122 {
123 return false;
124 }
125
126 static size_t ScalarNumber(const DataType & data)
127 {
128 size_t result = 1; // for the size
129 typename DataType::const_iterator iter = data.begin();
130 typename DataType::const_iterator end = data.end();
131 for (; iter != end; ++iter) {
133 }
134 return result;
135 }
136
137 static std::string ScalarDescription(const DataType & data, const size_t index,
138 const std::string & userDescription = "v")
139 CISST_THROW(std::out_of_range)
140 {
141 if (index == 0) {
142 return cmnData<size_t>::ScalarDescription(data.size(), 0, userDescription + ".size");
143 }
144 size_t currentIndex = 1;
145 typename DataType::const_iterator iter = data.begin();
146 typename DataType::const_iterator end = data.end();
147 size_t elementIndex = 0;
148 for (; iter != end; ++iter, ++elementIndex) {
149 const size_t elementScalarNumber = cmnData<_elementType>::ScalarNumber(*iter);
150 if (index < currentIndex + elementScalarNumber) {
151 std::stringstream ss;
152 ss << userDescription << "[" << elementIndex << "]";
153 return cmnData<_elementType>::ScalarDescription(*iter, index - currentIndex, ss.str());
154 }
155 currentIndex += elementScalarNumber;
156 }
157 cmnThrow(std::out_of_range("cmnDataScalarDescription: set index out of range"));
158 return "";
159 }
160
161 static double Scalar(const DataType & data, const size_t index)
162 CISST_THROW(std::out_of_range)
163 {
164 if (index == 0) {
165 return static_cast<double>(data.size());
166 }
167 size_t currentIndex = 1;
168 typename DataType::const_iterator iter = data.begin();
169 typename DataType::const_iterator end = data.end();
170 for (; iter != end; ++iter) {
171 const size_t elementScalarNumber = cmnData<_elementType>::ScalarNumber(*iter);
172 if (index < currentIndex + elementScalarNumber) {
173 return cmnData<_elementType>::Scalar( *iter, index - currentIndex);
174 }
175 currentIndex += elementScalarNumber;
176 }
177 cmnThrow(std::out_of_range("cmnDataScalar: set index out of range"));
178 return 0.0;
179 }
180};
181
182#if CISST_HAS_JSON
183template <class _elementType>
184class cmnDataJSON<std::set<_elementType> >
185{
186public:
187 typedef std::set<_elementType> DataType;
188
189 static void SerializeText(const DataType & data, Json::Value & jsonValue)
190 {
191 typename DataType::const_iterator iter = data.begin();
192 typename DataType::const_iterator end = data.end();
193 int jsonIndex = 0;
194 for (; iter != end; ++iter, ++jsonIndex) {
195 cmnDataJSON<_elementType>::SerializeText(*iter, jsonValue[jsonIndex]);
196 }
197 }
198
199 static void DeSerializeText(DataType & data, const Json::Value & jsonValue) CISST_THROW(std::runtime_error)
200 {
201 data.clear();
202 const int size = jsonValue.size();
203 for (int jsonIndex = 0; jsonIndex < size; ++jsonIndex) {
204 _elementType element;
205 cmnDataJSON<_elementType>::DeSerializeText(element, jsonValue[jsonIndex]);
206 data.insert(element);
207 }
208 }
209};
210#endif
211
212#endif // _cmnDataFunctionsSet_h
static std::string HumanReadable(const DataType &data)
Definition cmnDataFunctionsSet.h:44
@ IS_SPECIALIZED
Definition cmnDataFunctionsSet.h:35
static void DeSerializeText(DataType &data, std::istream &inputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsSet.h:61
std::set< _elementType > DataType
Definition cmnDataFunctionsSet.h:37
static std::string SerializeDescription(const DataType &data, const char delimiter, const std::string &userDescription="v")
Definition cmnDataFunctionsSet.h:76
static size_t ScalarNumber(const DataType &data)
Definition cmnDataFunctionsSet.h:126
static std::string ScalarDescription(const DataType &data, const size_t index, const std::string &userDescription="v") CISST_THROW(std
Definition cmnDataFunctionsSet.h:137
static void SerializeText(const DataType &data, std::ostream &outputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsSet.h:49
static bool ScalarNumberIsFixed(const DataType &CMN_UNUSED(data))
Definition cmnDataFunctionsSet.h:121
static void Copy(DataType &data, const DataType &source)
Definition cmnDataFunctionsSet.h:39
static void DeSerializeBinary(DataType &data, std::istream &inputStream, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat) CISST_THROW(std
Definition cmnDataFunctionsSet.h:105
static double Scalar(const DataType &data, const size_t index) CISST_THROW(std
Definition cmnDataFunctionsSet.h:161
static void SerializeBinary(const DataType &data, std::ostream &outputStream) CISST_THROW(std
Definition cmnDataFunctionsSet.h:98
Definition cmnDataFormat.h:30
Definition cmnDataFunctions.h:51
static size_t DeSerializeBinary(DataType &data, const char *buffer, size_t bufferSize, const cmnDataFormat &CMN_UNUSED(localFormat), const cmnDataFormat &CMN_UNUSED(remoteFormat))
static size_t SerializeBinary(const DataType &data, char *buffer, size_t bufferSize)
static std::string static ScalarDescription(const DataType &data, const size_t index, const std::string &userDescription="") CISST_THROW(std double static Scalar(const DataType &data, const size_t index) CISST_THROW(std size_t ScalarNumber(const DataType &data)
Definition cmnDataFunctions.h:162
size_t CISST_EXPORT cmnDataDeSerializeBinary_size_t(size_t &data, const char *buffer, size_t bufferSize, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat)
void cmnDataVectorSerializeText(const _vectorType &data, std::ostream &outputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsVectorHelpers.h:63
void cmnDataVectorSerializeBinary(const _vectorType &data, std::ostream &outputStream) CISST_THROW(std
Definition cmnDataFunctionsVectorHelpers.h:158
std::string cmnDataVectorHumanReadable(const _vectorType &data)
Definition cmnDataFunctionsVectorHelpers.h:44
Macros to export the symbols of cisstCommon (in a Dll).
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
STL namespace.
const_iterator end(void) const
Definition vctDynamicConstMatrixBase.h:209
size_type size(void) const
Definition vctDynamicConstMatrixBase.h:228