@@ -50,6 +50,12 @@ struct blackhole_output_archive
50
50
}
51
51
};
52
52
53
+ // blackhole_output_archive doesn't care about names
54
+ struct empty_name_fn
55
+ {
56
+ auto operator ()(const auto & container) const { return " " ; }
57
+ };
58
+
53
59
template <class T >
54
60
class error_duplicate_pool_name_found ;
55
61
@@ -85,32 +91,34 @@ constexpr bool is_pool_empty()
85
91
* Adapted from cereal/archives/adapters.hpp
86
92
*/
87
93
88
- template <class Previous , class Pools , class WrapF = boost::hana:: id_t >
94
+ template <class Previous , class Pools , class WrapFn , class PoolNameFn >
89
95
class json_immer_output_archive
90
96
: public cereal::OutputArchive<
91
- json_immer_output_archive<Previous, Pools, WrapF >>
97
+ json_immer_output_archive<Previous, Pools, WrapFn, PoolNameFn >>
92
98
, public cereal::traits::TextArchive
93
99
{
94
100
public:
101
+ using pool_name_fn = PoolNameFn;
102
+
95
103
template <class ... Args>
96
104
explicit json_immer_output_archive (Args&&... args)
97
- requires std::is_same_v<WrapF , boost::hana::id_t>
105
+ requires std::is_same_v<WrapFn , boost::hana::id_t>
98
106
: cereal::OutputArchive<json_immer_output_archive>{this }
99
107
, previous{std::forward<Args>(args)...}
100
108
{
101
109
}
102
110
103
111
template <class ... Args>
104
112
json_immer_output_archive (Pools pools_, Args&&... args)
105
- requires std::is_same_v<WrapF , boost::hana::id_t >
113
+ requires std::is_same_v<WrapFn , boost::hana::id_t >
106
114
: cereal::OutputArchive<json_immer_output_archive>{this }
107
115
, previous{std::forward<Args>(args)...}
108
116
, pools{std::move (pools_)}
109
117
{
110
118
}
111
119
112
120
template <class ... Args>
113
- json_immer_output_archive (Pools pools_, WrapF wrap_, Args&&... args)
121
+ json_immer_output_archive (Pools pools_, WrapFn wrap_, Args&&... args)
114
122
: cereal::OutputArchive<json_immer_output_archive>{this }
115
123
, wrap{std::move (wrap_)}
116
124
, previous{std::forward<Args>(args)...}
@@ -197,7 +205,7 @@ class json_immer_output_archive
197
205
}
198
206
199
207
private:
200
- template <class Previous_ , class Pools_ , class WrapF_ >
208
+ template <class Previous_ , class Pools_ , class WrapFn_ , class PoolNameFn_ >
201
209
friend class json_immer_output_archive ;
202
210
203
211
// Recursively serializes the pools but not calling finalize
@@ -207,19 +215,15 @@ class json_immer_output_archive
207
215
auto ar =
208
216
json_immer_output_archive<detail::blackhole_output_archive,
209
217
Pools,
210
- decltype (wrap)>{pools, wrap};
218
+ decltype (wrap),
219
+ detail::empty_name_fn>{pools, wrap};
211
220
// Do not try to serialize pools again inside of this temporary
212
221
// archive
213
222
ar.finalized = true ;
214
223
ar (pools);
215
224
return std::move (ar).get_output_pools ();
216
225
};
217
226
218
- using Names = typename Pools::names_t ;
219
- using IsUnique = decltype (detail::are_type_names_unique (Names{}));
220
- static_assert (IsUnique::value,
221
- " Pool names for each type must be unique" );
222
-
223
227
auto prev = pools;
224
228
while (true ) {
225
229
// Keep saving pools until everything is saved.
@@ -232,30 +236,32 @@ class json_immer_output_archive
232
236
}
233
237
234
238
private:
235
- WrapF wrap;
239
+ WrapFn wrap;
236
240
Previous previous;
237
241
Pools pools;
238
242
bool finalized{false };
239
243
};
240
244
241
- template <class Previous , class Pools , class WrapF = boost::hana:: id_t >
245
+ template <class Previous , class Pools , class WrapFn , class PoolNameFn >
242
246
class json_immer_input_archive
243
247
: public cereal::InputArchive<
244
- json_immer_input_archive<Previous, Pools, WrapF >>
248
+ json_immer_input_archive<Previous, Pools, WrapFn, PoolNameFn >>
245
249
, public cereal::traits::TextArchive
246
250
{
247
251
public:
252
+ using pool_name_fn = PoolNameFn;
253
+
248
254
template <class ... Args>
249
255
json_immer_input_archive (Pools pools_, Args&&... args)
250
- requires std::is_same_v<WrapF , boost::hana::id_t >
256
+ requires std::is_same_v<WrapFn , boost::hana::id_t >
251
257
: cereal::InputArchive<json_immer_input_archive>{this }
252
258
, previous{std::forward<Args>(args)...}
253
259
, pools{std::move (pools_)}
254
260
{
255
261
}
256
262
257
263
template <class ... Args>
258
- json_immer_input_archive (Pools pools_, WrapF wrap_, Args&&... args)
264
+ json_immer_input_archive (Pools pools_, WrapFn wrap_, Args&&... args)
259
265
: cereal::InputArchive<json_immer_input_archive>{this }
260
266
, wrap{std::move (wrap_)}
261
267
, previous{std::forward<Args>(args)...}
@@ -333,7 +339,7 @@ class json_immer_input_archive
333
339
bool ignore_pool_exceptions = false ;
334
340
335
341
private:
336
- WrapF wrap;
342
+ WrapFn wrap;
337
343
Previous previous;
338
344
Pools pools;
339
345
@@ -347,19 +353,21 @@ class json_immer_input_archive
347
353
namespace cereal {
348
354
namespace traits {
349
355
namespace detail {
350
- template <class Previous , class Pools , class WrapF >
356
+ template <class Previous , class Pools , class WrapFn , class PoolNameFn >
351
357
struct get_output_from_input <
352
- immer::persist::json_immer_input_archive<Previous, Pools, WrapF>>
358
+ immer::persist::
359
+ json_immer_input_archive<Previous, Pools, WrapFn, PoolNameFn>>
353
360
{
354
- using type =
355
- immer::persist:: json_immer_output_archive<Previous, Pools, WrapF >;
361
+ using type = immer::persist::
362
+ json_immer_output_archive<Previous, Pools, WrapFn, PoolNameFn >;
356
363
};
357
- template <class Previous , class Pools , class WrapF >
364
+ template <class Previous , class Pools , class WrapFn , class PoolNameFn >
358
365
struct get_input_from_output <
359
- immer::persist::json_immer_output_archive<Previous, Pools, WrapF>>
366
+ immer::persist::
367
+ json_immer_output_archive<Previous, Pools, WrapFn, PoolNameFn>>
360
368
{
361
- using type =
362
- immer::persist:: json_immer_input_archive<Previous, Pools, WrapF >;
369
+ using type = immer::persist::
370
+ json_immer_input_archive<Previous, Pools, WrapFn, PoolNameFn >;
363
371
};
364
372
} // namespace detail
365
373
} // namespace traits
0 commit comments