xref: /aosp_15_r20/external/google-fruit/examples/hello_world/main.cpp (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
1*a65addddSAndroid Build Coastguard Worker 
2*a65addddSAndroid Build Coastguard Worker #include <fruit/fruit.h>
3*a65addddSAndroid Build Coastguard Worker #include <iostream>
4*a65addddSAndroid Build Coastguard Worker 
5*a65addddSAndroid Build Coastguard Worker using fruit::Component;
6*a65addddSAndroid Build Coastguard Worker using fruit::Injector;
7*a65addddSAndroid Build Coastguard Worker 
8*a65addddSAndroid Build Coastguard Worker class Writer {
9*a65addddSAndroid Build Coastguard Worker public:
10*a65addddSAndroid Build Coastguard Worker   virtual void write(std::string s) = 0;
11*a65addddSAndroid Build Coastguard Worker };
12*a65addddSAndroid Build Coastguard Worker 
13*a65addddSAndroid Build Coastguard Worker class StdoutWriter : public Writer {
14*a65addddSAndroid Build Coastguard Worker public:
15*a65addddSAndroid Build Coastguard Worker   // Like "StdoutWriter() = default;" but also marks this constructor as the
16*a65addddSAndroid Build Coastguard Worker   // one to use for injection.
17*a65addddSAndroid Build Coastguard Worker   INJECT(StdoutWriter()) = default;
18*a65addddSAndroid Build Coastguard Worker 
write(std::string s)19*a65addddSAndroid Build Coastguard Worker   virtual void write(std::string s) override {
20*a65addddSAndroid Build Coastguard Worker     std::cout << s;
21*a65addddSAndroid Build Coastguard Worker   }
22*a65addddSAndroid Build Coastguard Worker };
23*a65addddSAndroid Build Coastguard Worker 
24*a65addddSAndroid Build Coastguard Worker class Greeter {
25*a65addddSAndroid Build Coastguard Worker public:
26*a65addddSAndroid Build Coastguard Worker   virtual void greet() = 0;
27*a65addddSAndroid Build Coastguard Worker };
28*a65addddSAndroid Build Coastguard Worker 
29*a65addddSAndroid Build Coastguard Worker class GreeterImpl : public Greeter {
30*a65addddSAndroid Build Coastguard Worker private:
31*a65addddSAndroid Build Coastguard Worker   Writer* writer;
32*a65addddSAndroid Build Coastguard Worker 
33*a65addddSAndroid Build Coastguard Worker public:
34*a65addddSAndroid Build Coastguard Worker   // Like "GreeterImpl(Writer* writer) {...}" but also marks this constructor
35*a65addddSAndroid Build Coastguard Worker   // as the one to use for injection.
INJECT(GreeterImpl (Writer * writer))36*a65addddSAndroid Build Coastguard Worker   INJECT(GreeterImpl(Writer* writer)) : writer(writer) {}
37*a65addddSAndroid Build Coastguard Worker 
greet()38*a65addddSAndroid Build Coastguard Worker   virtual void greet() override {
39*a65addddSAndroid Build Coastguard Worker     writer->write("Hello world!\n");
40*a65addddSAndroid Build Coastguard Worker   }
41*a65addddSAndroid Build Coastguard Worker };
42*a65addddSAndroid Build Coastguard Worker 
getGreeterComponent()43*a65addddSAndroid Build Coastguard Worker Component<Greeter> getGreeterComponent() {
44*a65addddSAndroid Build Coastguard Worker   return fruit::createComponent().bind<Writer, StdoutWriter>().bind<Greeter, GreeterImpl>();
45*a65addddSAndroid Build Coastguard Worker }
46*a65addddSAndroid Build Coastguard Worker 
main()47*a65addddSAndroid Build Coastguard Worker int main() {
48*a65addddSAndroid Build Coastguard Worker 
49*a65addddSAndroid Build Coastguard Worker   Injector<Greeter> injector(getGreeterComponent);
50*a65addddSAndroid Build Coastguard Worker   Greeter* greeter = injector.get<Greeter*>();
51*a65addddSAndroid Build Coastguard Worker 
52*a65addddSAndroid Build Coastguard Worker   greeter->greet();
53*a65addddSAndroid Build Coastguard Worker 
54*a65addddSAndroid Build Coastguard Worker   return 0;
55*a65addddSAndroid Build Coastguard Worker }
56