diff --git a/CHANGELOG.md b/CHANGELOG.md index 27e70dd1..31162fc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ NEXT-RELEASE Release notes (YYYY-MM-DD) ### Fixed * Using the `==` operator in a type safe query for a nullable string property would return the incorrect result when algined storage was disabled. * Fix compilation issue when building with Bionic due to use of std::tuple (since 2.1.0). +* Archiving on Xcode would fail due to duplicated alias' when aligned storage was enabled. ### Enhancements * Add ability to use `managed>` in type safe queries when comparing a value for a key. e.g. diff --git a/src/cpprealm/internal/bridge/generator/bridge_type_info_generator.cpp.in b/src/cpprealm/internal/bridge/generator/bridge_type_info_generator.cpp.in index 11b0943e..ccabbea9 100644 --- a/src/cpprealm/internal/bridge/generator/bridge_type_info_generator.cpp.in +++ b/src/cpprealm/internal/bridge/generator/bridge_type_info_generator.cpp.in @@ -9,6 +9,8 @@ # define KEY '_','_','i','3','8','6' #elif defined(__x86_64) # define KEY '_','_','x','8','6','_','6','4' +#elif defined(__x86_64__) +# define KEY '_','_','x','8','6','_','6','4','_','_' #elif defined(__ppc__) # define KEY '_','_','p','p','c','_','_' #elif defined(__ppc64__) @@ -19,6 +21,20 @@ # define KEY '_','_','A','R','M','_','A','R','C','H','_','7','A','_','_' #elif defined(__ARM_ARCH_7S__) # define KEY '_','_','A','R','M','_','A','R','C','H','_','7','S','_','_' +#elif defined(_M_X64) +# define KEY '_','M','_','X','6','4' +#elif defined(__amd64__) +# define KEY '_','_','a','m','d','6','4','_','_' +#elif defined(_M_IX86) +# define KEY '_','M','_','I','X','8','6' +#elif defined(__i386__) +# define KEY '_','_','i','3','8','6','_','_' +#elif defined(_M_ARM) +# define KEY '_','M','_','A','R','M' +#elif defined(_M_ARM64) +# define KEY '_','M','_','A','R','M','6','4' +#elif defined(__arm__) +# define KEY '_','_','a','r','m','_','_' #endif int main() @@ -44,5 +60,8 @@ int main() @TYPE_INFO_QUERY_DECLS@ + static char arch_key[] = {'a','r','c','h','_','k','e','y','_',KEY, '\0'}; + required += arch_key[0]; + return required; } \ No newline at end of file diff --git a/src/cpprealm/internal/bridge/generator/bridge_type_info_parser.cmake b/src/cpprealm/internal/bridge/generator/bridge_type_info_parser.cmake index c5b843a2..70ee6574 100644 --- a/src/cpprealm/internal/bridge/generator/bridge_type_info_parser.cmake +++ b/src/cpprealm/internal/bridge/generator/bridge_type_info_parser.cmake @@ -1,14 +1,28 @@ -file(STRINGS ${BRIDGE_TYPE_INFO_BIN} compiled_string_literals REGEX "^REALM_TYPE_INFO") +file(STRINGS ${BRIDGE_TYPE_INFO_BIN} compiled_string_literals REGEX "^(REALM_TYPE_INFO|arch_key_)") + +set(regex_realm "REALM_TYPE_INFO:(.+)\\[0*(.*),0*(.*)\\]") +set(regex_arch "^arch_key_(.+)") -set(regex "REALM_TYPE_INFO:(.+)\\[0*(.*),0*(.*)\\]") set(BRIDGE_TYPE_DECLS "") +set(BRIDGE_TYPE_DECLS_TYPES "") +set(BRIDGE_TYPE_DECLS_REQUIRES_ELSE_IF OFF) foreach(i ${compiled_string_literals}) - if("${i}" MATCHES "${regex}") - set(BRIDGE_TYPE_DECLS "${BRIDGE_TYPE_DECLS} using ${CMAKE_MATCH_1} = std::aligned_storage<${CMAKE_MATCH_2}, ${CMAKE_MATCH_3}>::type;\n") + if("${i}" MATCHES "${regex_realm}") + set(BRIDGE_TYPE_DECLS_TYPES "${BRIDGE_TYPE_DECLS_TYPES} using ${CMAKE_MATCH_1} = std::aligned_storage<${CMAKE_MATCH_2}, ${CMAKE_MATCH_3}>::type;\n") + elseif("${i}" MATCHES "${regex_arch}") + if(BRIDGE_TYPE_DECLS_REQUIRES_ELSE_IF) + set(BRIDGE_TYPE_DECLS "${BRIDGE_TYPE_DECLS}#elif defined(${CMAKE_MATCH_1})\n${BRIDGE_TYPE_DECLS_TYPES}") + else() + set(BRIDGE_TYPE_DECLS "#if defined(${CMAKE_MATCH_1})\n${BRIDGE_TYPE_DECLS_TYPES}") + endif() + set(BRIDGE_TYPE_DECLS_REQUIRES_ELSE_IF ON) + set(BRIDGE_TYPE_DECLS_TYPES "") else() - message(FATAL_ERROR "Unrecognized type info string: " ${h}) + message(FATAL_ERROR "Unrecognized type info string: ${i}") endif() endforeach() +set(BRIDGE_TYPE_DECLS "${BRIDGE_TYPE_DECLS}#endif") + configure_file(${SOURCE_DIR}/bridge_types.hpp.in ${BINARY_DIR}/bridge_types.hpp)