]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* |
2 | * Licensed to the Apache Software Foundation (ASF) under one | |
3 | * or more contributor license agreements. See the NOTICE file | |
4 | * distributed with this work for additional information | |
5 | * regarding copyright ownership. The ASF licenses this file | |
6 | * to you under the Apache License, Version 2.0 (the | |
7 | * "License"); you may not use this file except in compliance | |
8 | * with the License. You may obtain a copy of the License at | |
9 | * | |
10 | * http://www.apache.org/licenses/LICENSE-2.0 | |
11 | * | |
12 | * Unless required by applicable law or agreed to in writing, | |
13 | * software distributed under the License is distributed on an | |
14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
15 | * KIND, either express or implied. See the License for the | |
16 | * specific language governing permissions and limitations | |
17 | * under the License. | |
18 | */ | |
19 | ||
20 | #ifndef T_GENERATOR_REGISTRY_H | |
21 | #define T_GENERATOR_REGISTRY_H | |
22 | ||
23 | class t_generator; | |
24 | ||
25 | /** | |
26 | * A factory for producing generator classes of a particular language. | |
27 | * | |
28 | * This class is also responsible for: | |
29 | * - Registering itself with the generator registry. | |
30 | * - Providing documentation for the generators it produces. | |
31 | */ | |
32 | class t_generator_factory { | |
33 | public: | |
34 | t_generator_factory(const std::string& short_name, | |
35 | const std::string& long_name, | |
36 | const std::string& documentation); | |
37 | ||
38 | virtual ~t_generator_factory() = default; | |
39 | ||
40 | virtual t_generator* get_generator( | |
41 | // The program to generate. | |
42 | t_program* program, | |
43 | // Note: parsed_options will not exist beyond the call to get_generator. | |
44 | const std::map<std::string, std::string>& parsed_options, | |
45 | // Note: option_string might not exist beyond the call to get_generator. | |
46 | const std::string& option_string) = 0; | |
47 | ||
48 | virtual bool is_valid_namespace(const std::string& sub_namespace) = 0; | |
49 | ||
50 | std::string get_short_name() { return short_name_; } | |
51 | std::string get_long_name() { return long_name_; } | |
52 | std::string get_documentation() { return documentation_; } | |
53 | ||
54 | private: | |
55 | std::string short_name_; | |
56 | std::string long_name_; | |
57 | std::string documentation_; | |
58 | }; | |
59 | ||
60 | template <typename generator> | |
61 | class t_generator_factory_impl : public t_generator_factory { | |
62 | public: | |
63 | t_generator_factory_impl(const std::string& short_name, | |
64 | const std::string& long_name, | |
65 | const std::string& documentation) | |
66 | : t_generator_factory(short_name, long_name, documentation) {} | |
67 | ||
68 | t_generator* get_generator(t_program* program, | |
69 | const std::map<std::string, std::string>& parsed_options, | |
70 | const std::string& option_string) override { | |
71 | return new generator(program, parsed_options, option_string); | |
72 | } | |
73 | ||
74 | bool is_valid_namespace(const std::string& sub_namespace) override { | |
75 | return generator::is_valid_namespace(sub_namespace); | |
76 | } | |
77 | }; | |
78 | ||
79 | class t_generator_registry { | |
80 | public: | |
81 | static void register_generator(t_generator_factory* factory); | |
82 | ||
83 | static t_generator* get_generator(t_program* program, const std::string& options); | |
84 | static t_generator* get_generator(t_program* program, | |
85 | const std::string& laugnage, | |
86 | const std::map<std::string, std::string>& parsed_options, | |
87 | const std::string& options); | |
88 | ||
89 | typedef std::map<std::string, t_generator_factory*> gen_map_t; | |
90 | static gen_map_t& get_generator_map(); | |
91 | ||
92 | private: | |
93 | t_generator_registry(); | |
94 | t_generator_registry(const t_generator_registry&); | |
95 | }; | |
96 | ||
97 | #define THRIFT_REGISTER_GENERATOR(language, long_name, doc) \ | |
98 | class t_##language##_generator_factory_impl \ | |
99 | : public t_generator_factory_impl<t_##language##_generator> { \ | |
100 | public: \ | |
101 | t_##language##_generator_factory_impl() \ | |
102 | : t_generator_factory_impl<t_##language##_generator>(#language, long_name, doc) {} \ | |
103 | }; \ | |
104 | static t_##language##_generator_factory_impl _registerer; | |
105 | ||
106 | #endif |