// Generated file -- DO NOT MODIFY. #include "{{file}}.h" #include #include {% if package != None %} namespace {{package.cpp_namespace()}} { {% endif %} namespace { const uint64_t header_size = 24; // 4x uint32, 1x uint64 struct ExtPointer { uint32_t offset; uint32_t length; }; } // namespace {%- for message in messages %} glcr::Status {{message.name}}::ParseFromBytes(const yunq::MessageView& message) { RETURN_ERROR(ParseFromBytesInternal(message)); {%- for field in message.fields %} {%- if field.type == Type.CAPABILITY %} {%- if not field.repeated %} // Parse {{field.name}}. ASSIGN_OR_RETURN({{field.name}}_, message.ReadCapability({{loop.index0}})); {%- else %} // Parse {{field.name}}. ASSIGN_OR_RETURN({{field.name}}_, message.ReadRepeatedCapability({{loop.index0}})); {%- endif %} {%- endif %} {%- endfor %} return glcr::Status::Ok(); } glcr::Status {{message.name}}::ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer& caps) { RETURN_ERROR(ParseFromBytesInternal(message)); {%- for field in message.fields %} {%- if field.type == Type.CAPABILITY %} {%- if not field.repeated %} // Parse {{field.name}}. ASSIGN_OR_RETURN({{field.name}}_, message.ReadCapability({{loop.index0}}, caps)); {%- else %} // Parse {{field.name}}. ASSIGN_OR_RETURN({{field.name}}_, message.ReadRepeatedCapability({{loop.index0}}, caps)); {%- endif %} {%- endif %} {%- endfor %} return glcr::Status::Ok(); } glcr::Status {{message.name}}::ParseFromBytesInternal(const yunq::MessageView& message) { RETURN_ERROR(message.CheckHeader()); {%- for field in message.fields %} // Parse {{field.name}}. {%- if field.type != Type.CAPABILITY %} {%- if not field.repeated %} ASSIGN_OR_RETURN({{field.name}}_, message.ReadField<{{field.cpp_type()}}>({{loop.index0}})); {%- else %} ASSIGN_OR_RETURN({{field.name}}_, message.ReadRepeated<{{field.cpp_type()}}>({{loop.index0}})); {% endif %} {%- endif %} {%- endfor %} return glcr::Status::Ok(); } uint64_t {{message.name}}::SerializeToBytes(glcr::ByteBuffer& bytes, uint64_t offset) const { uint32_t next_extension = header_size + 8 * {{ message.fields | length }}; const uint32_t core_size = next_extension; {%- for field in message.fields %} // Write {{field.name}}. {%- if not field.repeated %} {%- if field.type == Type.U64 %} bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}()); {%- elif field.type == Type.I64 %} bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}()); {%- elif field.type == Type.STRING %} ExtPointer {{field.name}}_ptr{ .offset = next_extension, // FIXME: Check downcast of str length. .length = (uint32_t){{field.name}}().length(), }; bytes.WriteStringAt(offset + next_extension, {{field.name}}()); next_extension += {{field.name}}_ptr.length; bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}_ptr); {%- elif field.type == Type.CAPABILITY %} // FIXME: Implement inbuffer capabilities. bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), 0); {%- else %} // TODO: Unimplemented serialization {{field.type}} {%- endif %} {%- else %} ExtPointer {{field.name}}_ptr{ .offset = next_extension, .length = (uint32_t)({{field.name}}().size() * sizeof({{field.cpp_type()}})), }; next_extension += {{field.name}}_ptr.length; bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}_ptr); for (uint64_t i = 0; i < {{field.name}}().size(); i++) { uint32_t ext_offset = offset + {{field.name}}_ptr.offset + (i * sizeof({{field.cpp_type()}})); bytes.WriteAt<{{field.cpp_type()}}>(ext_offset, {{field.name}}().at(i)); } {%- endif %} {%- endfor %} // The next extension pointer is the length of the message. yunq::WriteHeader(bytes, offset, core_size, next_extension); return next_extension; } uint64_t {{message.name}}::SerializeToBytes(glcr::ByteBuffer& bytes, uint64_t offset, glcr::CapBuffer& caps) const { uint32_t next_extension = header_size + 8 * {{ message.fields | length}}; const uint32_t core_size = next_extension; uint64_t next_cap = 0; {%- for field in message.fields %} // Write {{field.name}}. {%- if not field.repeated %} {%- if field.type == Type.U64 %} bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}()); {%- elif field.type == Type.I64 %} bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}()); {%- elif field.type == Type.STRING %} ExtPointer {{field.name}}_ptr{ .offset = next_extension, // FIXME: Check downcast of str length. .length = (uint32_t){{field.name}}().length(), }; bytes.WriteStringAt(offset + next_extension, {{field.name}}()); next_extension += {{field.name}}_ptr.length; bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}_ptr); {%- elif field.type == Type.CAPABILITY %} caps.WriteAt(next_cap, {{field.name}}()); bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), next_cap++); {%- else %} // TODO: Unimplemented serialization {{field.type}} {%- endif %} {%- else %} ExtPointer {{field.name}}_ptr{ .offset = next_extension, .length = (uint32_t)({{field.name}}().size() * sizeof({{field.cpp_type()}})), }; next_extension += {{field.name}}_ptr.length; bytes.WriteAt(offset + header_size + (8 * {{loop.index0}}), {{field.name}}_ptr); for (uint64_t i = 0; i < {{field.name}}().size(); i++) { uint32_t ext_offset = offset + {{field.name}}_ptr.offset + (i * sizeof({{field.cpp_type()}})); bytes.WriteAt<{{field.cpp_type()}}>(ext_offset, {{field.name}}().at(i)); } {%- endif %} {%- endfor %} // The next extension pointer is the length of the message. yunq::WriteHeader(bytes, offset, core_size, next_extension); return next_extension; } {%- endfor %} {% if package != None %} } // namepace {{package.cpp_namespace()}} {% endif %}