binary tree inlining

This commit is contained in:
AF 2022-07-26 03:33:30 +03:00
parent 2f2ba19f2c
commit 19ccb3a5a0
3 changed files with 15 additions and 8 deletions

View File

@ -128,7 +128,7 @@ class ActiveCreation(
else: else:
resolved: BinaryTree[KeyMetadata[ActiveKeyType, MetaDataType]] = await tree.reference.resolve() resolved: BinaryTree[KeyMetadata[ActiveKeyType, MetaDataType]] = await tree.reference.resolve()
assert isinstance(resolved, BinaryTree) assert isinstance(resolved, BinaryTree)
key_metadata: KeyMetadata[ActiveKeyType, MetaDataType] = await resolved.key.resolve() key_metadata: KeyMetadata[ActiveKeyType, MetaDataType] = resolved.key
assert isinstance(key_metadata, KeyMetadata) assert isinstance(key_metadata, KeyMetadata)
return BinarySplit( return BinarySplit(
tree.create(resolved.treel), key_metadata.key, key_metadata.metadata, tree.create(resolved.treer) tree.create(resolved.treel), key_metadata.key, key_metadata.metadata, tree.create(resolved.treer)
@ -149,7 +149,7 @@ class ActiveCreation(
BinaryTree( BinaryTree(
treel.reference, treel.reference,
treer.reference, treer.reference,
HashPoint.of(KeyMetadata(key, await self.protocol.metadata(treel, treer, key, self))) KeyMetadata(key, await self.protocol.metadata(treel, treer, key, self))
) )
) )
) )

View File

@ -10,7 +10,7 @@ TreeKeyType = TypeVar('TreeKeyType')
class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]): class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]):
def __factory__(self) -> RainbowFactory['BinaryTree[TreeKeyType]']: def __factory__(self) -> RainbowFactory['BinaryTree[TreeKeyType]']:
return self.factory(self.key.factory) return self.factory(self.key.__factory__())
@classmethod @classmethod
def factory(cls, factory: RainbowFactory[TreeKeyType]) -> RainbowFactory['BinaryTree[TreeKeyType]']: def factory(cls, factory: RainbowFactory[TreeKeyType]) -> RainbowFactory['BinaryTree[TreeKeyType]']:
@ -21,17 +21,17 @@ class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]):
self, self,
treel: NullableReference['BinaryTree[TreeKeyType]'], treel: NullableReference['BinaryTree[TreeKeyType]'],
treer: NullableReference['BinaryTree[TreeKeyType]'], treer: NullableReference['BinaryTree[TreeKeyType]'],
key: HashPoint[TreeKeyType] key: TreeKeyType
): ):
assert isinstance(treel, NullableReference) assert isinstance(treel, NullableReference)
assert isinstance(treer, NullableReference) assert isinstance(treer, NullableReference)
assert isinstance(key, HashPoint) assert isinstance(key, Mentionable)
self.treel = treel self.treel = treel
self.treer = treer self.treer = treer
self.key = key self.key = key
def points(self) -> Iterable[HashPoint]: def points(self) -> Iterable[HashPoint]:
return [*self.treel.points(), *self.treer.points(), self.key] return [*self.treel.points(), *self.treer.points(), *RecursiveMentionable.points_of(self.key)]
def __bytes__(self): def __bytes__(self):
return bytes(self.treel) + bytes(self.treer) + bytes(self.key) return bytes(self.treel) + bytes(self.treer) + bytes(self.key)
@ -40,7 +40,7 @@ class BinaryTree(RecursiveMentionable, Generic[TreeKeyType]):
assert isinstance(tab, int) assert isinstance(tab, int)
treel_str, key_str, treer_str = await gather( treel_str, key_str, treer_str = await gather(
self.treel.str(tab), self.treel.str(tab),
hash_point_format(self.key, tab), hash_point_format(HashPoint.of(self.key), tab),
self.treer.str(tab), self.treer.str(tab),
) )
assert isinstance(treel_str, str) assert isinstance(treel_str, str)
@ -65,7 +65,7 @@ class BinaryTreeFactory(RainbowFactory[BinaryTree[TreeKeyType]], Generic[TreeKey
source[HashPoint.HASH_LENGTH:HashPoint.HASH_LENGTH * 2], source[HashPoint.HASH_LENGTH:HashPoint.HASH_LENGTH * 2],
resolver resolver
), ),
ResolverOrigin(self.factory, source[HashPoint.HASH_LENGTH * 2:], resolver).hash_point() self.factory.from_bytes(source[HashPoint.HASH_LENGTH * 2:], resolver),
) )
def loose(self) -> RainbowFactory[BinaryTree[TreeKeyType]]: def loose(self) -> RainbowFactory[BinaryTree[TreeKeyType]]:

View File

@ -11,6 +11,13 @@ class RecursiveMentionable(Mentionable, abc.ABC):
def points(self) -> Iterable[HashPoint]: def points(self) -> Iterable[HashPoint]:
raise NotImplementedError raise NotImplementedError
@classmethod
def points_of(cls, mentionable: Mentionable) -> Iterable[HashPoint]:
if isinstance(mentionable, RecursiveMentionable):
return mentionable.points()
else:
return []
async def str(self, tab: int) -> str: async def str(self, tab: int) -> str:
assert isinstance(tab, int) assert isinstance(tab, int)
return f'(recursive {self.__class__.__name__})' return f'(recursive {self.__class__.__name__})'