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.cbegin(), container.cend(), 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.cend();
80void add_item(std::vector<T> & vector,
const T & item)
82 if (!has_item(vector, item))
84 vector.push_back(item);
94void add_items(std::vector<T> & vector,
const std::vector<T> & items)
96 for (
const auto & item : items)
98 add_item(vector, item);
109template <
typename Container>
110[[nodiscard]]
bool remove_item(Container & container,
typename Container::const_reference item)
112 auto it = get_item_iterator(container, item);
113 if (it != container.end())
127template <
typename Container>
128[[nodiscard]]
bool has_any_item(
129 const Container & container,
const std::vector<typename Container::key_type> & items)
132 items.begin(), items.end(),
133 [&container](
const typename Container::key_type & item) { return has_item(container, item); });
143[[nodiscard]]
bool has_any_item(
const std::vector<T> & container,
const std::vector<T> & items)
146 items.begin(), items.end(), [&container](
const T & item) { return has_item(container, item); });
155template <
typename Container>
156[[nodiscard]]
bool has_all_items(
157 const Container & container,
const std::vector<typename Container::key_type> & items)
160 items.begin(), items.end(),
161 [&container](
const typename Container::key_type & item) { return has_item(container, item); });
171[[nodiscard]]
bool has_all_items(
const std::vector<T> & container,
const std::vector<T> & items)
174 items.begin(), items.end(), [&container](
const T & item) { return has_item(container, item); });
185template <
typename Container>
186[[nodiscard]]
bool is_unique(Container container)
188 std::sort(container.begin(), container.end());
189 return std::adjacent_find(container.cbegin(), container.cend()) == container.cend();