34 |
#include <string> |
#include <string> |
35 |
#include <vector> |
#include <vector> |
36 |
#include <map> |
#include <map> |
37 |
|
#include <time.h> |
38 |
|
#if __cplusplus < 201103L |
39 |
|
# 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 |
44 |
|
|
45 |
/** @brief Serialization / deserialization framework. |
/** @brief Serialization / deserialization framework. |
46 |
* |
* |
109 |
OPERATION_DESERIALIZE |
OPERATION_DESERIALIZE |
110 |
}; |
}; |
111 |
|
|
112 |
|
enum time_base_t { |
113 |
|
LOCAL_TIME, |
114 |
|
UTC_TIME |
115 |
|
}; |
116 |
|
|
117 |
template<typename T> |
template<typename T> |
118 |
bool IsEnum(const T& data) { |
bool IsEnum(const T& data) { |
119 |
|
#if __cplusplus < 201103L |
120 |
|
return std::tr1::is_enum<T>::value; |
121 |
|
#else |
122 |
return __is_enum(T); |
return __is_enum(T); |
123 |
|
#endif |
124 |
} |
} |
125 |
|
|
126 |
template<typename T> |
template<typename T> |
127 |
bool IsUnion(const T& data) { |
bool IsUnion(const T& data) { |
128 |
|
#if __cplusplus < 201103L |
129 |
|
return false; // without compiler support we cannot distinguish union from class |
130 |
|
#else |
131 |
return __is_union(T); |
return __is_union(T); |
132 |
|
#endif |
133 |
} |
} |
134 |
|
|
135 |
template<typename T> |
template<typename T> |
136 |
bool IsClass(const T& data) { |
bool IsClass(const T& data) { |
137 |
|
#if __cplusplus < 201103L |
138 |
|
return std::tr1::__is_union_or_class<T>::value; // without compiler support we cannot distinguish union from class |
139 |
|
#else |
140 |
return __is_class(T); |
return __is_class(T); |
141 |
|
#endif |
142 |
} |
} |
143 |
|
|
144 |
/*template<typename T> |
/*template<typename T> |
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 |
}; |
}; |
613 |
void setBoolValue(Object& object, bool value); |
void setBoolValue(Object& object, bool value); |
614 |
void setEnumValue(Object& object, uint64_t value); |
void setEnumValue(Object& object, uint64_t value); |
615 |
String valueAsString(const Object& object); |
String valueAsString(const Object& object); |
616 |
|
String name() const; |
617 |
|
void setName(String name); |
618 |
|
String comment() const; |
619 |
|
void setComment(String comment); |
620 |
|
time_t timeStampCreated() const; |
621 |
|
time_t timeStampModified() const; |
622 |
|
tm dateTimeCreated(time_base_t base = LOCAL_TIME) const; |
623 |
|
tm dateTimeModified(time_base_t base = LOCAL_TIME) const; |
624 |
|
|
625 |
protected: |
protected: |
626 |
// UID resolver for non-pointer types |
// UID resolver for non-pointer types |
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> { |
732 |
UID m_root; |
UID m_root; |
733 |
RawData m_rawData; |
RawData m_rawData; |
734 |
bool m_isModified; |
bool m_isModified; |
735 |
|
String m_name; |
736 |
|
String m_comment; |
737 |
|
time_t m_timeCreated; |
738 |
|
time_t m_timeModified; |
739 |
}; |
}; |
740 |
|
|
741 |
/** |
/** |