<commit_before>#pragma once

#include "boost_defs.hpp"

#include "event_queue.hpp"
#include "modifier_flag_manager.hpp"
#include <boost/optional.hpp>
#include <json/json.hpp>
#include <unordered_set>

namespace krbn {
namespace manipulator {
namespace details {

class event_definition final {
public:
  enum class type {
    none,
    key_code,
    pointing_button,
  };

  enum class modifier {
    any,
    caps_lock,
    command,
    control,
    fn,
    left_command,
    left_control,
    left_option,
    left_shift,
    option,
    right_command,
    right_control,
    right_option,
    right_shift,
    shift,
    end_,
  };

  event_definition(const nlohmann::json& json) : type_(type::none) {
    // Set type_ and values.
    do {
      {
        const std::string key = "key_code";
        if (json.find(key) != std::end(json) && json[key].is_string()) {
          if (auto key_code = types::get_key_code(json[key])) {
            type_ = type::key_code;
            key_code_ = *key_code;

            auto m = get_modifier(types::get_modifier_flag(*key_code));
            if (m != modifier::end_) {
              modifiers_.insert(m);
            }
          }
        }
      }
      {
        const std::string key = "pointing_button";
        if (json.find(key) != std::end(json) && json[key].is_string()) {
          if (auto pointing_button = types::get_pointing_button(json[key])) {
            type_ = type::pointing_button;
            pointing_button_ = *pointing_button;
            break;
          }
        }
      }
    } while (false);

    // Set modifiers_.
    {
      const std::string key = "modifiers";
      if (json.find(key) != std::end(json) && json[key].is_array()) {
        for (const auto& j : json[key]) {
          if (j.is_string()) {
            if (j == "any") { modifiers_.insert(modifier::any); }
            if (j == "command") { modifiers_.insert(modifier::command); }
            if (j == "control") { modifiers_.insert(modifier::control); }
            if (j == "fn") { modifiers_.insert(modifier::fn); }
            if (j == "left_command") { modifiers_.insert(modifier::left_command); }
            if (j == "left_control") { modifiers_.insert(modifier::left_control); }
            if (j == "left_option") { modifiers_.insert(modifier::left_option); }
            if (j == "left_shift") { modifiers_.insert(modifier::left_shift); }
            if (j == "option") { modifiers_.insert(modifier::option); }
            if (j == "right_command") { modifiers_.insert(modifier::right_command); }
            if (j == "right_control") { modifiers_.insert(modifier::right_control); }
            if (j == "right_option") { modifiers_.insert(modifier::right_option); }
            if (j == "right_shift") { modifiers_.insert(modifier::right_shift); }
            if (j == "shift") { modifiers_.insert(modifier::shift); }
          }
        }
      }
    }
  }

  event_definition(key_code key_code,
                   const std::unordered_set<modifier> modifiers) : type_(type::key_code),
                                                                   key_code_(key_code),
                                                                   modifiers_(modifiers) {
    auto m = get_modifier(types::get_modifier_flag(key_code));
    if (m != modifier::end_) {
      modifiers_.insert(m);
    }
  }

  event_definition(key_code key_code) : event_definition(key_code, std::unordered_set<modifier>()) {
  }

  event_definition(pointing_button pointing_button) : type_(type::pointing_button),
                                                      pointing_button_(pointing_button) {
  }

  type get_type(void) const {
    return type_;
  }

  boost::optional<key_code> get_key_code(void) const {
    if (type_ == type::key_code) {
      return key_code_;
    }
    return boost::none;
  }

  boost::optional<pointing_button> get_pointing_button(void) const {
    if (type_ == type::pointing_button) {
      return pointing_button_;
    }
    return boost::none;
  }
<commit_msg>remove to append from key_code modifier to modifiers_<commit_after>#pragma once

#include "boost_defs.hpp"

#include "event_queue.hpp"
#include "modifier_flag_manager.hpp"
#include <boost/optional.hpp>
#include <json/json.hpp>
#include <unordered_set>

namespace krbn {
namespace manipulator {
namespace details {

class event_definition final {
public:
  enum class type {
    none,
    key_code,
    pointing_button,
  };

  enum class modifier {
    any,
    caps_lock,
    command,
    control,
    fn,
    left_command,
    left_control,
    left_option,
    left_shift,
    option,
    right_command,
    right_control,
    right_option,
    right_shift,
    shift,
    end_,
  };

  event_definition(const nlohmann::json& json) : type_(type::none) {
    // Set type_ and values.
    do {
      {
        const std::string key = "key_code";
        if (json.find(key) != std::end(json) && json[key].is_string()) {
          if (auto key_code = types::get_key_code(json[key])) {
            type_ = type::key_code;
            key_code_ = *key_code;
          }
        }
      }
      {
        const std::string key = "pointing_button";
        if (json.find(key) != std::end(json) && json[key].is_string()) {
          if (auto pointing_button = types::get_pointing_button(json[key])) {
            type_ = type::pointing_button;
            pointing_button_ = *pointing_button;
            break;
          }
        }
      }
    } while (false);

    // Set modifiers_.
    {
      const std::string key = "modifiers";
      if (json.find(key) != std::end(json) && json[key].is_array()) {
        for (const auto& j : json[key]) {
          if (j.is_string()) {
            if (j == "any") { modifiers_.insert(modifier::any); }
            if (j == "command") { modifiers_.insert(modifier::command); }
            if (j == "control") { modifiers_.insert(modifier::control); }
            if (j == "fn") { modifiers_.insert(modifier::fn); }
            if (j == "left_command") { modifiers_.insert(modifier::left_command); }
            if (j == "left_control") { modifiers_.insert(modifier::left_control); }
            if (j == "left_option") { modifiers_.insert(modifier::left_option); }
            if (j == "left_shift") { modifiers_.insert(modifier::left_shift); }
            if (j == "option") { modifiers_.insert(modifier::option); }
            if (j == "right_command") { modifiers_.insert(modifier::right_command); }
            if (j == "right_control") { modifiers_.insert(modifier::right_control); }
            if (j == "right_option") { modifiers_.insert(modifier::right_option); }
            if (j == "right_shift") { modifiers_.insert(modifier::right_shift); }
            if (j == "shift") { modifiers_.insert(modifier::shift); }
          }
        }
      }
    }
  }

  event_definition(key_code key_code,
                   const std::unordered_set<modifier> modifiers) : type_(type::key_code),
                                                                   key_code_(key_code),
                                                                   modifiers_(modifiers) {
  }

  event_definition(key_code key_code) : event_definition(key_code, std::unordered_set<modifier>()) {
  }

  event_definition(pointing_button pointing_button) : type_(type::pointing_button),
                                                      pointing_button_(pointing_button) {
  }

  type get_type(void) const {
    return type_;
  }

  boost::optional<key_code> get_key_code(void) const {
    if (type_ == type::key_code) {
      return key_code_;
    }
    return boost::none;
  }

  boost::optional<pointing_button> get_pointing_button(void) const {
    if (type_ == type::pointing_button) {
      return pointing_button_;
    }
    return boost::none;
  }

{'fraction_non_alphanumeric': 0.13467452588416196, 'fraction_numerical': 0.0, 'mean_word_length': 2.2643245503973235, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6812031', 'n_tokens_mistral': 2418, 'n_tokens_neox': 2395, 'n_words': 435}