google / google/flatbuffers

native_type for tables in c++ object based api

Open
#4,969 22 comments 1 reaction 0 assignees View on GitHub
help wanted not-stale pr-requested
Dominant language
C++
Stars
26.5k
Forks
3.7k
PR merge metrics
No merged PRs in 30d

Description

Hi everybody,
I like to use custom types for tables in the object based API. The behavior should be equal to the "native_type" attribute for structs. I hope to get some feedback on the idea and possible pack and unpack APIs.

Example:
```
table MatrixXd (native_type:"Eigen::MatrixXd") {
rows:uint32;
data:[double];
}

table Signal {
mat:MatrixXd;
}
```

I like to get an object API similar to:
```
struct SignalT {
Eigen::MatrixXd mat; // instead of std::unique_ptrmat;
}
```

For structs the user has to specify the following functions:
```
namespace flatbuffers {
native_type UnPack(const FlatbufferStruct& obj);
FlatbufferStruct Pack(const native_type& obj);
}
```
I think this is no suitable interface for tables, as "Pack" should directly map to a FlatBufferBuilder.

**UnPack**
default is ` { auto _e = mat(); if (_e) _o->mat = std::unique_ptr(_e->UnPack(_resolver)); };`
The actual unpack functionality is implemented in "UnPackTo". Both UnPack and UnPackTo are members of the generated code and thus can not be user defined. I would suggest:

`native_type UnPack(const FlatbufferTable& obj, const flatbuffers::resolver_function_t *_resolver = nullptr);
` or alternatively
`void UnPackTo(native_type *_o, const FlatbufferTable& obj, const flatbuffers::resolver_function_t *_resolver = nullptr); `
I would prefer the first version. Return value optimization should do it's job.

**Pack**
There is a "Pack" method generated for each Table. On the other hand there are two overloaded CreateType functions which do the actual work. I think the interface is similar to what we like to have.

Suggestion:
`inline flatbuffers::Offset CreateSignal(flatbuffers::FlatBufferBuilder &_fbb, const native_type &_o, const flatbuffers::rehasher_function_t *_rehasher);`

I think it is possible to clean up the various generated code pack and unpack functions. For compatibility reasons we should not do so? I am looking forward to some feedback.

Best regards
Thomas

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.