Chromium Code Reviews| Index: mojo/public/cpp/bindings/lib/array_internal.h |
| diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h |
| index 865bf1cc8647e82a949ade03dac505887266c184..963b9d3de4cb1cbe13c9567a2d5e4d663887bcb9 100644 |
| --- a/mojo/public/cpp/bindings/lib/array_internal.h |
| +++ b/mojo/public/cpp/bindings/lib/array_internal.h |
| @@ -6,6 +6,7 @@ |
| #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_ |
| #include <new> |
| +#include <vector> |
| #include "mojo/public/cpp/bindings/buffer.h" |
| #include "mojo/public/cpp/bindings/lib/bindings_internal.h" |
| @@ -337,72 +338,46 @@ MOJO_COMPILE_ASSERT(sizeof(Array_Data<char>) == 8, bad_sizeof_Array_Data); |
| // UTF-8 encoded |
| typedef Array_Data<char> String_Data; |
| -template <typename T, bool kIsObject, bool kIsHandle> struct ArrayTraits {}; |
| +// ---- |
| -// When T is an object type: |
| -template <typename T> struct ArrayTraits<T, true, false> { |
| - typedef Array_Data<typename T::Data*> DataType; |
| - typedef const T& ConstRef; |
| - typedef T& Ref; |
| - static Buffer::Destructor GetDestructor() { |
| - return NULL; |
| - } |
| - static typename T::Data* ToArrayElement(const T& value) { |
| - return Unwrap(value); |
| - } |
| - // Something sketchy is indeed happening here... |
| - static Ref ToRef(typename T::Data*& data) { |
| - return *reinterpret_cast<T*>(&data); |
| - } |
| - static ConstRef ToConstRef(typename T::Data* const& data) { |
| - return *reinterpret_cast<const T*>(&data); |
| - } |
| -}; |
| +template <typename T, bool kIsMoveOnlyType> struct ArrayTraits {}; |
| -// When T is a primitive (non-bool) type: |
| -template <typename T> struct ArrayTraits<T, false, false> { |
| - typedef Array_Data<T> DataType; |
| - typedef const T& ConstRef; |
| - typedef T& Ref; |
| - static Buffer::Destructor GetDestructor() { |
| - return NULL; |
| +template <typename T> struct ArrayTraits<T, false> { |
| + typedef T StorageType; |
| + typedef typename std::vector<T>::reference RefType; |
| + typedef typename std::vector<T>::const_reference ConstRefType; |
| + static inline void Initialize(std::vector<T>* vec) { |
| } |
| - static T ToArrayElement(const T& value) { |
| - return value; |
| + static inline void Finalize(std::vector<T>* vec) { |
| } |
| - static Ref ToRef(T& data) { return data; } |
| - static ConstRef ToConstRef(const T& data) { return data; } |
| -}; |
| - |
| -// When T is a bool type: |
| -template <> struct ArrayTraits<bool, false, false> { |
| - typedef Array_Data<bool> DataType; |
| - typedef bool ConstRef; |
| - typedef ArrayDataTraits<bool>::Ref Ref; |
| - static Buffer::Destructor GetDestructor() { |
| - return NULL; |
| + static inline ConstRefType at(const std::vector<T>* vec, size_t offset) { |
| + return vec->at(offset); |
| } |
| - static bool ToArrayElement(const bool& value) { |
| - return value; |
| + static inline RefType at(std::vector<T>* vec, size_t offset) { |
| + return vec->at(offset); |
| } |
| - static Ref ToRef(const Ref& data) { return data; } |
| - static ConstRef ToConstRef(ConstRef data) { return data; } |
| }; |
| -// When T is a handle type: |
| -template <typename H> struct ArrayTraits<H, false, true> { |
| - typedef Array_Data<H> DataType; |
| - typedef Passable<H> ConstRef; |
| - typedef AssignableAndPassable<H> Ref; |
| - static Buffer::Destructor GetDestructor() { |
| - return &DataType::Destructor; |
| - } |
| - static H ToArrayElement(const H& value) { |
| - return value; |
| - } |
| - static Ref ToRef(H& data) { return Ref(&data); } |
| - static ConstRef ToConstRef(const H& data) { |
| - return ConstRef(const_cast<H*>(&data)); |
| +template <typename T> struct ArrayTraits<T, true> { |
| + struct StorageType { |
| + char buf[sizeof(T) + (8 - (sizeof(T) % 8)) % 8]; // Make 8-byte aligned. |
|
yzshen1
2014/05/23 17:45:05
What I was trying to ask is that with |vec| of typ
|
| + }; |
| + typedef T& RefType; |
| + typedef const T& ConstRefType; |
| + static inline void Initialize(std::vector<StorageType>* vec) { |
| + for (size_t i = 0; i < vec->size(); ++i) |
| + new (vec->at(i).buf) T(); |
| + } |
| + static inline void Finalize(std::vector<StorageType>* vec) { |
| + for (size_t i = 0; i < vec->size(); ++i) |
| + reinterpret_cast<T*>(vec->at(i).buf)->~T(); |
| + } |
| + static inline ConstRefType at(const std::vector<StorageType>* vec, |
| + size_t offset) { |
| + return *reinterpret_cast<const T*>(vec->at(offset).buf); |
| + } |
| + static inline RefType at(std::vector<StorageType>* vec, size_t offset) { |
| + return *reinterpret_cast<T*>(vec->at(offset).buf); |
| } |
| }; |