00001 // -*- C++ -*- 00002 // 00003 // Package: Core 00004 // Class : FWItemTVirtualCollectionProxyAccessor 00005 // 00006 // Implementation: 00007 // <Notes on implementation> 00008 // 00009 // Original Author: Chris Jones 00010 // Created: Sat Oct 18 08:43:47 EDT 2008 00011 // $Id: FWItemTVirtualCollectionProxyAccessor.cc,v 1.7 2010/11/01 14:48:19 matevz Exp $ 00012 // 00013 00014 // system include files 00015 #include "Reflex/Object.h" 00016 #include "TVirtualCollectionProxy.h" 00017 00018 // user include files 00019 #include "Fireworks/Core/src/FWItemTVirtualCollectionProxyAccessor.h" 00020 00021 00022 // 00023 // constants, enums and typedefs 00024 // 00025 00026 // 00027 // static data member definitions 00028 // 00029 00030 // 00031 // constructors and destructor 00032 // 00033 FWItemTVirtualCollectionProxyAccessor::FWItemTVirtualCollectionProxyAccessor( 00034 const TClass* iType, 00035 boost::shared_ptr<TVirtualCollectionProxy> iProxy, 00036 size_t iOffset) 00037 : m_type(iType), 00038 m_colProxy(iProxy), 00039 m_data(0), 00040 m_offset(iOffset) 00041 { 00042 } 00043 00044 // FWItemTVirtualCollectionProxyAccessor::FWItemTVirtualCollectionProxyAccessor(const FWItemTVirtualCollectionProxyAccessor& rhs) 00045 // { 00046 // // do actual copying here; 00047 // } 00048 00049 FWItemTVirtualCollectionProxyAccessor::~FWItemTVirtualCollectionProxyAccessor() 00050 { 00051 } 00052 00053 // 00054 // assignment operators 00055 // 00056 // const FWItemTVirtualCollectionProxyAccessor& FWItemTVirtualCollectionProxyAccessor::operator=(const FWItemTVirtualCollectionProxyAccessor& rhs) 00057 // { 00058 // //An exception safe implementation is 00059 // FWItemTVirtualCollectionProxyAccessor temp(rhs); 00060 // swap(rhs); 00061 // 00062 // return *this; 00063 // } 00064 00065 // 00066 // member functions 00067 // 00068 void 00069 FWItemTVirtualCollectionProxyAccessor::setData(const ROOT::Reflex::Object& product) 00070 { 00071 if (product.Address() == 0) 00072 { 00073 reset(); 00074 return; 00075 } 00076 00077 using ROOT::Reflex::Object; 00078 if(product.TypeOf().IsTypedef()) 00079 m_data = Object(product.TypeOf().ToType(),product.Address()).Address(); 00080 else 00081 m_data = product.Address(); 00082 00083 assert(0!=m_data); 00084 m_colProxy->PushProxy(static_cast<char*>(const_cast<void*>(m_data))+m_offset); 00085 } 00086 00087 void 00088 FWItemTVirtualCollectionProxyAccessor::reset() 00089 { 00090 if (0 != m_data) 00091 { 00092 m_data=0; 00093 m_colProxy->PopProxy(); 00094 } 00095 } 00096 00097 // 00098 // const member functions 00099 // 00100 const void* 00101 FWItemTVirtualCollectionProxyAccessor::modelData(int iIndex) const 00102 { 00103 if ( 0 == m_data) { return m_data; } 00104 return m_colProxy->At(iIndex); 00105 } 00106 00107 const void* 00108 FWItemTVirtualCollectionProxyAccessor::data() const 00109 { 00110 return m_data; 00111 } 00112 00113 unsigned int 00114 FWItemTVirtualCollectionProxyAccessor::size() const 00115 { 00116 if(m_data==0) { 00117 return 0; 00118 } 00119 return m_colProxy->Size(); 00120 } 00121 00122 const TClass* 00123 FWItemTVirtualCollectionProxyAccessor::modelType() const 00124 { 00125 return m_colProxy->GetValueClass(); 00126 } 00127 00128 const TClass* 00129 FWItemTVirtualCollectionProxyAccessor::type() const 00130 { 00131 return m_type; 00132 } 00133 00134 bool 00135 FWItemTVirtualCollectionProxyAccessor::isCollection() const 00136 { 00137 return true; 00138 } 00139 00140 // 00141 // static member functions 00142 //