OLD | NEW |
1 {#--- Begin #} | 1 {#--- Begin #} |
2 | 2 |
3 class {{struct.name}} { | 3 {%- macro encode(variable, kind, offset, bit, level=0, check_for_null=True) %} |
| 4 {%- if kind|is_pointer_array_kind %} |
| 5 {%- set sub_kind = kind.kind %} |
| 6 {%- if check_for_null %} |
| 7 if ({{variable}} == null) { |
| 8 encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|dart_tr
ue_false}}); |
| 9 } else { |
| 10 {%- else %} |
| 11 { |
| 12 {%- endif %} |
| 13 var encoder{{level + 1}} = encoder{{level}}.encodePointerArray({{variable}}.le
ngth, {{offset}}, {{kind|array_expected_length}}); |
| 14 for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) { |
| 15 {{encode(variable~'[i'~level~']', sub_kind, 'bindings.DataHeader.kHeaderSize
+ bindings.kPointerSize * i'~level, 0, level+1)|indent(4)}} |
| 16 } |
| 17 } |
| 18 {%- elif kind|is_map_kind %} |
| 19 if ({{variable}} == null) { |
| 20 encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|dart_tr
ue_false}}); |
| 21 } else { |
| 22 var encoder{{level + 1}} = encoder{{level}}.encoderForMap({{offset}}); |
| 23 int size{{level}} = {{variable}}.length; |
| 24 var keys{{level}} = {{variable}}.keys.toList(); |
| 25 var values{{level}} = {{variable}}.values.toList(); |
| 26 {{encode('keys'~level, kind.key_kind|array, 'bindings.DataHeader.kHeaderSize',
0, level+1, False)|indent(2)}} |
| 27 {{encode('values'~level, kind.value_kind|array, 'bindings.DataHeader.kHeaderSi
ze + bindings.kPointerSize', 0, level+1, False)|indent(2)}} |
| 28 } |
| 29 {%- else %} |
| 30 encoder{{level}}.{{kind|encode_method(variable, offset, bit)}}; |
| 31 {%- endif %} |
| 32 {%- endmacro %} |
| 33 |
| 34 |
| 35 {%- macro decode(variable, kind, offset, bit, level=0) %} |
| 36 {%- if kind|is_struct_kind or kind|is_pointer_array_kind or kind|is_map_kind %} |
| 37 var decoder{{level+1}} = decoder{{level}}.decodePointer({{offset}}, {{kind|is_nu
llable_kind|dart_true_false}}); |
| 38 {%- if kind|is_struct_kind %} |
| 39 {{variable}} = {{kind|dart_type}}.decode(decoder{{level+1}}); |
| 40 {%- else %}{# kind|is_pointer_array_kind or is_map_kind #} |
| 41 {%- if kind|is_nullable_kind %} |
| 42 if (decoder{{level+1}} == null) { |
| 43 {{variable}} = null; |
| 44 } else { |
| 45 {%- else %} |
| 46 { |
| 47 {%- endif %} |
| 48 {%- if kind|is_map_kind %} |
| 49 decoder{{level+1}}.decodeDataHeaderForMap(); |
| 50 List<{{kind.key_kind|dart_type}}> keys{{level}}; |
| 51 List<{{kind.value_kind|dart_type}}> values{{level}}; |
| 52 { |
| 53 {{decode('keys'~level, kind.key_kind|array, 'DataHeader.HEADER_SIZE', 0, lev
el+1)|indent(4)}} |
| 54 } |
| 55 { |
| 56 {{decode('values'~level, kind.value_kind|array('keys'~level~'.length'), 'bin
dings.DataHeader.kHeaderSize + bindings.kPointerSize', 0, level+1)|indent(4)}} |
| 57 } |
| 58 {{variable}} = new Map<{{kind.key_kind|dart_type}}, {{kind.value_kind|dart_typ
e}}>.fromIterables(keys, values); |
| 59 {%- else %} |
| 60 var si{{level+1}} = decoder{{level+1}}.decodeDataHeaderForPointerArray({{kind|
array_expected_length}}); |
| 61 {{variable}} = new {{kind|dart_type}}(si{{level+1}}.numFields); |
| 62 for (int i{{level+1}} = 0; i{{level+1}} < si{{level+1}}.numFields; ++i{{level+
1}}) { |
| 63 {{decode(variable~'[i'~(level+1)~']', kind.kind, 'bindings.DataHeader.kHeade
rSize + bindings.kPointerSize * i'~(level+1), 0, level+1)|indent(4)}} |
| 64 } |
| 65 {%- endif %} |
| 66 } |
| 67 {%- endif %} |
| 68 {%- else %} |
| 69 {{variable}} = decoder{{level}}.{{kind|decode_method(offset, bit)}}; |
| 70 {%- endif %} |
| 71 {%- endmacro %} |
| 72 |
| 73 |
| 74 {%- macro struct_def(struct) %} |
| 75 class {{struct|name}} extends bindings.Struct { |
| 76 static const int kStructSize = {{struct.packed|struct_size}}; |
| 77 static const bindings.DataHeader kDefaultStructInfo = |
| 78 const bindings.DataHeader(kStructSize, {{struct.packed.packed_fields|lengt
h}}); |
| 79 |
4 {#--- Enums #} | 80 {#--- Enums #} |
5 {%- from "enum_definition.tmpl" import enum_def %} | 81 {%- from "enum_definition.tmpl" import enum_def %} |
6 {% for enum in struct.enums %} | 82 {%- for enum in struct.enums %} |
7 {{enum_def(" static ", enum)}} | 83 {{enum_def(" static ", enum)}} |
8 {%- endfor %} | 84 {%- endfor %} |
9 | 85 |
10 | 86 |
11 {#--- Constants #} | 87 {#--- Constants #} |
12 {% for constant in struct.constants %} | 88 {%- for constant in struct.constants %} |
13 static final {{constant.name}} = {{constant.value|expression_to_text}}; | 89 static final {{constant.name}} = {{constant.value|expression_to_text}}; |
14 {%- endfor %} | 90 {%- endfor %} |
15 | 91 |
16 | |
17 {#--- initDefaults() #} | 92 {#--- initDefaults() #} |
18 {%- for packed_field in struct.packed.packed_fields %} | 93 {%- for packed_field in struct.packed.packed_fields %} |
19 {{packed_field.field.kind|dart_decl_type}} {{packed_field.field.name}} = {{pac
ked_field.field|default_value}}; | 94 {{packed_field.field.kind|dart_type}} {{packed_field.field|name}} = {{packed_f
ield.field|default_value}}; |
20 {%- endfor %} | 95 {%- endfor %} |
21 | 96 |
22 {{struct.name}}(); | 97 {{struct|name}}() : super(kStructSize); |
23 | 98 |
24 {#--- Encoding and decoding #} | 99 static {{struct|name}} deserialize(bindings.Message message) { |
25 | 100 return decode(new bindings.Decoder(message)); |
26 static const int encodedSize = | |
27 bindings.kStructHeaderSize + {{struct.packed|payload_size}}; | |
28 | |
29 static {{struct.name}} decode(bindings.MojoDecoder decoder) { | |
30 var packed; | |
31 var val = new {{struct.name}}(); | |
32 var numberOfBytes = decoder.readUint32(); | |
33 var numberOfFields = decoder.readUint32(); | |
34 {%- for byte in struct.bytes %} | |
35 {%- if byte.packed_fields|length > 1 %} | |
36 packed = decoder.readUint8(); | |
37 {%- for packed_field in byte.packed_fields %} | |
38 val.{{packed_field.field.name}} = (((packed >> {{packed_field.bit}}) & 1) !=
0) ? true : false; | |
39 {%- endfor %} | |
40 {%- else %} | |
41 {%- for packed_field in byte.packed_fields %} | |
42 val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_s
nippet}}; | |
43 {%- endfor %} | |
44 {%- endif %} | |
45 {%- if byte.is_padding %} | |
46 decoder.skip(1); | |
47 {%- endif %} | |
48 {%- endfor %} | |
49 return val; | |
50 } | 101 } |
51 | 102 |
52 static void encode(bindings.MojoEncoder encoder, {{struct.name}} val) { | 103 static {{struct|name}} decode(bindings.Decoder decoder0) { |
53 var packed; | 104 if (decoder0 == null) { |
54 encoder.writeUint32({{struct.name}}.encodedSize); | 105 return null; |
55 encoder.writeUint32({{struct.packed.packed_fields|length}}); | 106 } |
| 107 {{struct|name}} result = new {{struct|name}}(); |
| 108 {%- if not struct.bytes %} |
| 109 decoder0.decodeDataHeader(); |
| 110 {%- else %} |
| 111 var mainDataHeader = decoder0.decodeDataHeader(); |
| 112 {%- endif %} |
56 {%- for byte in struct.bytes %} | 113 {%- for byte in struct.bytes %} |
57 {%- if byte.packed_fields|length > 1 %} | 114 {%- for packed_field in byte.packed_fields %} |
58 packed = 0; | 115 if (mainDataHeader.numFields > {{packed_field.ordinal}}) { |
59 {%- for packed_field in byte.packed_fields %} | 116 {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+p
acked_field.offset, packed_field.bit)|indent(6)}} |
60 packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}}; | 117 } |
61 {%- endfor %} | 118 {%- endfor %} |
62 encoder.writeUint8(packed); | 119 {%- endfor %} |
63 {%- else %} | 120 return result; |
64 {%- for packed_field in byte.packed_fields %} | 121 } |
65 encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.n
ame}}); | 122 |
66 {%- endfor %} | 123 void encode(bindings.Encoder encoder) { |
67 {%- endif %} | 124 {%- if not struct.bytes %} |
68 {%- if byte.is_padding %} | 125 encoder.getEncoderAtOffset(kDefaultStructInfo); |
69 encoder.skip(1); | 126 {%- else %} |
70 {%- endif %} | 127 var encoder0 = encoder.getEncoderAtOffset(kDefaultStructInfo); |
| 128 {%- endif %} |
| 129 {%- for byte in struct.bytes %} |
| 130 {%- for packed_field in byte.packed_fields %} |
| 131 {{encode(packed_field.field|name, packed_field.field.kind, 8+packed_field.of
fset, packed_field.bit)|indent(4)}} |
| 132 {%- endfor %} |
71 {%- endfor %} | 133 {%- endfor %} |
72 } | 134 } |
73 } | 135 } |
| 136 {%- endmacro %} |
OLD | NEW |