diff --git a/wxdata/include/scwx/provider/iem_api_provider.hpp b/wxdata/include/scwx/provider/iem_api_provider.hpp index 7b568d83..316890df 100644 --- a/wxdata/include/scwx/provider/iem_api_provider.hpp +++ b/wxdata/include/scwx/provider/iem_api_provider.hpp @@ -4,10 +4,20 @@ #include #include -#include #include +#if defined(_MSC_VER) +# pragma warning(push) +# pragma warning(disable : 4702) +#endif + +#include + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif + namespace scwx::provider { @@ -30,10 +40,10 @@ public: ListTextProducts(std::chrono::sys_time date, std::optional cccc = {}, std::optional pil = {}); - static boost::outcome_v2::result> - ListTextProducts(std::vector> dates, - std::vector ccccs = {}, - std::vector pils = {}); + static boost::outcome_v2::result> ListTextProducts( + ranges::any_view> dates, + ranges::any_view ccccs = {}, + ranges::any_view pils = {}); static std::vector> LoadTextProducts(const std::vector& textProducts); diff --git a/wxdata/source/scwx/provider/iem_api_provider.cpp b/wxdata/source/scwx/provider/iem_api_provider.cpp index 00fff608..b72b3b18 100644 --- a/wxdata/source/scwx/provider/iem_api_provider.cpp +++ b/wxdata/source/scwx/provider/iem_api_provider.cpp @@ -6,7 +6,9 @@ #include #include +#include #include +#include #if (__cpp_lib_chrono < 201907L) # include @@ -50,17 +52,18 @@ IemApiProvider::ListTextProducts(std::chrono::sys_time date, std::string_view pil = optionalPil.has_value() ? optionalPil.value() : std::string_view {}; - return ListTextProducts( - std::vector> {date}, - {cccc}, - {pil}); + const auto dateArray = std::array {date}; + const auto ccccArray = std::array {cccc}; + const auto pilArray = std::array {pil}; + + return ListTextProducts(dateArray, ccccArray, pilArray); } boost::outcome_v2::result> IemApiProvider::ListTextProducts( - std::vector> dates, - std::vector ccccs, - std::vector pils) + ranges::any_view> dates, + ranges::any_view ccccs, + ranges::any_view pils) { using namespace std::chrono; @@ -75,20 +78,24 @@ IemApiProvider::ListTextProducts( # define kDateFormat "%Y-%m-%d" #endif - if (ccccs.empty()) + if (ccccs.begin() == ccccs.end()) { - ccccs.push_back({}); + ccccs = ranges::views::single(std::string_view {}); } - if (pils.empty()) + if (pils.begin() == pils.end()) { - pils.push_back({}); + pils = ranges::views::single(std::string_view {}); } + const auto dv = ranges::to(dates); + const auto cv = ranges::to(ccccs); + const auto pv = ranges::to(pils); + std::vector responses {}; for (const auto& [date, cccc, pil] : - ranges::views::cartesian_product(dates, ccccs, pils)) + ranges::views::cartesian_product(dv, cv, pv)) { auto parameters = cpr::Parameters {{"date", df::format(kDateFormat, date)}};