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