Apollo 10.0
自动驾驶开放平台
class_loader_utility.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_UTILITY_CLASS_LOADER_UTILITY_H_
18#define CYBER_CLASS_LOADER_UTILITY_CLASS_LOADER_UTILITY_H_
19
20#include <cassert>
21#include <cstdio>
22
23#include <map>
24#include <memory>
25#include <mutex>
26#include <string>
27#include <typeinfo>
28#include <utility>
29#include <vector>
30
33#include "cyber/common/log.h"
34
38namespace apollo {
39namespace cyber {
40namespace class_loader {
41
42class ClassLoader;
43
44namespace utility {
45
46using SharedLibraryPtr = std::shared_ptr<SharedLibrary>;
48 std::map<std::string, utility::AbstractClassFactoryBase*>;
49using BaseToClassFactoryMapMap = std::map<std::string, ClassClassFactoryMap>;
51 std::vector<std::pair<std::string, SharedLibraryPtr>>;
52using ClassFactoryVector = std::vector<AbstractClassFactoryBase*>;
53
55std::recursive_mutex& GetClassFactoryMapMapMutex();
57std::recursive_mutex& GetLibPathSharedLibMutex();
59 const std::string& typeid_base_class_name);
60std::string GetCurLoadingLibraryName();
61void SetCurLoadingLibraryName(const std::string& library_name);
64bool IsLibraryLoaded(const std::string& library_path, ClassLoader* loader);
65bool IsLibraryLoadedByAnybody(const std::string& library_path);
66bool LoadLibrary(const std::string& library_path, ClassLoader* loader);
67void UnloadLibrary(const std::string& library_path, ClassLoader* loader);
68template <typename Derived, typename Base>
69void RegisterClass(const std::string& class_name,
70 const std::string& base_class_name);
71template <typename Base>
72Base* CreateClassObj(const std::string& class_name, ClassLoader* loader);
73template <typename Base>
74std::vector<std::string> GetValidClassNames(ClassLoader* loader);
75
76template <typename Derived, typename Base>
77void RegisterClass(const std::string& class_name,
78 const std::string& base_class_name) {
79 AINFO << "registerclass:" << class_name << "," << base_class_name << ","
81
82 utility::AbstractClassFactory<Base>* new_class_factory_obj =
83 new utility::ClassFactory<Derived, Base>(class_name, base_class_name);
84 new_class_factory_obj->AddOwnedClassLoader(GetCurActiveClassLoader());
85 new_class_factory_obj->SetRelativeLibraryPath(GetCurLoadingLibraryName());
86
88 ClassClassFactoryMap& factory_map =
89 GetClassFactoryMapByBaseClass(typeid(Base).name());
90 factory_map[class_name] = new_class_factory_obj;
92}
93
94template <typename Base>
95Base* CreateClassObj(const std::string& class_name, ClassLoader* loader) {
97 ClassClassFactoryMap& factoryMap =
98 GetClassFactoryMapByBaseClass(typeid(Base).name());
99 AbstractClassFactory<Base>* factory = nullptr;
100 if (factoryMap.find(class_name) != factoryMap.end()) {
101 factory = dynamic_cast<utility::AbstractClassFactory<Base>*>(
102 factoryMap[class_name]);
103 }
105
106 Base* classobj = nullptr;
107 if (factory && factory->IsOwnedBy(loader)) {
108 classobj = factory->CreateObj();
109 }
110
111 return classobj;
112}
113
114template <typename Base>
115std::vector<std::string> GetValidClassNames(ClassLoader* loader) {
116 std::lock_guard<std::recursive_mutex> lck(GetClassFactoryMapMapMutex());
117
118 ClassClassFactoryMap& factoryMap =
119 GetClassFactoryMapByBaseClass(typeid(Base).name());
120 std::vector<std::string> classes;
121 for (auto& class_factory : factoryMap) {
122 AbstractClassFactoryBase* factory = class_factory.second;
123 if (factory && factory->IsOwnedBy(loader)) {
124 classes.emplace_back(class_factory.first);
125 }
126 }
127
128 return classes;
129}
130
131} // namespace utility
132} // namespace class_loader
133} // namespace cyber
134} // namespace apollo
135
136#endif // CYBER_CLASS_LOADER_UTILITY_CLASS_LOADER_UTILITY_H_
Definition base.h:20
for library load,createclass object
void SetRelativeLibraryPath(const std::string &library_path)
#define AINFO
Definition log.h:42
void RegisterClass(const std::string &class_name, const std::string &base_class_name)
ClassClassFactoryMap & GetClassFactoryMapByBaseClass(const std::string &typeid_base_class_name)
LibPathSharedLibVector & GetLibPathSharedLibVector()
std::map< std::string, utility::AbstractClassFactoryBase * > ClassClassFactoryMap
BaseToClassFactoryMapMap & GetClassFactoryMapMap()
std::vector< std::string > GetValidClassNames(ClassLoader *loader)
bool LoadLibrary(const std::string &library_path, ClassLoader *loader)
bool IsLibraryLoadedByAnybody(const std::string &library_path)
std::vector< std::pair< std::string, SharedLibraryPtr > > LibPathSharedLibVector
Base * CreateClassObj(const std::string &class_name, ClassLoader *loader)
std::recursive_mutex & GetClassFactoryMapMapMutex()
void SetCurActiveClassLoader(ClassLoader *loader)
void UnloadLibrary(const std::string &library_path, ClassLoader *loader)
void SetCurLoadingLibraryName(const std::string &library_name)
std::shared_ptr< SharedLibrary > SharedLibraryPtr
std::recursive_mutex & GetLibPathSharedLibMutex()
bool IsLibraryLoaded(const std::string &library_path, ClassLoader *class_loader)
std::vector< AbstractClassFactoryBase * > ClassFactoryVector
std::map< std::string, ClassClassFactoryMap > BaseToClassFactoryMapMap
class register implement
Definition arena_queue.h:37