Program Listing for File ridge_group.h

Return to documentation for file (src/ridge_impl/ridge_group.h)

#pragma once

#include <cstddef>
#include <functional>  // for function
#include <map>         // for map
#include <memory>      // for unique_ptr
#include <optional>    // for optional
#include <utility>     // for move, pair
#include <vector>      // for vector

#include "ridge.h"
#include "ridge_config.h"
#include "ridge_impl/ridge_mesh.h"
#include "ridge_impl/ridge_set.h"  // for RidgeSet
#include "types.h"

namespace sota {
class RidgeMesh;

using GroupOfRidgeMeshes = std::vector<RidgeMesh*>;
using BiomeGroups = std::vector<GroupOfRidgeMeshes>;

class RidgeGroup {
 public:
  RidgeGroup(GroupOfRidgeMeshes meshes, std::unique_ptr<RidgeSet> ridge_set, Biome biome)
      : _meshes(meshes), _ridge_set(std::move(ridge_set)), _biome(biome) {}
  explicit RidgeGroup(GroupOfRidgeMeshes meshes, Biome biome) : _meshes(meshes), _ridge_set({}), _biome(biome) {}

  RidgeGroup() = default;
  RidgeGroup(const RidgeGroup& other) = delete;
  RidgeGroup(RidgeGroup&& other) = default;
  RidgeGroup& operator=(const RidgeGroup& other) = delete;
  RidgeGroup& operator=(RidgeGroup&& other) = default;

  // getters
  const GroupOfRidgeMeshes& meshes();

  void fmap(std::function<void(const GroupOfRidgeMeshes&)> func);
  void fmap_mutable(std::function<void(GroupOfRidgeMeshes&)> func);
  void init_ridges(DiscreteVertexToDistance& distance_map, float offset, int divisions);
  bool has(RidgeMesh* mesh) { return std::find(_meshes.begin(), _meshes.end(), mesh) != _meshes.end(); }
  bool has_ridge_set() const { return _ridge_set.has_value(); };
  size_t size() const { return _meshes.size(); }
  Biome biome() { return _biome; }

  void add(RidgeMesh* mesh) { _meshes.push_back(mesh); }

 private:
  friend std::optional<RidgeGroup> combine(std::vector<RidgeGroup*> groups, RidgeConfig config);
  friend std::vector<RidgeGroup> remove_mesh(RidgeGroup& ridge_group, RidgeMesh* mesh, RidgeConfig config);

  GroupOfRidgeMeshes _meshes;
  std::optional<std::unique_ptr<RidgeSet>> _ridge_set{};
  Biome _biome;

  void assign_ridges();
  void calculate_corner_points_distances_to_border(DiscreteVertexToDistance& distance_map, int divisions);
};

bool check_biomes(std::vector<RidgeGroup>& groups);

// Return new RidgeGroup based on multiple RidgeGroup's.
std::optional<RidgeGroup> combine(std::vector<RidgeGroup*> groups, RidgeConfig config);

// If vector of RidgeGroup's is given remove specific RidgeGroups from it if that pointer to it is present in
// 'groups_to_be_removed' vector
void subtract(std::vector<RidgeGroup>& base, std::vector<RidgeGroup*> removed);

// If RidgeGroup is given return vector of RidgeGroups which are formed by removal of specific RidgeMesh from original
// RidgeGroup. Result must contain 1, 2 or 3 RidgeGroups - impossible to form more groups by removal of only element
std::vector<RidgeGroup> remove_mesh(RidgeGroup& ridge_group, RidgeMesh* mesh, RidgeConfig config);

}  // namespace sota