Template functions for standard library containers Serialize, support various intelligent pointers!

xiaoxiao2021-03-06  44

#ifndef mslk_utility_h_12345

#define mslk_utility_h_12345

#include // for Boost :: Type_Traits

#include // for assert

#include // for std :: Vector

#include // for std :: auto_ptr

#include // for mfc :: Collect

Namespace detail {/// support smart_ptr

Template

Struct serialzeelem // Pointer

{

Template

Static Void Do_write (CARCHIVE & AR, T Const & OP)

{

COBJECT * POB = Dynamic_cast (OP);

askERT (NULL! = POB);

Ar << POB;

}

Template

Static Void Do_read (Carchive & Ar, T & OP)

{

COBJECT * POB = NULL;

AR >> POB;

Op = Dynamic_cast (POB);

Assert (null! = OP);

}

}

Template <>

Struct serialzeelem // smart_ptr

{

Template

Static Void Do_write (CARCHIVE & AR, T Const & SP)

{

COBJECT * POB = Dynamic_cast (sp.get ());

askERT (NULL! = POB);

Ar << POB;

}

Template

Static Void Do_read (Carchive & Ar, T & SP)

{

COBJECT * POB = NULL;

AR >> POB;

T :: Element_Type * P = Dynamic_cast (POB);

Assert (null! = p);

SP = T (P);

}

}

} // end: detail

// 10.26 Update: Add feature, support element type set for smart_ptr

// universal object pointer Serialize

Template // T ==> std :: list <...>; std :: vector <...>

Void CommonObjectPointercollectSerialize (CARCHIVE & Ar, T & Refanydatacolect)

{

DWORD DWCOUNT;

IF (ar.isstoring ())

{

DWCount = refanydatacollect.size ();

Ar << dwcount;

Assert (dwcount> = 0);

T :: Iterator itbeg (Refanydatacolect.begin ()), ITEND (Refanydatacolect.end ()); for (; itbeg! = Ity; iTBEG)

{

SW :: Detail :: Serialzeelem :: value> :: do_write (ar, * itbeg);

}

}

Else

{

DWCOUNT;

Assert (dwcount> = 0);

While (dwcount--)

{

T :: value_type v;

Sw :: detail :: serialzeelem :: value> :: do_read (ar, v);

REFANYDATACOLLECT.PUSH_BACK (V);

}

}

}

#ENDIF / / MSLK_UTILITY_H_12345

转载请注明原文地址:https://www.9cbs.com/read-51546.html

New Post(0)