1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

Added default implementation of SerializeTrait<> that dispatches to

calling member functions of the target type to perform type-specific
serialization.
                         
Added version of ReadPtr that allows passing references to uintptr_t
(useful for smart pointers).

llvm-svn: 43396
This commit is contained in:
Ted Kremenek 2007-10-26 20:23:27 +00:00
parent 53b2e7f3ca
commit 87e1cadc06
2 changed files with 25 additions and 1 deletions

View File

@ -99,7 +99,9 @@ public:
return x;
}
void ReadPtr(void*& PtrRef);
void ReadPtr(void*& PtrRef);
void ReadPtr(uintptr_t& PtrRef) { ReadPtr(reinterpret_cast<void*&>(PtrRef)); }
void RegisterPtr(unsigned PtrId, void* Ptr);

View File

@ -19,6 +19,28 @@
namespace llvm {
/// SerializeTrait - SerializeTrait bridges between the Serializer/Deserializer
/// and the functions that serialize objects of specific types. The default
/// behavior is to call static methods of the class for the object being
/// serialized, but this behavior can be changed by specializing this
/// template. Classes only need to implement the methods corresponding
/// to the serialization scheme they want to support. For example, "Read"
/// and "ReadVal" correspond to different deserialization schemes which make
/// sense for different types; a class need only implement one of them.
/// Serialization and deserialization of pointers are specially handled
/// by the Serializer and Deserializer using the EmitOwnedPtr, etc. methods.
/// To serialize the actual object referred to by a pointer, the class
/// of the object either must implement the methods called by the default
/// behavior of SerializeTrait, or specialize SerializeTrait. This latter
/// is useful when one cannot add methods to an existing class (for example).
template <typename T>
struct SerializeTrait {
static inline void Emit(Serializer& S, const T& X) { X.Emit(S); }
static inline void Read(Deserializer& D, T& X) { X.Read(D); }
static inline T ReadVal(Deserializer& D) { T::ReadVal(D); }
static inline T* Materialize(Deserializer& D) { T::Materialize(D); }
};
#define SERIALIZE_INT_TRAIT(TYPE)\
template <> struct SerializeTrait<TYPE> {\
static void Emit(Serializer& S, TYPE X);\