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. |
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) }; |
return UID { (ID) &obj, sizeof(obj) }; |
184 |
} |
} |
185 |
}; |
}; |
186 |
|
|
188 |
template<typename T> |
template<typename T> |
189 |
struct Resolver<T*> { |
struct Resolver<T*> { |
190 |
static UID resolve(const T* const & obj) { |
static UID resolve(const T* const & obj) { |
191 |
return (UID) { (ID) obj, sizeof(*obj) }; |
return UID { (ID) obj, sizeof(*obj) }; |
192 |
} |
} |
193 |
}; |
}; |
194 |
}; |
}; |
640 |
class UIDChainResolver<T*> { |
class UIDChainResolver<T*> { |
641 |
public: |
public: |
642 |
UIDChainResolver(const T*& data) { |
UIDChainResolver(const T*& data) { |
643 |
m_uid.push_back((UID) { &data, sizeof(data) }); |
m_uid.push_back(UID { &data, sizeof(data) }); |
644 |
m_uid.push_back((UID) { data, sizeof(*data) }); |
m_uid.push_back(UID { data, sizeof(*data) }); |
645 |
} |
} |
646 |
|
|
647 |
operator UIDChain() const { return m_uid; } |
operator UIDChain() const { return m_uid; } |
681 |
|
|
682 |
// Automatically handles recursion for class/struct types, while ignoring all primitive types. |
// Automatically handles recursion for class/struct types, while ignoring all primitive types. |
683 |
template<typename T> |
template<typename T> |
684 |
struct SerializationRecursion : SerializationRecursionImpl<T, __is_class(T)> { |
struct SerializationRecursion : SerializationRecursionImpl<T, LIBGIG_IS_CLASS(T)> { |
685 |
}; |
}; |
686 |
|
|
687 |
class ObjectPool : public std::map<UID,Object> { |
class ObjectPool : public std::map<UID,Object> { |