• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
7 
8 namespace mojo {
9 
10 // This must be specialized for any type |T| to be serialized/deserialized as
11 // a mojom array.
12 //
13 // Usually you would like to do a partial specialization for a container (e.g.
14 // vector) template. Imagine you want to specialize it for Container<>, you need
15 // to implement:
16 //
17 //   template <typename T>
18 //   struct ArrayTraits<Container<T>> {
19 //     using Element = T;
20 //     // These two statements are optional. Use them if you'd like to serialize
21 //     // a container that supports iterators but does not support O(1) random
22 //     // access and so GetAt(...) would be expensive.
23 //     // using Iterator = T::iterator;
24 //     // using ConstIterator = T::const_iterator;
25 //
26 //     // These two methods are optional. Please see comments in struct_traits.h
27 //     static bool IsNull(const Container<T>& input);
28 //     static void SetToNull(Container<T>* output);
29 //
30 //     static size_t GetSize(const Container<T>& input);
31 //
32 //     // These two methods are optional. They are used to access the
33 //     // underlying storage of the array to speed up copy of POD types.
34 //     static T* GetData(Container<T>& input);
35 //     static const T* GetData(const Container<T>& input);
36 //
37 //     // The following six methods are optional if the GetAt(...) methods are
38 //     // implemented. These methods specify how to read the elements of
39 //     // Container in some sequential order specified by the iterator.
40 //     //
41 //     // Acquires an iterator positioned at the first element in the container.
42 //     static ConstIterator GetBegin(const Container<T>& input);
43 //     static Iterator GetBegin(Container<T>& input);
44 //
45 //     // Advances |iterator| to the next position within the container.
46 //     static void AdvanceIterator(ConstIterator& iterator);
47 //     static void AdvanceIterator(Iterator& iterator);
48 //
49 //     // Returns a reference to the value at the current position of
50 //     // |iterator|.
51 //     static const T& GetValue(ConstIterator& iterator);
52 //     static T& GetValue(Iterator& iterator);
53 //
54 //     // These two methods are optional if the iterator methods are
55 //     // implemented.
56 //     static T& GetAt(Container<T>& input, size_t index);
57 //     static const T& GetAt(const Container<T>& input, size_t index);
58 //
59 //     // Returning false results in deserialization failure and causes the
60 //     // message pipe receiving it to be disconnected.
61 //     static bool Resize(Container<T>& input, size_t size);
62 //   };
63 //
64 template <typename T>
65 struct ArrayTraits;
66 
67 }  // namespace mojo
68 
69 #endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
70