| 792 | } |
| 793 | |
| 794 | void emitFixedFrameView(const std::string& className, const FrameDecl& frame, bool noneFrame) { |
| 795 | out_ << "class " << className << " {\n" |
| 796 | "public:\n" |
| 797 | << " explicit " << className << "(std::span<uint8> bytes) : bytes_(bytes) {}\n" |
| 798 | << " bool ok() const { return "; |
| 799 | if (noneFrame) |
| 800 | out_ << "bytes_.empty()"; |
| 801 | else |
| 802 | out_ << "bytes_.size() >= " << frameFixedSizeExpr(frame); |
| 803 | out_ << "; }\n"; |
| 804 | if (!noneFrame) { |
| 805 | for (size_t i = 0; i < frame.fields.size(); ++i) { |
| 806 | const FrameField& field = frame.fields[i]; |
| 807 | const std::string offset = frameOffsetExpr(frame, i); |
| 808 | out_ << " " << field.type << " " << field.name |
| 809 | << "() const { return detail::Read<" << field.type << ">(bytes_, " << offset << "); }\n" |
| 810 | << " void set_" << field.name << "(" << field.type |
| 811 | << " value) { detail::Write(bytes_, " << offset << ", value); }\n"; |
| 812 | } |
| 813 | } |
| 814 | emitFrameDebugString(className, noneFrame ? FrameDecl{} : frame); |
| 815 | out_ << "private:\n" |
| 816 | " std::span<uint8> bytes_;\n" |
| 817 | "};\n\n"; |
| 818 | } |
| 819 | |
| 820 | static bool canEmitFixedFrame(const FrameDecl& frame) { |
| 821 | for (const auto& field : frame.fields) { |