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(); }