Files

106 lines
2.8 KiB
C++

/*
* (c) Copyright, Real-Time Innovations, 2017.
* All rights reserved.
*
* No duplications, whole or partial, manual or electronic, may be made
* without express written permission. Any such copies, or
* revisions thereof, must display this notice unaltered.
* This code contains trade secrets of Real-Time Innovations, Inc.
*/
#ifndef RTI_ROUTING_DETAIL_FORWARDER_UTILS_UTILS_HPP_
#define RTI_ROUTING_DETAIL_FORWARDER_UTILS_UTILS_HPP_
#include <map>
#include <dds/topic/Topic.hpp>
#include <rti/core/Exception.hpp>
#include <routingservice/routingservice_infrastructure.h>
namespace rti { namespace routing { namespace detail {
#define RTI_ROUTING_THROW_ON_NULL(pointer) \
if ((pointer) == NULL) { \
throw dds::core::Error("invalid return of NULL"); \
}
#define RTI_ROUTING_THROW_ON_ENV_ERROR(NATIVE_ENV) \
if (RTI_RoutingServiceEnvironment_error_occurred((NATIVE_ENV))) { \
dds::core::Error rex( \
RTI_RoutingServiceEnvironment_get_error_message((NATIVE_ENV))); \
RTI_RoutingServiceEnvironment_clear_error((NATIVE_ENV)); \
throw rex; \
}
#define RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE( \
VECTOR, \
NATIVE_ARRAY, \
ARRAY_LENGTH) \
(VECTOR).resize((ARRAY_LENGTH)); \
memcpy(&((VECTOR)[0]), \
(NATIVE_ARRAY), \
sizeof (void*) * (ARRAY_LENGTH));
#define RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE_W_OFFSET( \
VECTOR, \
NATIVE_ARRAY, \
OFFSET, \
ARRAY_LENGTH) \
(VECTOR).resize((ARRAY_LENGTH) + (OFFSET)); \
memcpy(&((VECTOR)[OFFSET]), \
(NATIVE_ARRAY), \
sizeof (void*) * (ARRAY_LENGTH));
#define RTI_ROUTING_SAMPLE_VECTOR_COPY_PTRS( \
TO_VECTOR, \
FROM_VECTOR) \
(TO_VECTOR).resize((FROM_VECTOR).size()); \
if ((FROM_VECTOR).size() > 0) { \
memcpy( \
&(TO_VECTOR[0]), \
&(FROM_VECTOR)[0], \
sizeof(void*) * (FROM_VECTOR).size()); \
}
template <typename OwnerType, typename ForwarderType>
struct ScopedForwarder {
ScopedForwarder(
OwnerType *owner,
ForwarderType *forwarder,
RTI_RoutingServiceEnvironment *environment)
:owner_(owner), forwarder_(forwarder), environment_(environment)
{
}
void release()
{
forwarder_ = NULL;
}
~ScopedForwarder()
{
if (forwarder_ != NULL) {
ForwarderType::delete_native(
owner_,
forwarder_->native(),
environment_);
}
}
private:
OwnerType *owner_;
ForwarderType *forwarder_;
RTI_RoutingServiceEnvironment *environment_;
};
} } }
#endif // RTI_ROUTING_DETAIL_FORWARDER_UTILS_UTILS_HPP_