14416fce6SCezary Zwolak #pragma once
24416fce6SCezary Zwolak 
34416fce6SCezary Zwolak #include "interfaces/json_storage.hpp"
4dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp"
54416fce6SCezary Zwolak 
64416fce6SCezary Zwolak namespace utils
74416fce6SCezary Zwolak {
84416fce6SCezary Zwolak 
94416fce6SCezary Zwolak class ToLabeledThresholdParamConversion
104416fce6SCezary Zwolak {
114416fce6SCezary Zwolak   public:
124416fce6SCezary Zwolak     LabeledTriggerThresholdParams operator()(const std::monostate& arg) const;
134416fce6SCezary Zwolak     LabeledTriggerThresholdParams
144416fce6SCezary Zwolak         operator()(const std::vector<numeric::ThresholdParam>& arg) const;
154416fce6SCezary Zwolak     LabeledTriggerThresholdParams
164416fce6SCezary Zwolak         operator()(const std::vector<discrete::ThresholdParam>& arg) const;
174416fce6SCezary Zwolak };
184416fce6SCezary Zwolak 
194416fce6SCezary Zwolak class FromLabeledThresholdParamConversion
204416fce6SCezary Zwolak {
214416fce6SCezary Zwolak   public:
224416fce6SCezary Zwolak     TriggerThresholdParams operator()(
234416fce6SCezary Zwolak         const std::vector<numeric::LabeledThresholdParam>& arg) const;
244416fce6SCezary Zwolak     TriggerThresholdParams operator()(
254416fce6SCezary Zwolak         const std::vector<discrete::LabeledThresholdParam>& arg) const;
264416fce6SCezary Zwolak };
274416fce6SCezary Zwolak 
284416fce6SCezary Zwolak SensorsInfo fromLabeledSensorsInfo(const std::vector<LabeledSensorInfo>& infos);
294416fce6SCezary Zwolak 
30*94f71c51SSzymon Dompke TriggerThresholdParams
31*94f71c51SSzymon Dompke     fromLabeledThresholdParam(const std::vector<LabeledThresholdParam>& params);
32*94f71c51SSzymon Dompke 
334416fce6SCezary Zwolak nlohmann::json labeledThresholdParamsToJson(
344416fce6SCezary Zwolak     const LabeledTriggerThresholdParams& labeledThresholdParams);
354416fce6SCezary Zwolak 
36*94f71c51SSzymon Dompke template <typename T>
37*94f71c51SSzymon Dompke struct is_variant : std::false_type
38*94f71c51SSzymon Dompke {};
39*94f71c51SSzymon Dompke 
40*94f71c51SSzymon Dompke template <typename... Args>
41*94f71c51SSzymon Dompke struct is_variant<std::variant<Args...>> : std::true_type
42*94f71c51SSzymon Dompke {};
43*94f71c51SSzymon Dompke 
44*94f71c51SSzymon Dompke template <typename T>
45*94f71c51SSzymon Dompke inline constexpr bool is_variant_v = is_variant<T>::value;
46*94f71c51SSzymon Dompke 
47*94f71c51SSzymon Dompke template <typename AlternativeT, typename VariantT>
48*94f71c51SSzymon Dompke requires is_variant_v<VariantT>
49*94f71c51SSzymon Dompke bool isFirstElementOfType(const std::vector<VariantT>& collection)
50*94f71c51SSzymon Dompke {
51*94f71c51SSzymon Dompke     if (collection.empty())
52*94f71c51SSzymon Dompke     {
53*94f71c51SSzymon Dompke         return false;
54*94f71c51SSzymon Dompke     }
55*94f71c51SSzymon Dompke     return std::holds_alternative<AlternativeT>(*collection.begin());
56*94f71c51SSzymon Dompke }
57*94f71c51SSzymon Dompke 
584416fce6SCezary Zwolak } // namespace utils
59