diff --git a/src/json.cpp b/src/json.cpp index cb1ea5b16d76e..c0d3bdee424d9 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -183,15 +183,6 @@ bool JsonObject::has_member( const std::string &name ) const return positions.count( name ) > 0; } -std::set JsonObject::get_member_names() const -{ - std::set ret; - for( auto &elem : positions ) { - ret.insert( elem.first ); - } - return ret; -} - std::string JsonObject::line_number() const { jsin->seek( start ); diff --git a/src/json.h b/src/json.h index f6c32549409d8..ad989ba533c35 100644 --- a/src/json.h +++ b/src/json.h @@ -834,7 +834,6 @@ class JsonObject void allow_omitted_members() const; bool has_member( const std::string &name ) const; // true iff named member exists - std::set get_member_names() const; std::string str() const; // copy object json as string [[noreturn]] void throw_error( std::string err ) const; [[noreturn]] void throw_error( std::string err, const std::string &name ) const; diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 619b6b77d8fa4..5ba1b889dd8fc 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1826,13 +1826,12 @@ an overload below. The mapgen piece is loaded from the member of the json object named key. */ template -void load_place_mapings( const JsonObject &pjo, const std::string &key, - mapgen_palette::placing_map::mapped_type &vect ) +void load_place_mapings( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - if( pjo.has_object( key ) ) { - load_place_mapings( pjo.get_object( key ), vect ); + if( value.test_object() ) { + load_place_mapings( value.get_object(), vect ); } else { - for( JsonObject jo : pjo.get_array( key ) ) { + for( JsonObject jo : value.get_array() ) { load_place_mapings( jo, vect ); jo.allow_omitted_members(); } @@ -1841,23 +1840,22 @@ void load_place_mapings( const JsonObject &pjo, const std::string &key, /* This function allows loading the mapgen pieces from a single string, *or* a json object. -The mapgen piece is loaded from the member of the json object named key. */ template -void load_place_mapings_string( const JsonObject &pjo, const std::string &key, +void load_place_mapings_string( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - if( pjo.has_string( key ) ) { + if( value.test_string() ) { try { - vect.push_back( make_shared_fast( pjo.get_string( key ) ) ); + vect.push_back( make_shared_fast( value.get_string() ) ); } catch( const std::runtime_error &err ) { // Using the json object here adds nice formatting and context information - pjo.throw_error( err.what(), key ); + value.throw_error( err.what() ); } - } else if( pjo.has_object( key ) ) { - load_place_mapings( pjo.get_object( key ), vect ); + } else if( value.test_object() ) { + load_place_mapings( value.get_object(), vect ); } else { - for( const JsonValue entry : pjo.get_array( key ) ) { + for( const JsonValue entry : value.get_array() ) { if( entry.test_string() ) { try { vect.push_back( make_shared_fast( entry.get_string() ) ); @@ -1877,14 +1875,14 @@ instance of jmapgen_alternativly which will chose the mapgen piece to apply to t Use this with terrain or traps or other things that can not be applied twice to the same place. */ template -void load_place_mapings_alternatively( const JsonObject &pjo, const std::string &key, +void load_place_mapings_alternatively( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - if( !pjo.has_array( key ) ) { - load_place_mapings_string( pjo, key, vect ); + if( !value.test_array() ) { + load_place_mapings_string( value, vect ); } else { auto alter = make_shared_fast< jmapgen_alternativly >(); - for( const JsonValue entry : pjo.get_array( key ) ) { + for( const JsonValue entry : value.get_array() ) { if( entry.test_string() ) { try { alter->alternatives.emplace_back( entry.get_string() ); @@ -1933,24 +1931,24 @@ void load_place_mapings_alternatively( const JsonObject &pjo, const std::string } template<> -void load_place_mapings( const JsonObject &pjo, const std::string &key, +void load_place_mapings( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - load_place_mapings_alternatively( pjo, key, vect ); + load_place_mapings_alternatively( value, vect ); } template<> -void load_place_mapings( const JsonObject &pjo, const std::string &key, +void load_place_mapings( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - load_place_mapings_alternatively( pjo, key, vect ); + load_place_mapings_alternatively( value, vect ); } template<> -void load_place_mapings( const JsonObject &pjo, const std::string &key, +void load_place_mapings( const JsonValue &value, mapgen_palette::placing_map::mapped_type &vect ) { - load_place_mapings_alternatively( pjo, key, vect ); + load_place_mapings_alternatively( value, vect ); } template @@ -1969,7 +1967,7 @@ void mapgen_palette::load_place_mapings( const JsonObject &jo, const std::string continue; } auto &vect = format_placings[ key[0] ]; - ::load_place_mapings( sub, member_name, vect ); + ::load_place_mapings( sub.get_member( member_name ), vect ); } } if( !jo.has_object( member_name ) ) { @@ -1981,13 +1979,13 @@ void mapgen_palette::load_place_mapings( const JsonObject &jo, const std::string if( member_name == "terrain" || member_name == "furniture" ) { return; } - JsonObject pjo = jo.get_object( member_name ); - for( auto &key : pjo.get_member_names() ) { + for( const JsonMember member : jo.get_object( member_name ) ) { + const std::string &key = member.name(); if( key.size() != 1 ) { - pjo.throw_error( "format map key must be 1 character", key ); + member.throw_error( "format map key must be 1 character" ); } auto &vect = format_placings[ key[0] ]; - ::load_place_mapings( pjo, key, vect ); + ::load_place_mapings( member, vect ); } } @@ -2063,16 +2061,16 @@ mapgen_palette mapgen_palette::load_internal( const JsonObject &jo, const std::s // mandatory: every character in rows must have matching entry, unless fill_ter is set // "terrain": { "a": "t_grass", "b": "t_lava" } if( jo.has_member( "terrain" ) ) { - JsonObject pjo = jo.get_object( "terrain" ); - for( const auto &key : pjo.get_member_names() ) { + for( const JsonMember member : jo.get_object( "terrain" ) ) { + const std::string &key = member.name(); if( key.size() != 1 ) { - pjo.throw_error( "format map key must be 1 character", key ); + member.throw_error( "format map key must be 1 character" ); } - if( pjo.has_string( key ) ) { - format_terrain[key[0]] = ter_id( pjo.get_string( key ) ); + if( member.test_string() ) { + format_terrain[key[0]] = ter_id( member.get_string() ); } else { auto &vect = format_placings[ key[0] ]; - ::load_place_mapings( pjo, key, vect ); + ::load_place_mapings( member, vect ); if( !vect.empty() ) { // Dummy entry to signal that this terrain is actually defined, because // the code below checks that each square on the map has a valid terrain @@ -2084,16 +2082,16 @@ mapgen_palette mapgen_palette::load_internal( const JsonObject &jo, const std::s } if( jo.has_object( "furniture" ) ) { - JsonObject pjo = jo.get_object( "furniture" ); - for( const auto &key : pjo.get_member_names() ) { + for( const JsonMember member : jo.get_object( "furniture" ) ) { + const std::string &key = member.name(); if( key.size() != 1 ) { - pjo.throw_error( "format map key must be 1 character", key ); + member.throw_error( "format map key must be 1 character" ); } - if( pjo.has_string( key ) ) { - format_furniture[key[0]] = furn_id( pjo.get_string( key ) ); + if( member.test_string() ) { + format_furniture[key[0]] = furn_id( member.get_string() ); } else { auto &vect = format_placings[ key[0] ]; - ::load_place_mapings( pjo, key, vect ); + ::load_place_mapings( member, vect ); } } }