| 99 | class Buffer: |
| 100 | profile_events:list[ProfileEvent] = [] |
| 101 | def __init__(self, device:str, size:int, dtype:DType, opaque:Any=None, options:BufferSpec|None=None, initial_value:bytes|None=None, |
| 102 | uop_refcount=0, base:Buffer|None=None, offset:int=0, preallocate=False): |
| 103 | assert isinstance(dtype, DType) and not isinstance(dtype, PtrDType) |
| 104 | self.device, self.size, self.dtype, self.options, self.offset, self.allocated_views = device, size, dtype, options, offset, 0 |
| 105 | self._bufs: dict[str, Any] = {} |
| 106 | if base is None: |
| 107 | assert offset == 0, "base buffers can't have offset" |
| 108 | self._base = None |
| 109 | self._uop_refcount = uop_refcount |
| 110 | if opaque is not None: self.allocate(opaque) |
| 111 | if initial_value is not None: |
| 112 | self.allocate() |
| 113 | self.copyin(memoryview(initial_value)) |
| 114 | else: |
| 115 | assert base._base is None, "base can't have a base" |
| 116 | assert device == base.device, "base must have the same device" |
| 117 | self._base = base |
| 118 | if preallocate: self.allocate() |
| 119 | @property |
| 120 | def base(self) -> Buffer: return self._base if self._base is not None else self |
| 121 | @property |