OSDN Git Service

Merge pull request #3987 from Hourier/Add-TerrainType-ReverseBegin-ReverseEnd
authorHourier <66951241+Hourier@users.noreply.github.com>
Thu, 2 May 2024 13:02:11 +0000 (22:02 +0900)
committerGitHub <noreply@github.com>
Thu, 2 May 2024 13:02:11 +0000 (22:02 +0900)
TerrainList にrbegin()/rend() を実装した

src/info-reader/feature-reader.cpp
src/system/terrain-type-definition.cpp
src/system/terrain-type-definition.h

index 928b9fe..2148ce1 100644 (file)
@@ -88,7 +88,6 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
         auto &terrain = terrains[s];
         terrain.idx = s;
         terrain.tag = tokens[2];
-
         terrain.mimic = s;
         terrain.destroyed = s;
         for (auto j = 0; j < MAX_FEAT_STATES; j++) {
@@ -103,12 +102,12 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
     }
 
     // J:name_ja, E:name_en
-    auto &terrain = *(terrains.end() - 1);
     if (tokens[0] == _("J", "E")) {
         if (tokens.size() < 2 || tokens[1].size() == 0) {
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
         }
 
+        auto &terrain = *terrains.rbegin();
         terrain.name = tokens[1];
         return PARSE_ERROR_NONE;
     }
@@ -124,6 +123,7 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
         }
 
+        auto &terrain = *terrains.rbegin();
         terrain.mimic_tag = tokens[1];
         return PARSE_ERROR_NONE;
     }
@@ -155,6 +155,7 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
             return PARSE_ERROR_GENERIC;
         }
 
+        auto &terrain = *terrains.rbegin();
         terrain.d_char[F_LIT_STANDARD] = s_char;
         terrain.d_attr[F_LIT_STANDARD] = s_attr;
         if (tokens.size() == n) {
@@ -214,6 +215,7 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
             }
 
             const auto &f_tokens = str_split(f, '_', false, 2);
+            auto &terrain = *terrains.rbegin();
             if (f_tokens.size() == 2) {
                 if (f_tokens[0] == "SUBTYPE") {
                     info_set_value(terrain.subtype, f_tokens[1]);
@@ -240,6 +242,7 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
         }
 
+        auto &terrain = *terrains.rbegin();
         info_set_value(terrain.priority, tokens[1]);
         return PARSE_ERROR_NONE;
     }
@@ -254,6 +257,7 @@ errr parse_terrains_info(std::string_view buf, angband_header *)
             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
         }
 
+        auto &terrain = *terrains.rbegin();
         auto i = 0;
         for (; i < MAX_FEAT_STATES; i++) {
             if (terrain.state[i].action == TerrainCharacteristics::MAX) {
index 51e1dfb..7901093 100644 (file)
@@ -38,21 +38,41 @@ std::vector<TerrainType>::iterator TerrainList::begin()
     return this->terrains.begin();
 }
 
-const std::vector<TerrainType>::const_iterator TerrainList::begin() const
+std::vector<TerrainType>::const_iterator TerrainList::begin() const
 {
     return this->terrains.begin();
 }
 
+std::vector<TerrainType>::reverse_iterator TerrainList::rbegin()
+{
+    return this->terrains.rbegin();
+}
+
+std::vector<TerrainType>::const_reverse_iterator TerrainList::rbegin() const
+{
+    return this->terrains.rbegin();
+}
+
 std::vector<TerrainType>::iterator TerrainList::end()
 {
     return this->terrains.end();
 }
 
-const std::vector<TerrainType>::const_iterator TerrainList::end() const
+std::vector<TerrainType>::const_iterator TerrainList::end() const
 {
     return this->terrains.end();
 }
 
+std::vector<TerrainType>::reverse_iterator TerrainList::rend()
+{
+    return this->terrains.rend();
+}
+
+std::vector<TerrainType>::const_reverse_iterator TerrainList::rend() const
+{
+    return this->terrains.rend();
+}
+
 size_t TerrainList::size() const
 {
     return this->terrains.size();
index 4619c8e..d10586c 100644 (file)
@@ -59,9 +59,13 @@ public:
     static TerrainList &get_instance();
     std::vector<TerrainType> &get_raw_vector();
     std::vector<TerrainType>::iterator begin();
-    const std::vector<TerrainType>::const_iterator begin() const;
+    std::vector<TerrainType>::const_iterator begin() const;
+    std::vector<TerrainType>::reverse_iterator rbegin();
+    std::vector<TerrainType>::const_reverse_iterator rbegin() const;
     std::vector<TerrainType>::iterator end();
-    const std::vector<TerrainType>::const_iterator end() const;
+    std::vector<TerrainType>::const_iterator end() const;
+    std::vector<TerrainType>::reverse_iterator rend();
+    std::vector<TerrainType>::const_reverse_iterator rend() const;
     size_t size() const;
     bool empty() const;
     void resize(size_t new_size);