| 
									
										
										
										
											2023-02-08 22:57:31 +08:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | #include <VTAll.hpp>
 | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | #include "StringHelper.hpp"
 | 
					
						
							| 
									
										
										
										
											2023-02-09 14:12:02 +08:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2023-02-08 22:57:31 +08:00
										 |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Unvirt { | 
					
						
							|  |  |  | 	namespace AccessibleValue { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 		constexpr const char c_InvalidEnumName[] = "[undefined]"; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 		struct GeneralReflection { const char* mName; }; | 
					
						
							|  |  |  | 		template<typename _Ty> | 
					
						
							|  |  |  | 		using GeneralReflectionArray = std::vector<std::pair<_Ty, GeneralReflection>>; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 		template<typename _Ty> | 
					
						
							|  |  |  | 		std::string GetEnumName(_Ty val, const GeneralReflectionArray<_Ty>& desc) { | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 			std::string strl; | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 			for (auto& item : desc) { | 
					
						
							|  |  |  | 				if (item.first == val) { | 
					
						
							|  |  |  | 					strl = item.second.mName; | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 					return strl; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | 			StringHelper::StdstringPrintf(strl, "%s (0x%08" PRIXCKDWORD ")",  | 
					
						
							|  |  |  | 				c_InvalidEnumName,  | 
					
						
							|  |  |  | 				static_cast<LibCmo::CKDWORD>(val) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 			return strl; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 		template<typename _Ty> | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | 		std::string GetFlagEnumName(_Ty val, const GeneralReflectionArray<_Ty>& desc, const char* splitor) { | 
					
						
							|  |  |  | 			std::string strl, cache; | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 			for (auto& item : desc) { | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 				// if it have exacelt same entry, return directly
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 				if (item.first == val) { | 
					
						
							|  |  |  | 					strl = item.second.mName; | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 					return strl; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// check flag match
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 				if (LibCmo::EnumsHelper::Has(val, item.first)) { | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | 					if (strl.size() != 0u && splitor != nullptr) { | 
					
						
							|  |  |  | 						strl += splitor; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					StringHelper::StdstringPrintf(cache, "%s (0x%08" PRIXCKDWORD ")", | 
					
						
							|  |  |  | 						item.second.mName, | 
					
						
							|  |  |  | 						static_cast<LibCmo::CKDWORD>(item.first) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					strl += cache; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 			// if nothing was gotten. set to undefined
 | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 			if (strl.size() == 0u) { | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | 				StringHelper::StdstringPrintf(strl, "%s (0x%08" PRIXCKDWORD ")",  | 
					
						
							|  |  |  | 					c_InvalidEnumName,  | 
					
						
							|  |  |  | 					static_cast<LibCmo::CKDWORD>(val) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 			return strl; | 
					
						
							| 
									
										
										
										
											2023-02-09 17:16:58 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-03 16:05:32 +08:00
										 |  |  | 		std::string GetClassIdName(LibCmo::CK2::CK_CLASSID cls); | 
					
						
							|  |  |  | 		std::string GetCkErrorName(LibCmo::CK2::CKERROR err); | 
					
						
							|  |  |  | 		std::string GetClassIdHierarchy(LibCmo::CK2::CK_CLASSID cls); | 
					
						
							|  |  |  | 		std::string GetCkErrorDescription(LibCmo::CK2::CKERROR err); | 
					
						
							| 
									
										
										
										
											2023-02-09 14:12:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 		std::string GetReadableFileSize(uint64_t size); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		namespace EnumDesc { | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_FILE_WRITEMODE> CK_FILE_WRITEMODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_FO_OPTIONS> CK_FO_OPTIONS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_STATECHUNK_CHUNKOPTIONS> CK_STATECHUNK_CHUNKOPTIONS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_STATECHUNK_DATAVERSION> CK_STATECHUNK_DATAVERSION; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_STATECHUNK_CHUNKVERSION> CK_STATECHUNK_CHUNKVERSION; | 
					
						
							| 
									
										
										
										
											2023-09-22 16:40:10 +08:00
										 |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_OBJECT_FLAGS> CK_OBJECT_FLAGS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_3DENTITY_FLAGS> CK_3DENTITY_FLAGS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::CK2::CK_TEXTURE_SAVEOPTIONS> CK_TEXTURE_SAVEOPTIONS; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VX_PIXELFORMAT> VX_PIXELFORMAT; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXTEXTURE_BLENDMODE> VXTEXTURE_BLENDMODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXTEXTURE_FILTERMODE> VXTEXTURE_FILTERMODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXBLEND_MODE> VXBLEND_MODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXTEXTURE_ADDRESSMODE> VXTEXTURE_ADDRESSMODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXFILL_MODE> VXFILL_MODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXSHADE_MODE> VXSHADE_MODE; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXCMPFUNC> VXCMPFUNC; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VX_EFFECT> VX_EFFECT; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VX_MOVEABLE_FLAGS> VX_MOVEABLE_FLAGS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXMESH_FLAGS> VXMESH_FLAGS; | 
					
						
							|  |  |  | 			extern const GeneralReflectionArray<LibCmo::VxMath::VXTEXTURE_WRAPMODE> VXTEXTURE_WRAPMODE; | 
					
						
							| 
									
										
										
										
											2023-08-26 20:34:51 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-02-08 22:57:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |