Fix OSx build

This commit is contained in:
Ivan Shynkarenka 2016-09-19 23:13:15 +03:00
parent 7d5c3e5e0f
commit 6f64e50a5a

View File

@ -1441,7 +1441,7 @@ private:
template <typename Char> template <typename Char>
static std::size_t calculate_extra_size(const internal::Arg& arg); static std::size_t calculate_extra_size(const internal::Arg& arg);
template <typename Char> template <typename Char>
static void serialize_extra_data(uint8_t*& data_buffer, const internal::Arg& arg); static void serialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, const internal::Value& arg);
template <typename Char> template <typename Char>
static void deserialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, internal::Value& arg); static void deserialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, internal::Value& arg);
}; };
@ -1471,11 +1471,11 @@ inline std::size_t ArgList::calculate_extra_size(const internal::Arg& arg)
} }
template <typename Char> template <typename Char>
inline void ArgList::serialize_extra_data(uint8_t*& data_buffer, const internal::Arg& arg) inline void ArgList::serialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, const internal::Value& value)
{ {
// Serialize extra data // Serialize extra data
if (arg.type == internal::Arg::NAMED_ARG) { if (type == internal::Arg::NAMED_ARG) {
const fmt::internal::NamedArg<Char>* named = static_cast<const fmt::internal::NamedArg<Char>*>(arg.pointer); const fmt::internal::NamedArg<Char>* named = static_cast<const fmt::internal::NamedArg<Char>*>(value.pointer);
std::memcpy(data_buffer, named, sizeof(fmt::internal::NamedArg<Char>)); std::memcpy(data_buffer, named, sizeof(fmt::internal::NamedArg<Char>));
data_buffer += sizeof(fmt::internal::NamedArg<Char>); data_buffer += sizeof(fmt::internal::NamedArg<Char>);
std::size_t size = named->name.size() * sizeof(Char); std::size_t size = named->name.size() * sizeof(Char);
@ -1483,42 +1483,42 @@ inline void ArgList::serialize_extra_data(uint8_t*& data_buffer, const internal:
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
std::memcpy(data_buffer, named->name.data(), size); std::memcpy(data_buffer, named->name.data(), size);
data_buffer += size; data_buffer += size;
serialize_extra_data<Char>(data_buffer, *named); serialize_extra_data<Char>(data_buffer, named->type, *named);
} }
else if (arg.type == internal::Arg::CSTRING) { else if (type == internal::Arg::CSTRING) {
std::size_t size = (std::strlen(arg.string.value) + 1) * sizeof(char); std::size_t size = (std::strlen(value.string.value) + 1) * sizeof(char);
std::memcpy(data_buffer, &size, sizeof(std::size_t)); std::memcpy(data_buffer, &size, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
std::memcpy(data_buffer, arg.string.value, size); std::memcpy(data_buffer, value.string.value, size);
data_buffer += size; data_buffer += size;
} }
else if (arg.type == internal::Arg::STRING) { else if (type == internal::Arg::STRING) {
std::size_t size = arg.string.size * sizeof(char); std::size_t size = value.string.size * sizeof(char);
std::memcpy(data_buffer, &size, sizeof(std::size_t)); std::memcpy(data_buffer, &size, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
std::memcpy(data_buffer, arg.string.value, size); std::memcpy(data_buffer, value.string.value, size);
data_buffer += size; data_buffer += size;
} }
else if (arg.type == internal::Arg::WSTRING) { else if (type == internal::Arg::WSTRING) {
std::size_t size = arg.wstring.size * sizeof(wchar_t); std::size_t size = value.wstring.size * sizeof(wchar_t);
std::memcpy(data_buffer, &size, sizeof(std::size_t)); std::memcpy(data_buffer, &size, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
std::memcpy(data_buffer, arg.wstring.value, size); std::memcpy(data_buffer, value.wstring.value, size);
data_buffer += size; data_buffer += size;
} }
else if (arg.type == internal::Arg::CUSTOM) { else if (type == internal::Arg::CUSTOM) {
std::memcpy(data_buffer, arg.custom.value, arg.custom.size); std::memcpy(data_buffer, value.custom.value, value.custom.size);
data_buffer += arg.custom.size; data_buffer += value.custom.size;
} }
} }
template <typename Char> template <typename Char>
inline void ArgList::deserialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, internal::Value& arg) inline void ArgList::deserialize_extra_data(uint8_t*& data_buffer, internal::Arg::Type type, internal::Value& value)
{ {
// Deserialize extra data // Deserialize extra data
if (type == internal::Arg::NAMED_ARG) { if (type == internal::Arg::NAMED_ARG) {
fmt::internal::NamedArg<Char>* named = reinterpret_cast<fmt::internal::NamedArg<Char>*>(data_buffer); fmt::internal::NamedArg<Char>* named = reinterpret_cast<fmt::internal::NamedArg<Char>*>(data_buffer);
arg.pointer = named; value.pointer = named;
data_buffer += sizeof(fmt::internal::NamedArg<Char>); data_buffer += sizeof(fmt::internal::NamedArg<Char>);
std::size_t size; std::size_t size;
std::memcpy(&size, data_buffer, sizeof(std::size_t)); std::memcpy(&size, data_buffer, sizeof(std::size_t));
@ -1531,28 +1531,28 @@ inline void ArgList::deserialize_extra_data(uint8_t*& data_buffer, internal::Arg
std::size_t size; std::size_t size;
std::memcpy(&size, data_buffer, sizeof(std::size_t)); std::memcpy(&size, data_buffer, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
arg.string.value = reinterpret_cast<const char*>(data_buffer); value.string.value = reinterpret_cast<const char*>(data_buffer);
data_buffer += size; data_buffer += size;
} }
else if (type == internal::Arg::STRING) { else if (type == internal::Arg::STRING) {
std::size_t size; std::size_t size;
std::memcpy(&size, data_buffer, sizeof(std::size_t)); std::memcpy(&size, data_buffer, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
arg.string.value = reinterpret_cast<const char*>(data_buffer); value.string.value = reinterpret_cast<const char*>(data_buffer);
arg.string.size = size / sizeof(char); value.string.size = size / sizeof(char);
data_buffer += size; data_buffer += size;
} }
else if (type == internal::Arg::WSTRING) { else if (type == internal::Arg::WSTRING) {
std::size_t size; std::size_t size;
std::memcpy(&size, data_buffer, sizeof(std::size_t)); std::memcpy(&size, data_buffer, sizeof(std::size_t));
data_buffer += sizeof(std::size_t); data_buffer += sizeof(std::size_t);
arg.wstring.value = reinterpret_cast<const wchar_t*>(data_buffer); value.wstring.value = reinterpret_cast<const wchar_t*>(data_buffer);
arg.wstring.size = size / sizeof(wchar_t); value.wstring.size = size / sizeof(wchar_t);
data_buffer += size; data_buffer += size;
} }
else if (type == internal::Arg::CUSTOM) { else if (type == internal::Arg::CUSTOM) {
arg.custom.value = data_buffer; value.custom.value = data_buffer;
data_buffer += arg.custom.size; data_buffer += value.custom.size;
} }
} }
@ -1600,10 +1600,11 @@ inline void ArgList::serialize(std::vector<uint8_t>& buffer) const
for (unsigned i = 0; i < count; ++i) { for (unsigned i = 0; i < count; ++i) {
// Serialize argument // Serialize argument
internal::Arg arg = args[i]; internal::Arg arg = args[i];
std::memcpy(base_buffer, &arg, item_size); internal::Value& value = arg;
std::memcpy(base_buffer, (count > MAX_PACKED_ARGS) ? &arg : &value, item_size);
base_buffer += item_size; base_buffer += item_size;
// Serialize extra data // Serialize extra data
serialize_extra_data<Char>(data_buffer, arg); serialize_extra_data<Char>(data_buffer, arg.type, value);
} }
} }
@ -1622,9 +1623,6 @@ inline ArgList ArgList::deserialize(std::vector<uint8_t>& buffer)
std::memcpy(&count, base_buffer, sizeof(unsigned)); std::memcpy(&count, base_buffer, sizeof(unsigned));
base_buffer += sizeof(unsigned); base_buffer += sizeof(unsigned);
// Calculate the item size
std::size_t item_size = (count > MAX_PACKED_ARGS) ? sizeof(internal::Arg) : sizeof(internal::Value);
// Deserialize the base buffer size // Deserialize the base buffer size
std::size_t base_size; std::size_t base_size;
std::memcpy(&base_size, base_buffer, sizeof(std::size_t)); std::memcpy(&base_size, base_buffer, sizeof(std::size_t));
@ -1638,14 +1636,27 @@ inline ArgList ArgList::deserialize(std::vector<uint8_t>& buffer)
std::memcpy(&types, base_buffer, sizeof(ULongLong)); std::memcpy(&types, base_buffer, sizeof(ULongLong));
base_buffer += sizeof(ULongLong); base_buffer += sizeof(ULongLong);
// Calculate the item size
std::size_t item_size = (count > MAX_PACKED_ARGS) ? sizeof(internal::Arg) : sizeof(internal::Value);
// Deserialize values of format arguments // Deserialize values of format arguments
uint8_t* local_buffer = base_buffer; uint8_t* local_buffer = base_buffer;
for (unsigned i = 0; i < count; ++i) { for (unsigned i = 0; i < count; ++i) {
// Deserialize argument if (count > MAX_PACKED_ARGS)
internal::Value* arg = reinterpret_cast<internal::Value*>(local_buffer); {
local_buffer += item_size; // Deserialize argument
// Deserialize extra data internal::Arg* arg = reinterpret_cast<internal::Arg*>(local_buffer);
deserialize_extra_data<Char>(data_buffer, type(types, i), *arg); // Deserialize extra data
deserialize_extra_data<Char>(data_buffer, arg->type, *arg);
}
else
{
// Deserialize argument
internal::Value* value = reinterpret_cast<internal::Value*>(local_buffer);
// Deserialize extra data
deserialize_extra_data<Char>(data_buffer, type(types, i), *value);
}
local_buffer += item_size;
} }
// Prepare and return arguments list stored in the provided buffer // Prepare and return arguments list stored in the provided buffer