|
20 | 20 | #include <cctype>
|
21 | 21 | #include <cstdint>
|
22 | 22 | #include <map>
|
| 23 | +#include <set> |
23 | 24 | #include <spb/json/deserialize.hpp>
|
24 | 25 | #include <sstream>
|
25 | 26 | #include <stdexcept>
|
@@ -213,10 +214,13 @@ void dump_cpp_serialize_value( std::ostream & stream, const proto_enum & my_enum
|
213 | 214 | stream << "void serialize_value( detail::ostream & stream, const " << full_name
|
214 | 215 | << " & value )\n{\n";
|
215 | 216 | stream << "\tswitch( value )\n\t{\n";
|
| 217 | + std::set<int32_t> numbers_taken; |
216 | 218 | for( const auto & field : my_enum.fields )
|
217 | 219 | {
|
| 220 | + if (numbers_taken.contains(field.number)) continue; |
218 | 221 | stream << "\tcase " << full_name << "::" << field.name
|
219 | 222 | << ":\n\t\treturn stream.serialize( \"" << field.name << "\"sv);\n";
|
| 223 | + numbers_taken.insert(field.number); |
220 | 224 | }
|
221 | 225 | stream << "\tdefault:\n\t\tthrow std::system_error( std::make_error_code( "
|
222 | 226 | "std::errc::invalid_argument ) );\n";
|
@@ -273,9 +277,12 @@ void dump_cpp_deserialize_value( std::ostream & stream, const proto_enum & my_en
|
273 | 277 | "std::errc::invalid_argument ) );\n";
|
274 | 278 | stream << "\t\t},\n\t\t[&]( int32_t enum_int )\n\t\t{\n\t\t\tswitch( " << full_name
|
275 | 279 | << "( enum_int ) )\n\t\t\t{\n";
|
| 280 | + std::set<int32_t> numbers_taken; |
276 | 281 | for( const auto & field : my_enum.fields )
|
277 | 282 | {
|
| 283 | + if (numbers_taken.contains(field.number)) continue; |
278 | 284 | stream << "\t\t\tcase " << full_name << "::" << field.name << ":\n";
|
| 285 | + numbers_taken.insert(field.number); |
279 | 286 | }
|
280 | 287 | stream << "\t\t\t\tvalue = " << full_name << "( enum_int );\n\t\t\t\treturn ;\n";
|
281 | 288 | stream << "\t\t\t}\n\t\t\tthrow std::system_error( std::make_error_code( "
|
|
0 commit comments