build/extracted-examples/guides/hack/12-generics/01-introduction/Stack.inc.hack (34 lines of code) (raw):

// WARNING: Contains some auto-generated boilerplate code, see: // HHVM\UserDocumentation\MarkdownExt\ExtractedCodeBlocks\FilterBase::addBoilerplate namespace HHVM\UserDocumentation\Guides\Hack\Generics\Introduction\Stack; use namespace HH\Lib\{C, Vec}; interface StackLike<T> { public function isEmpty(): bool; public function push(T $element): void; public function pop(): T; } class StackUnderflowException extends \Exception {} class VecStack<T> implements StackLike<T> { private int $stackPtr; public function __construct(private vec<T> $elements = vec[]) { $this->stackPtr = C\count($elements) - 1; } public function isEmpty(): bool { return $this->stackPtr === -1; } public function push(T $element): void { $this->stackPtr++; if (C\count($this->elements) === $this->stackPtr) { $this->elements[] = $element; } else { $this->elements[$this->stackPtr] = $element; } } public function pop(): T { if ($this->isEmpty()) { throw new StackUnderflowException(); } $element = $this->elements[$this->stackPtr]; $this->elements[$this->stackPtr] = $this->elements[0]; $this->stackPtr--; return $element; } }