14 #include <type_traits>
28 template <
class Loader>
31 std::shared_ptr<Loader> _so_loader;
38 explicit SymbolLoader(std::shared_ptr<Loader> loader): _so_loader(loader) {
39 if (_so_loader ==
nullptr) {
50 T* instantiateSymbol(
const std::string& name)
const {
51 T* instance =
nullptr;
53 StatusCode sts = bind_function<StatusCode(T*&, ResponseDesc*)>(name)(instance, &
desc);
67 std::function<T> bind_function(
const std::string& functionName)
const {
68 std::function<T> ptr(
reinterpret_cast<T*
>(_so_loader->get_symbol(functionName.c_str())));
78 class SOCreatorTrait {};
85 using enableIfSupportedChar =
typename std::enable_if<(std::is_same<C, char>::value || std::is_same<C, wchar_t>::value)>::type;
92 template <
class T,
class Loader = SharedObjectLoader>
94 template <
class U,
class W>
95 friend class SOPointer;
101 SOPointer() =
default;
107 template <
typename C,
108 typename = enableIfSupportedChar<C>>
109 explicit SOPointer(
const std::basic_string<C> & name)
110 : _so_loader(new Loader(name.c_str())),
111 _pointedObj(details::shared_from_irelease(
112 SymbolLoader<Loader>(_so_loader).template instantiateSymbol<T>(SOCreatorTrait<T>::name))) {}
118 explicit SOPointer(
const char * name)
119 : _so_loader(new Loader(name)),
120 _pointedObj(details::shared_from_irelease(
121 SymbolLoader<Loader>(_so_loader).template instantiateSymbol<T>(SOCreatorTrait<T>::name))) {}
127 explicit SOPointer(T* pointedObj): _so_loader(), _pointedObj(pointedObj) {
128 if (_pointedObj ==
nullptr) {
137 explicit SOPointer(std::shared_ptr<Loader> so_loader)
138 : _so_loader(so_loader),
139 _pointedObj(details::shared_from_irelease(
140 SymbolLoader<Loader>(_so_loader).template instantiateSymbol<T>(SOCreatorTrait<T>::name))) {}
146 template <
class U,
class W>
147 SOPointer(
const SOPointer<U, W>& that)
148 : _so_loader(
std::dynamic_pointer_cast<Loader>(that._so_loader)),
149 _pointedObj(
std::dynamic_pointer_cast<T>(that._pointedObj)) {
150 if (_pointedObj ==
nullptr) {
159 details::NoReleaseOn<T>* operator->() const noexcept {
160 return reinterpret_cast<details::NoReleaseOn<T>*
>(_pointedObj.get());
167 details::NoReleaseOn<T>* operator*() const noexcept {
168 return this->operator->();
171 explicit operator bool() const noexcept {
172 return (
nullptr != _so_loader) && (
nullptr != _pointedObj);
175 friend bool operator==(std::nullptr_t,
const SOPointer& ptr) noexcept {
178 friend bool operator==(
const SOPointer& ptr, std::nullptr_t) noexcept {
181 friend bool operator!=(std::nullptr_t,
const SOPointer& ptr) noexcept {
182 return static_cast<bool>(ptr);
184 friend bool operator!=(
const SOPointer& ptr, std::nullptr_t) noexcept {
185 return static_cast<bool>(ptr);
188 SOPointer& operator=(
const SOPointer& pointer) noexcept {
189 _pointedObj = pointer._pointedObj;
190 _so_loader = pointer._so_loader;
194 operator std::shared_ptr<Loader>() const noexcept {
202 std::shared_ptr<Loader> _so_loader;
207 std::shared_ptr<T> _pointedObj;
219 inline std::shared_ptr<T>
make_so_pointer(
const std::string & name) =
delete;
222 inline std::shared_ptr<T>
make_so_pointer(
const std::wstring & name) =
delete;
This is a header file with common inference engine definitions.
A header file for the main Inference Engine exception.
#define THROW_IE_EXCEPTION
A macro used to throw general exception with a description.
Definition: ie_exception.hpp:25
A header file for the Inference Engine plugins destruction mechanism.
Utility header file. Provides no release base class.
A header file for definition of abstraction over platform specific shared objects.
Inference Engine C++ API.
Definition: cldnn_config.hpp:15
@ C
A bias layout for operation.
Definition: ie_common.h:82
std::shared_ptr< T > make_so_pointer(const std::string &name)=delete
Creates a special shared_pointer wrapper for the given type from a specific shared module.
Definition: ie_extension.h:115
StatusCode
This enum contains codes for all possible return values of the interface functions.
Definition: ie_common.h:224
char msg[256]
Definition: ie_c_api.h:123