template<class T> inline
ArrayRCP<T>::ArrayRCP(
  T* p, size_type lowerOffset_in, size_type size_in,
  bool has_ownership_in, const ERCPNodeLookup rcpNodeLookup
  )
  : ptr_(p),
#ifndef TEUCHOS_DEBUG
    node_(ArrayRCP_createNewRCPNodeRawPtr(p, has_ownership_in)),
#endif // TEUCHOS_DEBUG
    lowerOffset_(lowerOffset_in),
    upperOffset_(size_in + lowerOffset_in - 1)
{
#ifdef TEUCHOS_DEBUG
  if (p) {
    RCPNode* existing_RCPNode = 0;
    if (!has_ownership_in && rcpNodeLookup==RCP_ENABLE_NODE_LOOKUP) {
      existing_RCPNode = RCPNodeTracer::getExistingRCPNode(p);
    }
    if (existing_RCPNode) {
      // Will not call add_new_RCPNode(...)
      node_ = RCPNodeHandle(existing_RCPNode, RCP_WEAK, false);
    }
    else {
      // Will call add_new_RCPNode(...)
      RCPNodeThrowDeleter nodeDeleter(ArrayRCP_createNewRCPNodeRawPtr(p, has_ownership_in));
      node_ = RCPNodeHandle(
        nodeDeleter.get(),
        p, typeName(*p), concreteTypeName(*p),
        has_ownership_in
        );
      nodeDeleter.release();
    }
  }
#endif // TEUCHOS_DEBUG
}
RCPNodeHandle basicRCPNodeHandle(const bool has_ownership, T **p_out = 0)
{
  T *p = 0;
  RCPNode *rcpNode = basicRCPNode(has_ownership, &p);
  if (p_out)
    *p_out = p;
#ifdef TEUCHOS_DEBUG
  return RCPNodeHandle(rcpNode, p, typeName(*p), concreteTypeName(*p), has_ownership);
#else
  return RCPNodeHandle(rcpNode);
#endif
}
inline
ArrayRCP<T>::ArrayRCP(
  T* p, size_type lowerOffset_in, size_type size_in,
  Dealloc_T dealloc, bool has_ownership_in
  )
  : ptr_(p),
#ifndef TEUCHOS_DEBUG
    node_(ArrayRCP_createNewDeallocRCPNodeRawPtr(p, dealloc, has_ownership_in)),
#endif // TEUCHOS_DEBUG
    lowerOffset_(lowerOffset_in),
    upperOffset_(size_in + lowerOffset_in - 1)
{
#ifdef TEUCHOS_DEBUG
  if (p) {
    node_ = RCPNodeHandle(
      ArrayRCP_createNewDeallocRCPNodeRawPtr(p, dealloc, has_ownership_in),
      p, typeName(*p), concreteTypeName(*p),
      has_ownership_in
      //, RCP_STRONG, false
      );
  }
#endif // TEUCHOS_DEBUG
}