mojo::TypeConverter: support inherting implicit conversion settings from another...
[chromium-blink-merge.git] / mojo / public / tools / bindings / generators / cpp_templates / wrapper_class_declaration.tmpl
blob79d1a8f73a1278d6f82d33538321bc6de71f0920
1 class {{struct.name}} {
2  public:
3   typedef internal::{{struct.name}}_Data Data;
5 {#--- Enums #}
6 {%- for enum in struct.enums -%}
7 {%    macro enum_def() %}{% include "enum_declaration.tmpl" %}{% endmacro %}
8   {{enum_def()|indent(2)}}
9 {%- endfor %}
11   {{struct.name}}() : data_(NULL) {
12   }
14   template <typename U>
15   {{struct.name}}(const U& u, mojo::Buffer* buf = mojo::Buffer::current()) {
16     mojo::TypeConverter<{{struct.name}},U>::AssertAllowImplicitTypeConversion();
17     *this = mojo::TypeConverter<{{struct.name}},U>::ConvertFrom(u, buf);
18   }
20   template <typename U>
21   {{struct.name}}& operator=(const U& u) {
22     mojo::TypeConverter<{{struct.name}},U>::AssertAllowImplicitTypeConversion();
23     *this = mojo::TypeConverter<{{struct.name}},U>::ConvertFrom(u, mojo::Buffer::current());
24     return *this;
25   }
27   template <typename U>
28   operator U() const {
29     mojo::TypeConverter<{{struct.name}},U>::AssertAllowImplicitTypeConversion();
30     return To<U>();
31   }
33   template <typename U>
34   U To() const {
35     return mojo::TypeConverter<{{struct.name}},U>::ConvertTo(*this);
36   }
38   template <typename U>
39   static {{struct.name}} From(const U& u, mojo::Buffer* buf = mojo::Buffer::current()) {
40     return mojo::TypeConverter<{{struct.name}},U>::ConvertFrom(u, buf);
41   }
43   bool is_null() const { return !data_; }
45 {#--- Getters #}
46 {%  for packed_field in struct.packed.packed_fields %}
47 {%-   set type = packed_field.field.kind|cpp_wrapper_type %}
48 {%-   set name = packed_field.field.name %}
49 {%-   if packed_field.field.kind|is_object_kind %}
50   const {{type}} {{name}}() const { {#
51     #}return mojo::internal::Wrap(data_->{{name}}()); }
52 {%-   elif packed_field.field.kind|is_handle_kind %}
53   {{type}} {{name}}() const { return mojo::MakePassable(data_->{{name}}()); }
54 {%-   elif packed_field.field.kind|is_enum_kind %}
55   {{type}} {{name}}() const { return static_cast<{{type}}>(data_->{{name}}()); }
56 {%-   else %}
57   {{type}} {{name}}() const { return data_->{{name}}(); }
58 {%-   endif %}
59 {%- endfor %}
61   class Builder {
62    public:
63     explicit Builder(mojo::Buffer* buf = mojo::Buffer::current());
65 {#--- Setters #}
66 {%  for packed_field in struct.packed.packed_fields %}
67 {%-   set type = packed_field.field.kind|cpp_const_wrapper_type %}
68 {%-   set name = packed_field.field.name %}
69 {%-   if packed_field.field.kind|is_object_kind %}
70     void set_{{name}}({{type}} {{name}}) { {#
71     #}data_->set_{{name}}(mojo::internal::Unwrap({{name}})); }
72 {%-   elif packed_field.field.kind|is_handle_kind %}
73     void set_{{name}}({{type}} {{name}}) { {#
74     #}data_->set_{{name}}({{name}}.release()); }
75 {%-   else %}
76     void set_{{name}}({{type}} {{name}}) { {#
77     #}data_->set_{{name}}({{name}}); }
78 {%-   endif %}
79 {%- endfor %}
81     {{struct.name}} Finish();
83    private:
84     {{struct.name}}::Data* data_;
85     MOJO_DISALLOW_COPY_AND_ASSIGN(Builder);
86   };
88  private:
89   friend class mojo::internal::WrapperHelper<{{struct.name}}>;
91   struct Wrap {};
92   {{struct.name}}(Wrap, const Data* data) : data_(data) {}
94   const Data* data_;