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_TESTS_STRUCT_WITH_TRAITS_IMPL_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_ 7 8 #include <stdint.h> 9 10 #include <map> 11 #include <set> 12 #include <string> 13 #include <vector> 14 15 #include "base/strings/string_piece.h" 16 #include "mojo/public/cpp/system/handle.h" 17 18 namespace mojo { 19 namespace test { 20 21 struct NestedStructWithTraitsImpl { 22 public: 23 NestedStructWithTraitsImpl(); 24 explicit NestedStructWithTraitsImpl(int32_t in_value); 25 26 bool operator==(const NestedStructWithTraitsImpl& other) const { 27 return value == other.value; 28 } 29 30 int32_t value = 0; 31 }; 32 33 enum class EnumWithTraitsImpl { CUSTOM_VALUE_0 = 10, CUSTOM_VALUE_1 = 11 }; 34 35 // A type which knows how to look like a mojo::test::StructWithTraits mojom type 36 // by way of mojo::StructTraits. 37 class StructWithTraitsImpl { 38 public: 39 StructWithTraitsImpl(); 40 ~StructWithTraitsImpl(); 41 42 StructWithTraitsImpl(const StructWithTraitsImpl& other); 43 set_enum(EnumWithTraitsImpl value)44 void set_enum(EnumWithTraitsImpl value) { enum_ = value; } get_enum()45 EnumWithTraitsImpl get_enum() const { return enum_; } 46 set_bool(bool value)47 void set_bool(bool value) { bool_ = value; } get_bool()48 bool get_bool() const { return bool_; } 49 set_uint32(uint32_t value)50 void set_uint32(uint32_t value) { uint32_ = value; } get_uint32()51 uint32_t get_uint32() const { return uint32_; } 52 set_uint64(uint64_t value)53 void set_uint64(uint64_t value) { uint64_ = value; } get_uint64()54 uint64_t get_uint64() const { return uint64_; } 55 set_string(std::string value)56 void set_string(std::string value) { string_ = value; } get_string_as_string_piece()57 base::StringPiece get_string_as_string_piece() const { return string_; } get_string()58 const std::string& get_string() const { return string_; } 59 get_string_array()60 const std::vector<std::string>& get_string_array() const { 61 return string_array_; 62 } get_mutable_string_array()63 std::vector<std::string>& get_mutable_string_array() { return string_array_; } 64 get_string_set()65 const std::set<std::string>& get_string_set() const { 66 return string_set_; 67 } get_mutable_string_set()68 std::set<std::string>& get_mutable_string_set() { return string_set_; } 69 get_struct()70 const NestedStructWithTraitsImpl& get_struct() const { return struct_; } get_mutable_struct()71 NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; } 72 get_struct_array()73 const std::vector<NestedStructWithTraitsImpl>& get_struct_array() const { 74 return struct_array_; 75 } get_mutable_struct_array()76 std::vector<NestedStructWithTraitsImpl>& get_mutable_struct_array() { 77 return struct_array_; 78 } 79 get_struct_map()80 const std::map<std::string, NestedStructWithTraitsImpl>& get_struct_map() 81 const { 82 return struct_map_; 83 } get_mutable_struct_map()84 std::map<std::string, NestedStructWithTraitsImpl>& get_mutable_struct_map() { 85 return struct_map_; 86 } 87 88 private: 89 EnumWithTraitsImpl enum_ = EnumWithTraitsImpl::CUSTOM_VALUE_0; 90 bool bool_ = false; 91 uint32_t uint32_ = 0; 92 uint64_t uint64_ = 0; 93 std::string string_; 94 std::vector<std::string> string_array_; 95 std::set<std::string> string_set_; 96 NestedStructWithTraitsImpl struct_; 97 std::vector<NestedStructWithTraitsImpl> struct_array_; 98 std::map<std::string, NestedStructWithTraitsImpl> struct_map_; 99 }; 100 101 // A type which corresponds nominally to the 102 // mojo::test::StructWithUnreachableTraits mojom type. Used to test that said 103 // type is never serialized, i.e. objects of this type are simply copied into 104 // a message as-is when written to an intra-process interface. 105 struct StructWithUnreachableTraitsImpl { 106 int32_t magic_number = 0; 107 }; 108 109 // A type which knows how to look like a mojo::test::TrivialStructWithTraits 110 // mojom type by way of mojo::StructTraits. 111 struct TrivialStructWithTraitsImpl { 112 int32_t value; 113 }; 114 115 // A type which knows how to look like a mojo::test::MoveOnlyStructWithTraits 116 // mojom type by way of mojo::StructTraits. 117 class MoveOnlyStructWithTraitsImpl { 118 public: 119 MoveOnlyStructWithTraitsImpl(); 120 MoveOnlyStructWithTraitsImpl(MoveOnlyStructWithTraitsImpl&& other); 121 ~MoveOnlyStructWithTraitsImpl(); 122 get_mutable_handle()123 ScopedHandle& get_mutable_handle() { return handle_; } 124 125 MoveOnlyStructWithTraitsImpl& operator=(MoveOnlyStructWithTraitsImpl&& other); 126 127 private: 128 ScopedHandle handle_; 129 DISALLOW_COPY_AND_ASSIGN(MoveOnlyStructWithTraitsImpl); 130 }; 131 132 class UnionWithTraitsBase { 133 public: 134 enum class Type { INT32, STRUCT }; 135 ~UnionWithTraitsBase()136 virtual ~UnionWithTraitsBase() {} 137 type()138 Type type() const { return type_; } 139 140 protected: 141 Type type_ = Type::INT32; 142 }; 143 144 class UnionWithTraitsInt32 : public UnionWithTraitsBase { 145 public: UnionWithTraitsInt32()146 UnionWithTraitsInt32() {} UnionWithTraitsInt32(int32_t value)147 explicit UnionWithTraitsInt32(int32_t value) : value_(value) {} 148 149 ~UnionWithTraitsInt32() override; 150 value()151 int32_t value() const { return value_; } set_value(int32_t value)152 void set_value(int32_t value) { value_ = value; } 153 154 private: 155 int32_t value_ = 0; 156 }; 157 158 class UnionWithTraitsStruct : public UnionWithTraitsBase { 159 public: UnionWithTraitsStruct()160 UnionWithTraitsStruct() { type_ = Type::STRUCT; } UnionWithTraitsStruct(int32_t value)161 explicit UnionWithTraitsStruct(int32_t value) : struct_(value) { 162 type_ = Type::STRUCT; 163 } 164 ~UnionWithTraitsStruct() override; 165 get_mutable_struct()166 NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; } get_struct()167 const NestedStructWithTraitsImpl& get_struct() const { return struct_; } 168 169 private: 170 NestedStructWithTraitsImpl struct_; 171 }; 172 173 class StructForceSerializeImpl { 174 public: 175 StructForceSerializeImpl(); 176 ~StructForceSerializeImpl(); 177 set_value(int32_t value)178 void set_value(int32_t value) { value_ = value; } value()179 int32_t value() const { return value_; } 180 set_was_serialized()181 void set_was_serialized() const { was_serialized_ = true; } was_serialized()182 bool was_serialized() const { return was_serialized_; } 183 set_was_deserialized()184 void set_was_deserialized() { was_deserialized_ = true; } was_deserialized()185 bool was_deserialized() const { return was_deserialized_; } 186 187 private: 188 int32_t value_ = 0; 189 mutable bool was_serialized_ = false; 190 bool was_deserialized_ = false; 191 }; 192 193 class StructNestedForceSerializeImpl { 194 public: 195 StructNestedForceSerializeImpl(); 196 ~StructNestedForceSerializeImpl(); 197 force()198 StructForceSerializeImpl& force() { return force_; } force()199 const StructForceSerializeImpl& force() const { return force_; } 200 set_was_serialized()201 void set_was_serialized() const { was_serialized_ = true; } was_serialized()202 bool was_serialized() const { return was_serialized_; } 203 set_was_deserialized()204 void set_was_deserialized() { was_deserialized_ = true; } was_deserialized()205 bool was_deserialized() const { return was_deserialized_; } 206 207 private: 208 StructForceSerializeImpl force_; 209 mutable bool was_serialized_ = false; 210 bool was_deserialized_ = false; 211 }; 212 213 } // namespace test 214 } // namespace mojo 215 216 #endif // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_ 217