]> granicus.if.org Git - taglib/commitdiff
Fixed detection of alignment-tolerant CPUs
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 27 Apr 2013 17:57:51 +0000 (02:57 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 27 Apr 2013 17:57:51 +0000 (02:57 +0900)
taglib/toolkit/tstring.cpp

index eeba15af41bbecee58d3b9796dd9ceddef297917..392f32ed711e1ff4724d58f1ebd03f34c4fcfd0a 100644 (file)
 #include <iostream>
 #include <string.h>
 
+// x86 CPUs are alignment-tolerant or allow pointer casts from smaller types to larger types.
+#if defined(__i386__) || defined(_M_IX86) || defined(__amd64) || defined(__amd64__) \
+  || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) 
+# define TAGLIB_ALIGNMENT_TOLERANT 1
+#endif
+
 #ifdef HAVE_STD_CODECVT
 # include <codecvt>
 #else
@@ -805,16 +811,12 @@ void String::copyFromUTF16(const wchar_t *s, size_t length, Type t)
 
 void String::copyFromUTF16(const char *s, size_t length, Type t)
 {
-#if !defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
-
-  // It's certain that sizeof(wchar_t) == 2 and alignment-tolerant.
+#if SIZEOF_WCHAR_T == 2 && defined(TAGLIB_ALIGNMENT_TOLERANT)
 
   copyFromUTF16(reinterpret_cast<const wchar_t*>(s), length / 2, t);
 
 #else
 
-  // Maybe sizeof(wchar_t) != 2 or alignment-strict.
-
   bool swap;
   if(t == UTF16) {
     if(length < 2) {