| Index: base/memory/aligned_memory.h
|
| diff --git a/base/memory/aligned_memory.h b/base/memory/aligned_memory.h
|
| index 0a176347a6dd47768c20c9585870fcd9cef417f1..6719599dc54f284a4fe3eee2b8bf2abac7bc8f7e 100644
|
| --- a/base/memory/aligned_memory.h
|
| +++ b/base/memory/aligned_memory.h
|
| @@ -18,13 +18,31 @@
|
| //
|
| // // ... later, to destruct my_class:
|
| // my_class.data_as<MyClass>()->MyClass::~MyClass();
|
| +//
|
| +// Alternatively, a runtime sized aligned allocation can be created:
|
| +//
|
| +// float* my_array = static_cast<float*>(AlignedAlloc(size, alignment));
|
| +//
|
| +// // ... later, to release the memory:
|
| +// AlignedFree(my_array);
|
| +//
|
| +// Or using scoped_ptr_malloc:
|
| +//
|
| +// scoped_ptr_malloc<float, ScopedPtrAlignedFree> my_array(
|
| +// static_cast<float*>(AlignedAlloc(size, alignment)));
|
|
|
| #ifndef BASE_MEMORY_ALIGNED_MEMORY_H_
|
| #define BASE_MEMORY_ALIGNED_MEMORY_H_
|
|
|
| +#include "base/base_export.h"
|
| #include "base/basictypes.h"
|
| #include "base/compiler_specific.h"
|
| -#include "base/logging.h"
|
| +
|
| +#if defined(COMPILER_MSVC)
|
| +#include <malloc.h>
|
| +#else
|
| +#include <stdlib.h>
|
| +#endif
|
|
|
| namespace base {
|
|
|
| @@ -38,15 +56,15 @@ struct AlignedMemory {};
|
| class AlignedMemory<Size, byte_alignment> { \
|
| public: \
|
| ALIGNAS(byte_alignment) uint8 data_[Size]; \
|
| - void* void_data() { return reinterpret_cast<void*>(data_); } \
|
| + void* void_data() { return static_cast<void*>(data_); } \
|
| const void* void_data() const { \
|
| - return reinterpret_cast<const void*>(data_); \
|
| + return static_cast<const void*>(data_); \
|
| } \
|
| template<typename Type> \
|
| - Type* data_as() { return reinterpret_cast<Type*>(void_data()); } \
|
| + Type* data_as() { return static_cast<Type*>(void_data()); } \
|
| template<typename Type> \
|
| const Type* data_as() const { \
|
| - return reinterpret_cast<const Type*>(void_data()); \
|
| + return static_cast<const Type*>(void_data()); \
|
| } \
|
| private: \
|
| void* operator new(size_t); \
|
| @@ -71,6 +89,26 @@ BASE_DECL_ALIGNED_MEMORY(1024);
|
| BASE_DECL_ALIGNED_MEMORY(2048);
|
| BASE_DECL_ALIGNED_MEMORY(4096);
|
|
|
| -} // base
|
| +#undef BASE_DECL_ALIGNED_MEMORY
|
| +
|
| +BASE_EXPORT void* AlignedAlloc(size_t size, size_t alignment);
|
| +
|
| +inline void AlignedFree(void* ptr) {
|
| +#if defined(COMPILER_MSVC)
|
| + _aligned_free(ptr);
|
| +#else
|
| + free(ptr);
|
| +#endif
|
| +}
|
| +
|
| +// Helper class for use with scoped_ptr_malloc.
|
| +class BASE_EXPORT ScopedPtrAlignedFree {
|
| + public:
|
| + inline void operator()(void* ptr) const {
|
| + AlignedFree(ptr);
|
| + }
|
| +};
|
| +
|
| +} // namespace base
|
|
|
| #endif // BASE_MEMORY_ALIGNED_MEMORY_H_
|
|
|