@ -1,14 +1,15 @@
# include "inventory.hpp"
namespace inventory {
bool Model : : add ( const std : : string & in_slot , DinkyECS : : Entity ent ) {
invariant ( ) ;
if ( by_slot . contains ( in_slot ) ) return false ;
bool Model : : add ( const std : : string in_slot , DinkyECS : : Entity ent ) {
// NOTE: for the C++ die hards, copy the in_slot on purpose to avoid dangling reference
if ( by_slot . contains ( in_slot ) | | by_entity . contains ( ent ) ) return false ;
by_entity . insert_or_assign ( ent , in_slot ) ;
by_slot . insert_or_assign ( in_slot , ent ) ;
invariant ( ) ;
return true ;
}
@ -29,19 +30,31 @@ namespace inventory {
}
void Model : : remove ( DinkyECS : : Entity ent ) {
auto & slot = by_entity . at ( ent ) ;
by_entity . erase ( ent ) ;
dbc : : check ( by_entity . contains ( ent ) , " attempt to remove entity that isn't in by_entity " ) ;
// NOTE: this was a reference but that caused corruption, just copy
auto slot = by_entity . at ( ent ) ;
dbc : : log ( fmt : : format ( " removing entity {} and slot {} " , ent , slot ) ) ;
dbc : : check ( by_slot . contains ( slot ) , " entity is in by_entity but the slot is not in by_slot " ) ;
// NOTE: you have to erase the entity after the slot or else you get corruption
by_slot . erase ( slot ) ;
by_entity . erase ( ent ) ;
invariant ( ) ;
}
void Model : : invariant ( ) {
for ( auto & [ slot , ent ] : by_slot ) {
dbc : : check ( by_entity . contains ( ent ) ,
fmt : : format ( " entity {} in by_slot isn't in by_entity? " , ent ) ) ;
dbc : : check ( by_entity . at ( ent ) = = slot ,
fmt : : format ( " mismatched slot {} in by_slot doesn't match entity {} " , slot , ent ) ) ;
}
for ( auto & [ ent , slot ] : by_entity ) {
dbc : : check ( by_slot . contains ( slot ) ,
fmt : : format ( " slot {} in by_entity isn't in by_slot? " , ent ) ) ;
dbc : : check ( by_slot . at ( slot ) = = ent ,
fmt : : format ( " mismatched entity {} in by_entity doesn't match entity {} " , ent , slot ) ) ;
}