From e3abaa2f3e2f9bc8a8b1df1a137eebac29e91ca4 Mon Sep 17 00:00:00 2001 From: BevapDin Date: Tue, 3 Dec 2019 21:00:26 +0100 Subject: [PATCH 1/6] Rename JsonArray::end member to avoid conflict later --- src/json.cpp | 10 +++++----- src/json.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/json.cpp b/src/json.cpp index 49c9ea7391dbf..b427a82dd7ca9 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -411,7 +411,7 @@ JsonArray::JsonArray( JsonIn &j ) positions.push_back( jsin->tell() ); jsin->skip_value(); } - end = jsin->tell(); + end_ = jsin->tell(); final_separator = jsin->get_ate_separator(); } @@ -421,7 +421,7 @@ JsonArray::JsonArray( const JsonArray &ja ) start = ja.start; index = 0; positions = ja.positions; - end = ja.end; + end_ = ja.end_; final_separator = ja.final_separator; } @@ -431,7 +431,7 @@ JsonArray &JsonArray::operator=( const JsonArray &ja ) start = ja.start; index = 0; positions = ja.positions; - end = ja.end; + end_ = ja.end_; final_separator = ja.final_separator; return *this; @@ -440,7 +440,7 @@ JsonArray &JsonArray::operator=( const JsonArray &ja ) void JsonArray::finish() { if( jsin && jsin->good() ) { - jsin->seek( end ); + jsin->seek( end_ ); jsin->set_ate_separator( final_separator ); } } @@ -461,7 +461,7 @@ bool JsonArray::empty() std::string JsonArray::str() { if( jsin ) { - return jsin->substr( start, end - start ); + return jsin->substr( start, end_ - start ); } else { return "[]"; } diff --git a/src/json.h b/src/json.h index 6f5c5e0b8e1a4..608b82afd2a52 100644 --- a/src/json.h +++ b/src/json.h @@ -964,7 +964,7 @@ class JsonArray std::vector positions; int start; int index; - int end; + int end_; bool final_separator; JsonIn *jsin; void verify_index( int i ); @@ -972,7 +972,7 @@ class JsonArray public: JsonArray( JsonIn &jsin ); JsonArray( const JsonArray &ja ); - JsonArray() : start( 0 ), index( 0 ), end( 0 ), jsin( nullptr ) {} + JsonArray() : start( 0 ), index( 0 ), end_( 0 ), jsin( nullptr ) {} ~JsonArray() { finish(); } From 67d192d1d33f89125cb7ff6acd8533f7083ab9e9 Mon Sep 17 00:00:00 2001 From: BevapDin Date: Tue, 3 Dec 2019 21:04:49 +0100 Subject: [PATCH 2/6] Make some member functions of JsonArray const. --- src/json.cpp | 42 +++++++++++++++++++-------------------- src/json.h | 56 ++++++++++++++++++++++++++-------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/json.cpp b/src/json.cpp index b427a82dd7ca9..145d4c35f272d 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -445,7 +445,7 @@ void JsonArray::finish() } } -bool JsonArray::has_more() +bool JsonArray::has_more() const { return ( index >= 0 && size_t( index ) < positions.size() ); } @@ -467,7 +467,7 @@ std::string JsonArray::str() } } -void JsonArray::verify_index( int i ) +void JsonArray::verify_index( int i ) const { if( !jsin ) { throw JsonError( "tried to access empty array." ); @@ -531,42 +531,42 @@ void JsonArray::skip_value() /* static access */ -bool JsonArray::get_bool( int i ) +bool JsonArray::get_bool( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_bool(); } -int JsonArray::get_int( int i ) +int JsonArray::get_int( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_int(); } -double JsonArray::get_float( int i ) +double JsonArray::get_float( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_float(); } -std::string JsonArray::get_string( int i ) +std::string JsonArray::get_string( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_string(); } -JsonArray JsonArray::get_array( int i ) +JsonArray JsonArray::get_array( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_array(); } -JsonObject JsonArray::get_object( int i ) +JsonObject JsonArray::get_object( int i ) const { verify_index( i ); jsin->seek( positions[i] ); @@ -575,7 +575,7 @@ JsonObject JsonArray::get_object( int i ) /* iterative type checking */ -bool JsonArray::test_null() +bool JsonArray::test_null() const { if( !has_more() ) { return false; @@ -584,7 +584,7 @@ bool JsonArray::test_null() return jsin->test_null(); } -bool JsonArray::test_bool() +bool JsonArray::test_bool() const { if( !has_more() ) { return false; @@ -593,7 +593,7 @@ bool JsonArray::test_bool() return jsin->test_bool(); } -bool JsonArray::test_number() +bool JsonArray::test_number() const { if( !has_more() ) { return false; @@ -602,7 +602,7 @@ bool JsonArray::test_number() return jsin->test_number(); } -bool JsonArray::test_string() +bool JsonArray::test_string() const { if( !has_more() ) { return false; @@ -611,7 +611,7 @@ bool JsonArray::test_string() return jsin->test_string(); } -bool JsonArray::test_bitset() +bool JsonArray::test_bitset() const { if( !has_more() ) { return false; @@ -620,7 +620,7 @@ bool JsonArray::test_bitset() return jsin->test_bitset(); } -bool JsonArray::test_array() +bool JsonArray::test_array() const { if( !has_more() ) { return false; @@ -629,7 +629,7 @@ bool JsonArray::test_array() return jsin->test_array(); } -bool JsonArray::test_object() +bool JsonArray::test_object() const { if( !has_more() ) { return false; @@ -640,42 +640,42 @@ bool JsonArray::test_object() /* random-access type checking */ -bool JsonArray::has_null( int i ) +bool JsonArray::has_null( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_null(); } -bool JsonArray::has_bool( int i ) +bool JsonArray::has_bool( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_bool(); } -bool JsonArray::has_number( int i ) +bool JsonArray::has_number( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_number(); } -bool JsonArray::has_string( int i ) +bool JsonArray::has_string( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_string(); } -bool JsonArray::has_array( int i ) +bool JsonArray::has_array( int i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_array(); } -bool JsonArray::has_object( int i ) +bool JsonArray::has_object( int i ) const { verify_index( i ); jsin->seek( positions[i] ); diff --git a/src/json.h b/src/json.h index 608b82afd2a52..2e0a4c8b591de 100644 --- a/src/json.h +++ b/src/json.h @@ -967,7 +967,7 @@ class JsonArray int end_; bool final_separator; JsonIn *jsin; - void verify_index( int i ); + void verify_index( int i ) const; public: JsonArray( JsonIn &jsin ); @@ -980,7 +980,7 @@ class JsonArray void finish(); // move the stream position to the end of the array - bool has_more(); // true iff more elements may be retrieved with next_* + bool has_more() const; // true iff more elements may be retrieved with next_* size_t size() const; bool empty(); std::string str(); // copy array json as string @@ -997,45 +997,45 @@ class JsonArray void skip_value(); // ignore whatever is next // static access - bool get_bool( int index ); - int get_int( int index ); - double get_float( int index ); - std::string get_string( int index ); - JsonArray get_array( int index ); - JsonObject get_object( int index ); + bool get_bool( int index ) const; + int get_int( int index ) const; + double get_float( int index ) const; + std::string get_string( int index ) const; + JsonArray get_array( int index ) const; + JsonObject get_object( int index ) const; // get_tags returns empty set if none found template - std::set get_tags( int index ); + std::set get_tags( int index ) const; // iterative type checking - bool test_null(); - bool test_bool(); - bool test_number(); - bool test_int() { + bool test_null() const; + bool test_bool() const; + bool test_number() const; + bool test_int() const { return test_number(); } - bool test_float() { + bool test_float() const { return test_number(); } - bool test_string(); - bool test_bitset(); - bool test_array(); - bool test_object(); + bool test_string() const; + bool test_bitset() const; + bool test_array() const; + bool test_object() const; // random-access type checking - bool has_null( int index ); - bool has_bool( int index ); - bool has_number( int index ); - bool has_int( int index ) { + bool has_null( int index ) const; + bool has_bool( int index ) const; + bool has_number( int index ) const; + bool has_int( int index ) const { return has_number( index ); } - bool has_float( int index ) { + bool has_float( int index ) const { return has_number( index ); } - bool has_string( int index ); - bool has_array( int index ); - bool has_object( int index ); + bool has_string( int index ) const; + bool has_array( int index ) const; + bool has_object( int index ) const; // iteratively read values by reference template bool read_next( T &t ) { @@ -1044,7 +1044,7 @@ class JsonArray return jsin->read( t ); } // random-access read values by reference - template bool read( int i, T &t ) { + template bool read( int i, T &t ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->read( t ); @@ -1052,7 +1052,7 @@ class JsonArray }; template -std::set JsonArray::get_tags( int index ) +std::set JsonArray::get_tags( int index ) const { std::set res; From 04067b2e4cad479931991a1b03a63f96c6a2c88e Mon Sep 17 00:00:00 2001 From: BevapDin Date: Tue, 3 Dec 2019 21:08:47 +0100 Subject: [PATCH 3/6] Use size_t instead of int as index value in JsonArray --- src/json.cpp | 30 +++++++++++++++--------------- src/json.h | 40 ++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/json.cpp b/src/json.cpp index 145d4c35f272d..69941beb6caaa 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -447,7 +447,7 @@ void JsonArray::finish() bool JsonArray::has_more() const { - return ( index >= 0 && size_t( index ) < positions.size() ); + return index < positions.size(); } size_t JsonArray::size() const { @@ -467,11 +467,11 @@ std::string JsonArray::str() } } -void JsonArray::verify_index( int i ) const +void JsonArray::verify_index( const size_t i ) const { if( !jsin ) { throw JsonError( "tried to access empty array." ); - } else if( i < 0 || size_t( i ) >= positions.size() ) { + } else if( i >= positions.size() ) { jsin->seek( start ); std::stringstream err; err << "bad index value: " << i; @@ -531,42 +531,42 @@ void JsonArray::skip_value() /* static access */ -bool JsonArray::get_bool( int i ) const +bool JsonArray::get_bool( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_bool(); } -int JsonArray::get_int( int i ) const +int JsonArray::get_int( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_int(); } -double JsonArray::get_float( int i ) const +double JsonArray::get_float( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_float(); } -std::string JsonArray::get_string( int i ) const +std::string JsonArray::get_string( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_string(); } -JsonArray JsonArray::get_array( int i ) const +JsonArray JsonArray::get_array( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->get_array(); } -JsonObject JsonArray::get_object( int i ) const +JsonObject JsonArray::get_object( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); @@ -640,42 +640,42 @@ bool JsonArray::test_object() const /* random-access type checking */ -bool JsonArray::has_null( int i ) const +bool JsonArray::has_null( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_null(); } -bool JsonArray::has_bool( int i ) const +bool JsonArray::has_bool( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_bool(); } -bool JsonArray::has_number( int i ) const +bool JsonArray::has_number( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_number(); } -bool JsonArray::has_string( int i ) const +bool JsonArray::has_string( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_string(); } -bool JsonArray::has_array( int i ) const +bool JsonArray::has_array( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->test_array(); } -bool JsonArray::has_object( int i ) const +bool JsonArray::has_object( const size_t i ) const { verify_index( i ); jsin->seek( positions[i] ); diff --git a/src/json.h b/src/json.h index 2e0a4c8b591de..d2e3ab2320799 100644 --- a/src/json.h +++ b/src/json.h @@ -961,13 +961,13 @@ class JsonObject class JsonArray { private: - std::vector positions; + std::vector positions; int start; - int index; + size_t index; int end_; bool final_separator; JsonIn *jsin; - void verify_index( int i ) const; + void verify_index( size_t i ) const; public: JsonArray( JsonIn &jsin ); @@ -997,16 +997,16 @@ class JsonArray void skip_value(); // ignore whatever is next // static access - bool get_bool( int index ) const; - int get_int( int index ) const; - double get_float( int index ) const; - std::string get_string( int index ) const; - JsonArray get_array( int index ) const; - JsonObject get_object( int index ) const; + bool get_bool( size_t index ) const; + int get_int( size_t index ) const; + double get_float( size_t index ) const; + std::string get_string( size_t index ) const; + JsonArray get_array( size_t index ) const; + JsonObject get_object( size_t index ) const; // get_tags returns empty set if none found template - std::set get_tags( int index ) const; + std::set get_tags( size_t index ) const; // iterative type checking bool test_null() const; @@ -1024,18 +1024,18 @@ class JsonArray bool test_object() const; // random-access type checking - bool has_null( int index ) const; - bool has_bool( int index ) const; - bool has_number( int index ) const; - bool has_int( int index ) const { + bool has_null( size_t index ) const; + bool has_bool( size_t index ) const; + bool has_number( size_t index ) const; + bool has_int( size_t index ) const { return has_number( index ); } - bool has_float( int index ) const { + bool has_float( size_t index ) const { return has_number( index ); } - bool has_string( int index ) const; - bool has_array( int index ) const; - bool has_object( int index ) const; + bool has_string( size_t index ) const; + bool has_array( size_t index ) const; + bool has_object( size_t index ) const; // iteratively read values by reference template bool read_next( T &t ) { @@ -1044,7 +1044,7 @@ class JsonArray return jsin->read( t ); } // random-access read values by reference - template bool read( int i, T &t ) const { + template bool read( size_t i, T &t ) const { verify_index( i ); jsin->seek( positions[i] ); return jsin->read( t ); @@ -1052,7 +1052,7 @@ class JsonArray }; template -std::set JsonArray::get_tags( int index ) const +std::set JsonArray::get_tags( const size_t index ) const { std::set res; From 984a649a3720e3ca0a224f3a34fcc386bec41b0b Mon Sep 17 00:00:00 2001 From: BevapDin Date: Tue, 3 Dec 2019 22:05:53 +0100 Subject: [PATCH 4/6] Implement iterators for JsonArray: This allows to iterate over a `JsonArray` with a range-based for loop. Changes some code to use the form of iterating. This now also works with unnamed `JsonArray` instances, e.g. `for( ... : foo.get_array( ... ) )`. --- src/json.cpp | 6 +++ src/json.h | 92 ++++++++++++++++++++++++++++++--- src/magic.cpp | 8 +-- src/magic_teleporter_list.cpp | 5 +- src/magic_ter_fur_transform.cpp | 26 +++------- src/mapdata.cpp | 8 ++- src/mapgen.cpp | 34 ++++-------- src/martialarts.cpp | 4 +- src/material.cpp | 27 ++++------ src/mattack_actors.cpp | 16 ++---- src/mission_util.cpp | 4 +- src/mod_manager.cpp | 5 +- src/mongroup.cpp | 10 ++-- src/monstergenerator.cpp | 10 ++-- src/mutation_data.cpp | 68 +++++++----------------- src/npc.cpp | 5 +- src/npc_class.cpp | 12 ++--- src/npctalk.cpp | 44 +++++----------- src/overlay_ordering.cpp | 4 +- src/overmap.cpp | 10 +--- src/panels.cpp | 12 +---- src/profession.cpp | 16 ++---- src/recipe.cpp | 41 ++++----------- src/recipe_groups.cpp | 8 +-- src/regional_settings.cpp | 29 ++++------- src/relic.cpp | 8 +-- src/requirements.cpp | 10 ++-- src/savegame.cpp | 20 +++---- src/savegame_json.cpp | 58 ++++++--------------- src/sdlsound.cpp | 17 ++---- src/tutorial.cpp | 5 +- src/veh_type.cpp | 30 ++++------- src/vehicle_group.cpp | 21 ++------ src/vitamin.cpp | 8 +-- src/worldfactory.cpp | 4 +- 35 files changed, 260 insertions(+), 425 deletions(-) diff --git a/src/json.cpp b/src/json.cpp index 69941beb6caaa..b670243e59fca 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -1793,3 +1793,9 @@ std::ostream &operator<<( std::ostream &stream, const JsonError &err ) // instantiate them here, or move the templated read/write functions into the header. template void JsonOut::write<12>( const std::bitset<12> & ); template bool JsonIn::read<12>( std::bitset<12> &, bool throw_on_error ); + +JsonIn &JsonArrayValueRef::seek() const +{ + jsin_.seek( pos_ ); + return jsin_; +} diff --git a/src/json.h b/src/json.h index d2e3ab2320799..7c3628d8607f7 100644 --- a/src/json.h +++ b/src/json.h @@ -888,6 +888,8 @@ class JsonObject std::string line_number(); // for occasional use only }; +class JsonArrayValueRef; + /* JsonArray * ========= * @@ -961,6 +963,8 @@ class JsonObject class JsonArray { private: + friend JsonArrayValueRef; + std::vector positions; int start; size_t index; @@ -1008,6 +1012,11 @@ class JsonArray template std::set get_tags( size_t index ) const; + class const_iterator; + + const_iterator begin() const; + const_iterator end() const; + // iterative type checking bool test_null() const; bool test_bool() const; @@ -1051,6 +1060,79 @@ class JsonArray } }; +class JsonArrayValueRef +{ + private: + friend JsonArray::const_iterator; + + JsonIn &jsin_; + int pos_; + + JsonArrayValueRef( JsonIn &jsin, int pos ) : jsin_( jsin ), pos_( pos ) { } + + JsonIn &seek() const; + + public: + operator std::string() const { + return seek().get_string(); + } + operator int() const { + return seek().get_int(); + } + operator bool() const { + return seek().get_bool(); + } + operator double() const { + return seek().get_float(); + } + operator JsonObject() const { + return seek().get_object(); + } + operator JsonArray() const { + return seek().get_array(); + } + template + bool read( T &t ) const { + return seek().read( t ); + } +}; + +class JsonArray::const_iterator +{ + private: + JsonArray array_; + size_t index_; + + public: + const_iterator( const JsonArray &array, size_t index ) : array_( array ), index_( index ) { } + + const_iterator &operator++() { + index_++; + return *this; + } + JsonArrayValueRef operator*() const { + array_.verify_index( index_ ); + return JsonArrayValueRef( *array_.jsin, array_.positions[index_] ); + } + + friend bool operator==( const const_iterator &lhs, const const_iterator &rhs ) { + return lhs.index_ == rhs.index_; + } + friend bool operator!=( const const_iterator &lhs, const const_iterator &rhs ) { + return !operator==( lhs, rhs ); + } +}; + +inline JsonArray::const_iterator JsonArray::begin() const +{ + return const_iterator( *this, 0 ); +} + +inline JsonArray::const_iterator JsonArray::end() const +{ + return const_iterator( *this, size() ); +} + template std::set JsonArray::get_tags( const size_t index ) const { @@ -1065,9 +1147,8 @@ std::set JsonArray::get_tags( const size_t index ) const return res; } - JsonArray jsarr = jsin->get_array(); - while( jsarr.has_more() ) { - res.insert( T( jsarr.next_string() ) ); + for( const std::string &line : jsin->get_array() ) { + res.insert( T( line ) ); } return res; @@ -1091,9 +1172,8 @@ std::set JsonObject::get_tags( const std::string &name ) } // otherwise assume it's an array and error if it isn't. - JsonArray jsarr = jsin->get_array(); - while( jsarr.has_more() ) { - res.insert( T( jsarr.next_string() ) ); + for( const std::string &line : jsin->get_array() ) { + res.insert( T( line ) ); } return res; diff --git a/src/magic.cpp b/src/magic.cpp index ed5c62ea99b72..8ce1f21d434c4 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -251,10 +251,8 @@ void spell_type::load( JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "valid_targets", valid_targets, trigger_reader ); if( jo.has_array( "extra_effects" ) ) { - JsonArray jarray = jo.get_array( "extra_effects" ); - while( jarray.has_more() ) { + for( JsonObject fake_spell_obj : jo.get_array( "extra_effects" ) ) { fake_spell temp; - JsonObject fake_spell_obj = jarray.next_object(); temp.load( fake_spell_obj ); additional_spells.emplace_back( temp ); } @@ -1178,9 +1176,7 @@ void known_magic::deserialize( JsonIn &jsin ) JsonObject data = jsin.get_object(); data.read( "mana", mana ); - JsonArray parray = data.get_array( "spellbook" ); - while( parray.has_more() ) { - JsonObject jo = parray.next_object(); + for( JsonObject jo : data.get_array( "spellbook" ) ) { std::string id = jo.get_string( "id" ); spell_id sp = spell_id( id ); int xp = jo.get_int( "xp" ); diff --git a/src/magic_teleporter_list.cpp b/src/magic_teleporter_list.cpp index bb751ab455f9a..b93f72c870cf2 100644 --- a/src/magic_teleporter_list.cpp +++ b/src/magic_teleporter_list.cpp @@ -141,10 +141,7 @@ void teleporter_list::deserialize( JsonIn &jsin ) { JsonObject data = jsin.get_object(); - JsonArray parray = data.get_array( "known_teleporters" ); - while( parray.has_more() ) { - JsonObject jo = parray.next_object(); - + for( JsonObject jo : data.get_array( "known_teleporters" ) ) { tripoint temp_pos; jo.read( "position", temp_pos ); std::string name; diff --git a/src/magic_ter_fur_transform.cpp b/src/magic_ter_fur_transform.cpp index e44bff623b9c7..61a17941750c4 100644 --- a/src/magic_ter_fur_transform.cpp +++ b/src/magic_ter_fur_transform.cpp @@ -82,44 +82,30 @@ void ter_furn_transform::load( JsonObject &jo, const std::string & ) optional( jo, was_loaded, "fail_message", fail_message, "" ); if( jo.has_member( "terrain" ) ) { - JsonArray obj_array = jo.get_array( "terrain" ); - while( obj_array.has_more() ) { - JsonObject ter_obj = obj_array.next_object(); - JsonArray target_array = ter_obj.get_array( "valid_terrain" ); + for( JsonObject ter_obj : jo.get_array( "terrain" ) ) { ter_furn_data cur_results = ter_furn_data(); cur_results.load( ter_obj ); - while( target_array.has_more() ) { - const std::string valid_terrain = target_array.next_string(); + for( const std::string &valid_terrain : ter_obj.get_array( "valid_terrain" ) ) { ter_transform.emplace( ter_str_id( valid_terrain ), cur_results ); } - target_array = ter_obj.get_array( "valid_flags" ); - - while( target_array.has_more() ) { - const std::string valid_terrain = target_array.next_string(); + for( const std::string &valid_terrain : ter_obj.get_array( "valid_flags" ) ) { ter_flag_transform.emplace( valid_terrain, cur_results ); } } } if( jo.has_member( "furniture" ) ) { - JsonArray obj_array = jo.get_array( "furniture" ); - while( obj_array.has_more() ) { - JsonObject furn_obj = obj_array.next_object(); - JsonArray target_array = furn_obj.get_array( "valid_furniture" ); + for( JsonObject furn_obj : jo.get_array( "furniture" ) ) { ter_furn_data cur_results = ter_furn_data(); cur_results.load( furn_obj ); - while( target_array.has_more() ) { - const std::string valid_furn = target_array.next_string(); + for( const std::string &valid_furn : furn_obj.get_array( "valid_furniture" ) ) { furn_transform.emplace( furn_str_id( valid_furn ), cur_results ); } - target_array = furn_obj.get_array( "valid_flags" ); - - while( target_array.has_more() ) { - const std::string valid_terrain = target_array.next_string(); + for( const std::string &valid_terrain : furn_obj.get_array( "valid_flags" ) ) { furn_flag_transform.emplace( valid_terrain, cur_results ); } } diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 56167247f4705..30ef6b04b6c16 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -184,8 +184,8 @@ static const std::unordered_map ter_connects_map = { static void load_map_bash_tent_centers( JsonArray ja, std::vector ¢ers ) { - while( ja.has_more() ) { - centers.emplace_back( ja.next_string() ); + for( const std::string &line : ja ) { + centers.emplace_back( line ); } } @@ -1108,9 +1108,7 @@ void map_data_common_t::load( JsonObject &jo, const std::string &src ) } if( jo.has_array( "harvest_by_season" ) ) { - JsonArray jsarr = jo.get_array( "harvest_by_season" ); - while( jsarr.has_more() ) { - JsonObject harvest_jo = jsarr.next_object(); + for( JsonObject harvest_jo : jo.get_array( "harvest_by_season" ) ) { auto season_strings = harvest_jo.get_tags( "seasons" ); std::set seasons; std::transform( season_strings.begin(), season_strings.end(), std::inserter( seasons, diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 1f109517f03ff..707a23a970b8e 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -411,10 +411,8 @@ void load_mapgen( JsonObject &jo ) JsonArray ja = jo.get_array( "om_terrain" ); if( ja.test_array() ) { point offset; - while( ja.has_more() ) { - JsonArray row_items = ja.next_array(); - while( row_items.has_more() ) { - const std::string mapgenid = row_items.next_string(); + for( JsonArray row_items : ja ) { + for( const std::string &mapgenid : row_items ) { const auto mgfunc = load_mapgen_function( jo, mapgenid, -1, offset ); if( mgfunc ) { oter_mapgen[ mapgenid ].push_back( mgfunc ); @@ -426,8 +424,8 @@ void load_mapgen( JsonObject &jo ) } } else { std::vector mapgenid_list; - while( ja.has_more() ) { - mapgenid_list.push_back( ja.next_string() ); + for( const std::string &line : ja ) { + mapgenid_list.push_back( line ); } if( !mapgenid_list.empty() ) { const std::string mapgenid = mapgenid_list[0]; @@ -771,9 +769,7 @@ class jmapgen_npc : public jmapgen_piece std::string new_trait = jsi.get_string( "add_trait" ); traits.emplace_back( new_trait ); } else if( jsi.has_array( "add_trait" ) ) { - JsonArray ja = jsi.get_array( "add_trait" ); - while( ja.has_more() ) { - std::string new_trait = ja.next_string(); + for( const std::string &new_trait : jsi.get_array( "add_trait" ) ) { traits.emplace_back( new_trait ); } } @@ -1448,16 +1444,12 @@ class jmapgen_computer : public jmapgen_piece security = jsi.get_int( "security", 0 ); target = jsi.get_bool( "target", false ); if( jsi.has_array( "options" ) ) { - JsonArray opts = jsi.get_array( "options" ); - while( opts.has_more() ) { - JsonObject jo = opts.next_object(); + for( JsonObject jo : jsi.get_array( "options" ) ) { options.emplace_back( computer_option::from_json( jo ) ); } } if( jsi.has_array( "failures" ) ) { - JsonArray opts = jsi.get_array( "failures" ); - while( opts.has_more() ) { - JsonObject jo = opts.next_object(); + for( JsonObject jo : jsi.get_array( "failures" ) ) { failures.emplace_back( computer_failure::from_json( jo ) ); } } @@ -1766,9 +1758,7 @@ void jmapgen_objects::add( const jmapgen_place &place, template void jmapgen_objects::load_objects( JsonArray parray ) { - while( parray.has_more() ) { - auto jsi = parray.next_object(); - + for( JsonObject jsi : parray ) { jmapgen_place where( jsi ); where.offset( m_offset ); @@ -1783,8 +1773,7 @@ void jmapgen_objects::load_objects( JsonArray parray ) template<> void jmapgen_objects::load_objects( JsonArray parray ) { - while( parray.has_more() ) { - auto jsi = parray.next_object(); + for( JsonObject jsi : parray ) { jmapgen_place where( jsi ); where.offset( m_offset ); @@ -1840,9 +1829,8 @@ void load_place_mapings( JsonObject &pjo, const std::string &key, if( pjo.has_object( key ) ) { load_place_mapings( pjo.get_object( key ), vect ); } else { - JsonArray jarr = pjo.get_array( key ); - while( jarr.has_more() ) { - load_place_mapings( jarr.next_object(), vect ); + for( JsonObject jo : pjo.get_array( key ) ) { + load_place_mapings( jo, vect ); } } } diff --git a/src/martialarts.cpp b/src/martialarts.cpp index 1e73b4050ee27..b3b0b6f609957 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -217,9 +217,7 @@ void martialart::load( JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "name", name ); mandatory( jo, was_loaded, "description", description ); mandatory( jo, was_loaded, "initiate", initiate ); - JsonArray jsarr = jo.get_array( "autolearn" ); - while( jsarr.has_more() ) { - JsonArray skillArray = jsarr.next_array(); + for( JsonArray skillArray : jo.get_array( "autolearn" ) ) { std::string skill_name = skillArray.get_string( 0 ); int skill_level = 0; std::string skill_level_string = skillArray.get_string( 1 ); diff --git a/src/material.cpp b/src/material.cpp index a86ee8902f559..5e86bb6d83dbb 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -80,24 +80,19 @@ void material_type::load( JsonObject &jsobj, const std::string & ) optional( jsobj, was_loaded, "soft", _soft, false ); optional( jsobj, was_loaded, "reinforces", _reinforces, false ); - auto arr = jsobj.get_array( "vitamins" ); - while( arr.has_more() ) { - auto pair = arr.next_array(); + for( JsonArray pair : jsobj.get_array( "vitamins" ) ) { _vitamins.emplace( vitamin_id( pair.get_string( 0 ) ), pair.get_float( 1 ) ); } mandatory( jsobj, was_loaded, "bash_dmg_verb", _bash_dmg_verb ); mandatory( jsobj, was_loaded, "cut_dmg_verb", _cut_dmg_verb ); - JsonArray jsarr = jsobj.get_array( "dmg_adj" ); - while( jsarr.has_more() ) { - _dmg_adj.push_back( jsarr.next_string() ); + for( const std::string &line : jsobj.get_array( "dmg_adj" ) ) { + _dmg_adj.push_back( line ); } if( jsobj.has_array( "burn_data" ) ) { - JsonArray burn_data_array = jsobj.get_array( "burn_data" ); - while( burn_data_array.has_more() ) { - JsonObject brn = burn_data_array.next_object(); + for( JsonObject brn : jsobj.get_array( "burn_data" ) ) { _burn_data.emplace_back( load_mat_burn_data( brn ) ); } } else { @@ -109,19 +104,15 @@ void material_type::load( JsonObject &jsobj, const std::string & ) _burn_data.emplace_back( mbd ); } - auto bp_array = jsobj.get_array( "burn_products" ); - while( bp_array.has_more( ) ) { - auto pair = bp_array.next_array(); + for( JsonArray pair : jsobj.get_array( "burn_products" ) ) { _burn_products.emplace_back( pair.get_string( 0 ), static_cast< float >( pair.get_float( 1 ) ) ); } - auto compactor_in_array = jsobj.get_array( "compact_accepts" ); - while( compactor_in_array.has_more( ) ) { - _compact_accepts.emplace_back( compactor_in_array.next_string() ); + for( const std::string &line : jsobj.get_array( "compact_accepts" ) ) { + _compact_accepts.emplace_back( line ); } - auto compactor_out_array = jsobj.get_array( "compacts_into" ); - while( compactor_out_array.has_more( ) ) { - _compacts_into.emplace_back( compactor_out_array.next_string() ); + for( const std::string &line : jsobj.get_array( "compacts_into" ) ) { + _compacts_into.emplace_back( line ); } } diff --git a/src/mattack_actors.cpp b/src/mattack_actors.cpp index e1a7e9da9ff53..e72764b2376d1 100644 --- a/src/mattack_actors.cpp +++ b/src/mattack_actors.cpp @@ -239,9 +239,7 @@ void melee_actor::load_internal( JsonObject &obj, const std::string & ) to_translation( "The %1$s bites 's %2$s!" ) ); if( obj.has_array( "body_parts" ) ) { - JsonArray jarr = obj.get_array( "body_parts" ); - while( jarr.has_more() ) { - JsonArray sub = jarr.next_array(); + for( JsonArray sub : obj.get_array( "body_parts" ) ) { const body_part bp = get_body_part_token( sub.get_string( 0 ) ); const float prob = sub.get_float( 1 ); body_parts.add_or_replace( bp, prob ); @@ -249,9 +247,7 @@ void melee_actor::load_internal( JsonObject &obj, const std::string & ) } if( obj.has_array( "effects" ) ) { - JsonArray jarr = obj.get_array( "effects" ); - while( jarr.has_more() ) { - JsonObject eff = jarr.next_object(); + for( JsonObject eff : obj.get_array( "effects" ) ) { effects.push_back( load_mon_effect_data( eff ) ); } } @@ -390,9 +386,7 @@ void gun_actor::load_internal( JsonObject &obj, const std::string & ) obj.read( "ammo_type", ammo_type ); if( obj.has_array( "fake_skills" ) ) { - JsonArray jarr = obj.get_array( "fake_skills" ); - while( jarr.has_more() ) { - JsonArray cur = jarr.next_array(); + for( JsonArray cur : obj.get_array( "fake_skills" ) ) { fake_skills[skill_id( cur.get_string( 0 ) )] = cur.get_int( 1 ); } } @@ -402,9 +396,7 @@ void gun_actor::load_internal( JsonObject &obj, const std::string & ) obj.read( "fake_int", fake_int ); obj.read( "fake_per", fake_per ); - auto arr = obj.get_array( "ranges" ); - while( arr.has_more() ) { - auto mode = arr.next_array(); + for( JsonArray mode : obj.get_array( "ranges" ) ) { if( mode.size() < 2 || mode.get_int( 0 ) > mode.get_int( 1 ) ) { obj.throw_error( "incomplete or invalid range specified", "ranges" ); } diff --git a/src/mission_util.cpp b/src/mission_util.cpp index 50352a0112c84..6623122fd1f63 100644 --- a/src/mission_util.cpp +++ b/src/mission_util.cpp @@ -486,9 +486,7 @@ bool mission_util::load_funcs( JsonObject &jo, return false; } } else if( jo.has_array( "update_mapgen" ) ) { - JsonArray mapgen_array = jo.get_array( "update_mapgen" ); - while( mapgen_array.has_more() ) { - JsonObject update_mapgen = mapgen_array.next_object(); + for( JsonObject update_mapgen : jo.get_array( "update_mapgen" ) ) { if( !set_update_mapgen( update_mapgen, funcs ) ) { return false; } diff --git a/src/mod_manager.cpp b/src/mod_manager.cpp index 430e21ca31bca..44762ccb019a1 100644 --- a/src/mod_manager.cpp +++ b/src/mod_manager.cpp @@ -404,9 +404,8 @@ void mod_manager::load_mods_list( WORLDPTR world ) const amo.clear(); bool obsolete_mod_found = false; read_from_file_optional_json( get_mods_list_file( world ), [&]( JsonIn & jsin ) { - JsonArray ja = jsin.get_array(); - while( ja.has_more() ) { - const mod_id mod( ja.next_string() ); + for( const std::string &line : jsin.get_array() ) { + const mod_id mod( line ); if( std::find( amo.begin(), amo.end(), mod ) != amo.end() ) { continue; } diff --git a/src/mongroup.cpp b/src/mongroup.cpp index f8057dd2515ac..c7affd6ffe3b2 100644 --- a/src/mongroup.cpp +++ b/src/mongroup.cpp @@ -346,10 +346,7 @@ void MonsterGroupManager::LoadMonsterGroup( JsonObject &jo ) } g.is_animal = jo.get_bool( "is_animal", false ); if( jo.has_array( "monsters" ) ) { - JsonArray monarr = jo.get_array( "monsters" ); - - while( monarr.has_more() ) { - JsonObject mon = monarr.next_object(); + for( JsonObject mon : jo.get_array( "monsters" ) ) { const mtype_id name = mtype_id( mon.get_string( "monster" ) ); int freq = mon.get_int( "freq" ); @@ -373,9 +370,8 @@ void MonsterGroupManager::LoadMonsterGroup( JsonObject &jo ) MonsterGroupEntry new_mon_group = MonsterGroupEntry( name, freq, cost, pack_min, pack_max, starts, ends ); if( mon.has_member( "conditions" ) ) { - JsonArray conditions_arr = mon.get_array( "conditions" ); - while( conditions_arr.has_more() ) { - new_mon_group.conditions.push_back( conditions_arr.next_string() ); + for( const std::string &line : mon.get_array( "conditions" ) ) { + new_mon_group.conditions.push_back( line ); } } diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 777068fdd9b0f..36fd46844464c 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -686,9 +686,8 @@ void mtype::load( JsonObject &jo, const std::string &src ) } if( jo.has_array( "scents_tracked" ) ) { - JsonArray jar = jo.get_array( "scents_tracked" ); - while( jar.has_more() ) { - scents_tracked.emplace( jar.next_string() ); + for( const std::string &line : jo.get_array( "scents_tracked" ) ) { + scents_tracked.emplace( line ); } } @@ -783,9 +782,8 @@ void mtype::load( JsonObject &jo, const std::string &src ) if( jo.has_member( "baby_flags" ) ) { // Because this determines mating season and some monsters have a mating season but not in-game offspring, declare this separately baby_flags.clear(); - JsonArray baby_tags = jo.get_array( "baby_flags" ); - while( baby_tags.has_more() ) { - baby_flags.push_back( baby_tags.next_string() ); + for( const std::string &line : jo.get_array( "baby_flags" ) ) { + baby_flags.push_back( line ); } } diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index 4df00c15e464c..2f9a34ec84535 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -308,22 +308,15 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) optional( jo, was_loaded, "debug", debug, false ); optional( jo, was_loaded, "player_display", player_display, true ); - JsonArray vr = jo.get_array( "vitamin_rates" ); - - while( vr.has_more() ) { - auto pair = vr.next_array(); + for( JsonArray pair : jo.get_array( "vitamin_rates" ) ) { vitamin_rates.emplace( vitamin_id( pair.get_string( 0 ) ), time_duration::from_turns( pair.get_int( 1 ) ) ); } - auto vam = jo.get_array( "vitamins_absorb_multi" ); - while( vam.has_more() ) { - auto pair = vam.next_array(); + for( JsonArray pair : jo.get_array( "vitamins_absorb_multi" ) ) { std::map vit; - auto vit_array = pair.get_array( 1 ); // fill the inner map with vitamins - while( vit_array.has_more() ) { - auto vitamins = vit_array.next_array(); + for( JsonArray vitamins : pair.get_array( 1 ) ) { vit.emplace( vitamin_id( vitamins.get_string( 0 ) ), vitamins.get_float( 1 ) ); } // assign the inner vitamin map to the material_id key @@ -394,31 +387,23 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) optional( jo, was_loaded, "flags", flags, string_reader{} ); optional( jo, was_loaded, "types", types, string_reader{} ); - JsonArray jsar = jo.get_array( "no_cbm_on_bp" ); - while( jsar.has_more() ) { - std::string s = jsar.next_string(); + for( const std::string &s : jo.get_array( "no_cbm_on_bp" ) ) { no_cbm_on_bp.emplace( get_body_part_token( s ) ); } optional( jo, was_loaded, "category", category, string_reader{} ); - JsonArray jsarr = jo.get_array( "spells_learned" ); - while( jsarr.has_more() ) { - JsonArray ja = jsarr.next_array(); + for( JsonArray ja : jo.get_array( "spells_learned" ) ) { const spell_id sp( ja.next_string() ); spells_learned.emplace( sp, ja.next_int() ); } - jsarr = jo.get_array( "lumination" ); - while( jsarr.has_more() ) { - JsonArray ja = jsarr.next_array(); + for( JsonArray ja : jo.get_array( "lumination" ) ) { const body_part bp = get_body_part_token( ja.next_string() ); lumination.emplace( bp, ja.next_float() ); } - jsarr = jo.get_array( "wet_protection" ); - while( jsarr.has_more() ) { - JsonObject jo = jsarr.next_object(); + for( JsonObject jo : jo.get_array( "wet_protection" ) ) { std::string part_id = jo.get_string( "part" ); int ignored = jo.get_int( "ignored", 0 ); int neutral = jo.get_int( "neutral", 0 ); @@ -427,30 +412,23 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) protection[get_body_part_token( part_id )] = protect; } - jsarr = jo.get_array( "encumbrance_always" ); - while( jsarr.has_more() ) { - JsonArray jo = jsarr.next_array(); + for( JsonArray jo : jo.get_array( "encumbrance_always" ) ) { std::string part_id = jo.next_string(); int enc = jo.next_int(); encumbrance_always[get_body_part_token( part_id )] = enc; } - jsarr = jo.get_array( "encumbrance_covered" ); - while( jsarr.has_more() ) { - JsonArray jo = jsarr.next_array(); + for( JsonArray jo : jo.get_array( "encumbrance_covered" ) ) { std::string part_id = jo.next_string(); int enc = jo.next_int(); encumbrance_covered[get_body_part_token( part_id )] = enc; } - jsarr = jo.get_array( "restricts_gear" ); - while( jsarr.has_more() ) { - restricts_gear.insert( get_body_part_token( jsarr.next_string() ) ); + for( const std::string &line : jo.get_array( "restricts_gear" ) ) { + restricts_gear.insert( get_body_part_token( line ) ); } - jsarr = jo.get_array( "armor" ); - while( jsarr.has_more() ) { - JsonObject jo = jsarr.next_object(); + for( JsonObject jo : jo.get_array( "armor" ) ) { auto parts = jo.get_tags( "parts" ); std::set bps; for( const std::string &part_string : parts ) { @@ -470,9 +448,7 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "attacks" ) ) { - jsarr = jo.get_array( "attacks" ); - while( jsarr.has_more() ) { - JsonObject jo = jsarr.next_object(); + for( JsonObject jo : jo.get_array( "attacks" ) ) { attacks_granted.emplace_back( load_mutation_attack( jo ) ); } } else if( jo.has_object( "attacks" ) ) { @@ -591,9 +567,8 @@ void dream::load( JsonObject &jsobj ) newdream.strength = jsobj.get_int( "strength" ); newdream.category = jsobj.get_string( "category" ); - JsonArray jsarr = jsobj.get_array( "messages" ); - while( jsarr.has_more() ) { - newdream.raw_messages.push_back( jsarr.next_string() ); + for( const std::string &line : jsobj.get_array( "messages" ) ) { + newdream.raw_messages.push_back( line ); } dreams.push_back( newdream ); @@ -606,9 +581,8 @@ bool trait_display_sort( const trait_id &a, const trait_id &b ) noexcept void mutation_branch::load_trait_blacklist( JsonObject &jsobj ) { - JsonArray jarr = jsobj.get_array( "traits" ); - while( jarr.has_more() ) { - trait_blacklist.insert( trait_id( jarr.next_string() ) ); + for( const std::string &line : jsobj.get_array( "traits" ) ) { + trait_blacklist.insert( trait_id( line ) ); } } @@ -696,9 +670,7 @@ void mutation_branch::load_trait_group( JsonObject &jsobj, const trait_group::Tr // TODO: (sm) Looks like this makes the new code backwards-compatible with the old format. Great if so! if( subtype == "old" ) { - JsonArray traits = jsobj.get_array( "traits" ); - while( traits.has_more() ) { - JsonArray pair = traits.next_array(); + for( JsonArray pair : jsobj.get_array( "traits" ) ) { tg.add_trait_entry( trait_id( pair.get_string( 0 ) ), pair.get_int( 1 ) ); } return; @@ -706,9 +678,7 @@ void mutation_branch::load_trait_group( JsonObject &jsobj, const trait_group::Tr // TODO: (sm) Taken from item_factory.cpp almost verbatim. Ensure that these work! if( jsobj.has_member( "entries" ) ) { - JsonArray traits = jsobj.get_array( "entries" ); - while( traits.has_more() ) { - JsonObject subobj = traits.next_object(); + for( JsonObject subobj : jsobj.get_array( "entries" ) ) { add_entry( tg, subobj ); } } diff --git a/src/npc.cpp b/src/npc.cpp index 3dca1ec1fbaf8..0dd7cae113d2b 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -231,9 +231,8 @@ void npc_template::load( JsonObject &jsobj ) if( jsobj.has_string( "mission_offered" ) ) { guy.miss_ids.emplace_back( mission_type_id( jsobj.get_string( "mission_offered" ) ) ); } else if( jsobj.has_array( "mission_offered" ) ) { - JsonArray ja = jsobj.get_array( "mission_offered" ); - while( ja.has_more() ) { - guy.miss_ids.emplace_back( mission_type_id( ja.next_string() ) ); + for( const std::string &line : jsobj.get_array( "mission_offered" ) ) { + guy.miss_ids.emplace_back( mission_type_id( line ) ); } } npc_templates.emplace( string_id( guy.idz ), std::move( tem ) ); diff --git a/src/npc_class.cpp b/src/npc_class.cpp index 82123203e1de2..a90b2fa06bc19 100644 --- a/src/npc_class.cpp +++ b/src/npc_class.cpp @@ -252,9 +252,7 @@ void npc_class::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "spells" ) ) { - JsonArray array = jo.get_array( "spells" ); - while( array.has_more() ) { - JsonObject subobj = array.next_object(); + for( JsonObject subobj : jo.get_array( "spells" ) ) { const int level = subobj.get_int( "level" ); const spell_id sp = spell_id( subobj.get_string( "id" ) ); _starting_spells.emplace( sp, level ); @@ -286,9 +284,7 @@ void npc_class::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "skills" ) ) { - JsonArray jarr = jo.get_array( "skills" ); - while( jarr.has_more() ) { - JsonObject skill_obj = jarr.next_object(); + for( JsonObject skill_obj : jo.get_array( "skills" ) ) { auto skill_ids = skill_obj.get_tags( "skill" ); if( skill_obj.has_object( "level" ) ) { const distribution dis = load_distribution( skill_obj, "level" ); @@ -305,9 +301,7 @@ void npc_class::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "bionics" ) ) { - JsonArray jarr = jo.get_array( "bionics" ); - while( jarr.has_more() ) { - JsonObject bionic_obj = jarr.next_object(); + for( JsonObject bionic_obj : jo.get_array( "bionics" ) ) { auto bionic_ids = bionic_obj.get_tags( "id" ); int chance = bionic_obj.get_int( "chance" ); for( const auto &bid : bionic_ids ) { diff --git a/src/npctalk.cpp b/src/npctalk.cpp index d2c4cac144e47..ecbd8452ba7c0 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -1796,9 +1796,7 @@ talk_trial::talk_trial( JsonObject &jo ) read_condition( jo, "condition", condition, false ); if( jo.has_array( "mod" ) ) { - JsonArray ja = jo.get_array( "mod" ); - while( ja.has_more() ) { - JsonArray jmod = ja.next_array(); + for( JsonArray jmod : jo.get_array( "mod" ) ) { trial_mod this_modifier; this_modifier.first = jmod.next_string(); this_modifier.second = jmod.next_int(); @@ -2206,9 +2204,8 @@ void talk_effect_fun_t::set_mapgen_update( JsonObject &jo, const std::string &me if( jo.has_string( member ) ) { update_ids.emplace_back( jo.get_string( member ) ); } else if( jo.has_array( member ) ) { - JsonArray ja = jo.get_array( member ); - while( ja.has_more() ) { - update_ids.emplace_back( ja.next_string() ); + for( const std::string &line : jo.get_array( member ) ) { + update_ids.emplace_back( line ); } } @@ -2512,9 +2509,7 @@ void talk_effect_t::parse_sub_effect( JsonObject &jo ) subeffect_fun.set_change_faction_rep( faction_rep ); } else if( jo.has_array( "add_debt" ) ) { std::vector debt_modifiers; - JsonArray ja = jo.get_array( "add_debt" ); - while( ja.has_more() ) { - JsonArray jmod = ja.next_array(); + for( JsonArray jmod : jo.get_array( "add_debt" ) ) { trial_mod this_modifier; this_modifier.first = jmod.next_string(); this_modifier.second = jmod.next_int(); @@ -2770,16 +2765,14 @@ json_talk_repeat_response::json_talk_repeat_response( JsonObject jo ) if( jo.has_string( "for_item" ) ) { for_item.emplace_back( jo.get_string( "for_item" ) ); } else if( jo.has_array( "for_item" ) ) { - JsonArray ja = jo.get_array( "for_item" ); - while( ja.has_more() ) { - for_item.emplace_back( ja.next_string() ); + for( const std::string &line : jo.get_array( "for_item" ) ) { + for_item.emplace_back( line ); } } else if( jo.has_string( "for_category" ) ) { for_category.emplace_back( jo.get_string( "for_category" ) ); } else if( jo.has_array( "for_category" ) ) { - JsonArray ja = jo.get_array( "for_category" ); - while( ja.has_more() ) { - for_category.emplace_back( ja.next_string() ); + for( const std::string &line : jo.get_array( "for_category" ) ) { + for_category.emplace_back( line ); } } else { jo.throw_error( "Repeat response with no repeat information!" ); @@ -2921,12 +2914,9 @@ dynamic_line_t::dynamic_line_t( JsonObject jo ) jo.throw_error( R"(dynamic line with "gendered_line" must also have "relevant_genders")" ); } - JsonArray ja = jo.get_array( "relevant_genders" ); std::vector relevant_genders; - while( ja.has_more() ) { - relevant_genders.push_back( ja.next_string() ); - } - for( const std::string &gender : relevant_genders ) { + for( const std::string &gender : jo.get_array( "relevant_genders" ) ) { + relevant_genders.push_back( gender ); if( gender != "npc" && gender != "u" ) { jo.throw_error( "Unexpected subject in relevant_genders; expected 'npc' or 'u'" ); } @@ -3037,25 +3027,19 @@ void json_talk_topic::load( JsonObject &jo ) JsonObject speaker_effect = jo.get_object( "speaker_effect" ); speaker_effects.emplace_back( speaker_effect, id ); } else if( jo.has_array( "speaker_effect" ) ) { - JsonArray ja = jo.get_array( "speaker_effect" ); - while( ja.has_more() ) { - JsonObject speaker_effect = ja.next_object(); + for( JsonObject speaker_effect : jo.get_array( "speaker_effect" ) ) { speaker_effects.emplace_back( speaker_effect, id ); } } } - JsonArray ja = jo.get_array( "responses" ); - responses.reserve( responses.size() + ja.size() ); - while( ja.has_more() ) { - JsonObject response = ja.next_object(); + for( JsonObject response : jo.get_array( "responses" ) ) { responses.emplace_back( response ); } if( jo.has_object( "repeat_responses" ) ) { repeat_responses.emplace_back( jo.get_object( "repeat_responses" ) ); } else if( jo.has_array( "repeat_responses" ) ) { - ja = jo.get_array( "repeat_responses" ); - while( ja.has_more() ) { - repeat_responses.emplace_back( ja.next_object() ); + for( JsonObject elem : jo.get_array( "repeat_responses" ) ) { + repeat_responses.emplace_back( elem ); } } if( responses.empty() ) { diff --git a/src/overlay_ordering.cpp b/src/overlay_ordering.cpp index 4c971a2b0ca19..957498198294d 100644 --- a/src/overlay_ordering.cpp +++ b/src/overlay_ordering.cpp @@ -15,9 +15,7 @@ void load_overlay_ordering( JsonObject &jsobj ) void load_overlay_ordering_into_array( JsonObject &jsobj, std::map &orderarray ) { - JsonArray jarr = jsobj.get_array( "overlay_ordering" ); - while( jarr.has_more() ) { - JsonObject ordering = jarr.next_object(); + for( JsonObject ordering : jsobj.get_array( "overlay_ordering" ) ) { int order = ordering.get_int( "order" ); for( auto &id : ordering.get_tags( "id" ) ) { orderarray[id] = order; diff --git a/src/overmap.cpp b/src/overmap.cpp index 5365e959a02b0..c5b87fc75cc5f 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -539,14 +539,8 @@ static void load_overmap_terrain_mapgens( JsonObject &jo, const std::string &id_ } } if( jo.has_array( jsonkey ) ) { - JsonArray ja = jo.get_array( jsonkey ); - int c = 0; - while( ja.has_more() ) { - if( ja.has_object( c ) ) { - JsonObject jio = ja.next_object(); - load_mapgen_function( jio, fmapkey, default_idx ); - } - c++; + for( JsonObject jio : jo.get_array( jsonkey ) ) { + load_mapgen_function( jio, fmapkey, default_idx ); } } } diff --git a/src/panels.cpp b/src/panels.cpp index 267f2c446b87a..71bc1e891a732 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -2191,20 +2191,12 @@ void panel_manager::deserialize( JsonIn &jsin ) JsonObject joLayouts( jsin.get_object() ); current_layout_id = joLayouts.get_string( "current_layout_id" ); - JsonArray jaLayouts = joLayouts.get_array( "layouts" ); - - while( jaLayouts.has_more() ) { - JsonObject joLayout = jaLayouts.next_object(); - + for( JsonObject joLayout : joLayouts.get_array( "layouts" ) ) { std::string layout_id = joLayout.get_string( "layout_id" ); auto &layout = layouts.find( layout_id )->second; auto it = layout.begin(); - JsonArray jaPanels = joLayout.get_array( "panels" ); - - while( jaPanels.has_more() ) { - JsonObject joPanel = jaPanels.next_object(); - + for( JsonObject joPanel : joLayout.get_array( "panels" ) ) { std::string name = joPanel.get_string( "name" ); bool toggle = joPanel.get_bool( "toggle" ); diff --git a/src/profession.cpp b/src/profession.cpp index a7951e66927d9..111a88ae40d3b 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -170,9 +170,7 @@ void profession::load( JsonObject &jo, const std::string & ) _description_female = to_translation( "prof_desc_female", desc ); } if( jo.has_array( "pets" ) ) { - JsonArray array = jo.get_array( "pets" ); - while( array.has_more() ) { - JsonObject subobj = array.next_object(); + for( JsonObject subobj : jo.get_array( "pets" ) ) { int count = subobj.get_int( "amount" ); mtype_id mon = mtype_id( subobj.get_string( "name" ) ); for( int start = 0; start < count; ++start ) { @@ -182,9 +180,7 @@ void profession::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "spells" ) ) { - JsonArray array = jo.get_array( "spells" ); - while( array.has_more() ) { - JsonObject subobj = array.next_object(); + for( JsonObject subobj : jo.get_array( "spells" ) ) { int level = subobj.get_int( "level" ); spell_id sp = spell_id( subobj.get_string( "id" ) ); _starting_spells.emplace( sp, level ); @@ -513,9 +509,7 @@ void json_item_substitution::load( JsonObject &jo ) if( !jo.has_array( "substitutions" ) ) { jo.throw_error( "No `substitutions` array found." ); } - JsonArray outer_arr = jo.get_array( "substitutions" ); - while( outer_arr.has_more() ) { - JsonObject subobj = outer_arr.next_object(); + for( JsonObject subobj : jo.get_array( "substitutions" ) ) { do_load( subobj ); } } @@ -546,9 +540,7 @@ void json_item_substitution::do_load( JsonObject &jo ) jo.throw_error( "Missing sub array" ); } - JsonArray sub = jo.get_array( "sub" ); - while( sub.has_more() ) { - JsonArray line = sub.next_array(); + for( JsonArray line : jo.get_array( "sub" ) ) { substitution s; const itype_id old_it = item_mode ? title : line.next_string(); if( item_mode ) { diff --git a/src/recipe.cpp b/src/recipe.cpp index 6479777f8cc28..e17c4b5228c7a 100644 --- a/src/recipe.cpp +++ b/src/recipe.cpp @@ -132,8 +132,7 @@ void recipe::load( JsonObject &jo, const std::string &src ) } else if( sk.has_array( 0 ) ) { // multiple requirements - while( sk.has_more() ) { - auto arr = sk.next_array(); + for( JsonArray arr : sk ) { required_skills[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } @@ -149,9 +148,7 @@ void recipe::load( JsonObject &jo, const std::string &src ) } else if( jo.has_array( "autolearn" ) ) { autolearn = true; - auto sk = jo.get_array( "autolearn" ); - while( sk.has_more() ) { - auto arr = sk.next_array(); + for( JsonArray arr : jo.get_array( "autolearn" ) ) { autolearn_requirements[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } @@ -171,20 +168,15 @@ void recipe::load( JsonObject &jo, const std::string &src ) assign( jo, "decomp_learn", learn_by_disassembly[skill_used] ); } else if( jo.has_array( "decomp_learn" ) ) { - auto sk = jo.get_array( "decomp_learn" ); - while( sk.has_more() ) { - auto arr = sk.next_array(); + for( JsonArray arr : jo.get_array( "decomp_learn" ) ) { learn_by_disassembly[skill_id( arr.get_string( 0 ) )] = arr.get_int( 1 ); } } } if( jo.has_member( "book_learn" ) ) { - auto bk = jo.get_array( "book_learn" ); booksets.clear(); - - while( bk.has_more() ) { - auto arr = bk.next_array(); + for( JsonArray arr : jo.get_array( "book_learn" ) ) { booksets.emplace( arr.get_string( 0 ), arr.size() > 1 ? arr.get_int( 1 ) : -1 ); } } @@ -194,11 +186,8 @@ void recipe::load( JsonObject &jo, const std::string &src ) reqs_external = { { requirement_id( jo.get_string( "using" ) ), 1 } }; } else if( jo.has_array( "using" ) ) { - auto arr = jo.get_array( "using" ); reqs_external.clear(); - - while( arr.has_more() ) { - auto cur = arr.next_array(); + for( JsonArray cur : jo.get_array( "using" ) ) { reqs_external.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } @@ -222,41 +211,31 @@ void recipe::load( JsonObject &jo, const std::string &src ) if( this->reversible ) { jo.throw_error( "Recipe cannot be reversible and have byproducts" ); } - auto bp = jo.get_array( "byproducts" ); byproducts.clear(); - while( bp.has_more() ) { - auto arr = bp.next_array(); + for( JsonArray arr : jo.get_array( "byproducts" ) ) { byproducts[ arr.get_string( 0 ) ] += arr.size() == 2 ? arr.get_int( 1 ) : 1; } } assign( jo, "construction_blueprint", blueprint ); if( !blueprint.empty() ) { assign( jo, "blueprint_name", bp_name ); - JsonArray bp_array = jo.get_array( "blueprint_resources" ); bp_resources.clear(); - while( bp_array.has_more() ) { - std::string resource = bp_array.next_string(); + for( const std::string &resource : jo.get_array( "blueprint_resources" ) ) { bp_resources.emplace_back( resource ); } - bp_array = jo.get_array( "blueprint_provides" ); - while( bp_array.has_more() ) { - JsonObject provide = bp_array.next_object(); + for( JsonObject provide : jo.get_array( "blueprint_provides" ) ) { bp_provides.emplace_back( std::make_pair( provide.get_string( "id" ), provide.get_int( "amount", 1 ) ) ); } // all blueprints provide themselves with needing it written in JSON bp_provides.emplace_back( std::make_pair( result_, 1 ) ); - bp_array = jo.get_array( "blueprint_requires" ); - while( bp_array.has_more() ) { - JsonObject require = bp_array.next_object(); + for( JsonObject require : jo.get_array( "blueprint_requires" ) ) { bp_requires.emplace_back( std::make_pair( require.get_string( "id" ), require.get_int( "amount", 1 ) ) ); } // all blueprints exclude themselves with needing it written in JSON bp_excludes.emplace_back( std::make_pair( result_, 1 ) ); - bp_array = jo.get_array( "blueprint_excludes" ); - while( bp_array.has_more() ) { - JsonObject exclude = bp_array.next_object(); + for( JsonObject exclude : jo.get_array( "blueprint_excludes" ) ) { bp_excludes.emplace_back( std::make_pair( exclude.get_string( "id" ), exclude.get_int( "amount", 1 ) ) ); } diff --git a/src/recipe_groups.cpp b/src/recipe_groups.cpp index affe850a9025f..220291d5b8074 100644 --- a/src/recipe_groups.cpp +++ b/src/recipe_groups.cpp @@ -40,18 +40,14 @@ generic_factory recipe_groups_data( "recipe group type", "nam void recipe_group_data::load( JsonObject &jo, const std::string & ) { building_type = jo.get_string( "building_type" ); - JsonArray jsarr = jo.get_array( "recipes" ); - while( jsarr.has_more() ) { - JsonObject ordering = jsarr.next_object(); + for( JsonObject ordering : jo.get_array( "recipes" ) ) { recipe_id name_id; ordering.read( "id", name_id ); translation desc; ordering.read( "description", desc ); recipes.emplace( name_id, desc ); om_terrains[name_id] = std::set(); - JsonArray js_terr = ordering.get_array( "om_terrains" ); - while( js_terr.has_more() ) { - const std::string ter_type = js_terr.next_string(); + for( const std::string &ter_type : ordering.get_array( "om_terrains" ) ) { om_terrains[name_id].insert( ter_type ); } } diff --git a/src/regional_settings.cpp b/src/regional_settings.cpp index 31c7d8a79cf7a..fc0615afca0ce 100644 --- a/src/regional_settings.cpp +++ b/src/regional_settings.cpp @@ -267,9 +267,8 @@ static void load_overmap_feature_flag_settings( JsonObject &jo, overmap_feature_flag_settings_jo.throw_error( "blacklist required" ); } } else { - JsonArray blacklist_ja = overmap_feature_flag_settings_jo.get_array( "blacklist" ); - while( blacklist_ja.has_more() ) { - overmap_feature_flag_settings.blacklist.emplace( blacklist_ja.next_string() ); + for( const std::string &line : overmap_feature_flag_settings_jo.get_array( "blacklist" ) ) { + overmap_feature_flag_settings.blacklist.emplace( line ); } } @@ -278,9 +277,8 @@ static void load_overmap_feature_flag_settings( JsonObject &jo, overmap_feature_flag_settings_jo.throw_error( "whitelist required" ); } } else { - JsonArray whitelist_ja = overmap_feature_flag_settings_jo.get_array( "whitelist" ); - while( whitelist_ja.has_more() ) { - overmap_feature_flag_settings.whitelist.emplace( whitelist_ja.next_string() ); + for( const std::string &line : overmap_feature_flag_settings_jo.get_array( "whitelist" ) ) { + overmap_feature_flag_settings.whitelist.emplace( line ); } } } @@ -343,12 +341,10 @@ static void load_overmap_lake_settings( JsonObject &jo, overmap_lake_settings_jo.throw_error( "shore_extendable_overmap_terrain_aliases required" ); } } else { - JsonArray aliases_jarr = - overmap_lake_settings_jo.get_array( "shore_extendable_overmap_terrain_aliases" ); oter_str_id alias; - while( aliases_jarr.has_more() ) { + for( JsonObject jo : + overmap_lake_settings_jo.get_array( "shore_extendable_overmap_terrain_aliases" ) ) { shore_extendable_overmap_terrain_alias alias; - JsonObject jo = aliases_jarr.next_object(); jo.read( "om_terrain", alias.overmap_terrain ); jo.read( "alias", alias.alias ); alias.match_type = jo.get_enum_value( "om_terrain_match_type", @@ -439,10 +435,8 @@ void load_region_settings( JsonObject &jo ) jo.throw_error( "river_scale required for default" ); } if( jo.has_array( "default_groundcover" ) ) { - JsonArray jia = jo.get_array( "default_groundcover" ); new_region.default_groundcover_str.reset( new weighted_int_list ); - while( jia.has_more() ) { - JsonArray inner = jia.next_array(); + for( JsonArray inner : jo.get_array( "default_groundcover" ) ) { if( new_region.default_groundcover_str->add( ter_str_id( inner.get_string( 0 ) ), inner.get_int( 1 ) ) == nullptr ) { jo.throw_error( "'default_groundcover' must be a weighted list: an array of pairs [ \"id\", weight ]" ); @@ -624,10 +618,7 @@ void load_region_overlay( JsonObject &jo ) { if( jo.has_array( "regions" ) ) { JsonArray regions = jo.get_array( "regions" ); - - while( regions.has_more() ) { - std::string regionid = regions.next_string(); - + for( const std::string ®ionid : regions ) { if( regionid == "all" ) { if( regions.size() != 1 ) { jo.throw_error( "regions: More than one region is not allowed when \"all\" is used" ); @@ -655,10 +646,8 @@ void apply_region_overlay( JsonObject &jo, regional_settings ®ion ) jo.read( "default_oter", region.default_oter ); jo.read( "river_scale", region.river_scale ); if( jo.has_array( "default_groundcover" ) ) { - JsonArray jia = jo.get_array( "default_groundcover" ); region.default_groundcover_str.reset( new weighted_int_list ); - while( jia.has_more() ) { - JsonArray inner = jia.next_array(); + for( JsonArray inner : jo.get_array( "default_groundcover" ) ) { if( region.default_groundcover_str->add( ter_str_id( inner.get_string( 0 ) ), inner.get_int( 1 ) ) == nullptr ) { jo.throw_error( "'default_groundcover' must be a weighted list: an array of pairs [ \"id\", weight ]" ); diff --git a/src/relic.cpp b/src/relic.cpp index 1f91f9ce9cb8d..bd15456d797a2 100644 --- a/src/relic.cpp +++ b/src/relic.cpp @@ -27,19 +27,15 @@ void relic::add_passive_effect( const enchantment &nench ) void relic::load( JsonObject &jo ) { if( jo.has_array( "active_effects" ) ) { - JsonArray jarray = jo.get_array( "active_effects" ); - while( jarray.has_more() ) { + for( JsonObject jobj : jo.get_array( "active_effects" ) ) { fake_spell sp; - JsonObject jobj = jarray.next_object(); sp.load( jobj ); add_active_effect( sp ); } } if( jo.has_array( "passive_effects" ) ) { - JsonArray jarray = jo.get_array( "passive_effects" ); - while( jarray.has_more() ) { + for( JsonObject jobj : jo.get_array( "passive_effects" ) ) { enchantment ench; - JsonObject jobj = jarray.next_object(); ench.load( jobj ); add_passive_effect( ench ); } diff --git a/src/requirements.cpp b/src/requirements.cpp index d0545b6dca78e..738f1ebd3457b 100644 --- a/src/requirements.cpp +++ b/src/requirements.cpp @@ -71,12 +71,10 @@ void quality::load( JsonObject &jo, const std::string & ) { mandatory( jo, was_loaded, "name", name ); - JsonArray arr = jo.get_array( "usages" ); - while( arr.has_more() ) { - auto lvl = arr.next_array(); - auto funcs = lvl.get_array( 1 ); - while( funcs.has_more() ) { - usages.emplace_back( lvl.get_int( 0 ), funcs.next_string() ); + for( JsonArray levels : jo.get_array( "usages" ) ) { + const int level = levels.get_int( 0 ); + for( const std::string &line : levels.get_array( 1 ) ) { + usages.emplace_back( level, line ); } } } diff --git a/src/savegame.cpp b/src/savegame.cpp index 32436d6f19572..d5e163bf4e441 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -201,11 +201,10 @@ void game::unserialize( std::istream &fin ) } data.read( "active_monsters", *critter_tracker ); - JsonArray vdata = data.get_array( "stair_monsters" ); coming_to_stairs.clear(); - while( vdata.has_more() ) { + for( auto elem : data.get_array( "stair_monsters" ) ) { monster stairtmp; - vdata.read_next( stairtmp ); + elem.read( stairtmp ); coming_to_stairs.push_back( stairtmp ); } @@ -221,10 +220,7 @@ void game::unserialize( std::istream &fin ) kills[mtype_id( member )] = odata.get_int( member ); } - vdata = data.get_array( "npc_kills" ); - while( vdata.has_more() ) { - std::string npc_name; - vdata.read_next( npc_name ); + for( const std::string &npc_name : data.get_array( "npc_kills" ) ) { npc_kills.push_back( npc_name ); } @@ -277,11 +273,10 @@ void game::load_shortcuts( std::istream &fin ) quick_shortcuts_map.clear(); for( std::set::iterator it = qsl_members.begin(); it != qsl_members.end(); ++it ) { - JsonArray ja = qs.get_array( *it ); std::list &qslist = quick_shortcuts_map[ *it ]; qslist.clear(); - while( ja.has_more() ) { - qslist.push_back( input_event( ja.next_int(), CATA_INPUT_KEYBOARD ) ); + for( const int i : qs.get_array( *it ) ) { + qslist.push_back( input_event( i, CATA_INPUT_KEYBOARD ) ); } } } @@ -318,9 +313,8 @@ std::unordered_set obsolete_terrains; void overmap::load_obsolete_terrains( JsonObject &jo ) { - JsonArray ja = jo.get_array( "terrains" ); - while( ja.has_more() ) { - obsolete_terrains.emplace( ja.next_string() ); + for( const std::string &line : jo.get_array( "terrains" ) ) { + obsolete_terrains.emplace( line ); } } diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 8c9f977001821..6efdf30b875df 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -885,10 +885,8 @@ void player::load( JsonObject &data ) data.read( "addictions", addictions ); data.read( "followers", follower_ids ); - JsonArray traps = data.get_array( "known_traps" ); known_traps.clear(); - while( traps.has_more() ) { - JsonObject pmap = traps.next_object(); + for( JsonObject pmap : data.get_array( "known_traps" ) ) { const tripoint p( pmap.get_int( "x" ), pmap.get_int( "y" ), pmap.get_int( "z" ) ); const std::string t = pmap.get_string( "trap" ); known_traps.insert( trap_map::value_type( p, t ) ); @@ -916,9 +914,7 @@ void player::load( JsonObject &data ) } if( data.has_array( "faction_warnings" ) ) { - JsonArray warning_arr = data.get_array( "faction_warnings" ); - while( warning_arr.has_more() ) { - JsonObject warning_data = warning_arr.next_object(); + for( JsonObject warning_data : data.get_array( "faction_warnings" ) ) { std::string fac_id = warning_data.get_string( "fac_warning_id" ); int warning_num = warning_data.get_int( "fac_warning_num" ); time_point warning_time = calendar::before_time_starts; @@ -946,10 +942,8 @@ void player::load( JsonObject &data ) last_target = g->critter_tracker->from_temporary_id( tmptar ); } data.read( "destination_point", destination_point ); - JsonArray basecamps = data.get_array( "camps" ); camps.clear(); - while( basecamps.has_more() ) { - JsonObject bcdata = basecamps.next_object(); + for( JsonObject bcdata : data.get_array( "camps" ) ) { tripoint bcpt; bcdata.read( "pos", bcpt ); camps.insert( bcpt ); @@ -1169,9 +1163,7 @@ void avatar::load( JsonObject &data ) } data.read( "show_map_memory", show_map_memory ); - JsonArray parray = data.get_array( "assigned_invlet" ); - while( parray.has_more() ) { - JsonArray pair = parray.next_array(); + for( JsonArray pair : data.get_array( "assigned_invlet" ) ) { inv.assigned_invlet[static_cast( pair.get_int( 0 ) )] = pair.get_string( 1 ); } @@ -1740,15 +1732,12 @@ void inventory::json_load_invcache( JsonIn &jsin ) { try { std::unordered_map map; - JsonArray ja = jsin.get_array(); - while( ja.has_more() ) { - JsonObject jo = ja.next_object(); + for( JsonObject jo : jsin.get_array() ) { std::set members = jo.get_member_names(); for( const auto &member : members ) { std::string invlets; - JsonArray pvect = jo.get_array( member ); - while( pvect.has_more() ) { - invlets.push_back( pvect.next_int() ); + for( const int i : jo.get_array( member ) ) { + invlets.push_back( i ); } map[member] = invlets; } @@ -2650,9 +2639,7 @@ void vehicle::deserialize( JsonIn &jsin ) point p; zone_data zd; - JsonArray ja = data.get_array( "zones" ); - while( ja.has_more() ) { - JsonObject sdata = ja.next_object(); + for( JsonObject sdata : data.get_array( "zones" ) ) { sdata.read( "point", p ); sdata.read( "zone", zd ); loot_zones.emplace( p, zd ); @@ -3145,19 +3132,15 @@ void map_memory::load( JsonIn &jsin ) // Deserializer for legacy object-based memory map. void map_memory::load( JsonObject &jsin ) { - JsonArray map_memory_tiles = jsin.get_array( "map_memory_tiles" ); tile_cache.clear(); - while( map_memory_tiles.has_more() ) { - JsonObject pmap = map_memory_tiles.next_object(); + for( JsonObject pmap : jsin.get_array( "map_memory_tiles" ) ) { const tripoint p( pmap.get_int( "x" ), pmap.get_int( "y" ), pmap.get_int( "z" ) ); memorize_tile( std::numeric_limits::max(), p, pmap.get_string( "tile" ), pmap.get_int( "subtile" ), pmap.get_int( "rotation" ) ); } - JsonArray map_memory_curses = jsin.get_array( "map_memory_curses" ); symbol_cache.clear(); - while( map_memory_curses.has_more() ) { - JsonObject pmap = map_memory_curses.next_object(); + for( JsonObject pmap : jsin.get_array( "map_memory_curses" ) ) { const tripoint p( pmap.get_int( "x" ), pmap.get_int( "y" ), pmap.get_int( "z" ) ); memorize_symbol( std::numeric_limits::max(), p, pmap.get_int( "symbol" ) ); } @@ -3345,9 +3328,7 @@ void basecamp::deserialize( JsonIn &jsin ) data.read( "name", name ); data.read( "pos", omt_pos ); data.read( "bb_pos", bb_pos ); - JsonArray ja = data.get_array( "expansions" ); - while( ja.has_more() ) { - JsonObject edata = ja.next_object(); + for( JsonObject edata : data.get_array( "expansions" ) ) { expansion_data e; point dir; if( edata.has_string( "dir" ) ) { @@ -3363,9 +3344,7 @@ void basecamp::deserialize( JsonIn &jsin ) } if( edata.has_array( "provides" ) ) { e.cur_level = -1; - JsonArray provides_arr = edata.get_array( "provides" ); - while( provides_arr.has_more() ) { - JsonObject provide_data = provides_arr.next_object(); + for( JsonObject provide_data : edata.get_array( "provides" ) ) { std::string id = provide_data.get_string( "id" ); int amount = provide_data.get_int( "amount" ); e.provides[ id ] = amount; @@ -3376,9 +3355,7 @@ void basecamp::deserialize( JsonIn &jsin ) if( e.provides.find( initial_provide ) == e.provides.end() ) { e.provides[ initial_provide ] = 1; } - JsonArray in_progress_arr = edata.get_array( "in_progress" ); - while( in_progress_arr.has_more() ) { - JsonObject in_progress_data = in_progress_arr.next_object(); + for( JsonObject in_progress_data : edata.get_array( "in_progress" ) ) { std::string id = in_progress_data.get_string( "id" ); int amount = in_progress_data.get_int( "amount" ); e.in_progress[ id ] = amount; @@ -3389,9 +3366,7 @@ void basecamp::deserialize( JsonIn &jsin ) directions.push_back( dir ); } } - JsonArray jo = data.get_array( "fortifications" ); - while( jo.has_more() ) { - JsonObject edata = jo.next_object(); + for( JsonObject edata : data.get_array( "fortifications" ) ) { tripoint restore_pos; edata.read( "pos", restore_pos ); fortifications.push_back( restore_pos ); @@ -3426,10 +3401,7 @@ void kill_tracker::deserialize( JsonIn &jsin ) kills[mtype_id( member )] = kills_obj.get_int( member ); } - JsonArray npc_kills_array = data.get_array( "npc_kills" ); - while( npc_kills_array.has_more() ) { - std::string npc_name; - npc_kills_array.read_next( npc_name ); + for( const std::string &npc_name : data.get_array( "npc_kills" ) ) { npc_kills.push_back( npc_name ); } } diff --git a/src/sdlsound.cpp b/src/sdlsound.cpp index da6b331422862..83f0f67f946c6 100644 --- a/src/sdlsound.cpp +++ b/src/sdlsound.cpp @@ -313,10 +313,8 @@ void sfx::load_sound_effects( JsonObject &jsobj ) const int volume = jsobj.get_int( "volume", 100 ); auto &effects = sfx_resources.sound_effects[ key ]; - JsonArray jsarr = jsobj.get_array( "files" ); - while( jsarr.has_more() ) { + for( const std::string file : jsobj.get_array( "files" ) ) { sound_effect new_sound_effect; - const std::string file = jsarr.next_string(); new_sound_effect.volume = volume; new_sound_effect.resource_id = add_sfx_path( file ); @@ -329,9 +327,7 @@ void sfx::load_sound_effect_preload( JsonObject &jsobj ) return; } - JsonArray jsarr = jsobj.get_array( "preload" ); - while( jsarr.has_more() ) { - JsonObject aobj = jsarr.next_object(); + for( JsonObject aobj : jsobj.get_array( "preload" ) ) { const id_and_variant preload_key( aobj.get_string( "id" ), aobj.get_string( "variant", "default" ) ); sfx_preload.push_back( preload_key ); @@ -344,17 +340,12 @@ void sfx::load_playlist( JsonObject &jsobj ) return; } - JsonArray jarr = jsobj.get_array( "playlists" ); - while( jarr.has_more() ) { - JsonObject playlist = jarr.next_object(); - + for( JsonObject playlist : jsobj.get_array( "playlists" ) ) { const std::string playlist_id = playlist.get_string( "id" ); music_playlist playlist_to_load; playlist_to_load.shuffle = playlist.get_bool( "shuffle", false ); - JsonArray files = playlist.get_array( "files" ); - while( files.has_more() ) { - JsonObject entry = files.next_object(); + for( JsonObject entry : playlist.get_array( "files" ) ) { const music_playlist::entry e{ entry.get_string( "file" ), entry.get_int( "volume" ) }; playlist_to_load.entries.push_back( e ); } diff --git a/src/tutorial.cpp b/src/tutorial.cpp index ae71a52f19230..1f8c6969e718c 100644 --- a/src/tutorial.cpp +++ b/src/tutorial.cpp @@ -274,10 +274,9 @@ void load_tutorial_messages( JsonObject &jo ) { // loading them all at once, as they have to be in exact order tut_text.clear(); - JsonArray messages = jo.get_array( "messages" ); - while( messages.has_more() ) { + for( auto messages : jo.get_array( "messages" ) ) { translation next; - messages.read_next( next ); + messages.read( next ); tut_text.emplace_back( next ); } } diff --git a/src/veh_type.cpp b/src/veh_type.cpp index 2624941594718..d85528ee9367a 100644 --- a/src/veh_type.cpp +++ b/src/veh_type.cpp @@ -171,8 +171,7 @@ static void parse_vp_reqs( JsonObject &obj, const std::string &id, const std::st if( !sk.empty() ) { skills.clear(); } - while( sk.has_more() ) { - auto cur = sk.next_array(); + for( JsonArray cur : sk ) { skills.emplace( skill_id( cur.get_string( 0 ) ), cur.size() >= 2 ? cur.get_int( 1 ) : 1 ); } @@ -187,9 +186,7 @@ static void parse_vp_reqs( JsonObject &obj, const std::string &id, const std::st reqs = { { requirement_id( src.get_string( "using" ) ), 1 } }; } else if( src.has_array( "using" ) ) { reqs.clear(); - auto arr = src.get_array( "using" ); - while( arr.has_more() ) { - auto cur = arr.next_array(); + for( JsonArray cur : src.get_array( "using" ) ) { reqs.emplace_back( requirement_id( cur.get_string( 0 ) ), cur.get_int( 1 ) ); } } else { @@ -221,15 +218,15 @@ void vpart_info::load_engine( cata::optional &eptr, JsonObject &j auto excludes = jo.get_array( "exclusions" ); if( !excludes.empty() ) { e_info.exclusions.clear(); - while( excludes.has_more() ) { - e_info.exclusions.push_back( excludes.next_string() ); + for( const std::string &line : excludes ) { + e_info.exclusions.push_back( line ); } } auto fuel_opts = jo.get_array( "fuel_options" ); if( !fuel_opts.empty() ) { e_info.fuel_opts.clear(); - while( fuel_opts.has_more() ) { - e_info.fuel_opts.push_back( itype_id( fuel_opts.next_string() ) ); + for( const std::string &line : fuel_opts ) { + e_info.fuel_opts.push_back( itype_id( line ) ); } } else if( e_info.fuel_opts.empty() && fuel_type != itype_id( "null" ) ) { e_info.fuel_opts.push_back( fuel_type ); @@ -347,9 +344,7 @@ void vpart_info::load( JsonObject &jo, const std::string &src ) if( jo.has_member( "transform_terrain" ) ) { JsonObject jttd = jo.get_object( "transform_terrain" ); - JsonArray jpf = jttd.get_array( "pre_flags" ); - while( jpf.has_more() ) { - std::string pre_flag = jpf.next_string(); + for( const std::string &pre_flag : jttd.get_array( "pre_flags" ) ) { def.transform_terrain.pre_flags.emplace( pre_flag ); } def.transform_terrain.post_terrain = jttd.get_string( "post_terrain", "t_null" ); @@ -403,8 +398,7 @@ void vpart_info::load( JsonObject &jo, const std::string &src ) auto qual = jo.get_array( "qualities" ); if( !qual.empty() ) { def.qualities.clear(); - while( qual.has_more() ) { - auto pair = qual.next_array(); + for( JsonArray pair : qual ) { def.qualities[ quality_id( pair.get_string( 0 ) ) ] = pair.get_int( 1 ); } } @@ -949,9 +943,7 @@ void vehicle_prototype::load( JsonObject &jo ) vproto.parts.push_back( pt ); }; - JsonArray parts = jo.get_array( "parts" ); - while( parts.has_more() ) { - JsonObject part = parts.next_object(); + for( JsonObject part : jo.get_array( "parts" ) ) { point pos = point( part.get_int( "x" ), part.get_int( "y" ) ); if( part.has_string( "part" ) ) { @@ -970,9 +962,7 @@ void vehicle_prototype::load( JsonObject &jo ) } } - JsonArray items = jo.get_array( "items" ); - while( items.has_more() ) { - JsonObject spawn_info = items.next_object(); + for( JsonObject spawn_info : jo.get_array( "items" ) ) { vehicle_item_spawn next_spawn; next_spawn.pos.x = spawn_info.get_int( "x" ); next_spawn.pos.y = spawn_info.get_int( "y" ); diff --git a/src/vehicle_group.cpp b/src/vehicle_group.cpp index c8965c68ca692..40d0ee5c74c6c 100644 --- a/src/vehicle_group.cpp +++ b/src/vehicle_group.cpp @@ -65,9 +65,7 @@ void VehicleGroup::load( JsonObject &jo ) { VehicleGroup &group = vgroups[vgroup_id( jo.get_string( "id" ) )]; - JsonArray vehicles = jo.get_array( "vehicles" ); - while( vehicles.has_more() ) { - JsonArray pair = vehicles.next_array(); + for( JsonArray pair : jo.get_array( "vehicles" ) ) { group.add_vehicle( vproto_id( pair.get_string( 0 ) ), pair.get_int( 1 ) ); } } @@ -80,10 +78,8 @@ void VehicleGroup::reset() VehicleFacings::VehicleFacings( JsonObject &jo, const std::string &key ) { if( jo.has_array( key ) ) { - JsonArray jpos = jo.get_array( key ); - - while( jpos.has_more() ) { - values.push_back( jpos.next_int() ); + for( const int i : jo.get_array( key ) ) { + values.push_back( i ); } } else { values.push_back( jo.get_int( key ) ); @@ -94,10 +90,7 @@ void VehiclePlacement::load( JsonObject &jo ) { VehiclePlacement &placement = vplacements[vplacement_id( jo.get_string( "id" ) )]; - JsonArray locations = jo.get_array( "locations" ); - while( locations.has_more() ) { - JsonObject jloc = locations.next_object(); - + for( JsonObject jloc : jo.get_array( "locations" ) ) { placement.add( jmapgen_int( jloc, "x" ), jmapgen_int( jloc, "y" ), VehicleFacings( jloc, "facing" ) ); } @@ -173,11 +166,7 @@ bool string_id::is_valid() const void VehicleSpawn::load( JsonObject &jo ) { VehicleSpawn &spawn = vspawns[vspawn_id( jo.get_string( "id" ) )]; - JsonArray types = jo.get_array( "spawn_types" ); - - while( types.has_more() ) { - JsonObject type = types.next_object(); - + for( JsonObject type : jo.get_array( "spawn_types" ) ) { if( type.has_object( "vehicle_json" ) ) { JsonObject vjo = type.get_object( "vehicle_json" ); spawn.add( type.get_float( "weight" ), make_shared_fast( vjo ) ); diff --git a/src/vitamin.cpp b/src/vitamin.cpp index 6c5f09e0f5c35..2959ff66f4cfa 100644 --- a/src/vitamin.cpp +++ b/src/vitamin.cpp @@ -65,15 +65,11 @@ void vitamin::load_vitamin( JsonObject &jo ) jo.throw_error( "vitamin consumption rate cannot be negative", "rate" ); } - JsonArray def = jo.get_array( "disease" ); - while( def.has_more() ) { - JsonArray e = def.next_array(); + for( JsonArray e : jo.get_array( "disease" ) ) { vit.disease_.emplace_back( e.get_int( 0 ), e.get_int( 1 ) ); } - auto exc = jo.get_array( "disease_excess" ); - while( exc.has_more() ) { - auto e = exc.next_array(); + for( JsonArray e : jo.get_array( "disease_excess" ) ) { vit.disease_excess_.emplace_back( e.get_int( 0 ), e.get_int( 1 ) ); } diff --git a/src/worldfactory.cpp b/src/worldfactory.cpp index f889b85fee155..10130d24794ca 100644 --- a/src/worldfactory.cpp +++ b/src/worldfactory.cpp @@ -1412,8 +1412,8 @@ void load_world_option( JsonObject &jo ) if( arr.empty() ) { jo.throw_error( "no options specified", "options" ); } - while( arr.has_more() ) { - get_options().get_option( arr.next_string() ).setValue( "true" ); + for( const std::string &line : arr ) { + get_options().get_option( line ).setValue( "true" ); } } From 30567edad0a5865f81f1102b6c1da331a8b794e9 Mon Sep 17 00:00:00 2001 From: BevapDin Date: Fri, 6 Dec 2019 07:33:27 +0100 Subject: [PATCH 5/6] Fix test errors from unvisited JSON object members. Functions take a copy of the JSON object, so the members in the original object are never visited and that is reported as error. --- src/mapgen.cpp | 1 + src/npctalk.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 707a23a970b8e..14978b3319cbc 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1831,6 +1831,7 @@ void load_place_mapings( JsonObject &pjo, const std::string &key, } else { for( JsonObject jo : pjo.get_array( key ) ) { load_place_mapings( jo, vect ); + jo.allow_omitted_members(); } } } diff --git a/src/npctalk.cpp b/src/npctalk.cpp index ecbd8452ba7c0..3dc7feb3dc858 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -3034,12 +3034,14 @@ void json_talk_topic::load( JsonObject &jo ) } for( JsonObject response : jo.get_array( "responses" ) ) { responses.emplace_back( response ); + response.allow_omitted_members(); } if( jo.has_object( "repeat_responses" ) ) { repeat_responses.emplace_back( jo.get_object( "repeat_responses" ) ); } else if( jo.has_array( "repeat_responses" ) ) { for( JsonObject elem : jo.get_array( "repeat_responses" ) ) { repeat_responses.emplace_back( elem ); + elem.allow_omitted_members(); } } if( responses.empty() ) { From b2d6077bd86eb5cfba13d4bff651c40c6132f7d1 Mon Sep 17 00:00:00 2001 From: BevapDin Date: Fri, 6 Dec 2019 19:39:08 +0100 Subject: [PATCH 6/6] Fix variable name collision in *some* compilers. Yes, I'm looking at you GCC 5.3.1. --- src/mutation_data.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index 2f9a34ec84535..6d81e4fad3dd5 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -403,24 +403,24 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) lumination.emplace( bp, ja.next_float() ); } - for( JsonObject jo : jo.get_array( "wet_protection" ) ) { - std::string part_id = jo.get_string( "part" ); - int ignored = jo.get_int( "ignored", 0 ); - int neutral = jo.get_int( "neutral", 0 ); - int good = jo.get_int( "good", 0 ); + for( JsonObject wp : jo.get_array( "wet_protection" ) ) { + std::string part_id = wp.get_string( "part" ); + int ignored = wp.get_int( "ignored", 0 ); + int neutral = wp.get_int( "neutral", 0 ); + int good = wp.get_int( "good", 0 ); tripoint protect = tripoint( ignored, neutral, good ); protection[get_body_part_token( part_id )] = protect; } - for( JsonArray jo : jo.get_array( "encumbrance_always" ) ) { - std::string part_id = jo.next_string(); - int enc = jo.next_int(); + for( JsonArray ea : jo.get_array( "encumbrance_always" ) ) { + std::string part_id = ea.next_string(); + int enc = ea.next_int(); encumbrance_always[get_body_part_token( part_id )] = enc; } - for( JsonArray jo : jo.get_array( "encumbrance_covered" ) ) { - std::string part_id = jo.next_string(); - int enc = jo.next_int(); + for( JsonArray ec : jo.get_array( "encumbrance_covered" ) ) { + std::string part_id = ec.next_string(); + int enc = ec.next_int(); encumbrance_covered[get_body_part_token( part_id )] = enc; } @@ -428,8 +428,8 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) restricts_gear.insert( get_body_part_token( line ) ); } - for( JsonObject jo : jo.get_array( "armor" ) ) { - auto parts = jo.get_tags( "parts" ); + for( JsonObject ao : jo.get_array( "armor" ) ) { + auto parts = ao.get_tags( "parts" ); std::set bps; for( const std::string &part_string : parts ) { if( part_string == "ALL" ) { @@ -440,7 +440,7 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) } } - resistances res = load_resistances_instance( jo ); + resistances res = load_resistances_instance( ao ); for( body_part bp : bps ) { armor[ bp ] = res; @@ -448,8 +448,8 @@ void mutation_branch::load( JsonObject &jo, const std::string & ) } if( jo.has_array( "attacks" ) ) { - for( JsonObject jo : jo.get_array( "attacks" ) ) { - attacks_granted.emplace_back( load_mutation_attack( jo ) ); + for( JsonObject ao : jo.get_array( "attacks" ) ) { + attacks_granted.emplace_back( load_mutation_attack( ao ) ); } } else if( jo.has_object( "attacks" ) ) { JsonObject attack = jo.get_object( "attacks" );