Common/Analytics: add basic support for vector serialization
Only supports u32 for now since that's the only thing we need.
This commit is contained in:
parent
64e04eb38c
commit
d98c0da41b
|
@ -5,6 +5,7 @@
|
|||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
|
||||
#include "Common/Analytics.h"
|
||||
#include "Common/CommonTypes.h"
|
||||
|
@ -17,7 +18,7 @@ namespace
|
|||
{
|
||||
// Format version number, used as the first byte of every report sent.
|
||||
// Increment for any change to the wire format.
|
||||
constexpr u8 WIRE_FORMAT_VERSION = 0;
|
||||
constexpr u8 WIRE_FORMAT_VERSION = 1;
|
||||
|
||||
// Identifiers for the value types supported by the analytics reporting wire
|
||||
// format.
|
||||
|
@ -28,8 +29,17 @@ enum class TypeId : u8
|
|||
UINT = 2,
|
||||
SINT = 3,
|
||||
FLOAT = 4,
|
||||
|
||||
// Flags which can be combined with other types.
|
||||
ARRAY = 0x80,
|
||||
};
|
||||
|
||||
TypeId operator|(TypeId l, TypeId r)
|
||||
{
|
||||
using ut = std::underlying_type_t<TypeId>;
|
||||
return static_cast<TypeId>(static_cast<ut>(l) | static_cast<ut>(r));
|
||||
}
|
||||
|
||||
void AppendBool(std::string* out, bool v)
|
||||
{
|
||||
out->push_back(v ? '\xFF' : '\x00');
|
||||
|
@ -112,6 +122,15 @@ void AnalyticsReportBuilder::AppendSerializedValue(std::string* report, float v)
|
|||
AppendBytes(report, reinterpret_cast<u8*>(&v), sizeof(v), false);
|
||||
}
|
||||
|
||||
void AnalyticsReportBuilder::AppendSerializedValueVector(std::string* report,
|
||||
const std::vector<u32>& v)
|
||||
{
|
||||
AppendType(report, TypeId::UINT | TypeId::ARRAY);
|
||||
AppendVarInt(report, v.size());
|
||||
for (u32 x : v)
|
||||
AppendVarInt(report, x);
|
||||
}
|
||||
|
||||
AnalyticsReporter::AnalyticsReporter()
|
||||
{
|
||||
m_reporter_thread = std::thread(&AnalyticsReporter::ThreadProc, this);
|
||||
|
|
|
@ -95,6 +95,15 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
AnalyticsReportBuilder& AddData(const std::string& key, const std::vector<T>& value)
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(m_lock);
|
||||
AppendSerializedValue(&m_report, key);
|
||||
AppendSerializedValueVector(&m_report, value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::string Get() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(m_lock);
|
||||
|
@ -118,6 +127,8 @@ protected:
|
|||
static void AppendSerializedValue(std::string* report, s32 v);
|
||||
static void AppendSerializedValue(std::string* report, float v);
|
||||
|
||||
static void AppendSerializedValueVector(std::string* report, const std::vector<u32>& v);
|
||||
|
||||
// Should really be a std::shared_mutex, unfortunately that's C++17 only.
|
||||
mutable std::mutex m_lock;
|
||||
std::string m_report;
|
||||
|
|
Loading…
Reference in New Issue