Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1510)

Unified Diff: mojo/public/cpp/bindings/lib/array_internal.h

Issue 294833002: Mojo: more idiomatic C++ bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..679642627d8af3b16ec47e23b206ad775e4b1664 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,6 +338,64 @@ 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 kIsMoveOnlyType> struct ArrayTraits {};
+
+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 inline void Finalize(std::vector<T>* vec) {
+ }
+ static inline ConstRefType at(const std::vector<T>* vec, size_t offset) {
+ return vec->at(offset);
+ }
+ static inline RefType at(std::vector<T>* vec, size_t offset) {
+ return vec->at(offset);
+ }
+};
+
+template <typename T> struct ArrayTraits<T, true> {
+ struct StorageType {
+ char buf[sizeof(T)];
+ };
+ 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();
yzshen1 2014/05/22 17:13:53 Is there potential alignment issue here? One alte
+ }
+ 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);
+ }
+};
+
+#if 0
+template <typename E> struct ArrayTraits<Array<E>, true> {
+ typedef S* StorageType;
+ static const T& at(const std::vector<StorageType>& vec, size_t offset) const {
+ const S*& slot = vec.at(offset);
+ return *reinterpret_cast<const T*>(reinterpret_cast<const char**>(&slot);
+ }
+ static T& at(std::vector<StorageType>& vec, size_t offset) {
+ S*& slot = vec.at(offset);
+ return *reinterpret_cast<T*>(reinterpret_cast<char**>(&slot);
+ }
+};
+#endif
+
+#if 0
template <typename T, bool kIsObject, bool kIsHandle> struct ArrayTraits {};
// When T is an object type:
@@ -405,6 +464,7 @@ template <typename H> struct ArrayTraits<H, false, true> {
return ConstRef(const_cast<H*>(&data));
}
};
+#endif
} // namespace internal
} // namespace mojo

Powered by Google App Engine
This is Rietveld 408576698