Apollo 10.0
自动驾驶开放平台
class_loader_manager.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#ifndef CYBER_CLASS_LOADER_CLASS_LOADER_MANAGER_H_
18#define CYBER_CLASS_LOADER_CLASS_LOADER_MANAGER_H_
19
20#include <map>
21#include <memory>
22#include <mutex>
23#include <string>
24#include <vector>
25
27
28namespace apollo {
29namespace cyber {
30namespace class_loader {
31
33 public:
35 virtual ~ClassLoaderManager();
36
37 bool LoadLibrary(const std::string& library_path);
38 void UnloadAllLibrary();
39 bool IsLibraryValid(const std::string& library_path);
40 template <typename Base>
41 std::shared_ptr<Base> CreateClassObj(const std::string& class_name);
42 template <typename Base>
43 std::shared_ptr<Base> CreateClassObj(const std::string& class_name,
44 const std::string& library_path);
45 template <typename Base>
46 bool IsClassValid(const std::string& class_name);
47 template <typename Base>
48 std::vector<std::string> GetValidClassNames();
49
55 template <typename Base>
56 std::string GetClassValidLibrary(const std::string& class_name);
57
58 private:
59 ClassLoader* GetClassLoaderByLibPath(const std::string& library_path);
60 std::vector<ClassLoader*> GetAllValidClassLoaders();
61 std::vector<std::string> GetAllValidLibPath();
62 int UnloadLibrary(const std::string& library_path);
63
64 private:
65 std::mutex libpath_loader_map_mutex_;
66 std::map<std::string, ClassLoader*> libpath_loader_map_;
67};
68
69template <typename Base>
71 const std::string& class_name) {
72 std::vector<ClassLoader*> class_loaders = GetAllValidClassLoaders();
73 for (auto class_loader : class_loaders) {
74 if (class_loader->IsClassValid<Base>(class_name)) {
75 return (class_loader->CreateClassObj<Base>(class_name));
76 }
77 }
78 AERROR << "Invalid class name: " << class_name;
79 return std::shared_ptr<Base>();
80}
81
82template <typename Base>
84 const std::string& class_name, const std::string& library_path) {
85 ClassLoader* loader = GetClassLoaderByLibPath(library_path);
86 if (loader) {
87 return (loader->CreateClassObj<Base>(class_name));
88 }
89 AERROR << "Could not create classobj, there is no ClassLoader in: "
90 << class_name;
91 return std::shared_ptr<Base>();
92}
93
94template <typename Base>
95bool ClassLoaderManager::IsClassValid(const std::string& class_name) {
96 std::vector<std::string> valid_classes = GetValidClassNames<Base>();
97 return (valid_classes.end() !=
98 std::find(valid_classes.begin(), valid_classes.end(), class_name));
99}
100
101template <typename Base>
102std::vector<std::string> ClassLoaderManager::GetValidClassNames() {
103 std::vector<std::string> valid_classes;
104 for (auto class_loader : GetAllValidClassLoaders()) {
105 std::vector<std::string> class_loaders =
106 class_loader->GetValidClassNames<Base>();
107 valid_classes.insert(valid_classes.end(), class_loaders.begin(),
108 class_loaders.end());
109 }
110 return valid_classes;
111}
112
113template <typename Base>
115 const std::string& class_name) {
116 for (auto& lib_class_loader : libpath_loader_map_) {
117 if (lib_class_loader.second != nullptr) {
118 if (lib_class_loader.second->IsClassValid<Base>(class_name)) {
119 return lib_class_loader.first;
120 }
121 }
122 }
123 return "";
124}
125
126} // namespace class_loader
127} // namespace cyber
128} // namespace apollo
129
130#endif // CYBER_CLASS_LOADER_CLASS_LOADER_MANAGER_H_
Definition base.h:20
bool IsClassValid(const std::string &class_name)
bool IsLibraryValid(const std::string &library_path)
std::shared_ptr< Base > CreateClassObj(const std::string &class_name)
bool LoadLibrary(const std::string &library_path)
std::string GetClassValidLibrary(const std::string &class_name)
get pathof library that class belongs to
for library load,createclass object
std::shared_ptr< Base > CreateClassObj(const std::string &class_name)
#define AERROR
Definition log.h:44
class register implement
Definition arena_queue.h:37