Skip to content

Commit b530c5e

Browse files
Revert "Revert "Merge pull request #1 from linksplatform/cppwrite""
This reverts commit e051a9c.
1 parent e051a9c commit b530c5e

File tree

9 files changed

+182
-125
lines changed

9 files changed

+182
-125
lines changed

cpp/CMakeLists.txt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
cmake_minimum_required(VERSION 3.15)
22
project(Platform.Data)
33

4+
set(LINKS_PLATFORM_TESTS OFF CACHE BOOL "Whether to compile tests")
5+
set(LINKS_PLATFORM_EXTRA_FLAGS "" CACHE STRING "Extra compiler flags")
6+
7+
set(CONAN_DISABLE_CHECK_COMPILER TRUE)
8+
set(LINKS_PLATFORM_TESTS TRUE)
49
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
510

611
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
@@ -13,7 +18,9 @@ target_link_libraries(${PROJECT_NAME}.Library INTERFACE CONAN_PKG::platform.inte
1318
target_link_libraries(${PROJECT_NAME}.Library INTERFACE CONAN_PKG::platform.ranges)
1419
target_link_libraries(${PROJECT_NAME}.Library INTERFACE CONAN_PKG::platform.setters)
1520

16-
add_executable(${PROJECT_NAME}.Tests ${PROJECT_NAME}.Tests/AllTests.cpp)
17-
target_link_libraries(${PROJECT_NAME}.Tests PRIVATE ${PROJECT_NAME}.Library)
18-
target_link_libraries(${PROJECT_NAME}.Tests PRIVATE CONAN_PKG::gtest)
19-
set_target_properties(${PROJECT_NAME}.Tests PROPERTIES CXX_STANDARD 20)
21+
if(${LINKS_PLATFORM_TESTS})
22+
add_executable(${PROJECT_NAME}.Tests ${PROJECT_NAME}.Tests/AllTests.cpp)
23+
target_link_libraries(${PROJECT_NAME}.Tests PRIVATE ${PROJECT_NAME}.Library)
24+
target_link_libraries(${PROJECT_NAME}.Tests PRIVATE CONAN_PKG::gtest)
25+
set_target_properties(${PROJECT_NAME}.Tests PROPERTIES CXX_STANDARD 20)
26+
endif()

cpp/Platform.Data.Tests/ILinksTests.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ namespace Platform::Data::Tests
33
template<std::integral TLinkAddress>
44
struct Links : public ILinks<Links<TLinkAddress>, TLinkAddress, LinksConstants<TLinkAddress>>
55
{
6-
TLinkAddress Count(Interfaces::IArray auto&& restriction) const { return 0; }
6+
TLinkAddress Count(Interfaces::CArray auto&& restriction) const { return 0; }
77

8-
TLinkAddress Each(auto&& handler, const Interfaces::IArray auto& restrictions) const
8+
TLinkAddress Each(auto&& handler, const Interfaces::CArray auto& restrictions) const
99
{ return 0; }
1010

11-
TLinkAddress Create(Interfaces::IArray auto&& restriction) { return 0; }
11+
TLinkAddress Create(Interfaces::CArray auto&& restriction) { return 0; }
1212

13-
TLinkAddress Update(Interfaces::IArray auto&& substitution, std::convertible_to<TLinkAddress> auto... restrictions) { return 0; }
13+
TLinkAddress Update(Interfaces::CArray auto&& substitution, std::convertible_to<TLinkAddress> auto... restrictions) { return 0; }
1414

15-
void Delete(Interfaces::IArray auto&& restriction) { }
15+
void Delete(Interfaces::CArray auto&& restriction) { }
1616
};
1717
TEST(ILinksDeriverTest, ConstructorAndMethodsTest)
1818
{
@@ -28,4 +28,4 @@ namespace Platform::Data::Tests
2828
const_links.Each([](TLink restriction_a){ return 1; }, restriction);
2929
links.Delete(restriction);
3030
}
31-
}
31+
}

cpp/Platform.Data.Tests/LinksConstantsTests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
using namespace Platform::Data;
66

77
auto constants = LinksConstants<std::uint64_t>(true);
8-
ASSERT_EQ(Hybrid<std::uint64_t>::ExternalZero, constants.ExternalReferencesRange.value().Minimum);
9-
ASSERT_EQ(std::numeric_limits<std::uint64_t>::max(), constants.ExternalReferencesRange.value().Maximum);
8+
ASSERT_EQ(Hybrid<std::uint64_t>::ExternalZero, constants.ExternalReferencesRange.Minimum);
9+
ASSERT_EQ(std::numeric_limits<std::uint64_t>::max(), constants.ExternalReferencesRange.Maximum);
1010
}
1111

1212
template<std::signed_integral TSigned, typename TUnsigned = std::make_unsigned_t<TSigned>>

cpp/Platform.Data/ILinks.h

Lines changed: 6 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -12,105 +12,30 @@
1212
const TConstants Constants{};
1313

