| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 #include "wtf/Compiler.h" | 24 #include "wtf/Compiler.h" |
| 25 #include <algorithm> | 25 #include <algorithm> |
| 26 #include <stdint.h> | 26 #include <stdint.h> |
| 27 #include <utility> | 27 #include <utility> |
| 28 | 28 |
| 29 namespace WTF { | 29 namespace WTF { |
| 30 | 30 |
| 31 #if COMPILER(GCC) | 31 #if COMPILER(GCC) |
| 32 #define WTF_ALIGN_OF(type) __alignof__(type) | 32 #define WTF_ALIGN_OF(type) __alignof__(type) |
| 33 #define WTF_ALIGNED(variable_type, variable, n) variable_type variable __attribu
te__((__aligned__(n))) | 33 #define WTF_ALIGNED(variable_type, variable, n) \ |
| 34 variable_type variable __attribute__((__aligned__(n))) |
| 34 #elif COMPILER(MSVC) | 35 #elif COMPILER(MSVC) |
| 35 #define WTF_ALIGN_OF(type) __alignof(type) | 36 #define WTF_ALIGN_OF(type) __alignof(type) |
| 36 #define WTF_ALIGNED(variable_type, variable, n) __declspec(align(n)) variable_ty
pe variable | 37 #define WTF_ALIGNED(variable_type, variable, n) \ |
| 38 __declspec(align(n)) variable_type variable |
| 37 #else | 39 #else |
| 38 #error WTF_ALIGN macros need alignment control. | 40 #error WTF_ALIGN macros need alignment control. |
| 39 #endif | 41 #endif |
| 40 | 42 |
| 41 #if COMPILER(GCC) | 43 #if COMPILER(GCC) |
| 42 typedef char __attribute__((__may_alias__)) AlignedBufferChar; | 44 typedef char __attribute__((__may_alias__)) AlignedBufferChar; |
| 43 #else | 45 #else |
| 44 typedef char AlignedBufferChar; | 46 typedef char AlignedBufferChar; |
| 45 #endif | 47 #endif |
| 46 | 48 |
| 47 template <size_t size, size_t alignment> struct AlignedBuffer; | 49 template <size_t size, size_t alignment> |
| 48 template <size_t size> struct AlignedBuffer<size, 1> { AlignedBufferChar buffer[
size]; }; | 50 struct AlignedBuffer; |
| 49 template <size_t size> struct AlignedBuffer<size, 2> { WTF_ALIGNED(AlignedBuffer
Char, buffer[size], 2); }; | 51 template <size_t size> |
| 50 template <size_t size> struct AlignedBuffer<size, 4> { WTF_ALIGNED(AlignedBuffer
Char, buffer[size], 4); }; | 52 struct AlignedBuffer<size, 1> { |
| 51 template <size_t size> struct AlignedBuffer<size, 8> { WTF_ALIGNED(AlignedBuffer
Char, buffer[size], 8); }; | 53 AlignedBufferChar buffer[size]; |
| 52 template <size_t size> struct AlignedBuffer<size, 16> { WTF_ALIGNED(AlignedBuffe
rChar, buffer[size], 16); }; | 54 }; |
| 53 template <size_t size> struct AlignedBuffer<size, 32> { WTF_ALIGNED(AlignedBuffe
rChar, buffer[size], 32); }; | 55 template <size_t size> |
| 54 template <size_t size> struct AlignedBuffer<size, 64> { WTF_ALIGNED(AlignedBuffe
rChar, buffer[size], 64); }; | 56 struct AlignedBuffer<size, 2> { |
| 57 WTF_ALIGNED(AlignedBufferChar, buffer[size], 2); |
| 58 }; |
| 59 template <size_t size> |
| 60 struct AlignedBuffer<size, 4> { |
| 61 WTF_ALIGNED(AlignedBufferChar, buffer[size], 4); |
| 62 }; |
| 63 template <size_t size> |
| 64 struct AlignedBuffer<size, 8> { |
| 65 WTF_ALIGNED(AlignedBufferChar, buffer[size], 8); |
| 66 }; |
| 67 template <size_t size> |
| 68 struct AlignedBuffer<size, 16> { |
| 69 WTF_ALIGNED(AlignedBufferChar, buffer[size], 16); |
| 70 }; |
| 71 template <size_t size> |
| 72 struct AlignedBuffer<size, 32> { |
| 73 WTF_ALIGNED(AlignedBufferChar, buffer[size], 32); |
| 74 }; |
| 75 template <size_t size> |
| 76 struct AlignedBuffer<size, 64> { |
| 77 WTF_ALIGNED(AlignedBufferChar, buffer[size], 64); |
| 78 }; |
| 55 | 79 |
| 56 template <size_t size, size_t alignment> | 80 template <size_t size, size_t alignment> |
| 57 void swap(AlignedBuffer<size, alignment>& a, AlignedBuffer<size, alignment>& b) | 81 void swap(AlignedBuffer<size, alignment>& a, |
| 58 { | 82 AlignedBuffer<size, alignment>& b) { |
| 59 for (size_t i = 0; i < size; ++i) | 83 for (size_t i = 0; i < size; ++i) |
| 60 std::swap(a.buffer[i], b.buffer[i]); | 84 std::swap(a.buffer[i], b.buffer[i]); |
| 61 } | 85 } |
| 62 | 86 |
| 63 template <uintptr_t mask> | 87 template <uintptr_t mask> |
| 64 inline bool isAlignedTo(const void* pointer) | 88 inline bool isAlignedTo(const void* pointer) { |
| 65 { | 89 return !(reinterpret_cast<uintptr_t>(pointer) & mask); |
| 66 return !(reinterpret_cast<uintptr_t>(pointer) & mask); | |
| 67 } | 90 } |
| 68 | 91 |
| 69 } // namespace WTF | 92 } // namespace WTF |
| 70 | 93 |
| 71 #endif // WTF_Alignment_h | 94 #endif // WTF_Alignment_h |
| OLD | NEW |