12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /* eslint-disable no-bitwise */
- export class FlagManager {
- get cell() {
- return this.view.cell;
- }
- constructor(view, actions, bootstrap = []) {
- this.view = view;
- const flags = {};
- const attrs = {};
- let shift = 0;
- Object.keys(actions).forEach((attr) => {
- let labels = actions[attr];
- if (!Array.isArray(labels)) {
- labels = [labels];
- }
- labels.forEach((label) => {
- let flag = flags[label];
- if (!flag) {
- shift += 1;
- flag = flags[label] = 1 << shift;
- }
- attrs[attr] |= flag;
- });
- });
- let labels = bootstrap;
- if (!Array.isArray(labels)) {
- labels = [labels];
- }
- labels.forEach((label) => {
- if (!flags[label]) {
- shift += 1;
- flags[label] = 1 << shift;
- }
- });
- // 26 - 30 are reserved for paper flags
- // 31+ overflows maximal number
- if (shift > 25) {
- throw new Error('Maximum number of flags exceeded.');
- }
- this.flags = flags;
- this.attrs = attrs;
- this.bootstrap = bootstrap;
- }
- getFlag(label) {
- const flags = this.flags;
- if (flags == null) {
- return 0;
- }
- if (Array.isArray(label)) {
- return label.reduce((memo, key) => memo | flags[key], 0);
- }
- return flags[label] | 0;
- }
- hasAction(flag, label) {
- return flag & this.getFlag(label);
- }
- removeAction(flag, label) {
- return flag ^ (flag & this.getFlag(label));
- }
- getBootstrapFlag() {
- return this.getFlag(this.bootstrap);
- }
- getChangedFlag() {
- let flag = 0;
- if (!this.attrs) {
- return flag;
- }
- Object.keys(this.attrs).forEach((attr) => {
- if (this.cell.hasChanged(attr)) {
- flag |= this.attrs[attr];
- }
- });
- return flag;
- }
- }
- //# sourceMappingURL=flag.js.map
|