]> git.proxmox.com Git - ceph.git/blame - ceph/src/jaegertracing/thrift/compiler/cpp/src/thrift/generate/t_generator_registry.h
buildsys: switch source download to quincy
[ceph.git] / ceph / src / jaegertracing / thrift / compiler / cpp / src / thrift / generate / t_generator_registry.h
CommitLineData
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
23class 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 */
32class t_generator_factory {
33public:
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
54private:
55 std::string short_name_;
56 std::string long_name_;
57 std::string documentation_;
58};
59
60template <typename generator>
61class t_generator_factory_impl : public t_generator_factory {
62public:
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
79class t_generator_registry {
80public:
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
92private:
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