/// @file /// @brief Task2: member function definitions/implementations #include "task2.hpp" // task2::select, task2::select_union #include // std::array #include // std::function #include // std::unordered_set #include // std::vector #include namespace task2 { /// @brief Selects the subset of vertices for which a boolean function evaluates to true /// @param vertices Two-dimensional vertices to select from /// @param region Boolean function to evaluate if a vertex is selected /// @param invert Inverts the selection process if set to true /// @return Indices of the selected vertices std::unordered_set select(const std::vector& vertices, const Region& region, bool invert) { std::unordered_set selected_indices; for (size_t i = 0; i < vertices.size(); ++i) { const bool isSelected = region(vertices[i]); if ((isSelected && !invert) || (!isSelected && invert)) { selected_indices.insert(i); } } return selected_indices; } /// @brief Selects the subset of vertices for which ANY of a sequence of boolean functions evaluates to true /// @param vertices Two-dimensional vertices to select from /// @param regions Sequence of boolean functions to evaluate /// @param invert Inverts the selection process if set to 'true' /// @return Indices of the selected vertices std::unordered_set select_union(const std::vector& vertices, const std::vector& regions, bool invert) { std::unordered_set selected_indices; for (size_t i = 0; i < vertices.size(); ++i) { bool isSelected = false; // Check if any region function evaluates to true for (const Region& region : regions) { isSelected = isSelected || region(vertices[i]); if (isSelected && !invert) { // Exit inner loop if selected and not inverting break; } } if (isSelected && invert) { // Add to selected set only if inverting and not already selected } else { // Add to selected set for normal selection or inverted with not yet selected selected_indices.insert(i); } } return selected_indices; } } // namespace task2