1414
// TODO: maybe mark methods as const
15-
TLinkAddress Count(Interfaces::IArray auto&& restriction) const { return self().Count(restriction); }
15+
TLinkAddress Count(Interfaces::CArray auto&& restriction) const { return self().Count(restriction); }
1616

1717
TLinkAddress Count() const
1818
{
1919
TLinkAddress array[0];
2020
return self().Count(array);
2121
}
2222

23-
TLinkAddress Each(auto&& handler, const Interfaces::IArray auto& restrictions) const
23+
TLinkAddress Each(auto&& handler, const Interfaces::CArray auto& restrictions) const
2424
{ return self().Each(handler, restrictions); }
2525

26-
TLinkAddress Create(Interfaces::IArray auto&& restriction) { return self().Create(restriction); }
26+
TLinkAddress Create(Interfaces::CArray auto&& restriction) { return self().Create(restriction); }
2727

28-
TLinkAddress Update(Interfaces::IArray auto&& substitution, Interfaces::IArray auto&& restrictions) { return self().Update(substitution, restrictions); }
28+
TLinkAddress Update(Interfaces::CArray auto&& substitution, Interfaces::CArray auto&& restrictions) { return self().Update(substitution, restrictions); }
2929

30-
TLinkAddress Update(Interfaces::IArray auto&& substitution, std::convertible_to<TLinkAddress> auto... restrictions)
30+
TLinkAddress Update(Interfaces::CArray auto&& substitution, std::convertible_to<TLinkAddress> auto... restrictions)
3131
{
3232
TLinkAddress array[] = { static_cast<TLinkAddress>(restrictions)... };
3333
return Update(substitution, array);
3434
}
3535

36-
void Delete(Interfaces::IArray auto&& restriction) { self().Delete(restriction); }
36+
void Delete(Interfaces::CArray auto&& restriction) { self().Delete(restriction); }
3737

3838
// EXTENSIONS
39-
auto Count(std::convertible_to<TLinkAddress> auto... restrictions) const -> TLinkAddress
40-
// TODO: later add noexcept(expr)
41-
{
42-
auto&& links = *this;
43-
TLinkAddress array[] = { static_cast<TLinkAddress>(restrictions)... };
44-
return links.Count(array);
45-
}
4639

