139 using value_type =
typename remove_const_key<typename OBJ::value_type>::type;
141 void operator()(OBJ& obj,
serializer& ser, ser_opt_t options)
144 const ser_opt_t UNUSED(opts) =
145 SerOption::is_set(options, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
147 switch (
const auto mode = ser.mode() ) {
148 case serializer::SIZER:
149 case serializer::PACK:
151 size_t size = get_size(obj);
153 if ( mode == serializer::PACK )
158 if constexpr ( is_vector_bool_v<OBJ> ) {
163 else if constexpr ( is_same_type_template_v<OBJ, std::map> ||
164 is_same_type_template_v<OBJ, std::unordered_map> ||
165 is_same_type_template_v<OBJ, std::multimap> ||
166 is_same_type_template_v<OBJ, std::unordered_multimap> ) {
169 for (
auto& e : obj ) {
170 auto& cast_e =
const_cast<value_type&
>(
reinterpret_cast<const value_type&
>(e));
171 SST_SER_NAME(cast_e.first,
"key");
172 SST_SER_NAME(cast_e.second,
"value", opts);
177 for (
auto& e : obj )
178 SST_SER(
const_cast<value_type&
>(
reinterpret_cast<const value_type&
>(e)), opts);
183 case serializer::UNPACK:
192 if constexpr ( is_same_type_template_v<OBJ, std::vector> ) obj.reserve(size);
194 if constexpr ( is_same_type_template_v<OBJ, std::forward_list> ) {
195 auto last = obj.before_begin();
196 for (
size_t i = 0; i < size; ++i ) {
197 last = obj.emplace_after(last);
199 SST_SER(value, opts);
203 for (
size_t i = 0; i < size; ++i ) {
204 if constexpr ( is_same_type_template_v<OBJ, std::map> ||
205 is_same_type_template_v<OBJ, std::unordered_map> ) {
206 typename OBJ::key_type key {};
208 auto& value = obj[std::move(key)];
209 SST_SER(value, opts);
211 else if constexpr ( is_same_type_template_v<OBJ, std::multimap> ||
212 is_same_type_template_v<OBJ, std::unordered_multimap> ) {
213 typename OBJ::key_type key {};
215 auto& value = obj.emplace(std::move(key),
typename OBJ::mapped_type {})->second;
216 SST_SER(value, opts);
218 else if constexpr ( is_same_type_template_v<OBJ, std::set> ||
219 is_same_type_template_v<OBJ, std::unordered_set> ||
220 is_same_type_template_v<OBJ, std::multiset> ||
221 is_same_type_template_v<OBJ, std::unordered_multiset> ) {
222 typename OBJ::key_type key {};
225 obj.emplace(std::move(key));
227 else if constexpr ( is_vector_bool_v<OBJ> ) {
230 obj.push_back(value);
233 auto& value = obj.emplace_back();
234 SST_SER(value, opts);
242 case serializer::MAP:
244 const std::string& name = ser.getMapName();
247 if constexpr ( is_vector_bool_v<OBJ> ) {
250 for (
size_t i = 0; i < obj.size(); ++i )
253 else if constexpr ( is_simple_map_v<OBJ> ) {
255 using SST::Core::to_string;
256 for (
auto& [key, value] : obj )
257 SST_SER_NAME(value, to_string(key).c_str());
265 for (
auto& e : obj )
267 const_cast<value_type&
>(
reinterpret_cast<const value_type&
>(e)), std::to_string(i++).c_str());
269 ser.mapper().map_hierarchy_end();
275 SST_FRIEND_SERIALIZE();