Program Listing for File PDJE_RAIL.hpp

Return to documentation for file (include\judge\PDJE_RAIL.hpp)

#pragma once
#include "PDJE_Rule.hpp"

static inline uint64_t
splitmix64_mix(uint64_t x) noexcept
{
    x += 0x9e3779b97f4a7c15ULL;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9ULL;
    x = (x ^ (x >> 27)) * 0x94d049bb133111ebULL;
    return x ^ (x >> 31);
}

static inline void
hash_combine64(uint64_t &seed, uint64_t v) noexcept
{
    seed = splitmix64_mix(seed ^ v);
}

template <class T>
static inline uint64_t
h64(const T &v) noexcept
{
    return static_cast<uint64_t>(std::hash<T>{}(v));
}
namespace std {
template <> struct std::hash<PDJE_JUDGE::RAIL_KEY::KB_MOUSE> {
    std::size_t
    operator()(const PDJE_JUDGE::RAIL_KEY::KB_MOUSE &rule) const noexcept
    {
        uint64_t seed = 0;
        hash_combine64(seed, h64(rule.Device_Name));
        hash_combine64(seed, h64(rule.DeviceKey));
        return static_cast<size_t>(seed);
    }
};

template <> struct std::hash<PDJE_JUDGE::RAIL_KEY::MIDI> {
    std::size_t
    operator()(const PDJE_JUDGE::RAIL_KEY::MIDI &rule) const noexcept
    {
        uint64_t seed = 0;
        hash_combine64(seed, h64(rule.ch));
        hash_combine64(seed, h64(rule.port_name));
        hash_combine64(seed, h64(rule.pos));
        hash_combine64(seed, h64(rule.type));
        return static_cast<size_t>(seed);
    }
};

}; // namespace std

namespace PDJE_JUDGE {
struct RAIL_DB {
    std::unordered_map<std::string, int64_t>                  offset;
    std::unordered_map<uint64_t, std::vector<RAIL_KEY::META>> meta;
    std::unordered_map<RAIL_KEY::KB_MOUSE, uint64_t>          kb_mouse_raildata;
    std::unordered_map<RAIL_KEY::MIDI, uint64_t>              midi_raildata;

    void
    Add(const RAIL_KEY::KB_MOUSE &key,
        const PDJE_Dev_Type      &type,
        const uint64_t           &id,
        const int64_t             offset);
    void
    Add(const RAIL_KEY::MIDI &key, const uint64_t &id, const int64_t offset);
    void
    Delete(const RAIL_KEY::KB_MOUSE &key);
    void
    Delete(const RAIL_KEY::MIDI &key);

    bool
    Empty();
    void
    Clear();

    std::optional<uint64_t>
    GetID(const RAIL_KEY::KB_MOUSE &key);
    std::optional<uint64_t>
    GetID(const RAIL_KEY::MIDI &key);

    std::optional<std::vector<RAIL_KEY::META>>
    GetMETA(const uint64_t id);
};

}; // namespace PDJE_JUDGE