Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Rust] cumulate offset of header and message_header_codec::ENCODED_LENGTH in generated Decoder::header method #987

Open
wbprime opened this issue Apr 10, 2024 · 3 comments · May be fixed by #991

Comments

@wbprime
Copy link

wbprime commented Apr 10, 2024

Code generator for rust would generate a header method for Decoder (see following)

impl<'a> DonotUsePlaceHolderDecoder<'a> {
        pub fn wrap(
            mut self,
            buf: ReadBuf<'a>,
            offset: usize,
            acting_block_length: u16,
            acting_version: u16,
        ) -> Self {
            let limit = offset + acting_block_length as usize;
            self.buf = buf;
            self.initial_offset = offset;
            self.offset = offset;
            self.limit = limit;
            self.acting_block_length = acting_block_length;
            self.acting_version = acting_version;
            self
        }

        #[inline]
        pub fn encoded_length(&self) -> usize {
            self.limit - self.offset
        }

        pub fn header(self, mut header: MessageHeaderDecoder<ReadBuf<'a>>) -> Self {
            debug_assert_eq!(SBE_TEMPLATE_ID, header.template_id());
            let acting_block_length = header.block_length();
            let acting_version = header.version();

            self.wrap(
                header.parent().unwrap(),
                message_header_codec::ENCODED_LENGTH,
                acting_block_length,
                acting_version,
            )
        }
}

The header method take a header decoder and call wrap method, passing message_header_codec::ENCODED_LENGTH as offset.

Considering a header decoder may be wraped with a none-zero offset header_off, header method should wrap with header_off + message_header_codec::ENCODED_LENGTH. To support this functionality, a MessageHeaderDecoder should expose its offset via, say get_limit() or something else.

@mward
Copy link
Contributor

mward commented Apr 10, 2024

@wbprime just to clarify, you are suggesting that the MessageHeaderDecoder is generated with additional function:

pub fn get_limit(&self) -> usize {
  self.limit + message_header_code::ENCODED_LENGTH
} 

and then the generated header functions be updated to:

pub fn header(self, mut header: MessageHeaderDecoder<ReadBuf<'a>>) -> Self {
  debug_assert_eq!(SBE_TEMPLATE_ID, header.template_id());
  let acting_block_length = header.block_length();
  let acting_version = header.version();
  let limit = header.get_limit();

  self.wrap(
    header.parent().unwrap(),
    limit,
    acting_block_length,
    acting_version,
  )
}

@wbprime
Copy link
Author

wbprime commented Apr 12, 2024

Yes, decoder wrap offset should be set to header offset + message_header_codec::ENCODED_LENGTH when wrapping using a header I suppose.

The generated header functions should be something like:

pub fn header(self, mut header: MessageHeaderDecoder<ReadBuf<'a>>) -> Self {
  debug_assert_eq!(SBE_TEMPLATE_ID, header.template_id());
  let acting_block_length = header.block_length();
  let acting_version = header.version();
  let limit = header.get_limit();

  self.wrap(
    header.parent().unwrap(),
    // limit, 
    limit + message_header_codec::ENCODED_LENGTH,
    acting_block_length,
    acting_version,
  )
}

1 similar comment
@wbprime
Copy link
Author

wbprime commented Apr 12, 2024

Yes, decoder wrap offset should be set to header offset + message_header_codec::ENCODED_LENGTH when wrapping using a header I suppose.

The generated header functions should be something like:

pub fn header(self, mut header: MessageHeaderDecoder<ReadBuf<'a>>) -> Self {
  debug_assert_eq!(SBE_TEMPLATE_ID, header.template_id());
  let acting_block_length = header.block_length();
  let acting_version = header.version();
  let limit = header.get_limit();

  self.wrap(
    header.parent().unwrap(),
    // limit, 
    limit + message_header_codec::ENCODED_LENGTH,
    acting_block_length,
    acting_version,
  )
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants