summaryrefslogtreecommitdiff
path: root/src/register_manager.cc
blob: 3abbd61b9bd1f104a7ad676a5ff0aaba887d026f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "register_manager.hh"

#include "assert.hh"
#include "hash_map.hh"
#include "string_utils.hh"

namespace Kakoune
{

Register& RegisterManager::operator[](StringView reg) const
{
    if (reg.length() == 1)
        return (*this)[reg[0_byte]];

    static const HashMap<String, Codepoint> reg_names = {
        { "slash", '/' },
        { "dquote", '"' },
        { "pipe", '|' },
        { "caret", '^' },
        { "arobase", '@' },
        { "percent", '%' },
        { "dot", '.' },
        { "hash", '#' },
        { "underscore", '_' },
        { "colon", ':' }
    };
    auto it = reg_names.find(reg);
    if (it == reg_names.end())
        throw runtime_error(format("no such register: '{}'", reg));
    return (*this)[it->value];
}

Register& RegisterManager::operator[](Codepoint c) const
{
    c = to_lower(c);
    auto it = m_registers.find(c);
    if (it == m_registers.end())
        throw runtime_error(format("no such register: '{}'", c));

    return *(it->value);
}

void RegisterManager::add_register(Codepoint c, std::unique_ptr<Register> reg)
{
    auto& reg_ptr = m_registers[c];
    kak_assert(not reg_ptr);
    reg_ptr = std::move(reg);
}

}