Gazebo Plugin

API Reference

2.0.3
gz/plugin/Plugin.hh
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017 Open Source Robotics Foundation
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 
18 
19 #ifndef GZ_PLUGIN_PLUGIN_HH_
20 #define GZ_PLUGIN_PLUGIN_HH_
21 
22 #include <memory>
23 #include <map>
24 #include <string>
25 
26 #include <gz/utils/SuppressWarning.hh>
27 
28 #include <gz/plugin/Export.hh>
29 #include <gz/plugin/Info.hh>
30 
31 namespace gz
32 {
33  namespace plugin
34  {
35  // Forward declaration
36  namespace detail {
37  template <class, class> class ComposePlugin;
38  template <class> class SelectSpecializers;
39  }
40  class EnablePluginFromThis;
41  class WeakPluginPtr;
42 
43  class GZ_PLUGIN_VISIBLE Plugin
44  {
45  // -------------------- Public API ---------------------
46 
62  public: template <class Interface>
63  Interface *QueryInterface();
64 
66  public: template <class Interface>
67  const Interface *QueryInterface() const;
68 
86  public: template <class Interface>
87  std::shared_ptr<Interface> QueryInterfaceSharedPtr();
88 
91  public: template <class Interface>
92  std::shared_ptr<const Interface> QueryInterfaceSharedPtr() const;
93 
97  public: template <class Interface>
98  bool HasInterface() const;
99 
113  public: bool HasInterface(const std::string &_interfaceName,
114  const bool _demangled = true) const;
115 
119  public: const std::string *Name() const;
120 
121  // -------------------- Private API -----------------------
122 
123  template <class> friend class TemplatePluginPtr;
124  template <class...> friend class SpecializedPlugin;
125  template <class, class> friend class detail::ComposePlugin;
126  template <class> friend class detail::SelectSpecializers;
127  friend class EnablePluginFromThis;
128  friend class WeakPluginPtr;
129 
133  protected: Plugin();
134 
136  private: void *PrivateQueryInterface(
137  const std::string &_interfaceName) const;
138 
140  private: void PrivateCopyPluginInstance(const Plugin &_other) const;
141 
147  private: void PrivateCopyPluginInstance(
148  const ConstInfoPtr &_info,
149  const std::shared_ptr<void> &_instancePtr) const;
150 
156  private: void PrivateCreatePluginInstance(
157  const ConstInfoPtr &_info,
158  const std::shared_ptr<void> &_dlHandlePtr) const;
159 
164  private: void PrivateCreateStaticPluginInstance(
165  const ConstInfoPtr &_info) const;
166 
167 
170  private: const std::shared_ptr<void> &PrivateGetInstancePtr() const;
171 
173  private: const ConstInfoPtr &PrivateGetInfoPtr() const;
174 
181 
184  private: InterfaceMap::iterator PrivateGetOrCreateIterator(
185  const std::string &_interfaceName);
186 
187  class Implementation;
188  GZ_UTILS_WARN_IGNORE__DLL_INTERFACE_MISSING
190  private: const std::unique_ptr<Implementation> dataPtr;
191  GZ_UTILS_WARN_RESUME__DLL_INTERFACE_MISSING
192 
194  public: virtual ~Plugin();
195  };
196  }
197 }
198 
199 #include "gz/plugin/detail/Plugin.hh"
200 
201 #endif