Skip to content

Commit bcbff5c

Browse files
committed
add support for reading type() in output unions
1 parent eb8ae0b commit bcbff5c

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

lib/cpp/scalgoproto.hh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,12 @@ private:
11221122
return T(*this, o);
11231123
}
11241124

1125+
template <typename T>
1126+
T read(std::uint64_t offset) {
1127+
T v;
1128+
memcpy(&v, data+offset, sizeof(T));
1129+
return v;
1130+
}
11251131
public:
11261132
Writer(size_t capacity = 256, std::unique_ptr<WriterBacking> backing = nullptr)
11271133
: backing(std::move(backing)), size(10) {
@@ -1332,6 +1338,7 @@ protected:
13321338
std::uint64_t offset_;
13331339

13341340
void setType_(std::uint16_t type) noexcept { writer_.write(type, offset_); }
1341+
std::uint16_t getType_() const noexcept {return writer_.read<uint16_t>(offset_); }
13351342

13361343
void setObject_(std::uint64_t p) noexcept { writer_.write48_(p, offset_ + 2); }
13371344

@@ -1351,6 +1358,7 @@ protected:
13511358
std::uint64_t next_;
13521359

13531360
void setType_(std::uint16_t type) noexcept { writer_.write(type, offset_); }
1361+
std::uint16_t getType_() const noexcept { return writer_.read<uint16_t>(offset_); }
13541362

13551363
void setSize_(std::uint64_t size) noexcept { writer_.write48_(size, offset_ + 2); }
13561364

scalgoprotoc/cpp_generator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,9 +903,11 @@ def generate_union(self, union: Union) -> None:
903903
self.o("protected:")
904904
self.o("\tusing scalgoproto::%sUnionOut::%sUnionOut;" % (prefix, prefix))
905905
self.o("public:")
906+
self.o("\tusing Type = %sType;" % union.name)
906907
self.o(
907908
"\tusing IN=%sIn<%s>;" % (union.name, "true" if inplace else "false")
908909
)
910+
self.o("\tType type() const noexcept {return (Type)this->getType_();}")
909911
idx = 1
910912
for member in union.members:
911913
assert member.type_ is not None

0 commit comments

Comments
 (0)