Source code for ufl.utils.stacks
# -*- coding: utf-8 -*-
"Various utility data structures."
# Copyright (C) 2008-2016 Martin Sandve Alnæs
#
# This file is part of UFL (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
[docs]class Stack(list):
"""A stack datastructure."""
def __init__(self, *args):
list.__init__(self, *args)
[docs] def push(self, v):
list.append(self, v)
[docs] def peek(self):
return self[-1]
[docs]class StackDict(dict):
"""A dict that can be changed incrementally with 'd.push(k,v)' and have changes rolled back with 'k,v = d.pop()'."""
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self._l = []
[docs] def push(self, k, v):
"""Store previous state for this key."""
self._l.append((k, self.get(k, None)))
if v is None:
if k in self:
del self[k]
else:
self[k] = v
[docs] def pop(self):
"""Restore previous state for this key."""
k, v = self._l.pop()
if v is None:
if k in self:
del self[k]
else:
self[k] = v
return k, v