C3/Src/Core/RouteId.cpp

99 lines
4.9 KiB
C++

#include "StdAfx.h"
#include "RouteId.h"
#include "Common/MWR/CppTools/ByteView.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const MWR::C3::RouteId MWR::C3::RouteId::Null{ AgentId::Null, DeviceId::Null };
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constexpr MWR::C3::RouteId::RouteId(AgentId aid, DeviceId iid)
: m_AgentId(std::move(aid))
, m_InterfaceId(std::move(iid))
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MWR::C3::RouteId MWR::C3::RouteId::FromString(std::string_view textId) noexcept(false)
{
return { AgentId{ textId.substr(0, AgentId::TextSize) }, DeviceId{ textId.substr(AgentId::TextSize + 1) } }; // +1 for separator
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MWR::C3::RouteId MWR::C3::RouteId::FromByteView(ByteView byteId)
{
return { AgentId{ byteId.SubString(0, AgentId::BinarySize) }, DeviceId{ byteId.SubString(AgentId::BinarySize, DeviceId::BinarySize) } };
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MWR::C3::RouteId MWR::C3::RouteId::GenerateRandom()
{
return { AgentId::GenerateRandom(), DeviceId::GenerateRandom() };
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
std::string MWR::C3::RouteId::ToString() const
{
return m_AgentId.ToString() + OBF(":") + m_InterfaceId.ToString();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MWR::ByteVector MWR::C3::RouteId::ToByteVector() const
{
// Allocate return vector.
MWR::ByteVector retByteVector;
retByteVector.reserve(m_AgentId.BinarySize + m_InterfaceId.BinarySize);
// Fill it with aid and iid.
auto aid = m_AgentId.ToByteVector(), iid = m_InterfaceId.ToByteVector();
retByteVector.insert(retByteVector.end(), aid.begin(), aid.end());
retByteVector.insert(retByteVector.end(), iid.begin(), iid.end());
// That's it.
return retByteVector;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MWR::ByteArray<MWR::C3::RouteId::BinarySize> MWR::C3::RouteId::ToByteArray() const
{
MWR::ByteArray<BinarySize> retArray;
// Fill it with aid and iid.
auto aid = m_AgentId.ToByteVector(), iid = m_InterfaceId.ToByteVector();
memcpy(retArray.data(), aid.data(), m_AgentId.BinarySize);
memcpy(retArray.data() + m_AgentId.BinarySize, iid.data(), m_InterfaceId.BinarySize);
// That's it.
return retArray;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MWR::C3::RouteId::operator!() const
{
return IsNull();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MWR::C3::RouteId::operator==(RouteId const& c) const
{
return c.m_AgentId == m_AgentId and m_InterfaceId == c.m_InterfaceId;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MWR::C3::RouteId::operator!=(RouteId const& c) const
{
return !operator == (c);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MWR::C3::RouteId::operator<(RouteId const& c) const
{
return m_AgentId < c.m_AgentId or (m_AgentId == c.m_AgentId and m_InterfaceId < c.m_InterfaceId);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MWR::C3::RouteId::IsNull() const
{
return m_AgentId != 0 and m_InterfaceId != 0;
}