59 return (T*)(0x777777);
79 RCPNode *rcpNode = basicRCPNodeNoAlloc<T>(p, has_ownership);
88 (*node)->delete_obj();
145 #endif // TEUCHOS_DEBUG
155 typedef RCPNodeTracer::RCPNodeStatistics RCPNodeStatistics;
159 RCPNode *node = basicRCPNode<A>(
true);
173 rcpNodeStatisticsBefore.maxNumRCPNodes);
175 rcpNodeStatisticsBefore.totalNumRCPNodeAllocations+1);
177 rcpNodeStatisticsBefore.totalNumRCPNodeDeletions);
188 rcpNodeStatisticsBefore.maxNumRCPNodes);
190 rcpNodeStatisticsBefore.totalNumRCPNodeAllocations+1);
192 rcpNodeStatisticsBefore.totalNumRCPNodeDeletions+1);
195 std::ostringstream statsOut_oss;
197 std::ostringstream expectedStatsOut_oss;
200 <<
"\n*** RCPNode Tracing statistics:"
202 <<
"\n maxNumRCPNodes = "<<rcpNodeStatistics2.maxNumRCPNodes
203 <<
"\n totalNumRCPNodeAllocations = "<<rcpNodeStatistics2.totalNumRCPNodeAllocations
204 <<
"\n totalNumRCPNodeDeletions = "<<rcpNodeStatistics2.totalNumRCPNodeDeletions
206 TEST_EQUALITY(statsOut_oss.str(), expectedStatsOut_oss.str());
216 #ifdef HAVE_TEUCHOS_STACKTRACE
218 Teuchos::store_stacktrace();
221 RCPNode *node1 = basicRCPNodeNoAlloc<A>(a_ptr,
true);
225 RCPNode *node2 = basicRCPNodeNoAlloc<A>(a_ptr,
true);
230 node2->has_ownership(
false);
239 RCPNode *node1 = basicRCPNodeNoAlloc<A>(a_ptr,
true);
243 RCPNode *node2 = basicRCPNodeNoAlloc<A>(a_ptr,
false);
260 RCPNode *node1 = basicRCPNodeNoAlloc<A>(a_ptr,
false);
264 RCPNode *node2 = basicRCPNodeNoAlloc<A>(a_ptr,
true);
281 ECHO(RCPNode *node_c = basicRCPNodeNoAlloc<C>(c_ptr,
true));
282 ECHO(RCPNode *node_b1 = basicRCPNodeNoAlloc<B1>(c_ptr,
true));
286 #ifdef HAS_TEUCHOS_GET_BASE_OBJ_VOID_PTR
298 ECHO(node_b1->has_ownership(
false));
304 #ifdef HAVE_TEUCHOS_DEBUG_RCP_NODE_TRACING
308 RCPNode *node = basicRCPNode<A>(
true);
312 #endif // HAVE_TEUCHOS_DEBUG_RCP_NODE_TRACING
315 #endif // TEUCHOS_DEBUG
333 TEST_EQUALITY( nodeRef.get_base_obj_map_key_void_ptr(),
static_cast<void*
>(p) );
335 std::invalid_argument);
337 std::invalid_argument);
338 #endif // TEUCHOS_DEBUG
378 ECHO(nodeRef2.debug_assert_valid_ptr(mockRCP));
393 TEST_THROW( nodeRef2.debug_assert_valid_ptr(mockRCP),
417 ECHO(nodeRef2.debug_assert_valid_ptr(mockRCP));
429 nodeRef1.debug_assert_valid_ptr(mockRCP);
440 #if defined(TEUCHOS_DEBUG) && !defined(HAVE_TEUCHOS_DEBUG_RCP_NODE_TRACING)
441 # define DO_RCPNODE_TRACING_TESTS 1
445 #ifdef DO_RCPNODE_TRACING_TESTS
452 RCPNodeTracer::setTracingActiveRCPNodes(
true);
458 const std::string T_name =
"T_name";
459 const std::string concreateT_name =
"concreateT_name";
460 const bool has_ownership =
true;
461 RCPNode *node =
new RCPNodeTmpl<T,DeallocDelete<T> >(
462 p, DeallocDelete<T>(), has_ownership);
464 RCPNodeHandle nodeRef(node, p, T_name, concreateT_name, has_ownership);
468 out <<
"\nMake sure output is printed when there is an active node with tracing ...\n";
472 std::ostringstream expendedOutput_oss;
476 <<
" 0: RCPNode (map_key_void_ptr=" << rcpNodeKey <<
")\n"
477 <<
" Information = {T="<<T_name<<
", ConcreteT="<<concreateT_name<<
", p="<<p<<
", has_ownership="<<has_ownership<<
"}\n"
478 <<
" RCPNode address = " << node <<
"\n"
479 <<
" insertionNumber = " << node->insertion_number()
483 std::ostringstream printActiveRCPNodes_out;
485 TEST_EQUALITY( printActiveRCPNodes_out.str(), expendedOutput_oss.str() );
501 out <<
"\nMake sure no output is printed when there are no active nodes ...\n";
502 const std::string expendedOutput =
"";
503 std::ostringstream printActiveRCPNodes_out;
505 TEST_EQUALITY( printActiveRCPNodes_out.str(), expendedOutput );
507 RCPNodeTracer::setTracingActiveRCPNodes(
false);
517 RCPNodeTracer::setTracingActiveRCPNodes(
false);
521 const std::string T_name =
"T_name";
522 const std::string concreateT_name =
"concreateT_name";
523 const bool has_ownership =
true;
524 RCPNode *node =
new RCPNodeTmpl<T,DeallocDelete<T> >(
525 p, DeallocDelete<T>(), has_ownership);
527 RCPNodeHandle nodeRef(node, p, T_name, concreateT_name, has_ownership);
531 out <<
"\nMake sure no output is printed when there are no active nodes without tracing ...\n";
532 const std::string expendedOutput =
"";
533 std::ostringstream printActiveRCPNodes_out;
535 TEST_EQUALITY( printActiveRCPNodes_out.str(), expendedOutput );
540 #endif // DO_RCPNODE_TRACING_TESTS
586 nodeRef2 = std::move(nodeRef1);
622 any &a4 = nodeRef2.get_extra_data(a1.
typeName(),
"a1");
665 std::invalid_argument);
668 std::invalid_argument);
670 #endif // TEUCHOS_DEBUG
695 std::invalid_argument);
698 std::invalid_argument);
700 #endif // TEUCHOS_DEBUG
716 #ifdef DO_RCPNODE_TRACING_TESTS
718 # define DEBUG_UNIT_TEST_GROUP( T ) \
719 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, debugWithNodeTracingPrint, T ) \
720 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, debugWithoutNodeTracingPrint, T )
724 # define DEBUG_UNIT_TEST_GROUP( T )
729 #define UNIT_TEST_GROUP( T ) \
730 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, basicConstruct_owns_mem, T ) \
731 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, basicConstruct_no_owns_mem, T ) \
732 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, weakPtr_basic_1, T ) \
733 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, weakPtr_basic_2, T ) \
734 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, copyConstruct, T ) \
735 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, moveConstruct, T ) \
736 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, copyAssignmentOperator, T ) \
737 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, moveAssignmentOperator, T ) \
738 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, extraData_basic, T ) \
739 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, extraData_basic_const, T ) \
740 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, extraData_failed, T ) \
741 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( RCPNodeHandle, extraData_failed_const, T ) \
742 DEBUG_UNIT_TEST_GROUP(T)
Dangling reference error exception class.
Null reference error exception class.
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
#define TEST_INEQUALITY_CONST(v1, v2)
Assert the inequality of v1 and constant v2.
static void printRCPNodeStatistics(const RCPNodeStatistics &rcpNodeStatistics, std::ostream &out)
Print the RCPNode allocation statistics.
static const void * getRCPNodeBaseObjMapKeyVoidPtr(T *p)
Get a const void* address to be used as the lookup key for an RCPNode given its embedded object's typ...
#define ECHO(statement)
Echo the given statement before it is executed.
static bool isTracingActiveRCPNodes()
Return if we are tracing active nodes or not.
bool same(const any &other) const
Return if two any objects are the same or not.
any & get_extra_data(const std::string &type_name, const std::string &name)
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
#define TEST_THROW(code, ExceptType)
Assert that the statement 'code' throws the exception 'ExceptType' (otherwise the test fails)...
any * get_optional_extra_data(const std::string &type_name, const std::string &name)
static RCPNodeStatistics getRCPNodeStatistics()
Return the statistics on RCPNode allocations.
#define TEST_COMPARE(v1, comp, v2)
Assert that v1 comp v2 (where comp = '==', '>=", "!=", etc).
const T & getConst(T &t)
Return a constant reference to an object given a non-const reference.
#define UNIT_TEST_GROUP(T)
Modified boost::any class, which is a container for a templated value.
static std::string getCommonDebugNotesString()
Common error message string on how to debug RCPNode problems.
RCPNodeHandle basicRCPNodeHandle(const bool has_ownership, T **p_out=0)
Policy class for deallocator that uses delete to delete a pointer which is used by RCP...
TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL(RCPNodeHandle, basicConstruct_owns_mem, T)
Node class to keep track of address and the reference count for a reference-counted utility class and...
TEUCHOS_UNIT_TEST(ConstNonconstObjectContainer, create)
#define SET_RCPNODE_TRACING()
Templated implementation class of RCPNode that has the responsibility for deleting the reference-coun...
std::string concreteTypeName(const T &t)
Template function for returning the type name of the actual concrete name of a passed-in object...
void deleteRCPNode(RCPNode **node)
RCPNode * basicRCPNodeNoAlloc(T *p, const bool has_ownership)
RCPNodeHandle create_strong() const
Return a strong handle.
#define TEST_EQUALITY_CONST(v1, v2)
Assert the equality of v1 and constant v2.
void set_extra_data(const any &extra_data, const std::string &name, EPrePostDestruction destroy_when, bool force_unique)
static RCPNode * getExistingRCPNode(T *p)
Return a raw pointer to an existing owning RCPNode given the address to the underlying object if it e...
RCPNode * basicRCPNode(const bool has_ownership, T **p_out=0)
T * access_private_ptr() const
Handle class that manages the RCPNode's reference counting.
int strong_count() const
The strong count for this RCPNode, or 0 if the node is NULL.
void has_ownership(bool has_ownership_in)
static void removeRCPNode(RCPNode *rcp_node)
Remove an RCPNode from global list.
std::string typeName() const
Return the name of the type.
bool same_node(const RCPNodeHandle &node2) const
Whether the RCPNode for which node2 is a handle is the same RCPNode as this object's RCPNode...
#define TEUCHOS_ASSERT(assertion_test)
This macro is throws when an assert fails.
RCPNode * node_ptr() const
Return a pointer to the underlying RCPNode.
RCPNodeHandle create_weak() const
Return a weak handle.
Reference-counted pointer node classes.
static std::string getActiveRCPNodeHeaderString()
Header string used in printActiveRCPNodes().
Defines basic traits returning the name of a type in a portable and readable way. ...
static int numActiveRCPNodes()
Print the number of active RCPNode objects currently being tracked.
static void addNewRCPNode(RCPNode *rcp_node, const std::string &info)
Add new RCPNode to the global list.
static void printActiveRCPNodes(std::ostream &out)
Print the list of currently active RCP nodes.