| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef INPUT_MAP_H |
| | #define INPUT_MAP_H |
| |
|
| | #include <stdint.h> |
| | #include <stdlib.h> |
| | #include <string.h> |
| |
|
| | #include <string> |
| |
|
| | #include "SimplePool.h" |
| | #include "../shared/WinptyAssert.h" |
| |
|
| | class InputMap { |
| | public: |
| | struct Key { |
| | uint16_t virtualKey; |
| | uint32_t unicodeChar; |
| | uint16_t keyState; |
| |
|
| | std::string toString() const; |
| | }; |
| |
|
| | private: |
| | struct Node; |
| |
|
| | struct Branch { |
| | Branch() { |
| | memset(&children, 0, sizeof(children)); |
| | } |
| |
|
| | Node *children[256]; |
| | }; |
| |
|
| | struct Node { |
| | Node() : childCount(0) { |
| | Key zeroKey = { 0, 0, 0 }; |
| | key = zeroKey; |
| | } |
| |
|
| | Key key; |
| | int childCount; |
| | enum { kTinyCount = 8 }; |
| | union { |
| | Branch *branch; |
| | struct { |
| | unsigned char values[kTinyCount]; |
| | Node *children[kTinyCount]; |
| | } tiny; |
| | } u; |
| |
|
| | bool hasKey() const { |
| | return key.virtualKey != 0 || key.unicodeChar != 0; |
| | } |
| | }; |
| |
|
| | private: |
| | SimplePool<Node, 256> m_nodePool; |
| | SimplePool<Branch, 8> m_branchPool; |
| | Node m_root; |
| |
|
| | public: |
| | void set(const char *encoding, int encodingLen, const Key &key); |
| | int lookupKey(const char *input, int inputSize, |
| | Key &keyOut, bool &incompleteOut) const; |
| | void dumpInputMap() const; |
| |
|
| | private: |
| | Node *getChild(Node &node, unsigned char ch) { |
| | return const_cast<Node*>(getChild(static_cast<const Node&>(node), ch)); |
| | } |
| |
|
| | const Node *getChild(const Node &node, unsigned char ch) const { |
| | if (node.childCount <= Node::kTinyCount) { |
| | for (int i = 0; i < node.childCount; ++i) { |
| | if (node.u.tiny.values[i] == ch) { |
| | return node.u.tiny.children[i]; |
| | } |
| | } |
| | return NULL; |
| | } else { |
| | return node.u.branch->children[ch]; |
| | } |
| | } |
| |
|
| | void setHelper(Node &node, const char *encoding, int encodingLen, const Key &key); |
| | Node &getOrCreateChild(Node &node, unsigned char ch); |
| | void dumpInputMapHelper(const Node &node, std::string &encoding) const; |
| | }; |
| |
|
| | const InputMap::Key kKeyZero = { 0, 0, 0 }; |
| |
|
| | void dumpInputMap(InputMap &inputMap); |
| |
|
| | #endif |
| |
|