115 lines · cpp
1// Example program for matching summary functions and synthetic child providers.2//3// The classes here simulate code generated by a serialization tool like, for4// example, protocol buffers. But the actual "generated" class layout is5// extremely naive to simplify the example.6//7// The idea is that we want to have generic formatters for a bunch of message8// classes, because they are all generated following common patterns, but the9// matching can't be based in the type name, because it can be anything.10 11#include <string>12 13class Message {14 // Dummy method definitions to illustrate a possible generic message API.15 std::string serialize() { return "TODO"; }16 Message* deserialize() {17 return nullptr; // TODO.18 }19};20 21// This class could have been generated from a description like this. Assume22// fields are always optional, for simplicity (e.g. we don't care during23// serialization if a Customer has a name or not, we're just moving data around24// and validation happens elsewhere).25//26// message Customer {27// string name;28// int age;29// string address;30// }31class Customer : public Message {32 private:33 int _internal_bookkeeping_bits_;34 35 // Presence bits. They are true if the field has been set.36 bool _has_name_ = false;37 bool _has_age_ = false;38 bool _has_address_ = false;39 40 // Actual field data.41 std::string name_;42 int age_;43 std::string address_;44 45 public:46 // Getters and setters.47 bool has_name() { return _has_name_; }48 bool has_age() { return _has_age_; }49 bool has_address() { return _has_address_; }50 51 std::string name() { return name_; }52 int age() { return age_; }53 std::string address() { return address_; }54 55 void set_name(std::string name) {56 name_ = name;57 _has_name_ = true;58 }59 void set_age(int age) {60 age_ = age;61 _has_age_ = true;62 }63 void set_address(std::string address) {64 address_ = address;65 _has_address_ = true;66 }67};68 69// message ProductOrder {70// string product_name;71// int amount;72// }73class ProductOrder : public Message {74 private:75 int _internal_bookkeeping_bits_;76 77 // Presence bits. They are true if the field has been set.78 bool _has_product_name_ = false;79 bool _has_amount_ = false;80 81 // Actual field data.82 std::string product_name_;83 int amount_;84 85 public:86 // Getters and setters.87 bool has_product_name() { return _has_product_name_; }88 bool has_amount() { return _has_amount_; }89 90 std::string get_product_name() { return product_name_; }91 int get_amount() { return amount_; }92 93 void set_product_name(std::string product_name) {94 product_name_ = product_name;95 _has_product_name_ = true;96 }97 void set_amount(int amount) {98 amount_ = amount;99 _has_amount_ = true;100 }101};102 103int main(int argc, char **argv) {104 Customer customer;105 customer.set_name("C. Ustomer");106 customer.set_address("123 Fake St.");107 // no age, so we can check absent fields get omitted.108 109 ProductOrder order;110 order.set_product_name("widget");111 order.set_amount(100);112 return 0; // break here.113}114 115