47-
auto Exists(TLinkAddress link) const noexcept -> bool
48-
{
49-
auto&& links = *this;
50-
auto&& constants = links.Constants;
51-
return IsExternalReference(constants, link) || (IsInternalReference(constants, link) && links.Count(LinkAddress(link)) != 0);
52-
}
53-
54-
auto EnsureLinkExists(TLinkAddress link, const std::string& argument = {}) const -> void
55-
{
56-
auto&& links = *this;
57-
if (not links.Exists(link))
58-
{
59-
throw ArgumentLinkDoesNotExistsException<TLinkAddress>(link, argument);
60-
}
61-
}
62-
63-
auto Each(auto&& handler, std::convertible_to<TLinkAddress> auto... restrictions) const -> TLinkAddress
64-
// TODO: later create noexcept(expr)
65-
{
66-
auto&& links = *this;
67-
TLinkAddress array[] = { static_cast<TLinkAddress>(restrictions)... };
68-
return links.Each(handler, array);
69-
}
70-
71-
auto GetLink(TLinkAddress link) const -> Interfaces::IArray auto
72-
{
73-
auto&& links = *this;
74-
auto&& constants = links.Constants;
75-
if (IsExternalReference(constants, link))
76-
{
77-
return Point(link, constants.TargetPart + 1);
78-
}
79-
80-
// TODO: dynamic polymorphism (for @Konard)
81-
//auto linkPartsSetter = Setter<IList<TLinkAddress>, TLinkAddress>(constants.Continue, constants.Break);
82-
//links.Each(linkPartsSetter.SetAndReturnTrue, link);
83-
//return linkPartsSetter.Result;
84-
85-
std::vector<TLinkAddress> wrapper;
86-
links.Each([&wrapper, &constants](Interfaces::IArray auto&& link)
87-
{
88-
wrapper = std::vector(std::ranges::begin(link), std::ranges::end(link));
89-
return constants.Continue;
90-
}, link);
91-
return wrapper;
92-
}
93-
94-
auto IsFullPoint(TLinkAddress link) const -> bool
95-
{
96-
auto&& links = *this;
97-
if (IsExternalReference(links.Constants, link))
98-
{
99-
return true;
100-
}
101-
links.EnsureLinkExists(link);
102-
return Point<TLinkAddress>::IsFullPoint(links.GetLink(link));
103-
}
104-
105-
auto IsPartialPoint(TLinkAddress link) const -> bool
106-
{
107-
auto&& links = *this;
108-
if (IsExternalReference(links.Constants, link))
109-
{
110-
return true;
111-
}
112-
links.EnsureLinkExists(link);
113-
return Point<TLinkAddress>::IsPartialPoint(links.GetLink(link));
114-
}
11540
};
11641
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,128 @@
11
namespace Platform::Data
22
{
3+
template<typename TLinkAddress>
4+
static TLinkAddress Create(auto&& storage, Interfaces::CArray auto&& substitution)
5+
{
6+
auto _continue { storage.Constants.Continue };
7+
TLinkAddress createdLinkAddress;
8+
storage.Create(substitution, [&createdLinkAddress, _continue] (Interfaces::CArray auto&& before, Interfaces::CArray auto&& after)
9+
{
10+
createdLinkAddress = after[0];
11+
return _continue;
12+
});
13+
return createdLinkAddress;
14+
}
315

16+
template<typename TLinkAddress>
17+
static TLinkAddress Create(auto&& storage)
18+
{
19+
constexpr std::array<TLinkAddress, 0> empty{};
20+
return Create<TLinkAddress>(storage, empty);
21+
}
22+
23+
template<typename TLinkAddress>
24+
static TLinkAddress Count(auto&& storage)
25+
// TODO: later add noexcept(expr)
26+
{
27+
constexpr std::array<TLinkAddress, 0> empty {};
28+
return storage.Count(empty);
29+
}
30+
31+
template<typename TLinkAddress>
32+
static TLinkAddress Count(auto&& storage, std::convertible_to<TLinkAddress> auto... restriction)
33+
// TODO: later add noexcept(expr)
34+
{
35+
std::array<TLinkAddress, sizeof...(restriction)> array { static_cast<TLinkAddress>(restriction)... };
36+
return storage.Count(array);
37+
}
38+
39+
template<typename TLinkAddress>
40+
static bool Exists(auto&& storage, TLinkAddress link) noexcept
41+
{
42+
auto&& constants = storage.Constants;
43+
return IsExternalReference(constants, link) || (IsInternalReference(constants, link) && Count<TLinkAddress>(storage, link) != 0);
44+
}
45+
46+
template<typename TLinkAddress>
47+
static void EnsureLinkExists(auto&& storage, TLinkAddress link, const std::string& argument = {})
48+
{
49+
if (!storage.Exists(link))
50+
{
51+
throw ArgumentLinkDoesNotExistsException<TLinkAddress>(link, argument);
52+
}
53+
}
54+
55+
template<typename TLinkAddress>
56+
static TLinkAddress Each(auto&& storage, auto&& handler, std::convertible_to<TLinkAddress> auto... restrictions)
57+
// TODO: later create noexcept(expr)
58+
{
59+
TLinkAddress array[] = { static_cast<TLinkAddress>(restrictions)... };
60+
return storage.Each(handler, array);
61+
}
62+
63+
template<typename TLinkAddress>
64+
static Interfaces::CArray auto GetLink(auto&& storage, TLinkAddress link)
65+
{
66+
auto constants = storage.Constants;
67+
auto _continue = constants.Continue;
68+
auto any = constants.Any;
69+
if (IsExternalReference(constants, link))
70+
{
71+
std::vector resultLink {link,link,link};
72+
return resultLink;
73+
}
74+
75+
std::vector<TLinkAddress> resultLink;
76+
storage.Each(std::array{link, any, any}, [&resultLink, _continue](Interfaces::CArray auto&& link)
77+
{
78+
resultLink = { std::ranges::begin(link), std::ranges::end(link) };
79+
return _continue;
80+
});
81+
Expects(!resultLink.empty());
82+
return resultLink;
83+
}
84+
85+
template<typename TLinkAddress>
86+
static bool IsFullPoint(auto&& storage, TLinkAddress link)
87+
{
88+
if (IsExternalReference(storage.Constants, link))
89+
{
90+
return true;
91+
}
92+
storage.EnsureLinkExists(link);
93+
return Point<TLinkAddress>::IsFullPoint(storage.GetLink(link));
94+
}
95+
96+
template<typename TLinkAddress>
97+
static bool IsPartialPoint(auto&& storage, TLinkAddress link)
98+
{
99+
if (IsExternalReference(storage.Constants, link))
100+
{
101+
return true;
102+
}
103+
storage.EnsureLinkExists(link);
104+
return Point<TLinkAddress>::IsPartialPoint(storage.GetLink(link));
105+
}
106+
107+
template<typename TLinkAddress>
108+
static TLinkAddress Delete(auto&& storage, std::convertible_to<TLinkAddress> auto ...restriction)
109+
{
110+
auto constants = storage.Constants;
111+
auto _continue = constants.Continue;
112+
std::array restrictionArray { static_cast<TLinkAddress>(restriction)... };
113+
TLinkAddress deletedLinkAddress;
114+
storage.Delete(restrictionArray, [&deletedLinkAddress, _continue](Interfaces::CArray auto before, Interfaces::CArray auto after)
115+
{
116+
deletedLinkAddress = before[0];
117+
return _continue;
118+
});
119+
return deletedLinkAddress;
120+
}
121+
122+
template<typename TLinkAddress>
123+
static bool Exists(const auto&& storage, TLinkAddress linkAddress)
124+
{
125+
auto constants = storage.Constants;
126+
return constants.IsExternalReference(linkAddress) || (constants.IsInternalReference(linkAddress) && (Count(storage, linkAddress) > 0));
127+
}
4128
}

0 commit comments

Comments
 (0)