Forráskód Böngészése

修复代码生成的 bug

akemimadoka 7 éve
szülő
commit
7bff68d3f8
4 módosított fájl, 57 hozzáadás és 29 törlés
  1. 17 0
      YumeBot/Jce.cpp
  2. 22 10
      YumeBot/Jce.h
  3. 15 19
      YumeBot/TlvCodeDef.h
  4. 3 0
      YumeBot/Utility.h

+ 17 - 0
YumeBot/Jce.cpp

@@ -25,3 +25,20 @@ JceOutputStream::JceOutputStream(natRefPointer<natBinaryWriter> writer)
 JceOutputStream::~JceOutputStream()
 {
 }
+
+#define TLV_CODE(name, code, ...) \
+	name::~name()\
+	{\
+	}\
+	\
+	std::string_view name::GetJceStructName() const noexcept\
+	{\
+		return #name;\
+	}\
+	\
+	TypeEnum name::GetJceStructType() const noexcept\
+	{\
+		return TypeEnum::name;\
+	}
+
+#include "TlvCodeDef.h"

+ 22 - 10
YumeBot/Jce.h

@@ -5,7 +5,9 @@
 
 namespace YumeBot::Jce
 {
-	DeclareException(InvalidData, NatsuLib::natException, u8"Invalid data");
+	DeclareException(JceException, NatsuLib::natException, u8"YumeBot::Jce::JceException");
+	DeclareException(JceDecodeException, JceException, u8"YumeBot::Jce::JceDecodeException");
+	DeclareException(JceEncodeException, JceException, u8"YumeBot::Jce::JceEncodeException");
 
 	class JceStruct
 		: public NatsuLib::natRefObj
@@ -38,8 +40,8 @@ namespace YumeBot::Jce
 
 		~JceStruct();
 
-	private:
-
+		virtual std::string_view GetJceStructName() const noexcept = 0;
+		virtual TypeEnum GetJceStructType() const noexcept = 0;
 	};
 
 	template <typename T>
@@ -82,7 +84,7 @@ namespace YumeBot::Jce
 #define FIELD_TYPE_BUILDER_OP(name, code, type) \
 	template <typename... Attributes>\
 	struct FieldTypeBuilder<JceStruct::TypeEnum::name, std::tuple<Attributes...>>\
-		: Utility::ResultType<decltype(Utility::RecursiveApply<type, Attributes...>())>\
+		: decltype(Utility::RecursiveApply<type, Attributes...>())\
 	{\
 	};
 
@@ -159,7 +161,7 @@ namespace YumeBot::Jce
 				const auto head = self.ReadHead();
 				if (static_cast<JceStruct::TypeEnum>(head.Type) != Type)
 				{
-					nat_Throw(InvalidData);
+					nat_Throw(JceDecodeException, u8"Type mismatch.");
 				}
 
 				self.m_Reader->ReadPod(value);
@@ -218,9 +220,9 @@ namespace YumeBot::Jce
 
 #define TEMPLATE_ARGUMENT(...) TemplateArgs<__VA_ARGS__>
 
-#define FIELD(name, tag, type, attribute) \
+#define FIELD(name, tag, type, ...) \
 	public:\
-		typename FieldTypeBuilder<JceStruct::TypeEnum::type, std::tuple<attribute>>::Type::Type m_##name;\
+		typename FieldTypeBuilder<JceStruct::TypeEnum::type, std::tuple<__VA_ARGS__>>::Type m_##name;\
 		\
 	public:\
 		const auto& Get##name() const noexcept\
@@ -248,6 +250,12 @@ namespace YumeBot::Jce
 	class name\
 		: public NatsuLib::natRefObjImpl<name, JceStruct>\
 	{\
+	public:\
+		~name();\
+		\
+		std::string_view GetJceStructName() const noexcept override;\
+		TypeEnum GetJceStructType() const noexcept override;\
+		\
 		__VA_ARGS__\
 	};
 
@@ -257,8 +265,12 @@ namespace YumeBot::Jce
 
 #define IS_OPTIONAL(defaultValue) defaultValue
 
