Improve ChunkFile.h:
- Add support for std::set and std:pair. - Switch from std::is_pod to std::is_trivially_copyable, to allow for types that have constructors but trivial copy constructors. Easy, except there are three different nonstandard versions of it required on different platforms, in addition to the standard one.
This commit is contained in:
parent
0f061e4e7c
commit
4c7bbd96e4
|
@ -16,6 +16,7 @@
|
|||
// - Serialization code for anything complex has to be manually written.
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <deque>
|
||||
|
@ -25,6 +26,21 @@
|
|||
#include "Common.h"
|
||||
#include "FileUtil.h"
|
||||
|
||||
// ewww
|
||||
#if _LIBCPP_VERSION
|
||||
#define IsTriviallyCopyable(T) std::is_trivially_copyable<T>::value
|
||||
#elif __GNUC__
|
||||
#define IsTriviallyCopyable(T) std::has_trivial_copy_constructor<T>::value
|
||||
#elif _MSC_VER >= 1800
|
||||
// work around bug
|
||||
#define IsTriviallyCopyable(T) (std::is_trivially_copyable<T>::value || std::is_pod<T>::value)
|
||||
#elif defined(_MSC_VER)
|
||||
#define IsTriviallyCopyable(T) std::has_trivial_copy<T>::value
|
||||
#else
|
||||
#error No version of is_trivially_copyable
|
||||
#endif
|
||||
|
||||
|
||||
template <class T>
|
||||
struct LinkedListItem : public T
|
||||
{
|
||||
|
@ -83,6 +99,34 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
template <typename V>
|
||||
void Do(std::set<V>& x)
|
||||
{
|
||||
u32 count = (u32)x.size();
|
||||
Do(count);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case MODE_READ:
|
||||
for (x.clear(); count != 0; --count)
|
||||
{
|
||||
V value;
|
||||
Do(value);
|
||||
x.insert(value);
|
||||
}
|
||||
break;
|
||||
|
||||
case MODE_WRITE:
|
||||
case MODE_MEASURE:
|
||||
case MODE_VERIFY:
|
||||
for (auto itr = x.begin(); itr != x.end(); ++itr)
|
||||
{
|
||||
Do(*itr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void DoContainer(T& x)
|
||||
{
|
||||
|
@ -118,6 +162,13 @@ public:
|
|||
DoContainer(x);
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
void Do(std::pair<T, U>& x)
|
||||
{
|
||||
Do(x.first);
|
||||
Do(x.second);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void DoArray(T* x, u32 count)
|
||||
{
|
||||
|
@ -128,12 +179,11 @@ public:
|
|||
template <typename T>
|
||||
void Do(T& x)
|
||||
{
|
||||
// Ideally this would be std::is_trivially_copyable, but not enough support yet
|
||||
static_assert(std::is_pod<T>::value, "Only sane for POD types");
|
||||
|
||||
static_assert(IsTriviallyCopyable(T), "Only sane for trivially copyable types");
|
||||
|
||||
DoVoid((void*)&x, sizeof(x));
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
void DoPOD(T& x)
|
||||
{
|
||||
|
|
|
@ -39,13 +39,6 @@ struct SQueuedEvent
|
|||
}
|
||||
};
|
||||
|
||||
// Hacks for ChunkFile to accept SQueuedEvent as POD
|
||||
namespace std
|
||||
{
|
||||
template <>
|
||||
struct is_pod<SQueuedEvent> : std::true_type {};
|
||||
}
|
||||
|
||||
// Important to remember that this class is for /dev/usb/oh1/57e/305 ONLY
|
||||
// /dev/usb/oh1 -> internal usb bus
|
||||
// 57e/305 -> VendorID/ProductID of device on usb bus
|
||||
|
|
Loading…
Reference in New Issue