#ifndef mslk_utility_h_12345
#define mslk_utility_h_12345
#include <boost/type_traits.hpp> // for boost::type_traits
#include <cassert> // for assert
#include <vector> // for std::vector
#include <memory> // for std::auto_ptr
#include <afxtempl.h> // for mfc::collect
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 );
}
}
}
#endif //mslk_utility_h_12345