-#define FIELD(name, tag, type, attribute) stream.Read<JceStruct::TypeEnum::type>(tag, ret->Get##name(),\
-	Utility::ReturnFirst<Utility::ConcatTrait<Utility::BindTrait<std::is_same, std::nullptr_t>::template Result, std::negation>::template Result, std::nullptr_t>(attribute));
+#define FIELD(name, tag, type, ...) \
+	{\
+		using FieldType = Utility::RemoveCvRef<decltype(ret->Get##name())>;\
+		stream.Read<JceStruct::TypeEnum::type>(tag, ret->Get##name(),\
+			Utility::ReturnFirst<Utility::ConcatTrait<Utility::BindTrait<std::is_same, std::nullptr_t>::template Result, std::negation>::template Result, std::nullptr_t>(__VA_ARGS__));\
+	}
 
 #define TLV_CODE(name, code, ...) \
 	template <>\
@@ -274,7 +286,7 @@ namespace YumeBot::Jce
 
 #include "TlvCodeDef.h"
 
-#define FIELD(name, tag, type, attribute) stream->Write<JceStruct::TypeEnum::type>(tag, value->Get##name());
+#define FIELD(name, tag, type, ...) stream->Write<JceStruct::TypeEnum::type>(tag, value->Get##name());
 
 #define TLV_CODE(name, code, ...) \
 	template <>\

+ 15 - 19
YumeBot/TlvCodeDef.h

@@ -2,10 +2,6 @@
 #define TLV_CODE(name, code, ...)
 #endif
 
-#ifndef ATTRIBUTE_SET
-#define ATTRIBUTE_SET(...) __VA_ARGS__
-#endif
-
 #ifndef NO_OP
 #define NO_OP
 #endif
@@ -19,62 +15,62 @@
 #endif
 
 #ifndef FIELD
-#define FIELD(name, tag, type, attribute)
+#define FIELD(name, tag, type, ...)
 #endif
 
 #ifndef BYTE
-#define BYTE(name, tag, attribute) FIELD(name, tag, Byte, attribute)
+#define BYTE(name, tag, ...) FIELD(name, tag, Byte, __VA_ARGS__)
 #endif
 
 #ifndef SHORT
-#define SHORT(name, tag, attribute) FIELD(name, tag, Short, attribute)
+#define SHORT(name, tag, ...) FIELD(name, tag, Short, __VA_ARGS__)
 #endif
 
 #ifndef INT
-#define INT(name, tag, attribute) FIELD(name, tag, Int, attribute)
+#define INT(name, tag, ...) FIELD(name, tag, Int, __VA_ARGS__)
 #endif
 
 #ifndef LONG
-#define LONG(name, tag, attribute) FIELD(name, tag, Long, attribute)
+#define LONG(name, tag, ...) FIELD(name, tag, Long, __VA_ARGS__)
 #endif
 
 #ifndef FLOAT
-#define FLOAT(name, tag, attribute) FIELD(name, tag, Float, attribute)
+#define FLOAT(name, tag, ...) FIELD(name, tag, Float, __VA_ARGS__)
 #endif
 
 #ifndef DOUBLE
-#define DOUBLE(name, tag, attribute) FIELD(name, tag, Double, attribute)
+#define DOUBLE(name, tag, ...) FIELD(name, tag, Double, __VA_ARGS__)
 #endif
 
 #ifndef STRING1
-#define STRING1(name, tag, attribute) FIELD(name, tag, String1, attribute)
+#define STRING1(name, tag, ...) FIELD(name, tag, String1, __VA_ARGS__)
 #endif
 
 #ifndef STRING4
-#define STRING4(name, tag, attribute) FIELD(name, tag, String4, attribute)
+#define STRING4(name, tag, ...) FIELD(name, tag, String4, __VA_ARGS__)
 #endif
 
 #ifndef MAP
-#define MAP(name, tag, attribute) FIELD(name, tag, Map, attribute)
+#define MAP(name, tag, ...) FIELD(name, tag, Map, __VA_ARGS__)
 #endif
 
 #ifndef LIST
-#define LIST(name, tag, attribute) FIELD(name, tag, List, attribute)
+#define LIST(name, tag, ...) FIELD(name, tag, List, __VA_ARGS__)
 #endif
 
 #ifndef STRUCT
-#define STRUCT(name, tag, attribute) FIELD(name, tag, StructBegin, attribute)
+#define STRUCT(name, tag, ...) FIELD(name, tag, StructBegin, __VA_ARGS__)
 #endif
 
 #ifndef ZERO_TAG
-#define ZERO_TAG(name, tag, attribute) FIELD(name, tag, ZeroTag, attribute)
+#define ZERO_TAG(name, tag, ...) FIELD(name, tag, ZeroTag, __VA_ARGS__)
 #endif
 
 #ifndef SIMPLE_LIST
-#define SIMPLE_LIST(name, tag, attribute) FIELD(name, tag, SimpleList, attribute)
+#define SIMPLE_LIST(name, tag, ...) FIELD(name, tag, SimpleList, __VA_ARGS__)
 #endif
 
-TLV_CODE(TlvTest, 0, INT(TestInt, 0, ATTRIBUTE_SET()), FLOAT(TestFloat, 1, ATTRIBUTE_SET(IS_OPTIONAL(1.0f))))
+TLV_CODE(TlvTest, 0, INT(TestInt, 0), FLOAT(TestFloat, 1, IS_OPTIONAL(1.0f)), MAP(TestMap, 2, TEMPLATE_ARGUMENT(int, float)))
 
 #undef SIMPLE_LIST
 #undef ZERO_TAG

+ 3 - 0
YumeBot/Utility.h

@@ -154,4 +154,7 @@ namespace YumeBot::Utility
 		template <typename... Args>
 		using Result = Template2<Template1<Args...>>;
 	};
+
+	template <typename T>
+	using RemoveCvRef = std::remove_cv_t<std::remove_reference_t<T>>;
 }