Skip to content

Commit 421ddbb

Browse files
committed
Fix: binding maps without template parameter
See USCiLab/cereal#812 for implementation details.
1 parent 8e709d6 commit 421ddbb

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

include/poly-scribe/detail/poly-bind.hpp

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,23 @@ namespace poly_scribe::detail
7979
///
8080
/// \brief Maping from type string to a input caster.
8181
///
82-
std::map<std::string, Casters> map;
82+
using Caster_map = std::map<std::string, Casters>;
83+
84+
///
85+
/// \brief Maping from archive type id to a input caster map.
86+
///
87+
using Archives_map = std::map<std::type_index, Caster_map>;
88+
89+
Archives_map archives_map;
90+
91+
///
92+
/// \brief Obtain serializers map for given archive
93+
///
94+
template<typename Archive>
95+
Caster_map &map( )
96+
{
97+
return archives_map[typeid( Archive )];
98+
}
8399
};
84100

85101
///
@@ -110,7 +126,23 @@ namespace poly_scribe::detail
110126
///
111127
/// \brief Maping from std::type_index to a output caster.
112128
///
113-
std::map<std::type_index, Casters> map;
129+
using Caster_map = std::map<std::type_index, Casters>;
130+
131+
///
132+
/// \brief Maping from archive type id to a output caster map.
133+
///
134+
using Archives_map = std::map<std::type_index, Caster_map>;
135+
136+
Archives_map archives_map;
137+
138+
///
139+
/// \brief Obtain serializers map for given archive
140+
///
141+
template<typename Archive>
142+
Caster_map &map( )
143+
{
144+
return archives_map[typeid( Archive )];
145+
}
114146
};
115147

116148
///
@@ -127,7 +159,7 @@ namespace poly_scribe::detail
127159
///
128160
InputBindingCreator( )
129161
{
130-
auto &map = ::cereal::detail::StaticObject<InputMap>::getInstance( ).map;
162+
auto &map = ::cereal::detail::StaticObject<InputMap>::getInstance( ).map<Archive>( );
131163
auto lock = ::cereal::detail::StaticObject<InputMap>::lock( );
132164
auto key = std::string( BindingName<T>::name( ) );
133165
auto lower_bound = map.lower_bound( key );
@@ -184,7 +216,8 @@ namespace poly_scribe::detail
184216
{
185217
OutputBindingCreator( )
186218
{
187-
auto &map = ::cereal::detail::StaticObject<OutputMap>::getInstance( ).map;
219+
auto &map = ::cereal::detail::StaticObject<OutputMap>::getInstance( ).map<Archive>( );
220+
auto lock = ::cereal::detail::StaticObject<OutputMap>::lock( );
188221
auto key = std::type_index( typeid( T ) );
189222
auto lower_bound = map.lower_bound( key );
190223

@@ -312,7 +345,7 @@ namespace poly_scribe::detail
312345
{
313346
t_archive( cereal::make_nvp( "type", t_name ) );
314347

315-
auto const &binding_map = cereal::detail::StaticObject<InputMap>::getInstance( ).map;
348+
auto const &binding_map = cereal::detail::StaticObject<InputMap>::getInstance( ).map<Archive>();
316349

317350
auto binding = binding_map.find( t_name );
318351
if( binding == binding_map.end( ) )

include/poly-scribe/pointer-wrapper.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace poly_scribe
5959
return;
6060
}
6161

62-
const auto &map = ::cereal::detail::StaticObject<detail::OutputMap>::getInstance( ).map;
62+
const auto &map = ::cereal::detail::StaticObject<detail::OutputMap>::getInstance( ).map<Archive>( );
6363

6464
auto binding = map.find( std::type_index( ptrinfo ) );
6565

0 commit comments

Comments
 (0)