19#ifndef HEDGEHOG_CX_TYPES_NODES_MAP_H_
20#define HEDGEHOG_CX_TYPES_NODES_MAP_H_
26#include "../behavior/abstract_node.h"
37 std::vector<std::string> types_{};
38 std::vector<std::vector<behavior::AbstractNode const *>> nodes_{};
39 std::vector<std::vector<std::string>> nodesName_{};
43 constexpr TypesNodesMap() =
default;
45 constexpr ~TypesNodesMap() =
default;
49 [[nodiscard]]
constexpr size_t nbTypes()
const {
return types_.size(); }
53 [[nodiscard]]
constexpr std::vector<std::string>
const &types()
const {
return types_; }
57 [[nodiscard]]
constexpr std::vector<std::vector<behavior::AbstractNode const *>>
const &nodes()
const {
63 [[nodiscard]]
constexpr std::vector<std::vector<std::string>>
const &nodesName()
const {
return nodesName_; }
68 [[nodiscard]]
constexpr std::vector<behavior::AbstractNode const *> nodes(std::string
const &type)
const {
69 auto posIt = std::find(types_.cbegin(), types_.cend(), type);
70 if (posIt != types_.cend()) {
return nodes_.at(
static_cast<unsigned long>(std::distance(types_.cbegin(), posIt))); }
75 constexpr void clear() {
77 for (
auto &nodes : nodes_) { nodes.clear(); }
78 for (
auto &nodesName : nodesName_) { nodesName.clear(); }
84 constexpr void insert(std::string
const &type, hh_cx::behavior::AbstractNode
const *node) {
85 auto posIt = std::find(types_.cbegin(), types_.cend(), type);
86 if (posIt != types_.cend()) {
87 nodes_.at(
static_cast<unsigned long>(std::distance(types_.cbegin(), posIt))).push_back(node);
88 nodesName_.at(
static_cast<unsigned long>(std::distance(types_.cbegin(), posIt))).push_back(node->name());
90 types_.push_back(type);
91 nodes_.push_back(std::vector<behavior::AbstractNode const *>{node});
92 nodesName_.push_back(std::vector<std::string>{node->name()});
99 [[nodiscard]]
constexpr bool contains(std::string
const &type)
const {
100 return std::find(types_.cbegin(), types_.cend(), type) != types_.cend();
107 [[nodiscard]]
constexpr bool contains(std::string
const &type, hh_cx::behavior::AbstractNode
const *node)
const {
108 if (contains(type)) {
109 auto nodes = this->nodes(type);
110 if (std::find(nodes.cbegin(), nodes.cend(), node) == nodes.cend()) {
return false; }
111 else {
return true; }
112 }
else {
return false; }
117 [[nodiscard]]
constexpr size_t maxTypeSize()
const {
118 if(types_.empty()) {
return 0; }
119 return std::max_element(
120 types_.cbegin(), types_.cend(),
121 [](
auto const &lhs,
auto const &rhs) { return lhs.size() < rhs.size(); }
127 [[nodiscard]]
constexpr size_t maxNumberNodes()
const {
131 return std::max_element(
132 nodes_.cbegin(), nodes_.cend(),
133 [](
auto const &lhs,
auto const &rhs) { return lhs.size() < rhs.size(); }
139 [[nodiscard]]
constexpr size_t maxSizeName()
const {
141 for (
auto const &type : nodesName_) {
142 for (
auto const &nodeName : type) {
143 if (nodeName.size() > ret) { ret = nodeName.size(); }