19 #include <type_traits> 21 #include "plugin_api.h" 45 explicit ScopedRef(T* ptr =
nullptr,
bool increaseRef =
true):
49 if (m_ptr && increaseRef)
50 const_cast<std::remove_const_t<T>*
>(m_ptr)->addRef();
55 m_ptr = right.release();
58 ScopedRef<T>& operator=(ScopedRef<T>&& right)
60 m_ptr = right.release();
66 ScopedRef<T>& operator=(
const ScopedRef<T>&) =
delete;
70 operator bool()
const {
return m_ptr !=
nullptr; }
73 T*
get() {
return m_ptr; }
76 const T*
get()
const {
return m_ptr; }
78 T* operator->() {
return m_ptr; }
79 const T* operator->()
const {
return m_ptr; }
98 const_cast<std::remove_const_t<T>*
>(m_ptr)->releaseRef();
114 const_cast<std::remove_const_t<T>*
>(m_ptr)->addRef();
122 typedef volatile LONG AtomicLong;
124 typedef volatile long AtomicLong;
126 #error "Unsupported compiler is used." 130 static AtomicLong
inc(AtomicLong* val)
133 return InterlockedIncrement(val);
135 return __sync_add_and_fetch(val, 1);
140 static AtomicLong
dec(AtomicLong* val)
143 return InterlockedDecrement(val);
145 return __sync_sub_and_fetch(val, 1);
170 m_objToWatch(objToWatch),
171 m_refCountingDelegate(0)
180 m_refCountingDelegate(refCountingDelegate)
187 return m_refCountingDelegate
188 ? m_refCountingDelegate->
addRef()
189 : atomic::inc(&m_refCount);
198 if (m_refCountingDelegate)
201 unsigned int newRefCounter = atomic::dec(&m_refCount);
202 if (newRefCounter == 0)
204 return newRefCounter;
207 unsigned int refCount()
const 209 if (m_refCountingDelegate)
210 return m_refCountingDelegate->refCount();
215 atomic::AtomicLong m_refCount;
217 CommonRefManager* m_refCountingDelegate;
220 template <
typename T>
230 virtual unsigned int addRef()
override {
return m_refManager.
addRef(); }
231 virtual unsigned int releaseRef()
override {
return m_refManager.
releaseRef(); }
233 unsigned int refCount()
const {
return m_refManager.refCount(); }
246 template<
typename Interface>
250 return commonRefCounter->refCount();
255 enum NxGuidFormatOption
260 applyAll = uppercase | hyphens | braces
268 return {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
274 memcpy(result.
bytes, data,
sizeof(result.
bytes));
278 static nxpl::NX_GUID fromStdString(
const std::string& guidStr)
280 static const auto kMinGuidStrSize = 32;
281 static const auto kGuidBytesNumber = 16;
283 if (guidStr.size() < kMinGuidStrSize)
284 return NxGuidHelper::nullGuid();
287 int currentByteIndex = 0;
288 std::string currentByteString;
289 for (std::string::size_type i = 0; i < guidStr.size(); ++i)
291 if (guidStr[i] ==
'{' || guidStr[i] ==
'}' || guidStr[i] ==
'-' 292 || guidStr[i] ==
'\t' || guidStr[i] ==
'\n' || guidStr[i] ==
'r' 293 || guidStr[i] ==
' ')
298 if (currentByteIndex >= kGuidBytesNumber)
299 return NxGuidHelper::nullGuid();
301 currentByteString += guidStr[i];
302 if (currentByteString.size() == 2)
304 char* pEnd =
nullptr;
306 const long v = std::strtol(currentByteString.c_str(), &pEnd, 16);
307 const bool hasError = v > std::numeric_limits<unsigned char>::max()
308 || v < std::numeric_limits<unsigned char>::min()
313 return NxGuidHelper::nullGuid();
315 guid.
bytes[currentByteIndex] = (
unsigned char) v;
317 currentByteString.clear();
321 if (currentByteIndex != kGuidBytesNumber)
322 return NxGuidHelper::nullGuid();
328 static std::string toStdString(
330 unsigned int format = NxGuidFormatOption::applyAll)
332 std::stringstream ss;
333 ss << std::hex << std::setfill(
'0');
335 if (format & NxGuidFormatOption::braces)
338 if (format & NxGuidFormatOption::uppercase)
339 ss << std::uppercase;
341 for (
int i = 0; i < 4; ++i)
344 ss << static_cast<unsigned int>(guid.
bytes[i]);
347 if (format & NxGuidFormatOption::hyphens)
350 for (
int i = 0; i < 2; ++i)
353 ss << static_cast<unsigned int>(guid.
bytes[4 + i]);
356 if (format & NxGuidFormatOption::hyphens)
359 for (
int i = 0; i < 2; ++i)
362 ss << static_cast<unsigned int>(guid.
bytes[6 + i]);
365 if (format & NxGuidFormatOption::hyphens)
368 for (
int i = 0; i < 2; ++i)
371 ss << static_cast<unsigned int>(guid.
bytes[8 + i]);
374 if (format & NxGuidFormatOption::hyphens)
377 for (
int i = 0; i < 6; ++i)
380 ss << static_cast<unsigned int>(guid.
bytes[10 + i]);
383 if (format & NxGuidFormatOption::braces)
398 inline std::ostream& operator<<(std::ostream& os,
const nxpl::NX_GUID&
id)
400 return os << nxpt::toStdString(
id);
414 for (
size_t i = 0; i <
sizeof(guid.
bytes); ++i)
415 h = (h + (324723947 + guid.
bytes[i])) ^ 93485734985;
ScopedRef(T *ptr=nullptr, bool increaseRef=true)
Definition: plugin_tools.h:45
unsigned char bytes[16]
GUID bytes.
Definition: plugin_api.h:24
T * release()
Definition: plugin_tools.h:82
Definition: plugin_tools.h:405
Base class for every interface, provided by plugin.
Definition: plugin_api.h:38
CommonRefManager(nxpl::PluginInterface *objToWatch)
Definition: plugin_tools.h:168
void reset(T *ptr=nullptr)
Definition: plugin_tools.h:93
GUID of plugin interface.
Definition: plugin_api.h:21
ScopedRef(void *ptr)
Definition: plugin_tools.h:42
unsigned int releaseRef()
Definition: plugin_tools.h:196
VMS dynamic plugin API (c++)
Definition: plugin_api.h:18
Definition: plugin_tools.h:263
Definition: plugin_tools.h:221
CommonRefManager(CommonRefManager *refCountingDelegate)
Definition: plugin_tools.h:179
Definition: plugin_tools.h:38
Definition: plugin_tools.h:158
Definition: plugin_tools.h:25
unsigned int addRef()
Definition: plugin_tools.h:185