|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# Copyright 2021 The Meson development team
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
import typing as T
|
|
|
|
|
|
|
|
from ...interpreterbase import (
|
|
|
|
MesonInterpreterObject,
|
|
|
|
IterableObject,
|
|
|
|
MesonOperator,
|
|
|
|
InvalidArguments,
|
|
|
|
)
|
|
|
|
|
|
|
|
if T.TYPE_CHECKING:
|
|
|
|
from ...interpreterbase import SubProject
|
|
|
|
|
|
|
|
class RangeHolder(MesonInterpreterObject, IterableObject):
|
|
|
|
def __init__(self, start: int, stop: int, step: int, *, subproject: 'SubProject') -> None:
|
|
|
|
super().__init__(subproject=subproject)
|
|
|
|
self.range = range(start, stop, step)
|
|
|
|
self.operators.update({
|
|
|
|
MesonOperator.INDEX: self.op_index,
|
|
|
|
})
|
|
|
|
|
|
|
|
def op_index(self, other: int) -> int:
|
|
|
|
try:
|
|
|
|
return self.range[other]
|
|
|
|
except IndexError:
|
|
|
|
raise InvalidArguments(f'Index {other} out of bounds of range.')
|
|
|
|
|
|
|
|
def iter_tuple_size(self) -> None:
|
|
|
|
return None
|
|
|
|
|
|
|
|
def iter_self(self) -> T.Iterator[int]:
|
|
|
|
return iter(self.range)
|
|
|
|
|
|
|
|
def size(self) -> int:
|
|
|
|
return len(self.range)
|