Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cpp/Platform.Data.Tests/ILinksTests.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
namespace Platform::Data::Tests
{
template<std::integral TLinkAddress = std::uint64_t, LinksConstants<TLinkAddress> VConstants = LinksConstants<TLinkAddress>{true}, typename TLink = std::vector<TLinkAddress>, typename TReadHandler = std::function<TLinkAddress(TLink)>, typename TWriteHandler = std::function<TLinkAddress(TLink, TLink)>>
struct Links : public ILinks<LinksOptions<TLinkAddress, VConstants, TLink,TReadHandler, TWriteHandler>>
template<std::integral TLinkAddress = std::uint64_t, typename TLinksConstants = LinksConstants<TLinkAddress>, typename TLink = std::vector<TLinkAddress>, typename TReadHandler = std::function<TLinkAddress(TLink)>, typename TWriteHandler = std::function<TLinkAddress(TLink, TLink)>>
struct Links : public ILinks<LinksOptions<TLinkAddress, TLinksConstants, TLink,TReadHandler, TWriteHandler>>
{
using base = ILinks<LinksOptions<TLinkAddress, VConstants, TLink, TReadHandler, TWriteHandler>>;
using base = ILinks<LinksOptions<TLinkAddress, TLinksConstants, TLink, TReadHandler, TWriteHandler>>;
using typename base::LinkAddressType;
using typename base::LinkType;
using typename base::WriteHandlerType;
Expand Down
3 changes: 2 additions & 1 deletion cpp/Platform.Data/ILinks.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
public:
using LinksOptionsType = TLinksOptions;
using LinkAddressType = typename LinksOptionsType::LinkAddressType;
static constexpr LinksConstants<LinkAddressType> Constants = LinksOptionsType::Constants;
using LinksConstantsType = typename LinksOptionsType::LinksConstantsType;
static constexpr LinksConstantsType Constants = LinksOptionsType::Constants;
using LinkType = typename LinksOptionsType::LinkType;
using ReadHandlerType = typename LinksOptionsType::ReadHandlerType;
using WriteHandlerType = typename LinksOptionsType::WriteHandlerType;
Expand Down
1 change: 1 addition & 0 deletions cpp/Platform.Data/LinksConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
template<std::integral TLinkAddress>
struct LinksConstants
{
using LinkAddressType = TLinkAddress;
static constexpr int DefaultTargetPart = 2;
public:
const TLinkAddress IndexPart{};
Expand Down
20 changes: 11 additions & 9 deletions cpp/Platform.Data/LinksConstantsExtensions.h
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
namespace Platform::Data
{
template <typename TLinkAddress, LinksConstants<TLinkAddress> VLinksConstants>
static bool IsInternalReference(TLinkAddress linkAddress) noexcept
template <typename TLinksConstants>
static bool IsInternalReference(typename TLinksConstants::LinkAddressType linkAddress) noexcept
{
return VLinksConstants.InternalReferencesRange.Contains(linkAddress);
static constexpr TLinksConstants constants{true};
return constants.InternalReferencesRange.Contains(linkAddress);
}

template <typename TLinkAddress, LinksConstants<TLinkAddress> VLinksConstants>
static bool IsReference(TLinkAddress linkAddress) noexcept
template <typename TLinksConstants>
static bool IsReference(typename TLinksConstants::LinkAddressType linkAddress) noexcept
{
return IsInternalReference(VLinksConstants, linkAddress) || IsExternalReference(VLinksConstants, linkAddress);
return IsInternalReference<TLinksConstants>(linkAddress) || IsExternalReference<TLinksConstants>(linkAddress);
}

template <typename TLinkAddress, LinksConstants<TLinkAddress> VLinksConstants>
static bool IsExternalReference(TLinkAddress linkAddress) noexcept
template <typename TLinksConstants>
static bool IsExternalReference(typename TLinksConstants::LinkAddressType linkAddress) noexcept
{
auto&& range = VLinksConstants.ExternalReferencesRange;
static constexpr TLinksConstants constants{true};
auto&& range = constants.ExternalReferencesRange;
return range.Contains(linkAddress);
}
}
5 changes: 3 additions & 2 deletions cpp/Platform.Data/LinksOptions.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
namespace Platform::Data
{

template<std::integral TLinkAddress = std::uint64_t, LinksConstants<TLinkAddress> VConstants = LinksConstants<TLinkAddress>{true}, typename TLink = std::vector<TLinkAddress>, typename TReadHandler = std::function<TLinkAddress(TLink)>, typename TWriteHandler = std::function<TLinkAddress(TLink, TLink)>>
template<std::integral TLinkAddress = std::uint64_t, typename TLinksConstants = LinksConstants<TLinkAddress>, typename TLink = std::vector<TLinkAddress>, typename TReadHandler = std::function<TLinkAddress(TLink)>, typename TWriteHandler = std::function<TLinkAddress(TLink, TLink)>>
struct LinksOptions
{
using LinkAddressType = TLinkAddress;
using LinkType = TLink;
using ReadHandlerType = TReadHandler;
using WriteHandlerType = TWriteHandler;
static constexpr LinksConstants<LinkAddressType> Constants = VConstants;
using LinksConstantsType = TLinksConstants;
static constexpr TLinksConstants Constants{true};
};

// template<typename ...>
Expand Down
Loading