OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "mojo/public/cpp/bindings/array_traits.h" | 10 #include "mojo/public/cpp/bindings/array_traits.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 size_t index) { | 35 size_t index) { |
36 return input[index]; | 36 return input[index]; |
37 } | 37 } |
38 | 38 |
39 static typename std::vector<T>::const_reference GetAt( | 39 static typename std::vector<T>::const_reference GetAt( |
40 const std::vector<T>& input, | 40 const std::vector<T>& input, |
41 size_t index) { | 41 size_t index) { |
42 return input[index]; | 42 return input[index]; |
43 } | 43 } |
44 | 44 |
45 static bool Resize(std::vector<T>& input, size_t size) { | 45 static inline bool Resize(std::vector<T>& input, size_t size) { |
| 46 // Instead of calling std::vector<T>::resize() directly, this is a hack to |
| 47 // make compilers happy. Some compilers (e.g., Mac, Android, Linux MSan) |
| 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 contents |
| 51 // of |input|, we discard them directly. |
| 52 // |
| 53 // The "inline" keyword of this method matters. Without it, we have observed |
| 54 // significant perf regression with some tests on Mac. crbug.com/631415 |
46 if (input.size() != size) { | 55 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); | 56 std::vector<T> temp(size); |
53 input.swap(temp); | 57 input.swap(temp); |
54 } | 58 } |
55 | 59 |
56 return true; | 60 return true; |
57 } | 61 } |
58 }; | 62 }; |
59 | 63 |
60 // This ArrayTraits specialization is used only for serialization. | 64 // This ArrayTraits specialization is used only for serialization. |
61 template <typename T> | 65 template <typename T> |
(...skipping 15 matching lines...) Expand all Loading... |
77 ++iterator; | 81 ++iterator; |
78 } | 82 } |
79 static const T& GetValue(ConstIterator& iterator) { | 83 static const T& GetValue(ConstIterator& iterator) { |
80 return *iterator; | 84 return *iterator; |
81 } | 85 } |
82 }; | 86 }; |
83 | 87 |
84 } // namespace mojo | 88 } // namespace mojo |
85 | 89 |
86 #endif // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ | 90 #endif // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_ |
OLD | NEW |