1 // Copyright 2016 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ 7 8 #include <vector> 9 10 #include "mojo/public/cpp/bindings/array_traits.h" 11 12 namespace mojo { 13 14 template <typename T> 15 struct ArrayTraits<std::vector<T>> { 16 using Element = T; 17 18 static bool IsNull(const std::vector<T>& input) { 19 // std::vector<> is always converted to non-null mojom array. 20 return false; 21 } 22 23 static void SetToNull(std::vector<T>* output) { 24 // std::vector<> doesn't support null state. Set it to empty instead. 25 output->clear(); 26 } 27 28 static size_t GetSize(const std::vector<T>& input) { return input.size(); } 29 30 static T* GetData(std::vector<T>& input) { return input.data(); } 31 32 static const T* GetData(const std::vector<T>& input) { return input.data(); } 33 34 static typename std::vector<T>::reference GetAt(std::vector<T>& input, 35 size_t index) { 36 return input[index]; 37 } 38 39 static typename std::vector<T>::const_reference GetAt( 40 const std::vector<T>& input, 41 size_t index) { 42 return input[index]; 43 } 44 45 static bool Resize(std::vector<T>& input, size_t size) { 46 if (input.size() != size) { 47 // This is a hack to make compilers for Mac and Android happy. They 48 // currently don't allow resizing types like 49 // std::vector<std::vector<MoveOnlyType>>. 50 // Because the deserialization code doesn't care about the original 51 // contents of |input|, we discard them directly. 52 std::vector<T> temp(size); 53 input.swap(temp); 54 } 55 56 return true; 57 } 58 }; 59 60 } // namespace mojo 61 62 #endif // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ 63