/* * Copyright (C)2005-2019 Haxe Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ package haxe.ds; /** A cell of `haxe.ds.GenericStack`. @see https://haxe.org/manual/std-GenericStack.html **/ #if (flash || cpp) @:generic #end class GenericCell { public var elt:T; public var next:GenericCell; public function new(elt, next) { this.elt = elt; this.next = next; } } #if cpp @:generic #if cppia private class GenericStackIterator { public var current:GenericCell; public function hasNext():Bool { return current != null; } public function next():T { var result = current.elt; current = current.next; return result; } public function new(head) { current = head; } } #else private class GenericStackIterator extends cpp.FastIterator { public var current:GenericCell; override public function hasNext():Bool { return current != null; } override public function next():T { var result = current.elt; current = current.next; return result; } public function new(head) { current = head; } } #end #end /** A stack of elements. This class is generic, which means one type is generated for each type parameter T on static targets. For example: - `new GenericStack()` generates `GenericStack_Int` - `new GenericStack()` generates `GenericStack_String` The generated name is an implementation detail and should not be relied upon. @see https://haxe.org/manual/std-GenericStack.html **/ #if (flash || cpp) @:generic #end class GenericStack { public var head:GenericCell; /** Creates a new empty GenericStack. **/ public function new() {} /** Pushes element `item` onto the stack. **/ public inline function add(item:T) { head = new GenericCell(item, head); } /** Returns the topmost stack element without removing it. If the stack is empty, null is returned. **/ public inline function first():Null { return if (head == null) null else head.elt; } /** Returns the topmost stack element and removes it. If the stack is empty, null is returned. **/ public inline function pop():Null { var k = head; if (k == null) return null; else { head = k.next; return k.elt; } } /** Tells if the stack is empty. **/ public inline function isEmpty():Bool { return (head == null); } /** Removes the first element which is equal to `v` according to the `==` operator. This method traverses the stack until it finds a matching element and unlinks it, returning true. If no matching element is found, false is returned. **/ public function remove(v:T):Bool { var prev:GenericCell = null; var l = head; while (l != null) { if (l.elt == v) { if (prev == null) head = l.next; else prev.next = l.next; break; } prev = l; l = l.next; } return (l != null); } #if cpp /** Returns an iterator over the elements of `this` GenericStack. **/ public function iterator():Iterator { return new GenericStackIterator(head); } #else /** Returns an iterator over the elements of `this` GenericStack. **/ public function iterator():Iterator { var l = head; return { hasNext: function() { return l != null; }, next: function() { var k = l; l = k.next; return k.elt; } }; } #end /** Returns a String representation of `this` GenericStack. **/ public function toString() { var a = new Array(); var l = head; while (l != null) { a.push(l.elt); l = l.next; } return "{" + a.join(",") + "}"; } }