| 211 | |
| 212 | |
| 213 | class Num2Layer: |
| 214 | def __init__(self): |
| 215 | # type: () -> None |
| 216 | self.num2layer = {} # type: Dict[int, Type[Packet]] |
| 217 | self.layer2num = {} # type: Dict[Type[Packet], int] |
| 218 | |
| 219 | def register(self, num, layer): |
| 220 | # type: (int, Type[Packet]) -> None |
| 221 | self.register_num2layer(num, layer) |
| 222 | self.register_layer2num(num, layer) |
| 223 | |
| 224 | def register_num2layer(self, num, layer): |
| 225 | # type: (int, Type[Packet]) -> None |
| 226 | self.num2layer[num] = layer |
| 227 | |
| 228 | def register_layer2num(self, num, layer): |
| 229 | # type: (int, Type[Packet]) -> None |
| 230 | self.layer2num[layer] = num |
| 231 | |
| 232 | @overload |
| 233 | def __getitem__(self, item): |
| 234 | # type: (Type[Packet]) -> int |
| 235 | pass |
| 236 | |
| 237 | @overload |
| 238 | def __getitem__(self, item): # noqa: F811 |
| 239 | # type: (int) -> Type[Packet] |
| 240 | pass |
| 241 | |
| 242 | def __getitem__(self, item): # noqa: F811 |
| 243 | # type: (Union[int, Type[Packet]]) -> Union[int, Type[Packet]] |
| 244 | if isinstance(item, int): |
| 245 | return self.num2layer[item] |
| 246 | else: |
| 247 | return self.layer2num[item] |
| 248 | |
| 249 | def __contains__(self, item): |
| 250 | # type: (Union[int, Type[Packet]]) -> bool |
| 251 | if isinstance(item, int): |
| 252 | return item in self.num2layer |
| 253 | else: |
| 254 | return item in self.layer2num |
| 255 | |
| 256 | def get(self, |
| 257 | item, # type: Union[int, Type[Packet]] |
| 258 | default=None, # type: Optional[Type[Packet]] |
| 259 | ): |
| 260 | # type: (...) -> Optional[Union[int, Type[Packet]]] |
| 261 | return self[item] if item in self else default |
| 262 | |
| 263 | def __repr__(self): |
| 264 | # type: () -> str |
| 265 | lst = [] |
| 266 | for num, layer in self.num2layer.items(): |
| 267 | if layer in self.layer2num and self.layer2num[layer] == num: |
| 268 | dir = "<->" |
| 269 | else: |
| 270 | dir = " ->" |