from typing import TYPE_CHECKING
from bytemaker.bittypes.bittype import BitType
from bytemaker.bitvector import BitVector
from bytemaker.typing_redirect import Optional, Type, TypeVar
if TYPE_CHECKING:
BufferSelf = TypeVar("BufferSelf", bound="Buffer")
else:
try:
from typing_redirect import Self as BufferSelf
except ImportError:
BufferSelf = TypeVar("BufferSelf", bound="Buffer")
[docs]
class Buffer(BitType[BitVector]):
"""
A BitType that represents a buffer of bits.
Use the `specialize` method to create a subclass with the desired number of bits
or use one of the pre-defined subclasses.
Class Attributes:
-----------------
num_bits : int
The number of bits in instances of this `Buffer` subclass.
base_bit_type : Type[Buffer]
The base `BitType` this class derives from. It will be `Buffer`.
py_type : Type[BitVector]
The type that this `BitType` represents. It is `BitVector`.
Instance Attributes
-------------------
bits : BitVector
The underlying sequence of bits of this `Buffer` object. Identical to `value`.
value : BitVector
The `BitVector` value of this `Buffer` object. Identical to `bits`.
"""
"""
A BitType that represents a buffer of bits.
Use the `specialize` method to create a subclass with the desired number of bits
or use one of the pre-defined subclasses.
"""
py_type = BitVector
@property
def value(self):
return self.bits
@value.setter
def value(self, value):
self._bits = BitVector(value)
[docs]
@classmethod
def specialize(cls: Type[BufferSelf], num_bits_: int, name_: Optional[str] = None):
"""
Returns a subclass of Buffer with the specified number of bits.
Args:
num_bits_ (int): The number of bits the buffer should have.
name_ (Optional[str], optional): The name of the subclass. Defaults to None,
meaning the name will be _Buffer.
Returns:
Type[BufferSelf]: A subclass of Buffer with the specified number of bits.
"""
class _Buffer(cls):
_num_bits = num_bits_
if name_:
_Buffer.__name__ = name_
return _Buffer
Buffer.base_bit_type = Buffer
[docs]
class Buffer1(Buffer):
_num_bits = 1
[docs]
class Buffer2(Buffer):
_num_bits = 2
[docs]
class Buffer3(Buffer):
_num_bits = 3
[docs]
class Buffer4(Buffer):
_num_bits = 4
[docs]
class Buffer5(Buffer):
_num_bits = 5
[docs]
class Buffer6(Buffer):
_num_bits = 6
[docs]
class Buffer7(Buffer):
_num_bits = 7
[docs]
class Buffer8(Buffer):
_num_bits = 8
[docs]
class Buffer9(Buffer):
_num_bits = 9
[docs]
class Buffer10(Buffer):
_num_bits = 10
[docs]
class Buffer11(Buffer):
_num_bits = 11
[docs]
class Buffer12(Buffer):
_num_bits = 12
[docs]
class Buffer13(Buffer):
_num_bits = 13
[docs]
class Buffer14(Buffer):
_num_bits = 14
[docs]
class Buffer15(Buffer):
_num_bits = 15
[docs]
class Buffer16(Buffer):
_num_bits = 16
[docs]
class Buffer17(Buffer):
_num_bits = 17
[docs]
class Buffer18(Buffer):
_num_bits = 18
[docs]
class Buffer19(Buffer):
_num_bits = 19
[docs]
class Buffer20(Buffer):
_num_bits = 20
[docs]
class Buffer21(Buffer):
_num_bits = 21
[docs]
class Buffer22(Buffer):
_num_bits = 22
[docs]
class Buffer23(Buffer):
_num_bits = 23
[docs]
class Buffer24(Buffer):
_num_bits = 24
[docs]
class Buffer25(Buffer):
_num_bits = 25
[docs]
class Buffer26(Buffer):
_num_bits = 26
[docs]
class Buffer27(Buffer):
_num_bits = 27
[docs]
class Buffer28(Buffer):
_num_bits = 28
[docs]
class Buffer29(Buffer):
_num_bits = 29
[docs]
class Buffer30(Buffer):
_num_bits = 30
[docs]
class Buffer31(Buffer):
_num_bits = 31
[docs]
class Buffer32(Buffer):
_num_bits = 32
[docs]
class Buffer50(Buffer):
_num_bits = 50
[docs]
class Buffer64(Buffer):
_num_bits = 64
[docs]
class Buffer100(Buffer):
_num_bits = 100
[docs]
class Buffer128(Buffer):
_num_bits = 128
[docs]
class Buffer200(Buffer):
_num_bits = 200
[docs]
class Buffer250(Buffer):
_num_bits = 250
[docs]
class Buffer256(Buffer):
_num_bits = 256
[docs]
class Buffer500(Buffer):
_num_bits = 500
[docs]
class Buffer512(Buffer):
_num_bits = 512
[docs]
class Buffer1000(Buffer):
_num_bits = 1000
[docs]
class Buffer1024(Buffer):
_num_bits = 1024
__all__ = [
"Buffer",
"Buffer1",
"Buffer2",
"Buffer3",
"Buffer4",
"Buffer5",
"Buffer6",
"Buffer7",
"Buffer8",
"Buffer9",
"Buffer10",
"Buffer11",
"Buffer12",
"Buffer13",
"Buffer14",
"Buffer15",
"Buffer16",
"Buffer17",
"Buffer18",
"Buffer19",
"Buffer20",
"Buffer21",
"Buffer22",
"Buffer23",
"Buffer24",
"Buffer25",
"Buffer26",
"Buffer27",
"Buffer28",
"Buffer29",
"Buffer30",
"Buffer31",
"Buffer32",
"Buffer50",
"Buffer64",
"Buffer100",
"Buffer128",
"Buffer200",
"Buffer250",
"Buffer256",
"Buffer500",
"Buffer512",
"Buffer1000",
"Buffer1024",
]