55#include < mp/config.h>
66#include < mp/util.h>
77
8- #include < boost/optional.hpp>
98#include < capnp/schema-parser.h>
109#include < fstream>
1110#include < map>
1211#include < set>
1312#include < sstream>
13+ #include < unistd.h>
1414#include < vector>
1515
1616#define PROXY_BIN " mpgen"
@@ -329,8 +329,10 @@ void Generate(kj::StringPtr src_prefix,
329329
330330 struct Field
331331 {
332- boost::optional<::capnp::StructSchema::Field> param;
333- boost::optional<::capnp::StructSchema::Field> result;
332+ ::capnp::StructSchema::Field param;
333+ bool param_is_set = false ;
334+ ::capnp::StructSchema::Field result;
335+ bool result_is_set = false ;
334336 int args = 0 ;
335337 bool retval = false ;
336338 bool optional = false ;
@@ -354,7 +356,13 @@ void Generate(kj::StringPtr src_prefix,
354356 fields.emplace_back ();
355357 }
356358 auto & field = fields[inserted.first ->second ];
357- (param ? field.param : field.result ) = schema_field;
359+ if (param) {
360+ field.param = schema_field;
361+ field.param_is_set = true ;
362+ } else {
363+ field.result = schema_field;
364+ field.result_is_set = true ;
365+ }
358366
359367 if (!param && field_name == " result" ) {
360368 field.retval = true ;
@@ -393,7 +401,7 @@ void Generate(kj::StringPtr src_prefix,
393401 fields[field.second ].optional = true ;
394402 }
395403 auto want_field = field_idx.find (" want" + Cap (field.first ));
396- if (want_field != field_idx.end () && fields[want_field->second ].param ) {
404+ if (want_field != field_idx.end () && fields[want_field->second ].param_is_set ) {
397405 fields[want_field->second ].skip = true ;
398406 fields[field.second ].requested = true ;
399407 }
@@ -416,12 +424,12 @@ void Generate(kj::StringPtr src_prefix,
416424 for (const auto & field : fields) {
417425 if (field.skip ) continue ;
418426
419- auto field_name = field.param ? field.param -> getProto (). getName () :
420- field. result ? field. result -> getProto ().getName () : " " ;
421- auto field_type = field. param ? field. param -> getType () : field. result -> getType ();
427+ const auto & f = field.param_is_set ? field.param : field. result ;
428+ auto field_name = f. getProto ().getName ();
429+ auto field_type = f. getType ();
422430
423431 std::ostringstream field_flags;
424- field_flags << (!field.param ? " FIELD_OUT" : field.result ? " FIELD_IN | FIELD_OUT" : " FIELD_IN" );
432+ field_flags << (!field.param_is_set ? " FIELD_OUT" : field.result_is_set ? " FIELD_IN | FIELD_OUT" : " FIELD_IN" );
425433 if (field.optional ) field_flags << " | FIELD_OPTIONAL" ;
426434 if (field.requested ) field_flags << " | FIELD_REQUESTED" ;
427435 if (BoxedType (field_type)) field_flags << " | FIELD_BOXED" ;
0 commit comments