diff --git a/headers/enduro2d/high/address.hpp b/headers/enduro2d/high/address.hpp index 0224fb36..46a00ba6 100644 --- a/headers/enduro2d/high/address.hpp +++ b/headers/enduro2d/high/address.hpp @@ -10,4 +10,6 @@ namespace e2d { namespace address { + str parent(str_view address); + str nested(str_view address); }} diff --git a/sources/enduro2d/high/address.cpp b/sources/enduro2d/high/address.cpp index 63bc9b87..c676c3c7 100644 --- a/sources/enduro2d/high/address.cpp +++ b/sources/enduro2d/high/address.cpp @@ -6,6 +6,34 @@ #include +namespace +{ + using namespace e2d; + + const str_view address_separator = ":/"; + + str_view::iterator str_view_search(str_view str, str_view s_str) noexcept { + return std::search(str.begin(), str.end(), s_str.begin(), s_str.end()); + } +} + namespace e2d { namespace address { + str parent(str_view address) { + const auto sep_e = str_view_search(address, address_separator); + if ( sep_e == address.end() ) { + return address; + } + const auto sep_d = std::distance(address.begin(), sep_e); + return address.substr(0, static_cast(sep_d)); + } + + str nested(str_view address) { + const auto sep_e = str_view_search(address, address_separator); + if ( sep_e == address.end() ) { + return str(); + } + const auto sep_d = std::distance(address.begin(), sep_e); + return address.substr(static_cast(sep_d) + address_separator.size()); + } }} diff --git a/untests/sources/untests_high/address.cpp b/untests/sources/untests_high/address.cpp index 8e6a9a69..231b6c60 100644 --- a/untests/sources/untests_high/address.cpp +++ b/untests/sources/untests_high/address.cpp @@ -8,4 +8,24 @@ using namespace e2d; TEST_CASE("address") { + SECTION("parent") { + REQUIRE(address::parent("") == ""); + REQUIRE(address::parent(":/") == ""); + REQUIRE(address::parent(":/child") == ""); + REQUIRE(address::parent("at/las.json") == "at/las.json"); + REQUIRE(address::parent("at/las.json:/") == "at/las.json"); + REQUIRE(address::parent("at/las.json:/spr/ite.png") == "at/las.json"); + REQUIRE(address::parent("at/las.json:/spr/ite.png:/") == "at/las.json"); + REQUIRE(address::parent("at/las.json:/spr/ite.png:/child") == "at/las.json"); + } + SECTION("nested") { + REQUIRE(address::nested("") == ""); + REQUIRE(address::nested(":/") == ""); + REQUIRE(address::nested(":/chi/ld") == "chi/ld"); + REQUIRE(address::nested("at/las.json") == ""); + REQUIRE(address::nested("at/las.json:/") == ""); + REQUIRE(address::nested("at/las.json:/spr/ite.png") == "spr/ite.png"); + REQUIRE(address::nested("at/las.json:/spr/ite.png:/") == "spr/ite.png:/"); + REQUIRE(address::nested("at/las.json:/spr/ite.png:/chi/ld") == "spr/ite.png:/chi/ld"); + } }