1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2016 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h>
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <string>
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <vector>
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/strings/string_piece.h"
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/struct_traits.h"
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo {
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <>
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct StructTraits<test::NestedStructWithTraits,
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    test::NestedStructWithTraitsImpl> {
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void* SetUpContext(const test::NestedStructWithTraitsImpl& input);
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void TearDownContext(const test::NestedStructWithTraitsImpl& input,
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                              void* context);
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static int32_t value(const test::NestedStructWithTraitsImpl& input,
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                       void* context);
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Read(test::NestedStructWithTraits::DataView data,
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                   test::NestedStructWithTraitsImpl* output);
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <>
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl> {
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static test::EnumWithTraits ToMojom(test::EnumWithTraitsImpl input);
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool FromMojom(test::EnumWithTraits input,
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                        test::EnumWithTraitsImpl* output);
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <>
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct StructTraits<test::StructWithTraits, test::StructWithTraitsImpl> {
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Deserialization to test::StructTraitsImpl.
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Read(test::StructWithTraits::DataView data,
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                   test::StructWithTraitsImpl* out);
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Fields in test::StructWithTraits.
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static test::EnumWithTraitsImpl f_enum(
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      const test::StructWithTraitsImpl& value) {
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_enum();
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool f_bool(const test::StructWithTraitsImpl& value) {
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_bool();
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static uint32_t f_uint32(const test::StructWithTraitsImpl& value) {
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_uint32();
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static uint64_t f_uint64(const test::StructWithTraitsImpl& value) {
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_uint64();
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static base::StringPiece f_string(const test::StructWithTraitsImpl& value) {
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_string_as_string_piece();
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const std::string& f_string2(const test::StructWithTraitsImpl& value) {
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_string();
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const std::vector<std::string>& f_string_array(
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      const test::StructWithTraitsImpl& value) {
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_string_array();
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const test::NestedStructWithTraitsImpl& f_struct(
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      const test::StructWithTraitsImpl& value) {
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_struct();
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const std::vector<test::NestedStructWithTraitsImpl>& f_struct_array(
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      const test::StructWithTraitsImpl& value) {
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_struct_array();
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const std::map<std::string, test::NestedStructWithTraitsImpl>&
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  f_struct_map(const test::StructWithTraitsImpl& value) {
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return value.get_struct_map();
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <>
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct StructTraits<test::PassByValueStructWithTraits,
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    test::PassByValueStructWithTraitsImpl> {
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Deserialization to test::PassByValueStructTraitsImpl.
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Read(test::PassByValueStructWithTraits::DataView data,
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                   test::PassByValueStructWithTraitsImpl* out);
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Fields in test::PassByValueStructWithTraits.
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static ScopedHandle f_handle(test::PassByValueStructWithTraitsImpl& value) {
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return std::move(value.get_mutable_handle());
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <>
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct StructTraits<test::StructWithTraitsForUniquePtrTest,
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    std::unique_ptr<int>> {
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static int f_int32(const std::unique_ptr<int>& data) { return *data; }
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Read(test::StructWithTraitsForUniquePtrTest::DataView data,
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                   std::unique_ptr<int>* out) {
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    out->reset(new int(data.f_int32()));
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return true;
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace mojo
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
124