https://mp.weixin.qq.com/s/0GSNIf0wCApPi8XYwa8MdQ
简单介绍EventSet的实现。
1. EventSet
定义事件集合:
0) 类参数
EventSet类包含两个类参数:
a. gate: (UInt, UInt) => Bool:使用两个参数,返回一个Bool;
b. events:事件序列;
c. event:事件的类型为:(String, () => Bool),这是一个二元组:第一个是事件名字符串,第二个是事件返回是否触发的方法;
1) size
返回事件集合中事件的个数。
2) hits
表示事件是否触发,把每个事件是否触发的Bool整合成为UInt返回。
3) check
使用掩码和gate方法来过滤hits,以检察某个事件是否触发。
4) dump
打印触发的事件的名称。
5) withCovers
为每个事件添加覆盖测试。
2. EventSets
定义多个事件集合:
0) 数据成员
a. 类参数:eventsSets:事件集合的序列;
b. eventSetIdBits:事件集合的ID所占用的位宽;
1) maskEventSelector
这是一个动(词)名(词)结构,对event selector进行mask,取出有效的事件选择位:
其中:
a. 参数eventSel是一个事件选择器;
b. setMask表示事件集合的ID占用的有效位数;eventSetIdBits是为时间集合ID分配的总位数,这里是8;但是不一定用完这8位,由eventSets.size决定;
c. maskMask从名称可知其是一个二级掩码,即事件集合掩码的掩码;多个事件集合中事件最多的集合中的事件数决定了事件集合掩码的位数;
d. 左移eventSetIdBits位,表示低eventSetIdBits位是事件集合ID的掩码,高位是事件集合中事件的掩码;
e. 由此可知,eventSel也是一个二级结构,低eventSetIdBits位表示选择的事件集合的ID,高位则表示该事件集合中事件的掩码;
f. setMask | maskMask表示事件选择器中的全部有效位,eventSel与之相与则表示取出eventSel中的有效位,而忽略其余的无效位;
2) decode
解出event selector这个二级结构:
3) evaluate
根据事件选择器,确定其中的事件是否发生:
其中:
a. 首先使用decode解出事件集合set,事件集合中事件的掩码mask;
b. 对各个事件集合使用mask进行check;
c. 选择相应事件集合的check结果返回;