15#ifndef HARDWARE_INTERFACE__HELPERS_HPP_
16#define HARDWARE_INTERFACE__HELPERS_HPP_
22#include <unordered_map>
36template <
typename Container,
typename T>
37[[nodiscard]]
auto get_item_iterator(
const Container & container,
const T & item)
39 if constexpr (std::is_same_v<Container, std::vector<T>>)
41 return std::find(container.begin(), container.end(), item);
44 std::is_same_v<Container, std::map<T, typename Container::mapped_type>> ||
45 std::is_same_v<Container, std::unordered_map<T, typename Container::mapped_type>>)
47 return container.find(item);
51 using is_vector = std::is_same<Container, std::vector<T>>;
52 using is_map = std::is_same<Container, std::map<T, typename Container::mapped_type>>;
53 using is_unordered_map =
54 std::is_same<Container, std::unordered_map<T, typename Container::mapped_type>>;
57 is_vector::value || is_map::value || is_unordered_map::value,
58 "Only std::vector, std::map and std::unordered_map are supported.");
68template <
typename Container,
typename T>
69[[nodiscard]]
bool has_item(
const Container & container,
const T & item)
71 return get_item_iterator(container, item) != container.end();
80void add_item(std::vector<T> & vector,
const T & item)
82 if (!has_item(vector, item))
84 vector.push_back(item);
95template <
typename Container>
96[[nodiscard]]
bool remove_item(Container & container,
typename Container::const_reference item)
98 auto it = get_item_iterator(container, item);
99 if (it != container.end())
113template <
typename Container>
114[[nodiscard]]
bool has_any_item(
115 const Container & container,
const std::vector<typename Container::key_type> & items)
118 items.begin(), items.end(),
119 [&container](
const typename Container::key_type & item) { return has_item(container, item); });
129[[nodiscard]]
bool has_any_item(
const std::vector<T> & container,
const std::vector<T> & items)
132 items.begin(), items.end(), [&container](
const T & item) { return has_item(container, item); });
141template <
typename Container>
142[[nodiscard]]
bool has_all_items(
143 const Container & container,
const std::vector<typename Container::key_type> & items)
146 items.begin(), items.end(),
147 [&container](
const typename Container::key_type & item) { return has_item(container, item); });
157[[nodiscard]]
bool has_all_items(
const std::vector<T> & container,
const std::vector<T> & items)
160 items.begin(), items.end(), [&container](
const T & item) { return has_item(container, item); });
171template <
typename Container>
172[[nodiscard]]
bool is_unique(Container container)
174 std::sort(container.begin(), container.end());
175 return std::adjacent_find(container.cbegin(), container.cend()) == container.cend();