37 |
#include <time.h> |
#include <time.h> |
38 |
#if __cplusplus < 201103L |
#if __cplusplus < 201103L |
39 |
# include <tr1/type_traits> |
# include <tr1/type_traits> |
40 |
|
# define LIBGIG_IS_CLASS(type) std::tr1::__is_union_or_class<type>::value //NOTE: without compiler support we cannot distinguish union from class |
41 |
|
#else |
42 |
|
# define LIBGIG_IS_CLASS(type) __is_class(type) |
43 |
#endif |
#endif |
44 |
|
|
45 |
/** @brief Serialization / deserialization framework. |
/** @brief Serialization / deserialization framework. |
126 |
template<typename T> |
template<typename T> |
127 |
bool IsUnion(const T& data) { |
bool IsUnion(const T& data) { |
128 |
#if __cplusplus < 201103L |
#if __cplusplus < 201103L |
129 |
return std::tr1::is_union<T>::value; |
return false; // without compiler support we cannot distinguish union from class |
130 |
#else |
#else |
131 |
return __is_union(T); |
return __is_union(T); |
132 |
#endif |
#endif |
135 |
template<typename T> |
template<typename T> |
136 |
bool IsClass(const T& data) { |
bool IsClass(const T& data) { |
137 |
#if __cplusplus < 201103L |
#if __cplusplus < 201103L |
138 |
return std::tr1::is_class<T>::value; |
return std::tr1::__is_union_or_class<T>::value; // without compiler support we cannot distinguish union from class |
139 |
#else |
#else |
140 |
return __is_class(T); |
return __is_class(T); |
141 |
#endif |
#endif |
180 |
template<typename T> |
template<typename T> |
181 |
struct Resolver { |
struct Resolver { |
182 |
static UID resolve(const T& obj) { |
static UID resolve(const T& obj) { |
183 |
return (UID) { (ID) &obj, sizeof(obj) }; |
const UID uid = { (ID) &obj, sizeof(obj) }; |
184 |
|
return uid; |
185 |
} |
} |
186 |
}; |
}; |
187 |
|
|
189 |
template<typename T> |
template<typename T> |
190 |
struct Resolver<T*> { |
struct Resolver<T*> { |
191 |
static UID resolve(const T* const & obj) { |
static UID resolve(const T* const & obj) { |
192 |
return (UID) { (ID) obj, sizeof(*obj) }; |
const UID uid = { (ID) obj, sizeof(*obj) }; |
193 |
|
return uid; |
194 |
} |
} |
195 |
}; |
}; |
196 |
}; |
}; |
642 |
class UIDChainResolver<T*> { |
class UIDChainResolver<T*> { |
643 |
public: |
public: |
644 |
UIDChainResolver(const T*& data) { |
UIDChainResolver(const T*& data) { |
645 |
m_uid.push_back((UID) { &data, sizeof(data) }); |
const UID uids[2] = { |
646 |
m_uid.push_back((UID) { data, sizeof(*data) }); |
{ &data, sizeof(data) }, |
647 |
|
{ data, sizeof(*data) } |
648 |
|
}; |
649 |
|
m_uid.push_back(uids[0]); |
650 |
|
m_uid.push_back(uids[1]); |
651 |
} |
} |
652 |
|
|
653 |
operator UIDChain() const { return m_uid; } |
operator UIDChain() const { return m_uid; } |
687 |
|
|
688 |
// Automatically handles recursion for class/struct types, while ignoring all primitive types. |
// Automatically handles recursion for class/struct types, while ignoring all primitive types. |
689 |
template<typename T> |
template<typename T> |
690 |
struct SerializationRecursion : SerializationRecursionImpl<T, __is_class(T)> { |
struct SerializationRecursion : SerializationRecursionImpl<T, LIBGIG_IS_CLASS(T)> { |
691 |
}; |
}; |
692 |
|
|
693 |
class ObjectPool : public std::map<UID,Object> { |
class ObjectPool : public std::map<UID,Object> { |