Untitled
unknown
c_cpp
a year ago
24 kB
14
Indexable
#include <iostream>
#include <vector>
#include <chrono>
template<typename T>
struct MessageHeader final
{
public:
T id{};
std::uint64_t size = 0;
};
enum class MessageTypes : std::uint64_t
{
VectorMessage = 0
};
template<typename T>
struct is_std_uint64_t_vector
: std::is_same<std::vector<std::uint64_t>, std::decay_t<T>>
{};
template<typename T>
struct is_std_string
: std::is_same<std::string, T>
{};
template<typename T>
struct Message final
{
public:
MessageHeader<T> header{};
std::vector<std::uint8_t> body;
template<typename DataType>
friend Message<T>& operator <<(Message<T>& message, const DataType& data)
{
static_assert(std::is_standard_layout<DataType>::value || is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value, "Data is too complex to be pushed into vector.");
std::uint64_t bodySize = message.body.size();
std::uint64_t resizedBodySize{ 0 };
if constexpr(is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value)
{
resizedBodySize = message.body.size() + data.size();
message.body.resize(resizedBodySize);
std::copy_n(data.data(), data.size(), message.body.data() + bodySize);
}
else
{
resizedBodySize = message.body.size() + sizeof(DataType);
message.body.resize(resizedBodySize);
std::copy_n(& data, sizeof(DataType), message.body.data() + bodySize);
}
message.header.size = resizedBodySize;
return message;
}
template<typename DataType>
friend Message<T>& operator >>(Message<T>& message, DataType& data)
{
static_assert(std::is_standard_layout<DataType>::value || is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value, "Data is too complex to be pushed from vector.");
std::uint64_t bodySize{ 0 };
if constexpr (is_std_uint64_t_vector<DataType>::value || is_std_string<DataType>::value)
{
bodySize = message.body.size() - data.size();
std::copy_n(message.body.begin() + bodySize, data.size(), data.data());
}
else
{
bodySize = message.body.size() - sizeof(DataType);
std::copy_n(message.body.begin() + bodySize, bodySize, &data);
}
message.body.resize(bodySize);
message.header.size = bodySize;
return message;
}
};
int main()
{
Message<MessageTypes> message;
std::chrono::system_clock::time_point timeNow = std::chrono::system_clock::now();
std::chrono::system_clock::time_point timeThen;
message << timeNow;
message >> timeThen;
std::string str = "123";
std::uint64_t strSz = str.size();
std::uint64_t strCpySz{ 0 };
message << str << strSz;
message >> strCpySz;
std::string strCpy(strCpySz,'\0');
message >> strCpy;
return 0;
}
1>------ Build started: Project: MemcpyTests, Configuration: Debug x64 ------
1>MemcpyTests.cpp
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: '=': cannot convert from 'const DataType' to '_Ty'
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: with
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: [
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: DataType=std::chrono::system_clock::time_point
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: ]
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: and
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: [
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: _Ty=uint8_t
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): error C2440: ]
1>(compiling source file 'MemcpyTests.cpp')
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> the template instantiation context (the oldest one first) is
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(94,13):
1> see reference to function template instantiation 'Message<MessageTypes> &operator <<<std::chrono::system_clock::time_point>(Message<MessageTypes> &,const DataType &)' being compiled
1> with
1> [
1> DataType=std::chrono::system_clock::time_point
1> ]
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(94,13):
1> see the first reference to 'operator <<' in 'main'
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(56,18):
1> see reference to function template instantiation '_OutIt std::copy_n<const DataType*,size_t,_Ty*>(_InIt,_Diff,_OutIt)' being compiled
1> with
1> [
1> _OutIt=uint8_t *,
1> DataType=std::chrono::system_clock::time_point,
1> _Ty=uint8_t,
1> _InIt=const std::chrono::system_clock::time_point *,
1> _Diff=size_t
1> ]
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17): error C2679: binary '=': no operator found which takes a right-hand operand of type 'unsigned char' (or there is no acceptable conversion)
1>(compiling source file 'MemcpyTests.cpp')
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 2 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': no overloaded function could convert all the argument types
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 1 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Conversion requires a second user-defined-conversion operator or constructor
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 1 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Conversion requires a second user-defined-conversion operator or constructor
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(210,9):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(void)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': function does not take 1 arguments
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(216,9):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<_Clock,_Duration2> &) noexcept(<expr>)'
1> with
1> [
1> _Clock=std::chrono::system_clock
1> ]
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> while trying to match the argument list '(unsigned char)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::operator =(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 2 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': no overloaded function could convert all the argument types
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> could be 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&)': cannot convert argument 1 from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &&'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Conversion requires a second user-defined-conversion operator or constructor
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(261,1):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &)': cannot convert argument 1 from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>> &'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Reason: cannot convert from 'unsigned char' to 'const std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> Conversion requires a second user-defined-conversion operator or constructor
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(210,9):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(void)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point': function does not take 1 arguments
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\__msvc_chrono.hpp(216,9):
1> or 'std::chrono::time_point<std::chrono::system_clock,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>::time_point(const std::chrono::time_point<_Clock,_Duration2> &) noexcept(<expr>)'
1> with
1> [
1> _Clock=std::chrono::system_clock
1> ]
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> while trying to match the argument list '(unsigned char)'
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17):
1> while trying to match the argument list '(DataType, unsigned char)'
1> with
1> [
1> DataType=std::chrono::system_clock::time_point
1> ]
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,17):
1> the template instantiation context (the oldest one first) is
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(95,13):
1> see reference to function template instantiation 'Message<MessageTypes> &operator >><std::chrono::system_clock::time_point>(Message<MessageTypes> &,DataType &)' being compiled
1> with
1> [
1> DataType=std::chrono::system_clock::time_point
1> ]
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(95,13):
1> see the first reference to 'operator >>' in 'main'
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(77,18):
1> see reference to function template instantiation '_OutIt std::copy_n<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,uint64_t,DataType*>(_InIt,_Diff,_OutIt)' being compiled
1> with
1> [
1> _OutIt=std::chrono::system_clock::time_point *,
1> _Ty=uint8_t,
1> DataType=std::chrono::system_clock::time_point,
1> _InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<uint8_t>>>,
1> _Diff=uint64_t
1> ]
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: '=': conversion from 'const DataType' to '_Ty', possible loss of data
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: with
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: [
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: DataType=uint64_t
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: ]
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: and
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: [
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: _Ty=uint8_t
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27): warning C4244: ]
1>(compiling source file 'MemcpyTests.cpp')
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\include\xutility(4924,27):
1> the template instantiation context (the oldest one first) is
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(101,20):
1> see reference to function template instantiation 'Message<MessageTypes> &operator <<<uint64_t>(Message<MessageTypes> &,const DataType &)' being compiled
1> with
1> [
1> DataType=uint64_t
1> ]
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(101,20):
1> see the first reference to 'operator <<' in 'main'
1> D:\Projects\cxx\Samples\MemcpyTests\MemcpyTests\MemcpyTests.cpp(56,18):
1> see reference to function template instantiation '_OutIt std::copy_n<const DataType*,size_t,_Ty*>(_InIt,_Diff,_OutIt)' being compiled
1> with
1> [
1> _OutIt=uint8_t *,
1> DataType=uint64_t,
1> _Ty=uint8_t,
1> _InIt=const uint64_t *,
1> _Diff=size_t
1> ]
1>Done building project "MemcpyTests.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========Editor is loading...
Leave a Comment