#ifndef my_utility_h
#define my_utility_h
////////////////////////////////////////////////////////////////
// 通用对象指针存取 CommonObjectPointerCollectSerialize<T> \
// 10.26号,能处理集合元素为各种 smart_ptr 的情况
////////////////////////////////////////////////////////////////
#include <boost/type_traits.hpp> // for boost::type_traits
#include <cassert> // for assert
namespace MyNS{
namespace detail{ /// support smart_ptr
template<bool bIsPtr>
struct SerialzeElem // pointer
{
template<typename T>
static void do_write(CArchive &ar,T const& op)
{
CObject *pOb = dynamic_cast<CObject*>(op);
assert(NULL != pOb);
ar<<pOb;
}
template<typename T>
static void do_read(CArchive &ar,T& op)
{
CObject *pOb=NULL;
ar>>pOb;
op = dynamic_cast<T>(pOb);
assert(NULL != op);
}
};
template<>
struct SerialzeElem<false> // smart_ptr
{
template<typename T>
static void do_write(CArchive &ar,T const& sp)
{
CObject *pOb = dynamic_cast<CObject*>(sp.get());
assert(NULL != pOb);
ar<<pOb;
}
template<typename T>
static void do_read(CArchive &ar,T& sp)
{
CObject *pOb=NULL;
ar>>pOb;
T::element_type* p = dynamic_cast<T::element_type*>(pOb);
assert(NULL != p);
sp = T(p);
}
};
} // end: detail
// 10.26 update: 支持元素类型为Smart_ptr的集合
// 通用对象指针的serialize
template<typename T> // T ==> std::list<…>;std::vector<…>
void CommonObjectPointerCollectSerialize( CArchive &ar, T &refAnyDataCollect )
{
DWORD dwCount;
if (ar.IsStoring())
{
dwCount = refAnyDataCollect.size();
ar<<dwCount;
assert(dwCount>=0);
T::iterator itBeg(refAnyDataCollect.begin()),itEnd(refAnyDataCollect.end());
for(; itBeg!=itEnd; ++itBeg)
{
sw::detail::SerialzeElem<boost::is_pointer<T::value_type>::value >::do_write(ar,*itBeg);
}
}
else
{
ar>>dwCount;
assert(dwCount>=0);
while (dwCount--)
{
T::value_type v;
sw::detail::SerialzeElem<boost::is_pointer<T::value_type>::value >::do_read(ar,v);
refAnyDataCollect.push_back( v );
}
}
}
} // end namespace:MyNS
#endif //my_utility_h
浙公网安备 33010602011771号