浏览代码

Replaced vector of strings with simple bool for flag

Ivan Savenko 1 年之前
父节点
当前提交
d1c274f93f
共有 6 个文件被更改,包括 45 次插入23 次删除
  1. 10 0
      lib/json/JsonNode.cpp
  2. 15 4
      lib/json/JsonNode.h
  3. 16 12
      lib/json/JsonParser.cpp
  4. 1 1
      lib/json/JsonUtils.cpp
  5. 0 4
      lib/json/JsonWriter.cpp
  6. 3 2
      lib/serializer/ESerializationVersion.h

+ 10 - 0
lib/json/JsonNode.cpp

@@ -129,6 +129,16 @@ const std::string & JsonNode::getModScope() const
 	return modScope;
 }
 
+void JsonNode::setOverrideFlag(bool value)
+{
+	overrideFlag = value;
+}
+
+bool JsonNode::getOverrideFlag() const
+{
+	return overrideFlag;
+}
+
 void JsonNode::setModScope(const std::string & metadata, bool recursive)
 {
 	modScope = metadata;

+ 15 - 4
lib/json/JsonNode.h

@@ -43,10 +43,9 @@ private:
 
 	/// Mod-origin of this particular field
 	std::string modScope;
-public:
-	/// meta-flags like override
-	std::vector<std::string> flags;
 
+	bool overrideFlag = false;
+public:
 	JsonNode() = default;
 
 	/// Create single node with specified value
@@ -71,6 +70,9 @@ public:
 	const std::string & getModScope() const;
 	void setModScope(const std::string & metadata, bool recursive = true);
 
+	void setOverrideFlag(bool value);
+	bool getOverrideFlag() const;
+
 	/// Convert node to another type. Converting to nullptr will clear all data
 	void setType(JsonType Type);
 	JsonType getType() const;
@@ -132,7 +134,16 @@ public:
 	template <typename Handler> void serialize(Handler &h)
 	{
 		h & modScope;
-		h & flags;
+
+		if (h.version >= Handler::Version::JSON_FLAGS)
+		{
+			h & overrideFlag;
+		}
+		else
+		{
+			std::vector<std::string> oldFlags;
+			h & oldFlags;
+		}
 		h & data;
 	}
 };

+ 16 - 12
lib/json/JsonParser.cpp

@@ -255,20 +255,26 @@ bool JsonParser::extractStruct(JsonNode &node)
 		if (!extractWhitespace())
 			return false;
 
+		bool overrideFlag = false;
 		std::string key;
 		if (!extractString(key))
 			return false;
 
-		// split key string into actual key and meta-flags
-		std::vector<std::string> keyAndFlags;
-		boost::split(keyAndFlags, key, boost::is_any_of("#"));
-		key = keyAndFlags[0];
-		// check for unknown flags - helps with debugging
-		std::vector<std::string> knownFlags = { "override" };
-		for(int i = 1; i < keyAndFlags.size(); i++)
+		if (key.find('#') != std::string::npos)
 		{
-			if(!vstd::contains(knownFlags, keyAndFlags[i]))
-				error("Encountered unknown flag #" + keyAndFlags[i], true);
+			// split key string into actual key and meta-flags
+			std::vector<std::string> keyAndFlags;
+			boost::split(keyAndFlags, key, boost::is_any_of("#"));
+
+			key = keyAndFlags[0];
+
+			for(int i = 1; i < keyAndFlags.size(); i++)
+			{
+				if (keyAndFlags[i] == "override")
+					overrideFlag = true;
+				else
+					error("Encountered unknown flag #" + keyAndFlags[i], true);
+			}
 		}
 
 		if (node.Struct().find(key) != node.Struct().end())
@@ -280,9 +286,7 @@ bool JsonParser::extractStruct(JsonNode &node)
 		if (!extractElement(node.Struct()[key], '}'))
 			return false;
 
-		// flags from key string belong to referenced element
-		for(int i = 1; i < keyAndFlags.size(); i++)
-			node.Struct()[key].flags.push_back(keyAndFlags[i]);
+		node.Struct()[key].setOverrideFlag(overrideFlag);
 
 		if (input[pos] == '}')
 		{

+ 1 - 1
lib/json/JsonUtils.cpp

@@ -223,7 +223,7 @@ void JsonUtils::merge(JsonNode & dest, JsonNode & source, bool ignoreOverride, b
 		}
 		case JsonNode::JsonType::DATA_STRUCT:
 		{
-			if(!ignoreOverride && vstd::contains(source.flags, "override"))
+			if(!ignoreOverride && source.getOverrideFlag())
 			{
 				std::swap(dest, source);
 			}

+ 0 - 4
lib/json/JsonWriter.cpp

@@ -39,8 +39,6 @@ void JsonWriter::writeEntry(JsonMap::const_iterator entry)
 	{
 		if (!entry->second.getModScope().empty())
 			out << prefix << " // " << entry->second.getModScope() << "\n";
-		if(!entry->second.flags.empty())
-			out << prefix << " // flags: " << boost::algorithm::join(entry->second.flags, ", ") << "\n";
 		out << prefix;
 	}
 	writeString(entry->first);
@@ -54,8 +52,6 @@ void JsonWriter::writeEntry(JsonVector::const_iterator entry)
 	{
 		if (!entry->getModScope().empty())
 			out << prefix << " // " << entry->getModScope() << "\n";
-		if(!entry->flags.empty())
-			out << prefix << " // flags: " << boost::algorithm::join(entry->flags, ", ") << "\n";
 		out << prefix;
 	}
 	writeNode(*entry);

+ 3 - 2
lib/serializer/ESerializationVersion.h

@@ -35,7 +35,8 @@ enum class ESerializationVersion : int32_t
 	RELEASE_143, // 832 +text container in campaigns, +starting hero in RMG options
 	HAS_EXTRA_OPTIONS, // 833 +extra options struct as part of startinfo
 	DESTROYED_OBJECTS, // 834 +list of objects destroyed by player
-	CAMPAIGN_MAP_TRANSLATIONS,
+	CAMPAIGN_MAP_TRANSLATIONS, // 835 +campaigns include translations for its maps
+	JSON_FLAGS, // 836 json uses new format for flags
 
-	CURRENT = CAMPAIGN_MAP_TRANSLATIONS
+	CURRENT = JSON_FLAGS
 };