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