Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 class {{export_attribute}} {{union.name}} { | 1 class {{export_attribute}} {{union.name}} { |
| 2 public: | 2 public: |
| 3 using DataView = {{union.name}}DataView; | 3 using DataView = {{union.name}}DataView; |
| 4 using Data_ = internal::{{union.name}}_Data; | 4 using Data_ = internal::{{union.name}}_Data; |
| 5 using Tag = Data_::{{union.name}}_Tag; | 5 using Tag = Data_::{{union.name}}_Tag; |
| 6 | 6 |
| 7 static {{union.name}}Ptr New(); | 7 struct TagTypes_ { |
| 8 {%- for field in union.fields %} | |
| 9 using {{field.name|under_to_camel}} = std::integral_constant<Tag, Tag::{{fie ld.name|upper}}>; | |
| 10 {%- endfor %} | |
| 11 }; | |
| 12 // Tag values that can be passed to the constructor to specify which field | |
| 13 // should set at construction. | |
| 14 {%- for field in union.fields %} | |
| 15 static constexpr TagTypes_::{{field.name|under_to_camel}} {{field.name}} = {}; | |
| 16 {%- endfor %} | |
| 17 | |
| 18 template <typename... Args> | |
| 19 static {{union.name}}Ptr New(Args&&... args) { | |
| 20 return {{union.name}}Ptr(base::in_place, std::forward<Args>(args)...); | |
| 21 } | |
| 8 | 22 |
| 9 template <typename U> | 23 template <typename U> |
| 10 static {{union.name}}Ptr From(const U& u) { | 24 static {{union.name}}Ptr From(const U& u) { |
| 11 return mojo::TypeConverter<{{union.name}}Ptr, U>::Convert(u); | 25 return mojo::TypeConverter<{{union.name}}Ptr, U>::Convert(u); |
| 12 } | 26 } |
| 13 | 27 |
| 14 template <typename U> | 28 template <typename U> |
| 15 U To() const { | 29 U To() const { |
| 16 return mojo::TypeConverter<U, {{union.name}}>::Convert(*this); | 30 return mojo::TypeConverter<U, {{union.name}}>::Convert(*this); |
| 17 } | 31 } |
| 18 | 32 |
| 19 {{union.name}}(); | 33 {{union.name}}(); |
| 34 explicit {{union.name}}(Tag tag); | |
|
yzshen1
2017/03/07 17:13:43
With the current constructors, users would do:
F
| |
| 35 {% for field in union.fields %} | |
| 36 | |
| 37 // Construct an instance holding |{{field.name}}|. | |
| 38 // Pass |{{union.name}}::{{field.name}}| to to match |TagTypes_::{{field.name| under_to_camel}}|. | |
| 39 {%- if union|is_distinct_kind(field) %} | |
| 40 explicit {{union.name}}({{field.kind|cpp_wrapper_param_type}} in) | |
|
yzshen1
2017/03/07 17:13:43
I still think we should avoid this distinct-type-t
| |
| 41 : {{union.name}}({{field.name}}, std::move(in)) {} | |
| 42 {%- endif %} | |
| 43 {%- if field.kind|is_object_kind %} | |
| 44 {{union.name}}(TagTypes_::{{field.name|under_to_camel}}); | |
|
yzshen1
2017/03/07 17:13:43
There is already a similar one on line 34. And it
| |
| 45 {%- endif %} | |
| 46 {{union.name}}(TagTypes_::{{field.name|under_to_camel}}, {{field.kind|cpp_wrap per_param_type}} in); | |
| 47 {%- endfor %} | |
| 20 ~{{union.name}}(); | 48 ~{{union.name}}(); |
| 21 | 49 |
| 22 // Clone() is a template so it is only instantiated if it is used. Thus, the | 50 // Clone() is a template so it is only instantiated if it is used. Thus, the |
| 23 // bindings generator does not need to know whether Clone() or copy | 51 // bindings generator does not need to know whether Clone() or copy |
| 24 // constructor/assignment are available for members. | 52 // constructor/assignment are available for members. |
| 25 template <typename UnionPtrType = {{union.name}}Ptr> | 53 template <typename UnionPtrType = {{union.name}}Ptr> |
| 26 {{union.name}}Ptr Clone() const; | 54 {{union.name}}Ptr Clone() const; |
| 27 | 55 |
| 28 // Equals() is a template so it is only instantiated if it is used. Thus, the | 56 // Equals() is a template so it is only instantiated if it is used. Thus, the |
| 29 // bindings generator does not need to know whether Equals() or == operator | 57 // bindings generator does not need to know whether Equals() or == operator |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 51 return *(data_.{{field.name}}); | 79 return *(data_.{{field.name}}); |
| 52 {%- else %} | 80 {%- else %} |
| 53 return data_.{{field.name}}; | 81 return data_.{{field.name}}; |
| 54 {%- endif %} | 82 {%- endif %} |
| 55 } | 83 } |
| 56 | 84 |
| 57 void set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}); | 85 void set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}); |
| 58 {%- endfor %} | 86 {%- endfor %} |
| 59 | 87 |
| 60 private: | 88 private: |
| 61 friend class mojo::internal::UnionAccessor<{{union.name}}>; | |
| 62 union Union_ { | 89 union Union_ { |
| 63 Union_() {} | 90 Union_() {} |
| 64 ~Union_() {} | 91 ~Union_() {} |
| 65 | 92 |
| 66 {%- for field in union.fields %} | 93 {%- for field in union.fields %} |
| 67 {%- if field.kind|is_object_kind or | 94 {%- if field.kind|is_object_kind or |
| 68 field.kind|is_any_handle_or_interface_kind %} | 95 field.kind|is_any_handle_or_interface_kind %} |
| 69 {{field.kind|cpp_wrapper_type}}* {{field.name}}; | 96 {{field.kind|cpp_wrapper_type}}* {{field.name}}; |
| 70 {%- else %} | 97 {%- else %} |
| 71 {{field.kind|cpp_wrapper_type}} {{field.name}}; | 98 {{field.kind|cpp_wrapper_type}} {{field.name}}; |
| 72 {%- endif %} | 99 {%- endif %} |
| 73 {%- endfor %} | 100 {%- endfor %} |
| 74 }; | 101 }; |
| 75 void SwitchActive(Tag new_active); | |
| 76 void SetActive(Tag new_active); | |
| 77 void DestroyActive(); | 102 void DestroyActive(); |
| 78 Tag tag_; | 103 Tag tag_ = static_cast<Tag>(-1); |
| 79 Union_ data_; | 104 Union_ data_; |
| 80 }; | 105 }; |
| OLD | NEW |