You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.7 KiB

// ==================================================
// Copyright 2014.
// Siemens Product Lifecycle Management Software Inc.
// All Rights Reserved.
// ==================================================
/**
@file
This file contains the declaration for a BusinessObjectExtenderRef smart pointer.
*/
/* */
#ifndef TCBUSINESSOBJECTEXTENDERREF_HXX
#define TCBUSINESSOBJECTEXTENDERREF_HXX
#include <unidefs.h>
#include <metaframework/BusinessObjectExtenderRegistry.hxx>
#include <metaframework/RootObject.hxx>
/**
@ingroup BO
@{
@brief BusinessObjectExtenderRef smart pointer.
BusinessObjectExtenderRef smart pointer. It is similar BusinessObjectRef.
@code
tag_t owningObjectTag = fromSomewhere();
...
BusinessObjectExtenderRef<ExtenderObjectQualifiedName> extenderRef( owningObjectTag );
extenderRef->getXYZ(...);
@endcode
*/
template <typename T> class BusinessObjectExtenderRef
{
public:
/**
Default constructor
*/
BusinessObjectExtenderRef(): m_owning_obj_tag(0), m_pointee( 0 ) {}
/**
Constructor
*/
explicit BusinessObjectExtenderRef(
tag_t owning_obj_tag /**< (I) The input Owning Object tag */
)
: m_owning_obj_tag( owning_obj_tag ), m_pointee( 0 )
{}
/**
Constructor
*/
explicit BusinessObjectExtenderRef(
Teamcenter::RootObject owning_object /**< (I) The input Owning Object */
)
: m_owning_obj_tag( 0 ), m_pointee( 0 )
{
m_owning_obj_tag = owning_object.getTag();
m_pointee = getPointee();
}
/**
Template for BusinessObjectExtenderRef
*/
template<typename S> explicit BusinessObjectExtenderRef(const BusinessObjectExtenderRef<S> &other)
{
m_owning_obj_tag = other.m_owning_obj_tag;
m_pointee = other.m_pointee ? dynamic_cast<T*>(other.m_pointee) : 0;
}
/**
Copy constructor for BusinessObjectExtenderRef
*/
BusinessObjectExtenderRef& operator = (
const BusinessObjectExtenderRef& other /**< (I) The input BusinessObjectExtenderRef */
)
{
if ( this != &other )
{
m_pointee = other.m_pointee;
m_owning_obj_tag = other.m_owning_obj_tag;
}
return *this;
}
/**
Assignment operator for BusinessObjectExtenderRef
*/
BusinessObjectExtenderRef& operator = (
tag_t owning_obj_tag /**< (I) The input Owning Object tag */
)
{
m_pointee = 0;
m_owning_obj_tag = owning_obj_tag;
return *this;
}
/**
Operator to return a pointer to the BusinessObjectExtenderRef
*/
T* operator->() const { return getPointee(); }
/**
Operator to return a reference to the BusinessObjectExtenderRef
*/
const T& operator*() const { return *getPointee(); }
/**
Template for isInstanceOf
@returns true if input class is an instance of this class.
*/
template <typename U> bool isInstanceOf() const
{
return dynamic_cast<U*>(getPointee()) ? true : false;
}
/**
Destructor for a BusinessObjectExtenderRef
*/
virtual ~BusinessObjectExtenderRef()
{
m_pointee = 0;
}
private:
T* getPointee() const
{
if ( m_owning_obj_tag && !m_pointee )
{
m_pointee = T::extenderRegistry().findExtenderObject( m_owning_obj_tag );
}
return m_pointee;
}
template<typename S> friend class BusinessObjectExtenderRef;
/**
The Owning object tag
*/
tag_t m_owning_obj_tag;
mutable T* m_pointee;
};
/** @} */
#endif